int test4(long arg)
{
- unsigned long fsi, fpscr;
+ unsigned long fsi, fso, fpscr;
long i;
- unsigned long cr;
+ unsigned long cr, mask;
/* check we can do basic mtfsf and mffs */
i = 1;
asm("mffs. 6; mfcr %0" : "=r" (cr) : : "cr1");
if (((cr >> 24) & 0xf) != ((fpscr >> 28) & 0x1f))
return 16 * i + 18;
+ asm("mffsce 12; stfd 12,0(%0)" : : "b" (&fso) : "memory");
+ if (fso != fpscr)
+ return 16 * i + 19;
+ fpscr = fpscr_eval(fpscr & ~0xf8);
+ if (get_fpscr() != fpscr)
+ return 16 * i + 20;
+ asm("lfd 7,0(%0); mtfsf 0xff,7,0,0" : : "b" (&fsi));
+ fpscr = fpscr_eval(fsi);
+ fsi = ~fsi;
+ asm("lfd 14,0(%0); mffscrn 15,14; stfd 15,0(%1)"
+ : : "b" (&fsi), "b" (&fso) : "memory");
+ if (fso != (fpscr & 0xff))
+ return 16 * i + 21;
+ fpscr = (fpscr & ~3) | (fsi & 3);
+ if (get_fpscr() != fpscr)
+ return 16 * i + 22;
+ fso = ~fso;
+ asm("mffscrni 16,1; stfd 16,0(%0)" : : "b" (&fso) : "memory");
+ if (fso != (fpscr & 0xff))
+ return 16 * i + 23;
+ fpscr = (fpscr & ~3) | 1;
+ if (get_fpscr() != fpscr)
+ return 16 * i + 24;
+ asm("mffsl 17; stfd 17,0(%0)" : : "b" (&fso) : "memory");
+ mask = ((1 << (63-45+1)) - (1 << (63-51))) | ((1 << (63-56+1)) - (1 << (63-63)));
+ if (fso != (fpscr & mask))
+ return 16 * i + 25;
+ asm("mcrfs 0,3; mcrfs 7,0; mfcr %0" : "=r" (cr) : : "cr0", "cr7");
+ fso = fpscr_eval(fpscr & ~0x80000);
+ if (((cr >> 28) & 0xf) != ((fpscr >> 16) & 0xf) ||
+ ((cr >> 0) & 0xf) != ((fso >> 28) & 0xf))
+ return 16 * i + 26;
+ fpscr = fso & 0x6fffffff;
+ asm("mtfsfi 0,7,0");
+ fpscr = fpscr_eval((fpscr & 0x0fffffff) | 0x70000000);
+ if (get_fpscr() != fpscr)
+ return 16 * i + 27;
+ asm("mtfsb0 21");
+ 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)));
+ if (get_fpscr() != fpscr)
+ return 16 * i + 29;
+ asm("mtfsb0 24");
+ fpscr = fpscr_eval(fpscr & ~(1 << (31-24)));
+ if (get_fpscr() != fpscr)
+ return 16 * i + 30;
+ asm("mtfsb1. 24; mfcr %0" : "=r" (cr));
+ fpscr = fpscr_eval(fpscr | (1 << (31-24)));
+ if (get_fpscr() != fpscr || ((cr >> 24) & 0xf) != ((fpscr >> 28) & 0xf))
+ return 16 * i + 31;
}
return 0;
}