cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

test-i386-snan-convert.c (1565B)


      1/* Test conversions of signaling NaNs to and from long double.  */
      2
      3#include <stdint.h>
      4#include <stdio.h>
      5
      6volatile float f_res;
      7volatile double d_res;
      8volatile long double ld_res;
      9
     10volatile float f_snan = __builtin_nansf("");
     11volatile double d_snan = __builtin_nans("");
     12volatile long double ld_snan = __builtin_nansl("");
     13
     14int issignaling_f(float x)
     15{
     16    union { float f; uint32_t u; } u = { .f = x };
     17    return (u.u & 0x7fffffff) > 0x7f800000 && (u.u & 0x400000) == 0;
     18}
     19
     20int issignaling_d(double x)
     21{
     22    union { double d; uint64_t u; } u = { .d = x };
     23    return (((u.u & UINT64_C(0x7fffffffffffffff)) >
     24            UINT64_C(0x7ff0000000000000)) &&
     25            (u.u & UINT64_C(0x8000000000000)) == 0);
     26}
     27
     28int issignaling_ld(long double x)
     29{
     30    union {
     31        long double ld;
     32        struct { uint64_t sig; uint16_t sign_exp; } s;
     33    } u = { .ld = x };
     34    return ((u.s.sign_exp & 0x7fff) == 0x7fff &&
     35            (u.s.sig >> 63) != 0 &&
     36            (u.s.sig & UINT64_C(0x4000000000000000)) == 0);
     37}
     38
     39int main(void)
     40{
     41    int ret = 0;
     42    ld_res = f_snan;
     43    if (issignaling_ld(ld_res)) {
     44        printf("FAIL: float -> long double\n");
     45        ret = 1;
     46    }
     47    ld_res = d_snan;
     48    if (issignaling_ld(ld_res)) {
     49        printf("FAIL: double -> long double\n");
     50        ret = 1;
     51    }
     52    f_res = ld_snan;
     53    if (issignaling_d(f_res)) {
     54        printf("FAIL: long double -> float\n");
     55        ret = 1;
     56    }
     57    d_res = ld_snan;
     58    if (issignaling_d(d_res)) {
     59        printf("FAIL: long double -> double\n");
     60        ret = 1;
     61    }
     62    return ret;
     63}