Blame SOURCES/valgrind-3.14.0-power9-addex.patch

560544
From 2c1f016e634bf79faf45e81c14c955c711bc202f Mon Sep 17 00:00:00 2001
560544
From: Mark Wielaard <mark@klomp.org>
560544
Date: Mon, 31 Dec 2018 22:26:31 +0100
560544
Subject: [PATCH] Bug 402519 - POWER 3.0 addex instruction incorrectly
560544
 implemented
560544
560544
addex uses OV as carry in and carry out. For all other instructions
560544
OV is the signed overflow flag. And instructions like adde use CA
560544
as carry.
560544
560544
Replace set_XER_OV_OV32 with set_XER_OV_OV32_ADDEX, which will
560544
call calculate_XER_CA_64 and calculate_XER_CA_32, but with OV
560544
as input, and sets OV and OV32.
560544
560544
Enable test_addex in none/tests/ppc64/test_isa_3_0.c and update
560544
the expected output. test_addex would fail to match the expected
560544
output before this patch.
560544
---
560544
 NEWS                                              |  1 +
560544
 VEX/priv/guest_ppc_toIR.c                         | 52 ++++++++++++++---------
560544
 none/tests/ppc64/test_isa_3_0.c                   |  3 +-
560544
 none/tests/ppc64/test_isa_3_0_other.stdout.exp-LE | 36 ++++++++++------
560544
 4 files changed, 58 insertions(+), 34 deletions(-)
560544
560544
diff --git a/VEX/priv/guest_ppc_toIR.c b/VEX/priv/guest_ppc_toIR.c
560544
index 18df822..d685383 100644
560544
--- a/VEX/priv/guest_ppc_toIR.c
560544
+++ b/VEX/priv/guest_ppc_toIR.c
560544
@@ -2645,21 +2645,6 @@ static void copy_OV_to_OV32( void ) {
560544
    putXER_OV32( getXER_OV() );
560544
 }
560544
 
560544
-static void set_XER_OV_OV32 ( IRType ty, UInt op, IRExpr* res,
560544
-                              IRExpr* argL, IRExpr* argR )
560544
-{
560544
-   if (ty == Ity_I32) {
560544
-      set_XER_OV_OV32_32( op, res, argL, argR );
560544
-   } else {
560544
-      IRExpr* xer_ov_32;
560544
-      set_XER_OV_64( op, res, argL, argR );
560544
-      xer_ov_32 = calculate_XER_OV_32( op, unop(Iop_64to32, res),
560544
-                                       unop(Iop_64to32, argL),
560544
-                                       unop(Iop_64to32, argR));
560544
-      putXER_OV32( unop(Iop_32to8, xer_ov_32) );
560544
-   }
560544
-}
560544
-
560544
 static void set_XER_OV_OV32_SO ( IRType ty, UInt op, IRExpr* res,
560544
                                  IRExpr* argL, IRExpr* argR )
560544
 {
560544
@@ -3005,6 +2990,33 @@ static void set_XER_CA_CA32 ( IRType ty, UInt op, IRExpr* res,
560544
    }
560544
 }
560544
 
560544
+/* Used only by addex instruction, which uses and sets OV as carry.  */
560544
+static void set_XER_OV_OV32_ADDEX ( IRType ty, IRExpr* res,
560544
+                                    IRExpr* argL, IRExpr* argR,
560544
+                                    IRExpr* old_ov )
560544
+{
560544
+   if (ty == Ity_I32) {
560544
+      IRTemp xer_ov = newTemp(Ity_I32);
560544
+      assign ( xer_ov, unop(Iop_32to8,
560544
+                            calculate_XER_CA_32( PPCG_FLAG_OP_ADDE,
560544
+                                                 res, argL, argR, old_ov ) ) );
560544
+      putXER_OV( mkexpr (xer_ov) );
560544
+      putXER_OV32( mkexpr (xer_ov) );
560544
+   } else {
560544
+      IRExpr *xer_ov;
560544
+      IRExpr* xer_ov_32;
560544
+      xer_ov = calculate_XER_CA_64( PPCG_FLAG_OP_ADDE,
560544
+                                    res, argL, argR, old_ov );
560544
+      putXER_OV( unop(Iop_32to8, xer_ov) );
560544
+      xer_ov_32 = calculate_XER_CA_32( PPCG_FLAG_OP_ADDE,
560544
+                                       unop(Iop_64to32, res),
560544
+                                       unop(Iop_64to32, argL),
560544
+                                       unop(Iop_64to32, argR),
560544
+                                       unop(Iop_64to32, old_ov) );
560544
+      putXER_OV32( unop(Iop_32to8, xer_ov_32) );
560544
+   }
560544
+}
560544
+
560544
 
