qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

test-i386-fbstp.c (5111B)


      1 /* Test fbstp instruction.  */
      2 
      3 #include <stdint.h>
      4 #include <stdio.h>
      5 #include <string.h>
      6 
      7 union u {
      8     struct { uint64_t sig; uint16_t sign_exp; } s;
      9     long double ld;
     10 };
     11 
     12 volatile union u ld_invalid_1 = { .s = { 1, 1234 } };
     13 volatile union u ld_invalid_2 = { .s = { 0, 1234 } };
     14 volatile union u ld_invalid_3 = { .s = { 0, 0x7fff } };
     15 volatile union u ld_invalid_4 = { .s = { (UINT64_C(1) << 63) - 1, 0x7fff } };
     16 
     17 int main(void)
     18 {
     19     int ret = 0;
     20     unsigned char out[10];
     21     memset(out, 0xfe, sizeof out);
     22     __asm__ volatile ("fbstp %0" : "=m" (out) : "t" (-0.0L) : "st");
     23     out[9] &= 0x80;
     24     if (memcmp(out, "\0\0\0\0\0\0\0\0\0\x80", sizeof out) != 0) {
     25         printf("FAIL: fbstp -0\n");
     26         ret = 1;
     27     }
     28     memset(out, 0x12, sizeof out);
     29     __asm__ volatile ("fbstp %0" : "=m" (out) : "t" (-0.1L) : "st");
     30     out[9] &= 0x80;
     31     if (memcmp(out, "\0\0\0\0\0\0\0\0\0\x80", sizeof out) != 0) {
     32         printf("FAIL: fbstp -0.1\n");
     33         ret = 1;
     34     }
     35     memset(out, 0x1f, sizeof out);
     36     __asm__ volatile ("fbstp %0" : "=m" (out) : "t" (-987654321987654321.0L) :
     37                       "st");
     38     out[9] &= 0x80;
     39     if (memcmp(out, "\x21\x43\x65\x87\x19\x32\x54\x76\x98\x80",
     40                sizeof out) != 0) {
     41         printf("FAIL: fbstp -987654321987654321\n");
     42         ret = 1;
     43     }
     44     memset(out, 0x12, sizeof out);
     45     __asm__ volatile ("fbstp %0" : "=m" (out) : "t" (999999999999999999.5L) :
     46                       "st");
     47     if (memcmp(out, "\0\0\0\0\0\0\0\xc0\xff\xff", sizeof out) != 0) {
     48         printf("FAIL: fbstp 999999999999999999.5\n");
     49         ret = 1;
     50     }
     51     memset(out, 0x12, sizeof out);
     52     __asm__ volatile ("fbstp %0" : "=m" (out) : "t" (1000000000000000000.0L) :
     53                       "st");
     54     if (memcmp(out, "\0\0\0\0\0\0\0\xc0\xff\xff", sizeof out) != 0) {
     55         printf("FAIL: fbstp 1000000000000000000\n");
     56         ret = 1;
     57     }
     58     memset(out, 0x12, sizeof out);
     59     __asm__ volatile ("fbstp %0" : "=m" (out) : "t" (1e30L) : "st");
     60     if (memcmp(out, "\0\0\0\0\0\0\0\xc0\xff\xff", sizeof out) != 0) {
     61         printf("FAIL: fbstp 1e30\n");
     62         ret = 1;
     63     }
     64     memset(out, 0x12, sizeof out);
     65     __asm__ volatile ("fbstp %0" : "=m" (out) : "t" (-999999999999999999.5L) :
     66                       "st");
     67     if (memcmp(out, "\0\0\0\0\0\0\0\xc0\xff\xff", sizeof out) != 0) {
     68         printf("FAIL: fbstp -999999999999999999.5\n");
     69         ret = 1;
     70     }
     71     memset(out, 0x12, sizeof out);
     72     __asm__ volatile ("fbstp %0" : "=m" (out) : "t" (-1000000000000000000.0L) :
     73                       "st");
     74     if (memcmp(out, "\0\0\0\0\0\0\0\xc0\xff\xff", sizeof out) != 0) {
     75         printf("FAIL: fbstp -1000000000000000000\n");
     76         ret = 1;
     77     }
     78     memset(out, 0x12, sizeof out);
     79     __asm__ volatile ("fbstp %0" : "=m" (out) : "t" (-1e30L) : "st");
     80     if (memcmp(out, "\0\0\0\0\0\0\0\xc0\xff\xff", sizeof out) != 0) {
     81         printf("FAIL: fbstp -1e30\n");
     82         ret = 1;
     83     }
     84     memset(out, 0x12, sizeof out);
     85     __asm__ volatile ("fbstp %0" : "=m" (out) : "t" (__builtin_infl()) : "st");
     86     if (memcmp(out, "\0\0\0\0\0\0\0\xc0\xff\xff", sizeof out) != 0) {
     87         printf("FAIL: fbstp inf\n");
     88         ret = 1;
     89     }
     90     memset(out, 0x12, sizeof out);
     91     __asm__ volatile ("fbstp %0" : "=m" (out) : "t" (-__builtin_infl()) :
     92                       "st");
     93     if (memcmp(out, "\0\0\0\0\0\0\0\xc0\xff\xff", sizeof out) != 0) {
     94         printf("FAIL: fbstp -inf\n");
     95         ret = 1;
     96     }
     97     memset(out, 0x12, sizeof out);
     98     __asm__ volatile ("fbstp %0" : "=m" (out) : "t" (__builtin_nanl("")) :
     99                       "st");
    100     if (memcmp(out, "\0\0\0\0\0\0\0\xc0\xff\xff", sizeof out) != 0) {
    101         printf("FAIL: fbstp nan\n");
    102         ret = 1;
    103     }
    104     memset(out, 0x12, sizeof out);
    105     __asm__ volatile ("fbstp %0" : "=m" (out) : "t" (-__builtin_nanl("")) :
    106                       "st");
    107     if (memcmp(out, "\0\0\0\0\0\0\0\xc0\xff\xff", sizeof out) != 0) {
    108         printf("FAIL: fbstp -nan\n");
    109         ret = 1;
    110     }
    111     memset(out, 0x12, sizeof out);
    112     __asm__ volatile ("fbstp %0" : "=m" (out) : "t" (ld_invalid_1.ld) :
    113                       "st");
    114     if (memcmp(out, "\0\0\0\0\0\0\0\xc0\xff\xff", sizeof out) != 0) {
    115         printf("FAIL: fbstp invalid 1\n");
    116         ret = 1;
    117     }
    118     memset(out, 0x12, sizeof out);
    119     __asm__ volatile ("fbstp %0" : "=m" (out) : "t" (ld_invalid_2.ld) :
    120                       "st");
    121     if (memcmp(out, "\0\0\0\0\0\0\0\xc0\xff\xff", sizeof out) != 0) {
    122         printf("FAIL: fbstp invalid 2\n");
    123         ret = 1;
    124     }
    125     memset(out, 0x12, sizeof out);
    126     __asm__ volatile ("fbstp %0" : "=m" (out) : "t" (ld_invalid_3.ld) :
    127                       "st");
    128     if (memcmp(out, "\0\0\0\0\0\0\0\xc0\xff\xff", sizeof out) != 0) {
    129         printf("FAIL: fbstp invalid 3\n");
    130         ret = 1;
    131     }
    132     memset(out, 0x12, sizeof out);
    133     __asm__ volatile ("fbstp %0" : "=m" (out) : "t" (ld_invalid_4.ld) :
    134                       "st");
    135     if (memcmp(out, "\0\0\0\0\0\0\0\xc0\xff\xff", sizeof out) != 0) {
    136         printf("FAIL: fbstp invalid 4\n");
    137         ret = 1;
    138     }
    139     return ret;
    140 }