]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
s390: Add testcases for DFP "shift significant" insns.
authorFlorian Krohm <florian@eich-krohm.de>
Tue, 1 Jan 2013 22:20:12 +0000 (22:20 +0000)
committerFlorian Krohm <florian@eich-krohm.de>
Tue, 1 Jan 2013 22:20:12 +0000 (22:20 +0000)
Patch by Maran Pakkirisamy (maranp@linux.vnet.ibm.com).
Part of fixing BZ 307113.

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@13215

none/tests/s390x/dfp-2.c
none/tests/s390x/dfp-2.stdout.exp

index 25731c284a7834a92cb13166d4ff3b9a4c458b8a..2dc064c557412250a1c3e283f4034563919f7d9f 100644 (file)
@@ -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;
 }
index e703ce424fce64a06297d7516b40c00806cb16e2..930f549b168ec3f6337935efa09d68e243f8c5d8 100644 (file)
@@ -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