qemu/tests/tcg/i386/test-i386-fisttp.c
<<
>>
Prefs
   1/* Test fisttpl and fisttpll instructions.  */
   2
   3#include <stdint.h>
   4#include <stdio.h>
   5#include <string.h>
   6
   7union u {
   8    struct { uint64_t sig; uint16_t sign_exp; } s;
   9    long double ld;
  10};
  11
  12volatile union u ld_invalid_1 = { .s = { 1, 1234 } };
  13
  14int main(void)
  15{
  16    int ret = 0;
  17    int32_t res_32;
  18    int64_t res_64;
  19    __asm__ volatile ("fisttpl %0" : "=m" (res_32) : "t" (0x1p100L) : "st");
  20    if (res_32 != INT32_MIN) {
  21        printf("FAIL: fisttpl 0x1p100\n");
  22        ret = 1;
  23    }
  24    __asm__ volatile ("fisttpl %0" : "=m" (res_32) : "t" (-0x1p100L) : "st");
  25    if (res_32 != INT32_MIN) {
  26        printf("FAIL: fisttpl -0x1p100\n");
  27        ret = 1;
  28    }
  29    __asm__ volatile ("fisttpl %0" : "=m" (res_32) : "t" (__builtin_infl()) :
  30                      "st");
  31    if (res_32 != INT32_MIN) {
  32        printf("FAIL: fisttpl inf\n");
  33        ret = 1;
  34    }
  35    __asm__ volatile ("fisttpl %0" : "=m" (res_32) : "t" (-__builtin_infl()) :
  36                      "st");
  37    if (res_32 != INT32_MIN) {
  38        printf("FAIL: fisttpl -inf\n");
  39        ret = 1;
  40    }
  41    __asm__ volatile ("fisttpl %0" : "=m" (res_32) : "t" (__builtin_nanl("")) :
  42                      "st");
  43    if (res_32 != INT32_MIN) {
  44        printf("FAIL: fisttpl nan\n");
  45        ret = 1;
  46    }
  47    __asm__ volatile ("fisttpl %0" : "=m" (res_32) :
  48                      "t" (-__builtin_nanl("")) : "st");
  49    if (res_32 != INT32_MIN) {
  50        printf("FAIL: fisttpl -nan\n");
  51        ret = 1;
  52    }
  53    __asm__ volatile ("fisttpl %0" : "=m" (res_32) : "t" (ld_invalid_1.ld) :
  54                      "st");
  55    if (res_32 != INT32_MIN) {
  56        printf("FAIL: fisttpl invalid\n");
  57        ret = 1;
  58    }
  59    __asm__ volatile ("fisttpll %0" : "=m" (res_64) : "t" (0x1p100L) : "st");
  60    if (res_64 != INT64_MIN) {
  61        printf("FAIL: fisttpll 0x1p100\n");
  62        ret = 1;
  63    }
  64    __asm__ volatile ("fisttpll %0" : "=m" (res_64) : "t" (-0x1p100L) : "st");
  65    if (res_64 != INT64_MIN) {
  66        printf("FAIL: fisttpll -0x1p100\n");
  67        ret = 1;
  68    }
  69    __asm__ volatile ("fisttpll %0" : "=m" (res_64) : "t" (__builtin_infl()) :
  70                      "st");
  71    if (res_64 != INT64_MIN) {
  72        printf("FAIL: fisttpll inf\n");
  73        ret = 1;
  74    }
  75    __asm__ volatile ("fisttpll %0" : "=m" (res_64) : "t" (-__builtin_infl()) :
  76                      "st");
  77    if (res_64 != INT64_MIN) {
  78        printf("FAIL: fisttpll -inf\n");
  79        ret = 1;
  80    }
  81    __asm__ volatile ("fisttpll %0" : "=m" (res_64) :
  82                      "t" (__builtin_nanl("")) : "st");
  83    if (res_64 != INT64_MIN) {
  84        printf("FAIL: fisttpll nan\n");
  85        ret = 1;
  86    }
  87    __asm__ volatile ("fisttpll %0" : "=m" (res_64) :
  88                      "t" (-__builtin_nanl("")) : "st");
  89    if (res_64 != INT64_MIN) {
  90        printf("FAIL: fisttpll -nan\n");
  91        ret = 1;
  92    }
  93    __asm__ volatile ("fisttpll %0" : "=m" (res_64) : "t" (ld_invalid_1.ld) :
  94                      "st");
  95    if (res_64 != INT64_MIN) {
  96        printf("FAIL: fisttpll invalid\n");
  97        ret = 1;
  98    }
  99    return ret;
 100}
 101