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