From 36130f1db351eec8bf19b00f4e2f9dd92276810b Mon Sep 17 00:00:00 2001 From: Paul Mackerras Date: Sun, 19 Jul 2020 11:53:01 +1000 Subject: [PATCH] tests/fpu: Add tests for frsp Signed-off-by: Paul Mackerras --- tests/fpu/fpu.c | 89 ++++++++++++++++++++++++++++++++----- tests/test_fpu.bin | Bin 13504 -> 14032 bytes tests/test_fpu.console_out | 1 + 3 files changed, 79 insertions(+), 11 deletions(-) diff --git a/tests/fpu/fpu.c b/tests/fpu/fpu.c index 80751d1..aff6d6c 100644 --- a/tests/fpu/fpu.c +++ b/tests/fpu/fpu.c @@ -10,6 +10,17 @@ #define MSR_FE0 0x800 #define MSR_FE1 0x100 +#define FPS_RN_NEAR 0 +#define FPS_RN_ZERO 1 +#define FPS_RN_CEIL 2 +#define FPS_RN_FLOOR 3 +#define FPS_XE 0x8 +#define FPS_ZE 0x10 +#define FPS_UE 0x20 +#define FPS_OE 0x40 +#define FPS_VE 0x80 +#define FPS_VXSOFT 0x400 + extern int trapit(long arg, int (*func)(long)); extern void do_rfid(unsigned long msr); extern void do_blr(void); @@ -363,8 +374,8 @@ int test5a(long arg) { set_fpscr(0); enable_fp_interrupts(); - set_fpscr(0x80); /* set VE */ - set_fpscr(0x480); /* set VXSOFT */ + set_fpscr(FPS_VE); /* set VE */ + set_fpscr(FPS_VXSOFT | FPS_VE); /* set VXSOFT */ set_fpscr(0); return 1; /* not supposed to get here */ } @@ -374,8 +385,8 @@ int test5b(long arg) unsigned long msr; enable_fp(); - set_fpscr(0x80); /* set VE */ - set_fpscr(0x480); /* set VXSOFT */ + set_fpscr(FPS_VE); /* set VE */ + set_fpscr(FPS_VXSOFT | FPS_VE); /* set VXSOFT */ asm("mfmsr %0" : "=r" (msr)); msr |= MSR_FE0 | MSR_FE1; asm("mtmsrd %0; xori 4,4,0" : : "r" (msr)); @@ -388,8 +399,8 @@ int test5c(long arg) unsigned long msr; enable_fp(); - set_fpscr(0x80); /* set VE */ - set_fpscr(0x480); /* set VXSOFT */ + set_fpscr(FPS_VE); /* set VE */ + set_fpscr(FPS_VXSOFT | FPS_VE); /* set VXSOFT */ asm("mfmsr %0" : "=r" (msr)); msr |= MSR_FE0 | MSR_FE1; do_rfid(msr); @@ -463,6 +474,12 @@ int test6(long arg) return 0; } +int fpu_test_6(void) +{ + enable_fp(); + return trapit(0, test6); +} + struct int_fp_equiv { long ival; unsigned long fp; @@ -522,16 +539,63 @@ int test7(long arg) return 0; } -int fpu_test_6(void) +int fpu_test_7(void) { enable_fp(); - return trapit(0, test6); + return trapit(0, test7); } -int fpu_test_7(void) +struct roundvals { + unsigned long fpscr; + unsigned long dpval; + unsigned long spval; +} 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 }, +}; + +int test8(long arg) +{ + long i; + unsigned long result; + + for (i = 0; i < sizeof(roundvals) / sizeof(roundvals[0]); ++i) { + asm("lfd 3,0(%0); lfd 4,8(%0); mtfsf 0,3,1,0; frsp 6,4; stfd 6,0(%1)" + : : "b" (&roundvals[i]), "b" (&result) : "memory"); + if (result != roundvals[i].spval) { + print_string("\r\n"); + print_hex(i, 4, " "); + print_hex(result, 16, " "); + return i + 1; + } + } + return 0; +} + +int fpu_test_8(void) { enable_fp(); - return trapit(0, test7); + return trapit(0, test8); } int fail = 0; @@ -549,7 +613,9 @@ void do_test(int num, int (*test)(void)) print_string("FAIL "); print_hex(ret, 5, " SRR0="); print_hex(mfspr(SRR0), 16, " SRR1="); - print_hex(mfspr(SRR1), 16, "\r\n"); + print_hex(mfspr(SRR1), 16, " FPSCR="); + enable_fp(); + print_hex(get_fpscr(), 8, "\r\n"); } } @@ -564,6 +630,7 @@ int main(void) do_test(5, fpu_test_5); do_test(6, fpu_test_6); do_test(7, fpu_test_7); + do_test(8, fpu_test_8); return fail; } diff --git a/tests/test_fpu.bin b/tests/test_fpu.bin index 25d50c77a0d990a40320f8baa84752efe3a6d996..81d18542064550fb7064a3683cbcdc7f7048c285 100755 GIT binary patch delta 2539 zcma)8du)?c6hGg$wsbH?$Jo|wCA3}X9^o;0?Hgm*!Zu2WQjrie20J!hA_*G64GXPU zDKk2=Ts3H-um$%AVjKYyjf4z?W@5zg2Zn^#(2;Bc+F^o&!9IWIYm0?Q;z{n#`Tfqh z=W*|CyRHpAo18?hN+NIF_oKW`&}*p7TSw#vw-MY%a2wZz%37T>rPo@YpCO;J9d7w~ z+!GOdInls{8>(7Mh~{OAEGVZC^FRDZboxTiLq5@B%C{lHh=@O)4h4zczOXkQVbZdZ z-y9LAO(n8%x43Ou26e=n(ILruGsUg(g;GT1WzNaIG@d+%RojrNc2x|F#EP3DVr}Le zxo5oiH1iw8JwIVa)+ZU{IjP09KdGv_o+Rq3I4;^IRLJjSh|3dRl9f%uo8^@n#Rpjh z1{(2fYN-?_vYgV(;#$_EwD5YW)RVQGT%!ZRl=z`zxSw4n z_FHusV~5pRl$eJjP(mBS%5y@>DVz1(U9~oZ3|6w;vC`G-HY(#X?>)8cFFbM9=!4Q$VyCU_k5f&Nw(``LS#Vwsh zOU?Jx+Fyo8kS3^%CUp|;_(;^{XXd_T;0DP*7tJ=s?Na2rDBjKACw(oZT4qY8M4e@( z{MGIwA6mAh1kcCv_Tw0?ccd5tU;WKp;3**skI)N0MeMC@;CT!^I_=*Y8{-_f4taYZ zaj;SFCpGT%2iy?2FTfp(sQ$2#DmHDTp!9P5EM1D}jz1MvH6!^+_}9tC_6 zxGj#2%vMa2z(|KJ`Opux?iN_SkoC;;$H&Bh*)6@rv8gA+uEfr@rJ!~Y~)vk ztll~+d7BV5zo4QzVjno9qrkzXw8IEn{?^!}!;?woQt%Yh9&j!#&h!u#CkmEkY4sda zh>Dwunx}I|s9|@k(6K2R9m*(cjqllo%PPf}j$><=45(@!JS-+GY$VI?s_J6`!ki0h zCAcUw3vMsp_z;i_oP!An>j0MTx;Q=ADeG>CTa%~BrkldM;T3jaQ7CnByG-0ZIce^fl<%-1)-y2w^A3`_Ut z<8vN>e+vAK*pHf=b6GkqG`Imd=PCHZkMZ+xeehp|pJQ39SVQ3Yz-=a)gsxKEv`<=? z?m}u`tXVz*i%e7+72ZO-p$euiDqbxtF>HZ(C@R_uore7|9fRUbp?z96Ov^1*J&t|k ziRben->T8+kC9aAt5-oEowOYdJWN zc&@0{bpY0Z+p5~jt{QEGeUcYNs}1fe?lCLVsRl;uqP26Xqofby z9ws4NlHbxw{KAEqfD~c5u)2rDjN+24dvGzu!r>v-;+5h|ebHUq(~;KVYq}$bQoT;} zO8OusPL@y{BsBf>dGosJ0-FoGpEa&VlSlbPo+LiR@fhkq4(E8vi0 a_$#z4u9NtaWelncVp^P&#)&brj{O5VEAAEm delta 1740 zcmaKse{54#6vxkd>q<99ef!a|jxM})UALBIR(`&@AuVjPb^|6^j3FQ$8w;|Lpcw|V zqZQi(435n+5@M7Mg3C0RfZIPRG1I64{6qXhgJL8g8YYMv5ZyA^^Ly70;SW8@$-U=u zzW3g9PjBD(?ZeMIiG0h6f{kCz3hu_Zg_Z;xi9%qlV69-STcS(4or|QM-Rl?1UFxaM zZytFpZZ9Vqxp+g@YYA%MN_=HGMFl_mHPN|?=O4;(r!ub)3KJAJ*F+;kuU|ZzR4CKC zQ7A9Y=M=X*{u=+Ktiv!E%Z3wUqL4P6k*woRo|+m%U}dYdNRoKDb(4I^#7C^|tevwd za1_OfBCb03>_S(6w3f-c+BrSH#^6DgPg?W1Ex$Q8+TNrUpqVN)Ueonsl?p{Q=zhzu zk=xR_Y~FJmu;r}Y2bDt7xVUlkJ-zn($*G8!B3e4>^M__Ng$MVk zD|XiP&6S6dr?|a)Be!4g z#kq07s z(J^U=zbraACw@gEHQ1<9a5q$Y9TnAa`^X6ch2LLG9VX1>&rQ1xY<396E z>y(FLmW$U~rcZZxh+O-L_CJckLO7$P_!%B9*4}guwY>eiu3rTfrobVkw(GiHF91w1 zAAA686r(V~8sIT}JyeXs1ltPl0&@re6Jr?OcZ2gwoN~h-yt1TB4&CGzOUk4Re7R&^ z#33R7Czgn@#_Y}X@9CBHm}%uDqu&Np1#TGCb@4E%+N>h~B(g?7LXmGq-t#~C81fCs z??|i{``4Rk)y(=$bR2@?{~-`}`U3eo$cw{-sqhP6cfrJcsVdD+z0xYP4_mKE6fW+4 z7aHFfe_U!eI%ITxjIWfsjSZNd9^)*R(-_5c@hyJBWj79B>bcFGF1!CcrqSCExAiL6 z0kD}8L|NltJz!O$1XvwBBL(I1n5)*e0WZ?R;$@rwiwOWLh5O*P2|nj`yXq%&T_9mX9)&l9 jdC&-9g7v_|g9Qsl41?YUhowQIH`T!N7n`_f=?DJ+=ocTF diff --git a/tests/test_fpu.console_out b/tests/test_fpu.console_out index 340756c..25e791c 100644 --- a/tests/test_fpu.console_out +++ b/tests/test_fpu.console_out @@ -5,3 +5,4 @@ test 04:PASS test 05:PASS test 06:PASS test 07:PASS +test 08:PASS