|
|
|
|
@ -21,6 +21,8 @@
|
|
|
|
|
#define FPS_VE 0x80
|
|
|
|
|
#define FPS_VXCVI 0x100
|
|
|
|
|
#define FPS_VXSOFT 0x400
|
|
|
|
|
#define FPS_FI 0x20000
|
|
|
|
|
#define FPS_FR 0x40000
|
|
|
|
|
|
|
|
|
|
extern int trapit(long arg, int (*func)(long));
|
|
|
|
|
extern void do_rfid(unsigned long msr);
|
|
|
|
|
@ -272,6 +274,7 @@ void set_fpscr(unsigned long fpscr)
|
|
|
|
|
unsigned long fpscr_eval(unsigned long val)
|
|
|
|
|
{
|
|
|
|
|
val &= ~0x60000000; /* clear FEX and VX */
|
|
|
|
|
val &= ~0x00000800; /* clear reserved bit 52 (BE) */
|
|
|
|
|
if (val & 0x1f80700) /* test all VX* bits */
|
|
|
|
|
val |= 0x20000000;
|
|
|
|
|
if ((val >> 25) & (val >> 3) & 0x1f)
|
|
|
|
|
@ -348,15 +351,15 @@ int test4(long arg)
|
|
|
|
|
fpscr = fpscr_eval((fpscr & 0x0fffffff) | 0x70000000);
|
|
|
|
|
if (get_fpscr() != fpscr)
|
|
|
|
|
return 16 * i + 27;
|
|
|
|
|
asm("mtfsb0 21");
|
|
|
|
|
asm("mtfsb0 21"); /* VXSOFT */
|
|
|
|
|
fpscr = fpscr_eval(fpscr & ~(1 << (31-21)));
|
|
|
|
|
if (get_fpscr() != fpscr)
|
|
|
|
|
return 16 * i + 28;
|
|
|
|
|
asm("mtfsb1 21");
|
|
|
|
|
fpscr = fpscr_eval(fpscr | (1 << (31-21)));
|
|
|
|
|
fpscr = fpscr_eval(fpscr | (1 << (31-21)) | (1ul << 31));
|
|
|
|
|
if (get_fpscr() != fpscr)
|
|
|
|
|
return 16 * i + 29;
|
|
|
|
|
asm("mtfsb0 24");
|
|
|
|
|
asm("mtfsb0 24"); /* OE */
|
|
|
|
|
fpscr = fpscr_eval(fpscr & ~(1 << (31-24)));
|
|
|
|
|
if (get_fpscr() != fpscr)
|
|
|
|
|
return 16 * i + 30;
|
|
|
|
|
@ -653,29 +656,35 @@ struct roundvals {
|
|
|
|
|
unsigned long fpscr;
|
|
|
|
|
unsigned long dpval;
|
|
|
|
|
unsigned long spval;
|
|
|
|
|
unsigned long fpscr_fir;
|
|
|
|
|
} roundvals[] = {
|
|
|
|
|
{ FPS_RN_NEAR, 0, 0 },
|
|
|
|
|
{ FPS_RN_CEIL, 0x8000000000000000, 0x8000000000000000 },
|
|
|
|
|
{ FPS_RN_NEAR, 0x402123456789abcd, 0x4021234560000000 },
|
|
|
|
|
{ FPS_RN_ZERO, 0x402123456789abcd, 0x4021234560000000 },
|
|
|
|
|
{ FPS_RN_CEIL, 0x402123456789abcd, 0x4021234580000000 },
|
|
|
|
|
{ FPS_RN_FLOOR, 0x402123456789abcd, 0x4021234560000000 },
|
|
|
|
|
{ FPS_RN_NEAR, 0x402123457689abcd, 0x4021234580000000 },
|
|
|
|
|
{ FPS_RN_ZERO, 0x402123457689abcd, 0x4021234560000000 },
|
|
|
|
|
{ FPS_RN_CEIL, 0x402123457689abcd, 0x4021234580000000 },
|
|
|
|
|
{ FPS_RN_FLOOR, 0x402123457689abcd, 0x4021234560000000 },
|
|
|
|
|
{ FPS_RN_NEAR, 0x4021234570000000, 0x4021234580000000 },
|
|
|
|
|
{ FPS_RN_NEAR, 0x4021234550000000, 0x4021234540000000 },
|
|
|
|
|
{ FPS_RN_NEAR, 0x7ff123456789abcd, 0x7ff9234560000000 },
|
|
|
|
|
{ FPS_RN_ZERO, 0x7ffa3456789abcde, 0x7ffa345660000000 },
|
|
|
|
|
{ FPS_RN_FLOOR, 0x7ff0000000000000, 0x7ff0000000000000 },
|
|
|
|
|
{ FPS_RN_NEAR, 0x47e1234550000000, 0x47e1234540000000 },
|
|
|
|
|
{ FPS_RN_NEAR, 0x47f1234550000000, 0x7ff0000000000000 },
|
|
|
|
|
{ FPS_RN_ZERO, 0x47f1234550000000, 0x47efffffe0000000 },
|
|
|
|
|
{ FPS_RN_CEIL, 0x47f1234550000000, 0x7ff0000000000000 },
|
|
|
|
|
{ FPS_RN_FLOOR, 0x47f1234550000000, 0x47efffffe0000000 },
|
|
|
|
|
{ FPS_RN_NEAR, 0x38012345b0000000, 0x38012345c0000000 },
|
|
|
|
|
{ FPS_RN_NEAR, 0x37c12345b0000000, 0x37c1234400000000 },
|
|
|
|
|
{ FPS_RN_NEAR|FPS_FI|FPS_FR, 0, 0, 0 },
|
|
|
|
|
{ FPS_RN_CEIL|FPS_FI|FPS_FR, 0x8000000000000000, 0x8000000000000000, 0 },
|
|
|
|
|
{ FPS_RN_NEAR|FPS_FR, 0x402123456789abcd, 0x4021234560000000, FPS_FI },
|
|
|
|
|
{ FPS_RN_ZERO|FPS_FR, 0x402123456789abcd, 0x4021234560000000, FPS_FI },
|
|
|
|
|
{ FPS_RN_CEIL, 0x402123456789abcd, 0x4021234580000000, FPS_FR|FPS_FI },
|
|
|
|
|
{ FPS_RN_FLOOR, 0x402123456789abcd, 0x4021234560000000, FPS_FI },
|
|
|
|
|
{ FPS_RN_NEAR, 0x402123457689abcd, 0x4021234580000000, FPS_FR|FPS_FI },
|
|
|
|
|
{ FPS_RN_ZERO|FPS_FR|FPS_FI, 0x402123457689abcd, 0x4021234560000000, FPS_FI },
|
|
|
|
|
{ FPS_RN_CEIL|FPS_FR, 0x402123457689abcd, 0x4021234580000000, FPS_FR|FPS_FI },
|
|
|
|
|
{ FPS_RN_FLOOR, 0x402123457689abcd, 0x4021234560000000, FPS_FI },
|
|
|
|
|
{ FPS_RN_NEAR, 0x4021234570000000, 0x4021234580000000, FPS_FR|FPS_FI },
|
|
|
|
|
{ FPS_RN_NEAR, 0x4021234550000000, 0x4021234540000000, FPS_FI },
|
|
|
|
|
{ FPS_RN_NEAR|FPS_FR|FPS_FI, 0x7ff123456789abcd, 0x7ff9234560000000, 0 },
|
|
|
|
|
{ FPS_RN_ZERO|FPS_FR, 0x7ffa3456789abcde, 0x7ffa345660000000, 0 },
|
|
|
|
|
{ FPS_RN_FLOOR|FPS_FR|FPS_FI, 0x7ff0000000000000, 0x7ff0000000000000, 0 },
|
|
|
|
|
{ FPS_RN_NEAR, 0x47e1234550000000, 0x47e1234540000000, FPS_FI },
|
|
|
|
|
{ FPS_RN_NEAR, 0x47f1234550000000, 0x7ff0000000000000, FPS_FR|FPS_FI },
|
|
|
|
|
{ FPS_RN_ZERO, 0x47f1234550000000, 0x47efffffe0000000, FPS_FI },
|
|
|
|
|
{ FPS_RN_CEIL, 0x47f1234550000000, 0x7ff0000000000000, FPS_FR|FPS_FI },
|
|
|
|
|
{ FPS_RN_FLOOR, 0x47f1234550000000, 0x47efffffe0000000, FPS_FI },
|
|
|
|
|
{ FPS_RN_NEAR, 0x38012345b0000000, 0x38012345c0000000, FPS_FR|FPS_FI },
|
|
|
|
|
{ FPS_RN_NEAR, 0x37c12345b0000000, 0x37c1234400000000, FPS_FI },
|
|
|
|
|
{ FPS_RN_NEAR, 0x0000008800000088, 0, FPS_FI },
|
|
|
|
|
{ FPS_RN_NEAR, 0xc2000000c2000000, 0xc2000000c0000000, FPS_FI },
|
|
|
|
|
{ FPS_RN_NEAR|FPS_OE, 0xefffffffffffffff, 0xe400000000000000, FPS_FR|FPS_FI },
|
|
|
|
|
{ FPS_RN_NEAR|FPS_OE, 0xff0000ff43434343, 0xf30000ff40000000, FPS_FI },
|
|
|
|
|
{ FPS_RN_NEAR|FPS_OE, 0xfc00fc0139fffcff, 0xf000fc0140000000, FPS_FR|FPS_FI },
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
int test8(long arg)
|
|
|
|
|
@ -696,6 +705,13 @@ int test8(long arg)
|
|
|
|
|
}
|
|
|
|
|
if (check_fprf(result, true, fpscr))
|
|
|
|
|
return i + 0x101;
|
|
|
|
|
if ((fpscr & (FPS_FR|FPS_FI)) != roundvals[i].fpscr_fir) {
|
|
|
|
|
print_string("\r\n");
|
|
|
|
|
print_hex(i, 4, " ");
|
|
|
|
|
print_hex(fpscr, 8, " ");
|
|
|
|
|
print_hex(roundvals[i].fpscr_fir, 8, " ");
|
|
|
|
|
return i + 0x201;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
@ -740,6 +756,8 @@ struct cvtivals {
|
|
|
|
|
{ 0x7ff923456789abcd, 0x8000000000000000, 0, 0x80000000, 0, { 1, 1, 1, 1 } },
|
|
|
|
|
{ 0xfff923456789abcd, 0x8000000000000000, 0, 0x80000000, 0, { 1, 1, 1, 1 } },
|
|
|
|
|
{ 0xbfd123456789abcd, 0, 0, 0, 0, {0, 0, 0, 0} },
|
|
|
|
|
{ 0x41effffffff00081, 0x100000000, 0x100000000, 0x7fffffff, 0xffffffff, { 0, 0, 1, 1 } },
|
|
|
|
|
{ 0xc1e0000000000000, 0xffffffff80000000, 0x0000000000000000, 0x80000000, 0x00000000, { 0, 1, 0, 1 } },
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
#define GET_VXCVI() ((get_fpscr() >> 8) & 1)
|
|
|
|
|
@ -814,6 +832,7 @@ struct cvtivals cvtizvals[] = {
|
|
|
|
|
{ 0xfff0000000000000, 0x8000000000000000, 0, 0x80000000, 0, { 1, 1, 1, 1 } },
|
|
|
|
|
{ 0x7ff923456789abcd, 0x8000000000000000, 0, 0x80000000, 0, { 1, 1, 1, 1 } },
|
|
|
|
|
{ 0xfff923456789abcd, 0x8000000000000000, 0, 0x80000000, 0, { 1, 1, 1, 1 } },
|
|
|
|
|
{ 0xc1e0000000000000, 0xffffffff80000000, 0x0000000000000000, 0x80000000, 0x00000000, { 0, 1, 0, 1 } },
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
int test10(long arg)
|
|
|
|
|
@ -959,51 +978,53 @@ struct addvals {
|
|
|
|
|
unsigned long val_b;
|
|
|
|
|
unsigned long sum;
|
|
|
|
|
unsigned long diff;
|
|
|
|
|
unsigned long fpscr;
|
|
|
|
|
} addvals[] = {
|
|
|
|
|
{ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 },
|
|
|
|
|
{ 0x8000000000000000, 0x8000000000000000, 0x8000000000000000, 0x0000000000000000 },
|
|
|
|
|
{ 0x3fdfffffffffffff, 0x0000000000000000, 0x3fdfffffffffffff, 0x3fdfffffffffffff },
|
|
|
|
|
{ 0x3ff0000000000000, 0x3ff0000000000000, 0x4000000000000000, 0x0000000000000000 },
|
|
|
|
|
{ 0xbff0000000000000, 0xbff0000000000000, 0xc000000000000000, 0x0000000000000000 },
|
|
|
|
|
{ 0x402123456789abcd, 0x4021000000000000, 0x403111a2b3c4d5e6, 0x3fb1a2b3c4d5e680 },
|
|
|
|
|
{ 0x4061200000000000, 0x406123456789abcd, 0x407121a2b3c4d5e6, 0xbfba2b3c4d5e6800 },
|
|
|
|
|
{ 0x4061230000000000, 0x3fa4560000000000, 0x4061244560000000, 0x406121baa0000000 },
|
|
|
|
|
{ 0xc061230000000000, 0x3fa4560000000000, 0xc06121baa0000000, 0xc061244560000000 },
|
|
|
|
|
{ 0x4061230000000000, 0xbfa4560000000000, 0x406121baa0000000, 0x4061244560000000 },
|
|
|
|
|
{ 0xc061230000000000, 0xbfa4560000000000, 0xc061244560000000, 0xc06121baa0000000 },
|
|
|
|
|
{ 0x3fa1230000000000, 0x4064560000000000, 0x4064571230000000, 0xc06454edd0000000 },
|
|
|
|
|
{ 0xbfa1230000000000, 0x4064560000000000, 0x406454edd0000000, 0xc064571230000000 },
|
|
|
|
|
{ 0x3fa1230000000000, 0xc064560000000000, 0xc06454edd0000000, 0x4064571230000000 },
|
|
|
|
|
{ 0xbfa1230000000000, 0xc064560000000000, 0xc064571230000000, 0x406454edd0000000 },
|
|
|
|
|
{ 0x6780000000000001, 0x6470000000000000, 0x6780000000000009, 0x677ffffffffffff2 },
|
|
|
|
|
{ 0x6780000000000001, 0x6460000000000000, 0x6780000000000005, 0x677ffffffffffffa },
|
|
|
|
|
{ 0x6780000000000001, 0x6450000000000000, 0x6780000000000003, 0x677ffffffffffffe },
|
|
|
|
|
{ 0x6780000000000001, 0x6440000000000000, 0x6780000000000002, 0x6780000000000000 },
|
|
|
|
|
{ 0x7ff8888888888888, 0x7ff9999999999999, 0x7ff8888888888888, 0x7ff8888888888888 },
|
|
|
|
|
{ 0xfff8888888888888, 0x7ff9999999999999, 0xfff8888888888888, 0xfff8888888888888 },
|
|
|
|
|
{ 0x7ff8888888888888, 0x7ff0000000000000, 0x7ff8888888888888, 0x7ff8888888888888 },
|
|
|
|
|
{ 0x7ff8888888888888, 0x0000000000000000, 0x7ff8888888888888, 0x7ff8888888888888 },
|
|
|
|
|
{ 0x7ff8888888888888, 0x0001111111111111, 0x7ff8888888888888, 0x7ff8888888888888 },
|
|
|
|
|
{ 0x7ff8888888888888, 0x3ff0000000000000, 0x7ff8888888888888, 0x7ff8888888888888 },
|
|
|
|
|
{ 0x7ff0000000000000, 0x7ff9999999999999, 0x7ff9999999999999, 0x7ff9999999999999 },
|
|
|
|
|
{ 0x7ff0000000000000, 0x7ff0000000000000, 0x7ff0000000000000, 0x7ff8000000000000 },
|
|
|
|
|
{ 0x7ff0000000000000, 0xfff0000000000000, 0x7ff8000000000000, 0x7ff0000000000000 },
|
|
|
|
|
{ 0x7ff0000000000000, 0x0000000000000000, 0x7ff0000000000000, 0x7ff0000000000000 },
|
|
|
|
|
{ 0x7ff0000000000000, 0x8000000000000000, 0x7ff0000000000000, 0x7ff0000000000000 },
|
|
|
|
|
{ 0x7ff0000000000000, 0x8002222222222222, 0x7ff0000000000000, 0x7ff0000000000000 },
|
|
|
|
|
{ 0x7ff0000000000000, 0xc002222222222222, 0x7ff0000000000000, 0x7ff0000000000000 },
|
|
|
|
|
{ 0x0000000000000000, 0x7ff9999999999999, 0x7ff9999999999999, 0x7ff9999999999999 },
|
|
|
|
|
{ 0x0000000000000000, 0x7ff0000000000000, 0x7ff0000000000000, 0xfff0000000000000 },
|
|
|
|
|
{ 0x8000000000000000, 0x7ff0000000000000, 0x7ff0000000000000, 0xfff0000000000000 },
|
|
|
|
|
{ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 },
|
|
|
|
|
{ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 },
|
|
|
|
|
{ 0x8000000000000000, 0x8000000000000000, 0x8000000000000000, 0x0000000000000000 },
|
|
|
|
|
{ 0x8000000000000000, 0x8000000000000000, 0x8000000000000000, 0x0000000000000000 },
|
|
|
|
|
{ 0x8002222222222222, 0x0001111111111111, 0x8001111111111111, 0x8003333333333333 },
|
|
|
|
|
{ 0x0000022222222222, 0x0000111111111111, 0x0000133333333333, 0x80000eeeeeeeeeef },
|
|
|
|
|
{ 0x401ffffffbfffefe, 0x406b8265196bd89e, 0x406c8265194bd896, 0xc06a8265198bd8a6 },
|
|
|
|
|
{ 0x4030020000000004, 0xbf110001ffffffff, 0x403001fbbfff8004, 0x4030020440008004 },
|
|
|
|
|
{ 0x3fdfffffffffffff, 0x3fe0000000000000, 0x3ff0000000000000, 0xbc90000000000000 },
|
|
|
|
|
{ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, FPS_RN_NEAR },
|
|
|
|
|
{ 0x8000000000000000, 0x8000000000000000, 0x8000000000000000, 0x0000000000000000, FPS_RN_NEAR },
|
|
|
|
|
{ 0x3fdfffffffffffff, 0x0000000000000000, 0x3fdfffffffffffff, 0x3fdfffffffffffff, FPS_RN_NEAR },
|
|
|
|
|
{ 0x3ff0000000000000, 0x3ff0000000000000, 0x4000000000000000, 0x0000000000000000, FPS_RN_NEAR },
|
|
|
|
|
{ 0xbff0000000000000, 0xbff0000000000000, 0xc000000000000000, 0x0000000000000000, FPS_RN_NEAR },
|
|
|
|
|
{ 0x402123456789abcd, 0x4021000000000000, 0x403111a2b3c4d5e6, 0x3fb1a2b3c4d5e680, FPS_RN_NEAR },
|
|
|
|
|
{ 0x4061200000000000, 0x406123456789abcd, 0x407121a2b3c4d5e6, 0xbfba2b3c4d5e6800, FPS_RN_NEAR },
|
|
|
|
|
{ 0x4061230000000000, 0x3fa4560000000000, 0x4061244560000000, 0x406121baa0000000, FPS_RN_NEAR },
|
|
|
|
|
{ 0xc061230000000000, 0x3fa4560000000000, 0xc06121baa0000000, 0xc061244560000000, FPS_RN_NEAR },
|
|
|
|
|
{ 0x4061230000000000, 0xbfa4560000000000, 0x406121baa0000000, 0x4061244560000000, FPS_RN_NEAR },
|
|
|
|
|
{ 0xc061230000000000, 0xbfa4560000000000, 0xc061244560000000, 0xc06121baa0000000, FPS_RN_NEAR },
|
|
|
|
|
{ 0x3fa1230000000000, 0x4064560000000000, 0x4064571230000000, 0xc06454edd0000000, FPS_RN_NEAR },
|
|
|
|
|
{ 0xbfa1230000000000, 0x4064560000000000, 0x406454edd0000000, 0xc064571230000000, FPS_RN_NEAR },
|
|
|
|
|
{ 0x3fa1230000000000, 0xc064560000000000, 0xc06454edd0000000, 0x4064571230000000, FPS_RN_NEAR },
|
|
|
|
|
{ 0xbfa1230000000000, 0xc064560000000000, 0xc064571230000000, 0x406454edd0000000, FPS_RN_NEAR },
|
|
|
|
|
{ 0x6780000000000001, 0x6470000000000000, 0x6780000000000009, 0x677ffffffffffff2, FPS_RN_NEAR },
|
|
|
|
|
{ 0x6780000000000001, 0x6460000000000000, 0x6780000000000005, 0x677ffffffffffffa, FPS_RN_NEAR },
|
|
|
|
|
{ 0x6780000000000001, 0x6450000000000000, 0x6780000000000003, 0x677ffffffffffffe, FPS_RN_NEAR },
|
|
|
|
|
{ 0x6780000000000001, 0x6440000000000000, 0x6780000000000002, 0x6780000000000000, FPS_RN_NEAR },
|
|
|
|
|
{ 0x7ff8888888888888, 0x7ff9999999999999, 0x7ff8888888888888, 0x7ff8888888888888, FPS_RN_NEAR },
|
|
|
|
|
{ 0xfff8888888888888, 0x7ff9999999999999, 0xfff8888888888888, 0xfff8888888888888, FPS_RN_NEAR },
|
|
|
|
|
{ 0x7ff8888888888888, 0x7ff0000000000000, 0x7ff8888888888888, 0x7ff8888888888888, FPS_RN_NEAR },
|
|
|
|
|
{ 0x7ff8888888888888, 0x0000000000000000, 0x7ff8888888888888, 0x7ff8888888888888, FPS_RN_NEAR },
|
|
|
|
|
{ 0x7ff8888888888888, 0x0001111111111111, 0x7ff8888888888888, 0x7ff8888888888888, FPS_RN_NEAR },
|
|
|
|
|
{ 0x7ff8888888888888, 0x3ff0000000000000, 0x7ff8888888888888, 0x7ff8888888888888, FPS_RN_NEAR },
|
|
|
|
|
{ 0x7ff0000000000000, 0x7ff9999999999999, 0x7ff9999999999999, 0x7ff9999999999999, FPS_RN_NEAR },
|
|
|
|
|
{ 0x7ff0000000000000, 0x7ff0000000000000, 0x7ff0000000000000, 0x7ff8000000000000, FPS_RN_NEAR },
|
|
|
|
|
{ 0x7ff0000000000000, 0xfff0000000000000, 0x7ff8000000000000, 0x7ff0000000000000, FPS_RN_NEAR },
|
|
|
|
|
{ 0x7ff0000000000000, 0x0000000000000000, 0x7ff0000000000000, 0x7ff0000000000000, FPS_RN_NEAR },
|
|
|
|
|
{ 0x7ff0000000000000, 0x8000000000000000, 0x7ff0000000000000, 0x7ff0000000000000, FPS_RN_NEAR },
|
|
|
|
|
{ 0x7ff0000000000000, 0x8002222222222222, 0x7ff0000000000000, 0x7ff0000000000000, FPS_RN_NEAR },
|
|
|
|
|
{ 0x7ff0000000000000, 0xc002222222222222, 0x7ff0000000000000, 0x7ff0000000000000, FPS_RN_NEAR },
|
|
|
|
|
{ 0x0000000000000000, 0x7ff9999999999999, 0x7ff9999999999999, 0x7ff9999999999999, FPS_RN_NEAR },
|
|
|
|
|
{ 0x0000000000000000, 0x7ff0000000000000, 0x7ff0000000000000, 0xfff0000000000000, FPS_RN_NEAR },
|
|
|
|
|
{ 0x8000000000000000, 0x7ff0000000000000, 0x7ff0000000000000, 0xfff0000000000000, FPS_RN_NEAR },
|
|
|
|
|
{ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, FPS_RN_NEAR },
|
|
|
|
|
{ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, FPS_RN_NEAR },
|
|
|
|
|
{ 0x8000000000000000, 0x8000000000000000, 0x8000000000000000, 0x0000000000000000, FPS_RN_NEAR },
|
|
|
|
|
{ 0x8000000000000000, 0x8000000000000000, 0x8000000000000000, 0x0000000000000000, FPS_RN_NEAR },
|
|
|
|
|
{ 0x8002222222222222, 0x0001111111111111, 0x8001111111111111, 0x8003333333333333, FPS_RN_NEAR },
|
|
|
|
|
{ 0x0000022222222222, 0x0000111111111111, 0x0000133333333333, 0x80000eeeeeeeeeef, FPS_RN_NEAR },
|
|
|
|
|
{ 0x401ffffffbfffefe, 0x406b8265196bd89e, 0x406c8265194bd896, 0xc06a8265198bd8a6, FPS_RN_NEAR },
|
|
|
|
|
{ 0x4030020000000004, 0xbf110001ffffffff, 0x403001fbbfff8004, 0x4030020440008004, FPS_RN_NEAR },
|
|
|
|
|
{ 0x3fdfffffffffffff, 0x3fe0000000000000, 0x3ff0000000000000, 0xbc90000000000000, FPS_RN_NEAR },
|
|
|
|
|
{ 0x001000100010000f, 0x00000000000000ff, 0x001000100010010e, 0x00100010000fff10, FPS_RN_CEIL },
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
int test13(long arg)
|
|
|
|
|
@ -1013,8 +1034,8 @@ int test13(long arg)
|
|
|
|
|
struct addvals *vp = addvals;
|
|
|
|
|
unsigned long fpscr;
|
|
|
|
|
|
|
|
|
|
set_fpscr(FPS_RN_NEAR);
|
|
|
|
|
for (i = 0; i < sizeof(addvals) / sizeof(addvals[0]); ++i, ++vp) {
|
|
|
|
|
set_fpscr(vp->fpscr);
|
|
|
|
|
asm("lfd 5,0(%0); lfd 6,8(%0); fadd 7,5,6; fsub 8,5,6; stfd 7,0(%1); stfd 8,8(%1)"
|
|
|
|
|
: : "b" (&vp->val_a), "b" (results) : "memory");
|
|
|
|
|
fpscr = get_fpscr();
|
|
|
|
|
@ -1491,110 +1512,123 @@ struct fmavals {
|
|
|
|
|
unsigned long ra;
|
|
|
|
|
unsigned long rc;
|
|
|
|
|
unsigned long rb;
|
|
|
|
|
unsigned long fpscr;
|
|
|
|
|
unsigned long fma;
|
|
|
|
|
unsigned long fms;
|
|
|
|
|
unsigned long nfma;
|
|
|
|
|
unsigned long nfms;
|
|
|
|
|
} fmavals[] = {
|
|
|
|
|
/* +0 * +0 +- +0 -> +0, +0, -0, -0 */
|
|
|
|
|
{ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
|
|
|
|
|
{ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, FPS_RN_NEAR,
|
|
|
|
|
0x0000000000000000, 0x0000000000000000, 0x8000000000000000, 0x8000000000000000 },
|
|
|
|
|
/* +0 * NaNC +- +0 -> NaNC, NaNC, NaNC, NaNC */
|
|
|
|
|
{ 0x0000000000000000, 0x7ffc000000000000, 0x0000000000000000,
|
|
|
|
|
{ 0x0000000000000000, 0x7ffc000000000000, 0x0000000000000000, FPS_RN_NEAR,
|
|
|
|
|
0x7ffc000000000000, 0x7ffc000000000000, 0x7ffc000000000000, 0x7ffc000000000000 },
|
|
|
|
|
/* +0 * NaNC +- NaNB -> NaNB, NaNB, NaNB, NaNB */
|
|
|
|
|
{ 0x0000000000000000, 0x7ffc000000000000, 0x7ffb000000000000,
|
|
|
|
|
{ 0x0000000000000000, 0x7ffc000000000000, 0x7ffb000000000000, FPS_RN_NEAR,
|
|
|
|
|
0x7ffb000000000000, 0x7ffb000000000000, 0x7ffb000000000000, 0x7ffb000000000000 },
|
|
|
|
|
/* NaNA * NaNC +- NaNB -> NaNA, NaNA, NaNA, NaNA */
|
|
|
|
|
{ 0x7ffa000000000000, 0x7ffc000000000000, 0x7ffb000000000000,
|
|
|
|
|
{ 0x7ffa000000000000, 0x7ffc000000000000, 0x7ffb000000000000, FPS_RN_NEAR,
|
|
|
|
|
0x7ffa000000000000, 0x7ffa000000000000, 0x7ffa000000000000, 0x7ffa000000000000 },
|
|
|
|
|
/* +1.0 * -0 +- +finite B -> +B, -B, -B, +B */
|
|
|
|
|
{ 0x3ff0000000000000, 0x8000000000000000, 0x678123456789abcd,
|
|
|
|
|
{ 0x3ff0000000000000, 0x8000000000000000, 0x678123456789abcd, FPS_RN_NEAR,
|
|
|
|
|
0x678123456789abcd, 0xe78123456789abcd, 0xe78123456789abcd, 0x678123456789abcd },
|
|
|
|
|
/* +1.0 * -1.0 +- (B = +3.818e+190) -> +B, -B, -B, +B */
|
|
|
|
|
{ 0x3ff0000000000000, 0xbff0000000000000, 0x678123456789abcd,
|
|
|
|
|
{ 0x3ff0000000000000, 0xbff0000000000000, 0x678123456789abcd, FPS_RN_NEAR,
|
|
|
|
|
0x678123456789abcd, 0xe78123456789abcd, 0xe78123456789abcd, 0x678123456789abcd },
|
|
|
|
|
/* +inf * -1.0 +- +finite B -> -inf, -inf, +inf, +inf */
|
|
|
|
|
{ 0x7ff0000000000000, 0xbff0000000000000, 0x678123456789abcd,
|
|
|
|
|
{ 0x7ff0000000000000, 0xbff0000000000000, 0x678123456789abcd, FPS_RN_NEAR,
|
|
|
|
|
0xfff0000000000000, 0xfff0000000000000, 0x7ff0000000000000, 0x7ff0000000000000 },
|
|
|
|
|
/* +inf * +0 +- +finite B -> NaNQ, NaNQ, NaNQ, NaNQ */
|
|
|
|
|
{ 0x7ff0000000000000, 0x0000000000000000, 0x678123456789abcd,
|
|
|
|
|
{ 0x7ff0000000000000, 0x0000000000000000, 0x678123456789abcd, FPS_RN_NEAR,
|
|
|
|
|
0x7ff8000000000000, 0x7ff8000000000000, 0x7ff8000000000000, 0x7ff8000000000000 },
|
|
|
|
|
/* +1.0 * +1.0 +- 1.00000012 -> +2.00000012, +1.2e-7, -2.00000012, -1.2e-7 */
|
|
|
|
|
{ 0x3ff0000000000000, 0x3ff0000000000000, 0x3ff0000020000000,
|
|
|
|
|
{ 0x3ff0000000000000, 0x3ff0000000000000, 0x3ff0000020000000, FPS_RN_NEAR,
|
|
|
|
|
0x4000000010000000, 0xbe80000000000000, 0xc000000010000000, 0x3e80000000000000 },
|
|
|
|
|
/* +(1 + 2^-52) * +(1 + 2^-52) +- +1.0 -> +(2 + 2^-51), +2^-51, -(2 + 2^-51), -2^-51 */
|
|
|
|
|
{ 0x3ff0000000000001, 0x3ff0000000000001, 0x3ff0000000000000,
|
|
|
|
|
{ 0x3ff0000000000001, 0x3ff0000000000001, 0x3ff0000000000000, FPS_RN_NEAR,
|
|
|
|
|
0x4000000000000001, 0x3cc0000000000000, 0xc000000000000001, 0xbcc0000000000000 },
|
|
|
|
|
/* +(1 + 3*2^-52) * +(1 + 2^-51) +- +1.0 -> +(2 + 2^-50), +5 * 2^-52 + 2^-101, -, - */
|
|
|
|
|
{ 0x3ff0000000000003, 0x3ff0000000000002, 0x3ff0000000000000,
|
|
|
|
|
0x4000000000000002, 0x3cd4000000000002, 0xc000000000000002, 0xbcd4000000000002 },
|
|
|
|
|
/* +(1 + 3*2^-52) * +(1 + 2^-51) +- +1.0 -> +(2 + 3*2^-51), +5 * 2^-52 + 2^-101, -, - */
|
|
|
|
|
{ 0x3ff0000000000003, 0x3ff0000000000002, 0x3ff0000000000000, FPS_RN_NEAR,
|
|
|
|
|
0x4000000000000003, 0x3cd4000000000002, 0xc000000000000003, 0xbcd4000000000002 },
|
|
|
|
|
/* +2.443e-77 * 2.828 +- 6.909e-77 -> -1.402e-93, +1.382e-76, +1.402e-93, -1.382e-76 */
|
|
|
|
|
{ 0x3006a09e667f3bcc, 0x4006a09e667f3bcd, 0xb020000000000000,
|
|
|
|
|
{ 0x3006a09e667f3bcc, 0x4006a09e667f3bcd, 0xb020000000000000, FPS_RN_NEAR,
|
|
|
|
|
0xaca765753908cd20, 0x3030000000000000, 0x2ca765753908cd20, 0xb030000000000000 },
|
|
|
|
|
/* +2.443e-77 * 2.828 +- 6.909e-77 -> +9.446e-93, +1.382e-76, -9.446e-93, -1.382e-76 */
|
|
|
|
|
{ 0x3006a09e667f3bcd, 0x4006a09e667f3bcd, 0xb020000000000000,
|
|
|
|
|
{ 0x3006a09e667f3bcd, 0x4006a09e667f3bcd, 0xb020000000000000, FPS_RN_NEAR,
|
|
|
|
|
0x2cd3b3efbf5e2229, 0x3030000000000000, 0xacd3b3efbf5e2229, 0xb030000000000000 },
|
|
|
|
|
/* +2.443e-77 * 2.828 +- -1.1055e-75 -> -1.0364e-75, +1.1746e-75, +1.0364e-75, -1.1746e-75 */
|
|
|
|
|
{ 0x3006a09e667f3bcc, 0x4006a09e667f3bcd, 0xb060003450000000,
|
|
|
|
|
{ 0x3006a09e667f3bcc, 0x4006a09e667f3bcd, 0xb060003450000000, FPS_RN_NEAR,
|
|
|
|
|
0xb05e0068a0000000, 0x3061003450000000, 0x305e0068a0000000, 0xb061003450000000 },
|
|
|
|
|
/* +2 * +3 +- 3 -> +9, +3, -9, -3 */
|
|
|
|
|
{ 0x4000000000000000, 0x4008000000000000, 0x4008000000000000,
|
|
|
|
|
{ 0x4000000000000000, 0x4008000000000000, 0x4008000000000000, FPS_RN_NEAR,
|
|
|
|
|
0x4022000000000000, 0x4008000000000000, 0xc022000000000000, 0xc008000000000000 },
|
|
|
|
|
/* +2 * +3 +- 5 -> +11, +1, -11, -1 */
|
|
|
|
|
{ 0x4000000000000000, 0x4008000000000000, 0x4014000000000000,
|
|
|
|
|
{ 0x4000000000000000, 0x4008000000000000, 0x4014000000000000, FPS_RN_NEAR,
|
|
|
|
|
0x4026000000000000, 0x3ff0000000000000, 0xc026000000000000, 0xbff0000000000000 },
|
|
|
|
|
/* +2 * +3 +- 7 -> +13, -1, -13, +1 */
|
|
|
|
|
{ 0x4000000000000000, 0x4008000000000000, 0x401c000000000000,
|
|
|
|
|
{ 0x4000000000000000, 0x4008000000000000, 0x401c000000000000, FPS_RN_NEAR,
|
|
|
|
|
0x402a000000000000, 0xbff0000000000000, 0xc02a000000000000, 0x3ff0000000000000 },
|
|
|
|
|
/* +2 * +3 +- 9 -> +15, -3, -15, +3 */
|
|
|
|
|
{ 0x4000000000000000, 0x4008000000000000, 0x4022000000000000,
|
|
|
|
|
{ 0x4000000000000000, 0x4008000000000000, 0x4022000000000000, FPS_RN_NEAR,
|
|
|
|
|
0x402e000000000000, 0xc008000000000000, 0xc02e000000000000, 0x4008000000000000 },
|
|
|
|
|
/* +2 * +3 +- -3 -> +3, +9, -3, -9 */
|
|
|
|
|
{ 0x4000000000000000, 0x4008000000000000, 0xc008000000000000,
|
|
|
|
|
{ 0x4000000000000000, 0x4008000000000000, 0xc008000000000000, FPS_RN_NEAR,
|
|
|
|
|
0x4008000000000000, 0x4022000000000000, 0xc008000000000000, 0xc022000000000000 },
|
|
|
|
|
/* +2 * +3 +- -5 -> +1, +11, -1, -11 */
|
|
|
|
|
{ 0x4000000000000000, 0x4008000000000000, 0xc014000000000000,
|
|
|
|
|
{ 0x4000000000000000, 0x4008000000000000, 0xc014000000000000, FPS_RN_NEAR,
|
|
|
|
|
0x3ff0000000000000, 0x4026000000000000, 0xbff0000000000000, 0xc026000000000000 },
|
|
|
|
|
/* +2 * +3 +- -7 -> -1, +13, +1, -13 */
|
|
|
|
|
{ 0x4000000000000000, 0x4008000000000000, 0xc01c000000000000,
|
|
|
|
|
{ 0x4000000000000000, 0x4008000000000000, 0xc01c000000000000, FPS_RN_NEAR,
|
|
|
|
|
0xbff0000000000000, 0x402a000000000000, 0x3ff0000000000000, 0xc02a000000000000 },
|
|
|
|
|
/* +2 * +3 +- -9 -> -3, +15, +3, -15 */
|
|
|
|
|
{ 0x4000000000000000, 0x4008000000000000, 0xc022000000000000,
|
|
|
|
|
{ 0x4000000000000000, 0x4008000000000000, 0xc022000000000000, FPS_RN_NEAR,
|
|
|
|
|
0xc008000000000000, 0x402e000000000000, 0x4008000000000000, 0xc02e000000000000 },
|
|
|
|
|
/* +2 * -3 +- 3 -> -3, -9, +3, +9 */
|
|
|
|
|
{ 0x4000000000000000, 0xc008000000000000, 0x4008000000000000,
|
|
|
|
|
{ 0x4000000000000000, 0xc008000000000000, 0x4008000000000000, FPS_RN_NEAR,
|
|
|
|
|
0xc008000000000000, 0xc022000000000000, 0x4008000000000000, 0x4022000000000000 },
|
|
|
|
|
/* +2 * -3 +- 5 -> -1, -11, +1, +11 */
|
|
|
|
|
{ 0x4000000000000000, 0xc008000000000000, 0x4014000000000000,
|
|
|
|
|
{ 0x4000000000000000, 0xc008000000000000, 0x4014000000000000, FPS_RN_NEAR,
|
|
|
|
|
0xbff0000000000000, 0xc026000000000000, 0x3ff0000000000000, 0x4026000000000000 },
|
|
|
|
|
/* +2 * -3 +- 7 -> +1, -13, -1, +13 */
|
|
|
|
|
{ 0x4000000000000000, 0xc008000000000000, 0x401c000000000000,
|
|
|
|
|
{ 0x4000000000000000, 0xc008000000000000, 0x401c000000000000, FPS_RN_NEAR,
|
|
|
|
|
0x3ff0000000000000, 0xc02a000000000000, 0xbff0000000000000, 0x402a000000000000 },
|
|
|
|
|
/* +2 * -3 +- 9 -> +3, -15, -3, +15 */
|
|
|
|
|
{ 0x4000000000000000, 0xc008000000000000, 0x4022000000000000,
|
|
|
|
|
{ 0x4000000000000000, 0xc008000000000000, 0x4022000000000000, FPS_RN_NEAR,
|
|
|
|
|
0x4008000000000000, 0xc02e000000000000, 0xc008000000000000, 0x402e000000000000 },
|
|
|
|
|
/* -2 * +3 +- -3 -> -9, -3, +9, +3 */
|
|
|
|
|
{ 0xc000000000000000, 0x4008000000000000, 0xc008000000000000,
|
|
|
|
|
{ 0xc000000000000000, 0x4008000000000000, 0xc008000000000000, FPS_RN_NEAR,
|
|
|
|
|
0xc022000000000000, 0xc008000000000000, 0x4022000000000000, 0x4008000000000000 },
|
|
|
|
|
/* -2 * +3 +- -5 -> -11, -1, +11, +1 */
|
|
|
|
|
{ 0xc000000000000000, 0x4008000000000000, 0xc014000000000000,
|
|
|
|
|
{ 0xc000000000000000, 0x4008000000000000, 0xc014000000000000, FPS_RN_NEAR,
|
|
|
|
|
0xc026000000000000, 0xbff0000000000000, 0x4026000000000000, 0x3ff0000000000000 },
|
|
|
|
|
/* -2 * +3 +- -7 -> -13, +1, +13, -1 */
|
|
|
|
|
{ 0xc000000000000000, 0x4008000000000000, 0xc01c000000000000,
|
|
|
|
|
{ 0xc000000000000000, 0x4008000000000000, 0xc01c000000000000, FPS_RN_NEAR,
|
|
|
|
|
0xc02a000000000000, 0x3ff0000000000000, 0x402a000000000000, 0xbff0000000000000 },
|
|
|
|
|
/* -2 * +3 +- -9 -> -15, +3, +15, -3 */
|
|
|
|
|
{ 0xc000000000000000, 0x4008000000000000, 0xc022000000000000,
|
|
|
|
|
{ 0xc000000000000000, 0x4008000000000000, 0xc022000000000000, FPS_RN_NEAR,
|
|
|
|
|
0xc02e000000000000, 0x4008000000000000, 0x402e000000000000, 0xc008000000000000 },
|
|
|
|
|
/* -2 * +3 +- +0 -> -6, -6, +6, +6 */
|
|
|
|
|
{ 0xc000000000000000, 0x4008000000000000, 0x0000000000000000,
|
|
|
|
|
{ 0xc000000000000000, 0x4008000000000000, 0x0000000000000000, FPS_RN_NEAR,
|
|
|
|
|
0xc018000000000000, 0xc018000000000000, 0x4018000000000000, 0x4018000000000000 },
|
|
|
|
|
/* +2 * -3 +- -0 -> -6, -6, +6, +6 */
|
|
|
|
|
{ 0x4000000000000000, 0xc008000000000000, 0x8000000000000000,
|
|
|
|
|
{ 0x4000000000000000, 0xc008000000000000, 0x8000000000000000, FPS_RN_NEAR,
|
|
|
|
|
0xc018000000000000, 0xc018000000000000, 0x4018000000000000, 0x4018000000000000 },
|
|
|
|
|
/* 2^-1026 * (1.5 * 2^1023) +- -0 -> (1.5 * 2^-3), ditto, -ditto, -ditto */
|
|
|
|
|
{ 0x0001000000000000, 0x7fe8000000000000, 0x8000000000000000,
|
|
|
|
|
{ 0x0001000000000000, 0x7fe8000000000000, 0x8000000000000000, FPS_RN_NEAR,
|
|
|
|
|
0x3fc8000000000000, 0x3fc8000000000000, 0xbfc8000000000000, 0xbfc8000000000000 },
|
|
|
|
|
/* 1 * -1 + tiny -> -1 + delta, -1, 1 - delta, 1 */
|
|
|
|
|
{ 0x3ff0000000000000, 0xbff0000000000000, 0x00000000b2200102, FPS_RN_CEIL,
|
|
|
|
|
0xbfefffffffffffff, 0xbff0000000000000, 0x3fefffffffffffff, 0x3ff0000000000000 },
|
|
|
|
|
/* from random exec tests */
|
|
|
|
|
{ 0x43eff79000000000, 0x00000000000000ff, 0x0000000000000081, FPS_RN_CEIL,
|
|
|
|
|
0x014fd79870000001, 0x014fd79870000000, 0x814fd79870000001, 0x814fd79870000000 },
|
|
|
|
|
{ 0x00000000ffffffff, 0x1fc771af627f62ab, 0x8000000000000000, FPS_RN_ZERO,
|
|
|
|
|
0x0000000000000000, 0x0000000000000000, 0x8000000000000000, 0x8000000000000000 },
|
|
|
|
|
{ 0x41efffffffe00000, 0xc1efffffffe00000, 0x43f0000000000000, FPS_RN_CEIL,
|
|
|
|
|
0x41fffffffff00000, 0xc3ffffffffe00000, 0xc1fffffffff00000, 0x43ffffffffe00000 },
|
|
|
|
|
{ 0x3ff0000000000000, 0x000060fbffffefc1, 0x000060fbffffefc1, FPS_RN_NEAR,
|
|
|
|
|
0x0000c1f7ffffdf82, 0x0000000000000000, 0x8000c1f7ffffdf82, 0x8000000000000000 },
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
int test23(long arg)
|
|
|
|
|
@ -1604,8 +1638,8 @@ int test23(long arg)
|
|
|
|
|
struct fmavals *vp = fmavals;
|
|
|
|
|
unsigned long fpscr;
|
|
|
|
|
|
|
|
|
|
set_fpscr(FPS_RN_NEAR);
|
|
|
|
|
for (i = 0; i < sizeof(fmavals) / sizeof(fmavals[0]); ++i, ++vp) {
|
|
|
|
|
set_fpscr(vp->fpscr);
|
|
|
|
|
asm("lfd 6,0(%0); lfd 7,8(%0); lfd 8,16(%0); fmadd 0,6,7,8; stfd 0,0(%1)"
|
|
|
|
|
: : "b" (&vp->ra), "b" (results) : "memory");
|
|
|
|
|
asm("fmsub 1,6,7,8; fnmadd 2,6,7,8; fnmsub 3,6,7,8; stfd 1,8(%0); stfd 2,16(%0); stfd 3,24(%0)"
|
|
|
|
|
|