From e1bbb786c078b7ecdae7d027860d44949eb87bb2 Mon Sep 17 00:00:00 2001 From: Paul Mackerras Date: Thu, 30 Jul 2020 13:38:09 +1000 Subject: [PATCH] tests/fpu: Add tests for fsel and fcmpu Signed-off-by: Paul Mackerras --- tests/fpu/fpu.c | 98 +++++++++++++++++++++++++++++++++++++ tests/test_fpu.bin | Bin 24512 -> 25024 bytes tests/test_fpu.console_out | 2 + 3 files changed, 100 insertions(+) diff --git a/tests/fpu/fpu.c b/tests/fpu/fpu.c index e62ce27..06da475 100644 --- a/tests/fpu/fpu.c +++ b/tests/fpu/fpu.c @@ -1148,6 +1148,102 @@ int fpu_test_18(void) return trapit(0, test18); } +#define RES_B 0x7ffaaaaaaaaaaaaa +#define RES_C 0x000bbbbbbbbbbbbb + +struct selvals { + unsigned long val; + unsigned long result; +} selvals[] = { + { 0x0000000000000000, RES_C }, + { 0x8000000000000000, RES_C }, + { 0x3ff0000000000000, RES_C }, + { 0xbff0000000000000, RES_B }, + { 0x7ff0000000000000, RES_C }, + { 0xfff0000000000000, RES_B }, + { 0x7ff8000000000000, RES_B }, + { 0xfff8000000000000, RES_B }, + { 0x0000000000000001, RES_C }, + { 0x8000000000000001, RES_B }, + { 0xffffffffffffffff, RES_B }, +}; + +int test19(long arg) +{ + long i; + unsigned long result; + unsigned long frb = RES_B; + unsigned long frc = RES_C; + struct selvals *vp = selvals; + + for (i = 0; i < sizeof(selvals) / sizeof(selvals[0]); ++i, ++vp) { + asm("lfd 6,0(%0); lfd 10,0(%1); lfd 22,0(%2); fsel 0,6,22,10; stfd 0,0(%3)" + : : "b" (&vp->val), "b" (&frb), "b" (&frc), "b" (&result) : "memory"); + if (result != vp->result) { + print_hex(i, 2, " "); + print_hex(result, 16, " "); + return i + 1; + } + } + return 0; +} + +int fpu_test_19(void) +{ + enable_fp(); + return trapit(0, test19); +} + +#define LT 8 +#define GT 4 +#define EQ 2 +#define UN 1 + +struct cmpvals { + unsigned long vala, valb; + unsigned long result; +} cmpvals[] = { + { 0x0000000000000000, 0x0000000000000000, EQ }, + { 0x8000000000000000, 0x0000000000000000, EQ }, + { 0x3ff0000000000000, 0x3ff0000000000000, EQ }, + { 0x3ff0000000000001, 0x3ff0000000000000, GT }, + { 0x3ff0000000000000, 0x3ff0000000000001, LT }, + { 0xbff0000000000000, 0x3ff0000000000000, LT }, + { 0x7ff0000000000000, 0x7ff0000000000000, EQ }, + { 0xfff0000000000000, 0x7ff0000000000000, LT }, + { 0x7ff8000000000000, 0x7ff0000000000000, UN }, + { 0xfff8000000000000, 0x7ff0000000000000, UN }, + { 0x0000000000000001, 0x0000000000000001, EQ }, + { 0x8000000000000001, 0x7ff0000000000000, LT }, + { 0xffffffffffffffff, 0x7ff0000000000000, UN }, + { 0xffffffffffffffff, 0xffffffffffffffff, UN }, +}; + +int test20(long arg) +{ + long i; + unsigned long cr; + struct cmpvals *vp = cmpvals; + + for (i = 0; i < sizeof(cmpvals) / sizeof(cmpvals[0]); ++i, ++vp) { + asm("lfd 6,0(%1); lfd 10,8(%1); fcmpu 7,6,10; mfcr %0" + : "=r" (cr) : "b" (&vp->vala) : "memory"); + cr &= 0xf; + if (cr != vp->result) { + print_hex(i, 2, " "); + print_hex(cr, 1, " "); + return i + 1; + } + } + return 0; +} + +int fpu_test_20(void) +{ + enable_fp(); + return trapit(0, test20); +} + int fail = 0; void do_test(int num, int (*test)(void)) @@ -1191,6 +1287,8 @@ int main(void) do_test(16, fpu_test_16); do_test(17, fpu_test_17); do_test(18, fpu_test_18); + do_test(19, fpu_test_19); + do_test(20, fpu_test_20); return fail; } diff --git a/tests/test_fpu.bin b/tests/test_fpu.bin index 572aad0ef8df74ffd3de84f0d0435c5bf1706b02..0f9e03a588b27413f4d3522e6be6362f86d9204d 100755 GIT binary patch delta 3674 zcmai03s93+7C!$^5`rQPk_RA<5D%a6KiGTWBvEsKM4)2+uoVW zIp;gyJ@>nh|Awy5xvsNZI)G(9Kxy^4@X|)IwXnLh8o)-_I>OcwwyxH>dT;t{&b{~L zTwa~ivFA_EI4n&D6Trw{i7Dv8Sq|i=+!A*AwkVdd*pC&P{M_@z?Y-PLA!nsJ$IDwC z0PUAgJ|%aj+)24zm-hv7{y8Ab7VE}d)w5hHj;fyLT02Xl%XwaviU(q5M7WDd8rUpN z*c+3rU10!ghnV6M#V+&66TdQ*8>7^DQC3O;6pjSg%hkn`tW9pSjMh}zge~eC&W*e# zSEES*YqwOwT_}oM3jw;!U*ZytnU|&DcFkJFjyGJwv76Yg%f`AK8D?nJyt4`yXv_Hx zuizeSId>bcYM1f$WX#rWl&@Lk5+2}PT|Rnrk^GKd;vHRyykU(?__YMq#YXZKYjI0# ziM+4cC47z1ary7Yy&yN%xP&Dvz~;C}Ui~X+7T*7|rj-M@Mj)i10Xx3j)CZDUtH>XX< zq-o3fZ%6TAe45f`hlm&fn3Y>6KprIWBN2cA`VX_ ztm1#8L2Y8z)XlMAZKFMu^66U|hFfuYVm9Abk6RN<_&KrIo0!Gh5JwZ2Yy0bKghVq@=qUN_xyYhfb~4Ux!&U|6psPI`<1X{#0YJ}kdb9CfUU(vOcpQ6IwUka zy6&(*oA1@fVwsWFMgA~b*HVf(a0n;EYwR{i5e{m=%7JKBL8j>=oS&BJh$8818D6pb z5nBS2;M~R}c!b^{q_EJe)e$U z*&PxpXvRZ?lO4{W^|Q6VABfq0uy`BA0{M)?;(CgMit0$w1?<+JE$R!*LR;;7{{h?0 zwqbTtqzV+X>cLyX6un7Uuu270>A}CGtl@r(*@ohAwT}A6*V<3<#9G@33$1kpI}ES$ z)(0~37G*UicWEJM5 zy~y|M!Ch(N2fjKwe#)g3hfaAAM`)mR9~Mu~9yjCB`{M`hr#N(=7eAi9aH)sBHFn)D z(sjH0y;yeX(G!P}F76}{liB5snC$=fE4&W75o)9heSeZ4n@8`>NWeGJ5me!u&{5Rc8ksTXN|p=v$5NNqYcWZ0joIPtrmR{Y@Z zPb>aAaR7c)ag5MGq)^2dCgJfJYtfszo7;(-vu1PeVMo>+uC4Q*SsTL~KL1G$(^q`! zaG26wcbkpYOFx>TxViu~)(GG>>|IGX+i*E;oN}Z8(|(7r!~7p3-Y8*jk72Qd z)e<&kNGz+T+shsk#%CWR9YQp_Mq`r~5D|?!Js%O)8TDK`m&JacV(7lyc-bWkN^kqt z0yV`mUvUW+Db`ap_5|{7TwtUhd-f25P3gw=dc(rPHCElVy!zcIqbyOJe{vW}B&hN!S$tjG3FlH(bHIx!JtyD!xYM@m2g_ZW5n% z4NsBD7{E(pDh6@A z_MkRDiT8LgkBo8l@{ zO$NxI8gx;hi+IxMEs=OF{K6;;F;_^;YZ6sDt$yMbV7HK}06D;hf8k9bNuEaT9GqfG zR#?eqRG;E~wN%BtL#1>PMqMuyrE&Re{hzAA0N4I{sDT_#x zny@3c@QJBdQAMusEx8MF*k&E1u;K6zD{B&NKA|V{0>N`}J z(=}FdRrf^E$x+gO(){ySWKPYj`d$=w5Xc%U$*z7MVJ-$xV;f~*9p5oOJ8Q#zQDg{f zjP0bpgRq&bE;WX|N4<5FZbj!^^Lh@OR%UiqSS)g^dr`*&k13V9IQm~jYW`7P`fr^z zZ=nqDF4ly33zayyQp=M`S){WD$pMlWunwi)3H+6 z$LfiJ7Q}<~f_Tt!c#+HN{QctY7{?i@(Y5k7=lIxLI3fPLU1|@L!}2L!bSW0E|hvuS0H;=dWe4%7eu delta 2747 zcmai0eN0qW7QgQ@Z;E!L!^aFC!tjQV5fG+`0uN@u!4C>UMQV+$THP6`Ev?3oxXa=$ zI@4xsqzM)|EwxQUN3tcXX&c)i4Q-lTx-|{Dny`Opv}ikw(*|10(iL%9wRg{bGb#`p zPjWct{Lb&5d+xdSjShV&4E<9u5n`(##P0m+A^SeGJBh>YB*cN(F2r^rwri)`am2J- z@E+MxL__9}4uAHDYpNrojF5?cBU6@$yPlw<^(xrtRmSRg9L83ag}JAYdwO(aUM_@n zKCJh;2su7FaG%^{y&H3{jvkHV!h4V?N0Jv#YnKW=Fr$4^=<(TO>nRWXyd45a1@r9|&a#$H}Y$dF|P)aoqsqyb*hy{O*(qDTJV2RNQ+hAe#&o!SbO z`g$7N0*CeW!ZUDLzn)stz?|43UfAZ5e}SJ9OTnM0p`q?eSG;~E1 z97w7b2mauZFG6f`X;<<_F~RAPYk2^j$+*l3J;~K#aEC|!6qcowf|R16?=*rrrCQwh ztVhmOz!NDNQM1z{kHHg*ONHyuzWC3=e*Bvq?Pwzl8Xe;IU{3v5m6Swkz#pFkQkJSK zEp^eQL{hUkfe(f_f?&*COgAS&b=r1%E*|>Q^5V|wNzE}FhLSfOXdUl?K$@9$?u9r* zHTCFWiy@C{yWkbW2K~{!jdB{!Tq4eK#(J$<;+By(iNupSC`sQ#pMDei((Q4aDBfmu zoTLhqsFX*~B!F4U;GKcrsG;OAOd1b6kM4a>ZoPTMReNiG<@e+UaxAnAakS$(xGUe$ z7>NrbaV*9%`kce_0>%Py$pa5Hwlx!@+z*#CzO3qu>{5sojW<~x+Hrmkz9JT5Uj5FQ zct^K?y;r3HtNabdGMj|Az@D{gPOW0(&90S=@%&n`^J)#k*{tVj=nW{zE;7$2N!%lzO{iGP|f?_UdCHWwo2Hj>gqTFrK|yhIOW=Xln=b zndWXgabxbb7cri_(EW(AZ9(QzXjp>pwHvlCG0)k$cwU9- zd~f?_Sl#)XzqtzWrWO*G&TngCVfdXkOu5<$NuzRu=OS1+e#NIEej$!RhT0rU+`&bp z#u<6N{4;hRggtpC_&lf0)sL5`AurqbrJg{a&-110{0GC5&oO>U_v36sP9^3Du`0az z96s4HrA~#C$EWAM4<}C6AxR(ylv8-IV>g`2g}4tMp4)L}J9gZA-){eY?ZMq1M9zb{ zbt-ip&}{{hW_Q~U$Clm@cEVfv%Y|k*o4-PM*GCIlqFjUFOB@feu^;=QqT6o$#1~4+ zZ!}{&tV5V5-i#yPAH56&p%3>eJp=LcQ+qKA`~V{bb|WwmYD>Nglzs(M!h@6yYx~F_fwUB$cQ7_3&)FG z3+_cl%X@`0aBlgDMc#l+B)d~0_I=3eT47o1&6s#!McR(9C;Ow(r~iuHry{v!v#}^* zE7RP?Yzj|1Cx*D<^*Uw0tb9Up+X-oZly`)Cv=ndhjTEZ{*X~iqf(UZaq9T!4FEQ4@ z0ThneP+Jk3Ld%6?8@XO)te*oY9BV=yM@&M?g=1}~(}-np0EOF5RMj_(T_OaYEH%=> zZ=j{rOiz9beQ2zHIA3a@&-!5oP16|YWdrRTgAz1@W3UO0e+*jCL>J2R6iz)#@q? zQ&E$m2pRsJJU^CxyA4e=F2=;P=x*6R+24PQmhWaSFuLq&KJWoB0?o<%I zDmSU8(QWz;{)dEA6<*2rkYdRY*PuHMZ&)(byV1)ZhksZMVkf#+Va$@Q9zbtk0_v>> z@dCOvu+Ew;-a_vZ_wpo>kmes58{iE+7Sn)ddRN%CFoslptFC%DJo+`r!D`*sjFjEz zZp8mxNt}+d2Gxz2<0_<7RD!lbB@Saa1<4hw3$$uX{`cN_`3$lUJA@ct$mMZV8L>fV zuc%WWLNDPOd|hGE4WK)GjWLISjI}WmHb(0}SDBeRJy3 diff --git a/tests/test_fpu.console_out b/tests/test_fpu.console_out index a5c08ea..aea206f 100644 --- a/tests/test_fpu.console_out +++ b/tests/test_fpu.console_out @@ -16,3 +16,5 @@ test 15:PASS test 16:PASS test 17:PASS test 18:PASS +test 19:PASS +test 20:PASS