From: Florian Krohm Date: Tue, 1 Jan 2013 22:20:12 +0000 (+0000) Subject: s390: Add testcases for DFP "shift significant" insns. X-Git-Tag: svn/VALGRIND_3_9_0~465 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=963e82c6fe66919c84c4492c0b3bd03170bcac31;p=thirdparty%2Fvalgrind.git s390: Add testcases for DFP "shift significant" insns. Patch by Maran Pakkirisamy (maranp@linux.vnet.ibm.com). Part of fixing BZ 307113. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@13215 --- diff --git a/none/tests/s390x/dfp-2.c b/none/tests/s390x/dfp-2.c index 25731c284a..2dc064c557 100644 --- a/none/tests/s390x/dfp-2.c +++ b/none/tests/s390x/dfp-2.c @@ -54,6 +54,70 @@ void ltxtr(_Decimal128 in) printf(" -> %d\n", cc); } +void sldt(_Decimal64 in, unsigned long amount) +{ + _Decimal64 out; + int *shift = (int *) amount; + + asm volatile (".insn rxf, 0xed0000000040, %[out], %[in], 0(%[amount])\n\t" + :[out]"=f"(out) + :[in]"f"(in),[amount]"a"(shift)); + + printf("SLDT "); + DFP_VAL_PRINT(in, _Decimal64); + printf(" -> "); + DFP_VAL_PRINT(out, _Decimal64); + printf("\n"); +} + +void slxt(_Decimal128 in, unsigned long amount) +{ + _Decimal128 out; + int *shift = (int *) amount; + + asm volatile (".insn rxf, 0xed0000000048, %[out], %[in], 0(%[amount])\n\t" + :[out]"=f"(out) + :[in]"f"(in),[amount]"a"(shift)); + + printf("SLXT "); + DFP_VAL_PRINT(in, _Decimal128); + printf(" -> "); + DFP_VAL_PRINT(out, _Decimal128); + printf("\n"); +} + +void srdt(_Decimal64 in, unsigned long amount) +{ + _Decimal64 out; + int *shift = (int *) amount; + + asm volatile (".insn rxf, 0xed0000000041, %[out], %[in], 0(%[amount])\n\t" + :[out]"=f"(out) + :[in]"f"(in),[amount]"a"(shift)); + + printf("SRDT "); + DFP_VAL_PRINT(in, _Decimal64); + printf(" -> "); + DFP_VAL_PRINT(out, _Decimal64); + printf("\n"); +} + +void srxt(_Decimal128 in, unsigned long amount) +{ + _Decimal128 out; + int *shift = (int *) amount; + + asm volatile (".insn rxf, 0xed0000000049, %[out], %[in], 0(%[amount])\n\t" + :[out]"=f"(out) + :[in]"f"(in),[amount]"a"(shift)); + + printf("SRXT "); + DFP_VAL_PRINT(in, _Decimal128); + printf(" -> "); + DFP_VAL_PRINT(out, _Decimal128); + printf("\n"); +} + int main() { _Decimal64 d64 = 50.0005DD; _Decimal128 d128 = 50.0005DL; @@ -72,5 +136,27 @@ int main() { ltxtr(-d128); ltxtr(0.0DL); + d64 = 12345678.54321DD; + sldt(d64, 10); + sldt(-d64, 2); + sldt(0.DD, 2); + sldt(-0.DD, 2); + + srdt(d64, 5); + srdt(-d64, 2); + srdt(0.DD, 2); + srdt(-0.DD, 2); + + d128 = 12345678.54321DL; + slxt(d128, 10); + slxt(-d128, 2); + slxt(0.DL, 2); + slxt(-0.DL, 2); + + srxt(d128, 10); + srxt(-d128, 2); + srxt(0.DL, 2); + srxt(-0.DL, 2); + return 0; } diff --git a/none/tests/s390x/dfp-2.stdout.exp b/none/tests/s390x/dfp-2.stdout.exp index e703ce424f..930f549b16 100644 --- a/none/tests/s390x/dfp-2.stdout.exp +++ b/none/tests/s390x/dfp-2.stdout.exp @@ -10,3 +10,19 @@ LTDTR 2234000000000000 -> 0 LTXTR 2207000000000000000a0005 -> 2 LTXTR a207000000000000000a0005 -> 1 LTXTR 2207c0000000000000000000 -> 0 +SLDT 2224014d2e7971a1 -> 6a26c34400000000 +SLDT a224014d2e7971a1 -> a224a395bcb8c880 +SLDT 2238000000000000 -> 2238000000000000 +SLDT a238000000000000 -> a238000000000000 +SRDT 2224014d2e7971a1 -> 2224000001271778 +SRDT a224014d2e7971a1 -> a22400049c5de2c3 +SRDT 2238000000000000 -> 2238000000000000 +SRDT a238000000000000 -> a238000000000000 +SLXT 2206c0000000000014d2e7971a1 -> 2206c0000000049c5de2c34400000000 +SLXT a206c0000000000014d2e7971a1 -> a206c00000000000a395bcb8c880 +SLXT 220800000000000000000000 -> 220800000000000000000000 +SLXT a20800000000000000000000 -> a20800000000000000000000 +SRXT 2206c0000000000014d2e7971a1 -> 2206c00000000000000000a3 +SRXT a206c0000000000014d2e7971a1 -> a206c0000000000049c5de2c3 +SRXT 220800000000000000000000 -> 220800000000000000000000 +SRXT a20800000000000000000000 -> a20800000000000000000000