1672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj
2672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj/* Derived from: */
3672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj
4672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj/*
5672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj *  x86 CPU test
6672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj *
7672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj *  Copyright (c) 2003 Fabrice Bellard
8672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj *
9672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj *  This program is free software; you can redistribute it and/or modify
10672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj *  it under the terms of the GNU General Public License as published by
11672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj *  the Free Software Foundation; either version 2 of the License, or
12672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj *  (at your option) any later version.
13672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj *
14672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj *  This program is distributed in the hope that it will be useful,
15672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj *  GNU General Public License for more details.
18672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj *
19672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj *  You should have received a copy of the GNU General Public License
20672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj *  along with this program; if not, write to the Free Software
21672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj */
23672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj
24672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj
25672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj#include <stdlib.h>
26672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj#include <stdio.h>
27672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj#include <string.h>
28672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj#include <inttypes.h>
29672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj#include <math.h>
30672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj
31672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj/**********************************************/
32672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj
33672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardjvoid test_fops(double a, double b)
34672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj{
35672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    printf("a=%f b=%f a+b=%f\n", a, b, a + b);
36672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    printf("a=%f b=%f a-b=%f\n", a, b, a - b);
37672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    printf("a=%f b=%f a*b=%f\n", a, b, a * b);
38672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    printf("a=%f b=%f a/b=%f\n", a, b, a / b);
39672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    printf("a=%f b=%f fmod(a, b)=%f\n", a, b, fmod(a, b));
40672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    printf("a=%f sqrt(a)=%f\n", a, sqrt(a));
41672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    printf("a=%f sin(a)=%f\n", a, sin(a));
42672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    printf("a=%f cos(a)=%f\n", a, cos(a));
43672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    printf("a=%f tan(a)=%f\n", a, tan(a));
44672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    printf("a=%f log(a)=%f\n", a, log(a));
45672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    printf("a=%f exp(a)=%f\n", a, exp(a));
46672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    printf("a=%f b=%f atan2(a, b)=%f\n", a, b, atan2(a, b));
47672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    /* just to test some op combining */
48672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    printf("a=%f asin(sin(a))=%f\n", a, asin(sin(a)));
49672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    printf("a=%f acos(cos(a))=%f\n", a, acos(cos(a)));
50672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    printf("a=%f atan(tan(a))=%f\n", a, atan(tan(a)));
51672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj}
52672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj#define CC_C    0x0001
53672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj#define CC_P    0x0004
54672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj#define CC_A    0x0010
55672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj#define CC_Z    0x0040
56672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj#define CC_S    0x0080
57672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj#define CC_O    0x0800
58672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj
59672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj
60672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardjvoid test_fcmp(double a, double b)
61672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj{
62672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    printf("(%f<%f)=%d\n",
63672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj           a, b, a < b);
64672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    printf("(%f<=%f)=%d\n",
65672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj           a, b, a <= b);
66672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    printf("(%f==%f)=%d\n",
67672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj           a, b, a == b);
68672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    printf("(%f>%f)=%d\n",
69672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj           a, b, a > b);
70672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    printf("(%f<=%f)=%d\n",
71672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj           a, b, a >= b);
72672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    {
73672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj        unsigned int eflags;
74672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj        /* test f(u)comi instruction */
75672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj        asm("fcomi %2, %1\n"
76672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj            "pushf\n"
77672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj            "pop %0\n"
78672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj            : "=r" (eflags)
79672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj            : "t" (a), "u" (b));
80672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj        printf("fcomi(%f %f)=%08x\n", a, b, eflags & (CC_Z | CC_P | CC_C));
81672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    }
82672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj}
83672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj
84672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardjvoid test_fcvt(double a)
85672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj{
86672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    float fa;
87672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    long double la;
88672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    int16_t fpuc;
89672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    int i;
90672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    int64_t lla;
91672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    int ia;
92672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    int16_t wa;
93672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    double ra;
94672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj
95672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    fa = a;
96672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    la = a;
97672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    printf("(float)%f = %f\n", a, fa);
98672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    printf("(long double)%f = %Lf\n", a, la);
99d0f18a89da8102abb237ccfe9d04a5c284972942njn    printf("a=%016llx\n", *(long long *)&a);
100d0f18a89da8102abb237ccfe9d04a5c284972942njn    printf("la=%016llx %04x\n", *(long long *)&la,
101672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj           *(unsigned short *)((char *)(&la) + 8));
102672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj
103672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    /* test all roundings */
104672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    asm volatile ("fstcw %0" : "=m" (fpuc));
105672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    for(i=0;i<4;i++) {
106672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj      int16_t tmp = (fpuc & ~0x0c00) | (i << 10);
107672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj        asm volatile ("fldcw %0" : : "m" (tmp));
108406dc34663a60f683be10efab37e048cb0ca227csewardj        asm volatile ("fists %0" : "=m" (wa) : "t" (a));
109672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj        asm volatile ("fistl %0" : "=m" (ia) : "t" (a));
110672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj        asm volatile ("fistpll %0" : "=m" (lla) : "t" (a) : "st");
111672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj        asm volatile ("frndint ; fstl %0" : "=m" (ra) : "t" (a));
112672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj        asm volatile ("fldcw %0" : : "m" (fpuc));
113672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj        printf("(short)a = %d\n", wa);
114672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj        printf("(int)a = %d\n", ia);
115d0f18a89da8102abb237ccfe9d04a5c284972942njn        printf("(int64_t)a = %lld\n", lla);
116672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj        printf("rint(a) = %f\n", ra);
117672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    }
118672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj}
119672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj
120672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj#define TEST(N) \
121672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    asm("fld" #N : "=t" (a)); \
122672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    printf("fld" #N "= %f\n", a);
123672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj
124672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardjvoid test_fconst(void)
125672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj{
126672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    double a;
127672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    TEST(1);
128672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    TEST(l2t);
129672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    TEST(l2e);
130672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    TEST(pi);
131672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    TEST(lg2);
132672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    TEST(ln2);
133672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    TEST(z);
134672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj}
135672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj
136672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardjvoid test_fbcd(double a)
137672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj{
138672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    unsigned short bcd[5];
139672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    double b;
140672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj
141672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    asm("fbstp %0" : "=m" (bcd[0]) : "t" (a) : "st");
142672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    asm("fbld %1" : "=t" (b) : "m" (bcd[0]));
143672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    printf("a=%f bcd=%04x%04x%04x%04x%04x b=%f\n",
144672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj           a, bcd[4], bcd[3], bcd[2], bcd[1], bcd[0], b);
145672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj}
146672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj
147672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj#define TEST_ENV(env, save, restore)\
148672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj{\
149672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    memset((env), 0xaa, sizeof(*(env)));\
150672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    for(i=0;i<5;i++)\
151672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj        asm volatile ("fldl %0" : : "m" (dtab[i]));\
152672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    asm(save " %0\n" : : "m" (*(env)));\
153672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    asm(restore " %0\n": : "m" (*(env)));\
154672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    for(i=0;i<5;i++)\
155672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj        asm volatile ("fstpl %0" : "=m" (rtab[i]));\
156672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    for(i=0;i<5;i++)\
157672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj        printf("res[%d]=%f\n", i, rtab[i]);\
158672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    printf("fpuc=%04x fpus=%04x fptag=%04x\n",\
159672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj           (env)->fpuc,\
160672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj           (env)->fpus & 0xff00,\
161672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj           (env)->fptag);\
162672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj}
163672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj
164672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardjvoid test_fenv(void)
165672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj{
166672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    struct __attribute__((packed)) {
167672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj        uint16_t fpuc;
168672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj        uint16_t dummy1;
169672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj        uint16_t fpus;
170672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj        uint16_t dummy2;
171672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj        uint16_t fptag;
172672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj        uint16_t dummy3;
173672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj        uint32_t ignored[4];
174672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj        long double fpregs[8];
175672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    } float_env32;
176672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    struct __attribute__((packed)) {
177672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj        uint16_t fpuc;
178672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj        uint16_t fpus;
179672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj        uint16_t fptag;
180672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj        uint16_t ignored[4];
181672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj        long double fpregs[8];
182672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    } float_env16;
183672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    double dtab[8];
184672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    double rtab[8];
185672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    int i;
186672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj
187672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    for(i=0;i<8;i++)
188672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj        dtab[i] = i + 1;
189672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj
190a04c20d295572c16c8cd40ae0ce6338d3250fb8bnjn    TEST_ENV(&float_env16, "data16/fnstenv", "data16/fldenv");
191a04c20d295572c16c8cd40ae0ce6338d3250fb8bnjn    TEST_ENV(&float_env16, "data16/fnsave", "data16/frstor");
192672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    TEST_ENV(&float_env32, "fnstenv", "fldenv");
193672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    TEST_ENV(&float_env32, "fnsave", "frstor");
194672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj
195672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    /* test for ffree */
196672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    for(i=0;i<5;i++)
197672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj        asm volatile ("fldl %0" : : "m" (dtab[i]));
198672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    asm volatile("ffree %st(2)");
199672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    asm volatile ("fnstenv %0\n" : : "m" (float_env32));
200672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    asm volatile ("fninit");
201672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    printf("fptag=%04x\n", float_env32.fptag);
202672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj}
203672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj
204672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj
205672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj#define TEST_FCMOV(a, b, eflags, CC)\
206672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj{\
207672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    double res;\
208672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    asm("push %3\n"\
209672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj        "popf\n"\
210672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj        "fcmov" CC " %2, %0\n"\
211672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj        : "=t" (res)\
212672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj        : "0" (a), "u" (b), "g" (eflags));\
213672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    printf("fcmov%s eflags=0x%04x-> %f\n", \
214672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj           CC, eflags, res);\
215672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj}
216672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj
217672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardjvoid test_fcmov(void)
218672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj{
219672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    double a, b;
220672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    int eflags, i;
221672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj
222672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    a = 1.0;
223672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    b = 2.0;
224672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    for(i = 0; i < 4; i++) {
225672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj        eflags = 0;
226672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj        if (i & 1)
227672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj            eflags |= CC_C;
228672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj        if (i & 2)
229672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj            eflags |= CC_Z;
230672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj        TEST_FCMOV(a, b, eflags, "b");
231672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj        TEST_FCMOV(a, b, eflags, "e");
232672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj        TEST_FCMOV(a, b, eflags, "be");
233672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj        TEST_FCMOV(a, b, eflags, "nb");
234672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj        TEST_FCMOV(a, b, eflags, "ne");
235672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj        TEST_FCMOV(a, b, eflags, "nbe");
236672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    }
237672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    TEST_FCMOV(a, b, 0, "u");
238672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    TEST_FCMOV(a, b, CC_P, "u");
239672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    TEST_FCMOV(a, b, 0, "nu");
240672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    TEST_FCMOV(a, b, CC_P, "nu");
241672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj}
242672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj
243672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardjvoid test_floats(void)
244672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj{
245672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    test_fops(2, 3);
246672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    test_fops(1.4, -5);
247672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    test_fcmp(2, -1);
248672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    test_fcmp(2, 2);
249672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    test_fcmp(2, 3);
250672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    test_fcvt(0.5);
251672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    test_fcvt(-0.5);
252672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    test_fcvt(1.0/7.0);
253672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    test_fcvt(-1.0/9.0);
254672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    test_fcvt(32768);
255672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    test_fcvt(-1e20);
256672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj    test_fconst();
257672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj}
258672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj
259672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardjint main ( void )
260672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj{
261672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj  test_floats();
262672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj  return 0;
263672f7784dfd614eb5ef9ebc1a76aaeaa8a195722sewardj}
264