tests/fpu: Test remaining FPSCR-related instructions
authorPaul Mackerras <paulus@ozlabs.org>
Mon, 31 Aug 2020 03:10:51 +0000 (13:10 +1000)
committerPaul Mackerras <paulus@ozlabs.org>
Thu, 3 Sep 2020 07:44:31 +0000 (17:44 +1000)
This adds tests for mffsce, mffscrn, mffscrni, mffsl, mcrfs, mtfsfi,
mtfsb0 and mtfsb1.

Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
tests/fpu/fpu.c

index 54811ed8e228196afd5f7dc2ed54a701a456f8d2..f9c4245f7d1739cdfcd617d2d26dd386035ffffa 100644 (file)
@@ -272,9 +272,9 @@ unsigned int test4vals[] = {
 
 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;
@@ -298,6 +298,59 @@ int test4(long arg)
                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;
 }