560544
 
560544
 /*------------------------------------------------------------*/
560544
@@ -5094,16 +5106,18 @@ static Bool dis_int_arith ( UInt theInstr )
560544
       }
560544
 
560544
       case 0xAA: {// addex (Add Extended alternate carry bit Z23-form)
560544
+         IRTemp old_xer_ov = newTemp(ty);
560544
          DIP("addex r%u,r%u,r%u,%d\n", rD_addr, rA_addr, rB_addr, (Int)flag_OE);
560544
+         assign( old_xer_ov, mkWidenFrom32(ty, getXER_OV_32(), False) );
560544
          assign( rD, binop( mkSzOp(ty, Iop_Add8), mkexpr(rA),
560544
                             binop( mkSzOp(ty, Iop_Add8), mkexpr(rB),
560544
-                                   mkWidenFrom8( ty, getXER_OV(), False ) ) ) );
560544
+                                   mkexpr(old_xer_ov) ) ) );
560544
 
560544
          /* CY bit is same as OE bit */
560544
          if (flag_OE == 0) {
560544
-            /* Exception, do not set SO bit */
560544
-            set_XER_OV_OV32( ty, PPCG_FLAG_OP_ADDE,
560544
-                             mkexpr(rD), mkexpr(rA), mkexpr(rB) );
560544
+            /* Exception, do not set SO bit and set OV from carry. */
560544
+            set_XER_OV_OV32_ADDEX( ty, mkexpr(rD), mkexpr(rA), mkexpr(rB),
560544
+                                   mkexpr(old_xer_ov) );
560544
          } else {
560544
             /* CY=1, 2 and 3 (AKA flag_OE) are reserved */
560544
             vex_printf("addex instruction, CY = %d is reserved.\n", flag_OE);
560544
diff --git a/none/tests/ppc64/test_isa_3_0.c b/none/tests/ppc64/test_isa_3_0.c
560544
index 2d13505..1c2cda3 100644
560544
--- a/none/tests/ppc64/test_isa_3_0.c
560544
+++ b/none/tests/ppc64/test_isa_3_0.c
560544
@@ -286,7 +286,7 @@ static test_list_t testgroup_ia_ops_two[] = {
560544
    { &test_moduw, "moduw" },
560544
    { &test_modsd, "modsd" },
560544
    { &test_modud, "modud" },
560544
-   //{ &test_addex, "addex" },
560544
+   { &test_addex, "addex" },
560544
    { NULL       , NULL             },
560544
 };
560544
 
560544
@@ -2741,7 +2741,6 @@ static void testfunction_gpr_vector_logical_one (const char* instruction_name,
560544
     *   rt, xa
560544
     */
560544
    int i;
560544
-   int t;
560544
    volatile HWord_t res;
560544
 
560544
    VERBOSE_FUNCTION_CALLOUT
560544
diff --git a/none/tests/ppc64/test_isa_3_0_other.stdout.exp-LE b/none/tests/ppc64/test_isa_3_0_other.stdout.exp-LE
560544
index 152ff28..cc0e88e 100644
560544
--- a/none/tests/ppc64/test_isa_3_0_other.stdout.exp-LE
560544
+++ b/none/tests/ppc64/test_isa_3_0_other.stdout.exp-LE
560544
@@ -40,7 +40,17 @@ modud ffffffffffffffff, 0000000000000000 => 0000000000000000 (00000000)
560544
 modud ffffffffffffffff, 0000001cbe991def => 000000043eb0c0b2 (00000000)
560544
 modud ffffffffffffffff, ffffffffffffffff => 0000000000000000 (00000000)
560544
 
560544
-All done. Tested 4 different instructions
560544
+addex 0000000000000000, 0000000000000000 => 0000000000000000 (00000000)
560544
+addex 0000000000000000, 0000001cbe991def => 0000001cbe991def (00000000)
560544
+addex 0000000000000000, ffffffffffffffff => ffffffffffffffff (00000000)
560544
+addex 0000001cbe991def, 0000000000000000 => 0000001cbe991def (00000000)
560544
+addex 0000001cbe991def, 0000001cbe991def => 000000397d323bde (00000000) OV32
560544
+addex 0000001cbe991def, ffffffffffffffff => 0000001cbe991dee (00000000) OV OV32
560544
+addex ffffffffffffffff, 0000000000000000 => 0000000000000000 (00000000) OV OV32
560544
+addex ffffffffffffffff, 0000001cbe991def => 0000001cbe991def (00000000) OV OV32
560544
+addex ffffffffffffffff, ffffffffffffffff => ffffffffffffffff (00000000) OV OV32
560544
+
560544
+All done. Tested 5 different instructions
560544
 ppc one argument plus shift:
560544
 Test instruction group [ppc one argument plus shift]
560544
 extswsli  aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaa 0 ffffffffffffffff => aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaa 0 ffffffffffffffff
560544
@@ -85,7 +95,7 @@ extswsli. aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaa 0 ffaa5599113377cc => aaaaaaaaaaaaaa
560544
 extswsli. 5152535455565758 5152535455565758 0 ffaa5599113377cc => 5152535455565758 5152535455565758 0 ffaa5599113377cc
560544
 extswsli. 0000000000000000 0000000000000000 0 ffaa5599113377cc => 0000000000000000 0000000000000000 0 ffaa5599113377cc
560544
 
560544
-All done. Tested 6 different instructions
560544
+All done. Tested 7 different instructions
560544
 ppc three parameter ops:
560544
 Test instruction group [ppc three parameter ops]
560544
 maddhd  0000000000000000, 0000000000000000, 0000000000000000  => 0000000000000000 (00000000)
560544
@@ -172,7 +182,7 @@ maddld  ffffffffffffffff, ffffffffffffffff, 0000000000000000  => 000000000000000
560544
 maddld  ffffffffffffffff, ffffffffffffffff, 0000001cbe991def  => 0000001cbe991df0 (00000000)
560544
 maddld  ffffffffffffffff, ffffffffffffffff, ffffffffffffffff  => 0000000000000000 (00000000)
560544
 
560544
-All done. Tested 9 different instructions
560544
+All done. Tested 10 different instructions
560544
 ppc count zeros:
560544
 Test instruction group [ppc count zeros]
560544
 cnttzw 0000000000000000 => 0000000000000020
560544
@@ -197,7 +207,7 @@ cnttzd. 0000001cbe991def => 0000000000000000 Expected cr0 to be zero, it is (200
560544
 cnttzd. ffffffffffffffff => 0000000000000000 Expected cr0 to be zero, it is (20000000)
560544
 
560544
 
560544
-All done. Tested 13 different instructions
560544
+All done. Tested 14 different instructions
560544
 ppc set boolean:
560544
 Test instruction group [ppc set boolean]
560544
 setb cr_field:0 cr_value::00000000 =>  0000000000000000
560544
@@ -265,7 +275,7 @@ setb cr_field:7 cr_value::00000005 =>  0000000000000001
560544
 setb cr_field:7 cr_value::00000006 =>  0000000000000001
560544
 setb cr_field:7 cr_value::00000007 =>  0000000000000001
560544
 
560544
-All done. Tested 14 different instructions
560544
+All done. Tested 15 different instructions
560544
 ppc char compare:
560544
 Test instruction group [ppc char compare]
560544
 cmprb l=0 0x61 (a) (cmpeq:0x5b427b625a417a61) (cmprb:src22(a-z) src21(A-Z)) => in range/found
560544
@@ -1711,7 +1721,7 @@ cmpeqb 0x5d (]) (cmpeq:0x4642666245416561) (cmprb:src22(a-e) src21(A-E)) =>
560544
 cmpeqb 0x60 (`) (cmpeq:0x4642666245416561) (cmprb:src22(a-e) src21(A-E)) =>
560544
 cmpeqb 0x5f (_) (cmpeq:0x4642666245416561) (cmprb:src22(a-e) src21(A-E)) =>
560544
 
560544
-All done. Tested 17 different instructions
560544
+All done. Tested 18 different instructions
560544
 ppc vector scalar move to/from:
560544
 Test instruction group [ppc vector scalar move to/from]
560544
 mfvsrld aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaa 0 ffffffffffffffff => aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaa ffffffffffffffff
560544
@@ -1777,7 +1787,7 @@ mtvsrws aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaa 0 ffaa5599113377cc => 113377cc113377cc
560544
 mtvsrws 5152535455565758 5152535455565758 0 ffaa5599113377cc => 113377cc113377cc 113377cc113377cc 0 ffaa5599113377cc
560544
 mtvsrws 0000000000000000 0000000000000000 0 ffaa5599113377cc => 113377cc113377cc 113377cc113377cc 0 ffaa5599113377cc
560544
 
560544
-All done. Tested 20 different instructions
560544
+All done. Tested 21 different instructions
560544
 ppc dfp significance:
560544
 Test instruction group [ppc dfp significance]
560544
 dtstsfi significance(0x00) +Finite                  0 * 10 ^ -12 (GT) (4)
560544
@@ -1862,7 +1872,7 @@ dtstsfiq significance(0x20) -inf      (GT) (4)
560544
 dtstsfiq significance(0x30) -inf      (GT) (4)
560544
 dtstsfiq significance(0x3f) -inf      (GT) (4)
560544
 
560544
-All done. Tested 22 different instructions
560544
+All done. Tested 23 different instructions
560544
 ppc bcd misc:
560544
 Test instruction group [ppc bcd misc]
560544
 bcdadd. p0 xa:0000000000000000 000000000000000c (+|0) xb:0000000000000000 000000000000000c (+|0) => (EQ) (2) xt:0000000000000000 000000000000000c(+|0)
560544
@@ -33338,12 +33348,12 @@ bcdcfsq. p1 xa:0000000000000000 000000000000000c (+|0) xb:9999999999999999 99999
560544
 bcdcfsq. p1 xa:0000000000000000 000000000000000c (+|0) xb:0000000000000000 000000001234567d ( - ) => (GT) (4) xt:0000000000000000 000000305419901f(+|0)
560544
 
560544
 
560544
-All done. Tested 51 different instructions
560544
+All done. Tested 52 different instructions
560544
 ppc noop misc:
560544
 Test instruction group [ppc noop misc]
560544
 wait   =>
560544
 
560544
-All done. Tested 52 different instructions
560544
+All done. Tested 53 different instructions
560544
 ppc addpc_misc:
560544
 Test instruction group [ppc addpc_misc]
560544
 addpcis   0000000000000000  =>  0000000000000000
560544
@@ -33380,7 +33390,7 @@ subpcis   000000000000000d  =>  0000000000000000
560544
 subpcis   000000000000000e  =>  0000000000000000
560544
 subpcis   000000000000000f  =>  0000000000000000
560544
 
560544
-All done. Tested 54 different instructions
560544
+All done. Tested 55 different instructions
560544
 ppc mffpscr:
560544
 Test instruction group [ppc mffpscr]
560544
 mffsce  =>  000000000.000000
560544
@@ -33395,7 +33405,7 @@ mffs  =>  000000000.000000
560544
  fpscr: f14 
560544
  local_fpscr: 
560544
 
560544
-All done. Tested 57 different instructions
560544
+All done. Tested 58 different instructions
560544
 ppc mffpscr:
560544
 Test instruction group [ppc mffpscr]
560544
 mffscdrni  0  =>  0X0
560544
@@ -33426,4 +33436,4 @@ mffscrn  f15 0X1   =>  0X200000000
560544
 mffscrn  f15 0X2   =>  0X200000000
560544
  fpscr: f14  local_fpscr:  30-DRN1 RN-bit62
560544
 
560544
-All done. Tested 61 different instructions
560544
+All done. Tested 62 different instructions
560544
-- 
560544
1.8.3.1
560544