]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
New irop Iop_MullEven*
authorCerion Armour-Brown <cerion@valgrind.org>
Fri, 4 Nov 2005 19:44:48 +0000 (19:44 +0000)
committerCerion Armour-Brown <cerion@valgrind.org>
Fri, 4 Nov 2005 19:44:48 +0000 (19:44 +0000)
 - a widening un/signed multiply of even lanes

Recast misused irops Iop_MulLo/Hi* as Iop_MullEven*

git-svn-id: svn://svn.valgrind.org/vex/trunk@1434

VEX/priv/guest-ppc32/toIR.c
VEX/priv/host-ppc32/hdefs.c
VEX/priv/host-ppc32/isel.c
VEX/priv/ir/irdefs.c
VEX/pub/libvex_ir.h

index 2a38fa19ab3926d11c13468fd2f867560e310839..8601452cf0b669f8ed262a3e09be44b591019de0 100644 (file)
@@ -5388,42 +5388,50 @@ static Bool dis_av_arith ( UInt theInstr )
    /* Multiply */
    case 0x008: // vmuloub (Multiply Odd Unsigned Byte, AV p213)
       DIP("vmuloub v%d,v%d,v%d\n", vD_addr, vA_addr, vB_addr);
-      putVReg( vD_addr, binop(Iop_MulLo16Ux8, mkexpr(vA), mkexpr(vB)) );
+      putVReg( vD_addr, binop(Iop_MullEven8Ux16,
+                              binop(Iop_ShlV128, mkexpr(vA), mkU8(8)),
+                              binop(Iop_ShlV128, mkexpr(vB), mkU8(8)) ));
       break;
 
    case 0x048: // vmulouh (Multiply Odd Unsigned Half Word, AV p214)
       DIP("vmulouh v%d,v%d,v%d\n", vD_addr, vA_addr, vB_addr);
-      putVReg( vD_addr, binop(Iop_MulLo32Ux4, mkexpr(vA), mkexpr(vB)) );
+      putVReg( vD_addr, binop(Iop_MullEven16Ux8,
+                              binop(Iop_ShlV128, mkexpr(vA), mkU8(16)),
+                              binop(Iop_ShlV128, mkexpr(vB), mkU8(16)) ));
       break;
 
    case 0x108: // vmulosb (Multiply Odd Signed Byte, AV p211)
       DIP("vmulosb v%d,v%d,v%d\n", vD_addr, vA_addr, vB_addr);
-      putVReg( vD_addr, binop(Iop_MulLo16Sx8, mkexpr(vA), mkexpr(vB)) );
+      putVReg( vD_addr, binop(Iop_MullEven8Sx16,
+                              binop(Iop_ShlV128, mkexpr(vA), mkU8(8)),
+                              binop(Iop_ShlV128, mkexpr(vB), mkU8(8)) ));
       break;
 
    case 0x148: // vmulosh (Multiply Odd Signed Half Word, AV p212)
       DIP("vmulosh v%d,v%d,v%d\n", vD_addr, vA_addr, vB_addr);
-      putVReg( vD_addr, binop(Iop_MulLo32Sx4, mkexpr(vA), mkexpr(vB)) );
+      putVReg( vD_addr, binop(Iop_MullEven16Sx8,
+                              binop(Iop_ShlV128, mkexpr(vA), mkU8(16)),
+                              binop(Iop_ShlV128, mkexpr(vB), mkU8(16)) ));
       break;
 
    case 0x208: // vmuleub (Multiply Even Unsigned Byte, AV p209)
       DIP("vmuleub v%d,v%d,v%d\n", vD_addr, vA_addr, vB_addr);
-      putVReg( vD_addr, binop(Iop_MulHi16Ux8, mkexpr(vA), mkexpr(vB)) );
+      putVReg( vD_addr, binop(Iop_MullEven8Ux16, mkexpr(vA), mkexpr(vB)) );
       break;
 
    case 0x248: // vmuleuh (Multiply Even Unsigned Half Word, AV p210)
       DIP("vmuleuh v%d,v%d,v%d\n", vD_addr, vA_addr, vB_addr);
-      putVReg( vD_addr, binop(Iop_MulHi32Ux4, mkexpr(vA), mkexpr(vB)) );
+      putVReg( vD_addr, binop(Iop_MullEven16Ux8, mkexpr(vA), mkexpr(vB)) );
       break;
 
    case 0x308: // vmulesb (Multiply Even Signed Byte, AV p207)
       DIP("vmulesb v%d,v%d,v%d\n", vD_addr, vA_addr, vB_addr);
-      putVReg( vD_addr, binop(Iop_MulHi16Sx8, mkexpr(vA), mkexpr(vB)) );
+      putVReg( vD_addr, binop(Iop_MullEven8Sx16, mkexpr(vA), mkexpr(vB)) );
       break;
 
    case 0x348: // vmulesh (Multiply Even Signed Half Word, AV p208)
       DIP("vmulesh v%d,v%d,v%d\n", vD_addr, vA_addr, vB_addr);
-      putVReg( vD_addr, binop(Iop_MulHi32Sx4, mkexpr(vA), mkexpr(vB)) );
+      putVReg( vD_addr, binop(Iop_MullEven16Sx8, mkexpr(vA), mkexpr(vB)) );
       break;
 
 
@@ -5648,13 +5656,17 @@ static Bool dis_av_multarith ( UInt theInstr )
 
       assign( zLo, binop(Iop_Add32x4,
                          binop(Iop_SarN32x4,
-                               binop(Iop_MulLo32Sx4, mkexpr(aLo), mkexpr(bLo)),
+                               binop(Iop_MullEven16Sx8,
+                                     binop(Iop_ShlV128, mkexpr(aLo), mkU8(16)),
+                                     binop(Iop_ShlV128, mkexpr(bLo), mkU8(16)) ),
                                mkU8(15)),
                          mkexpr(cLo)) );
 
       assign( zHi, binop(Iop_Add32x4,
                          binop(Iop_SarN32x4,
-                               binop(Iop_MulLo32Sx4, mkexpr(aHi), mkexpr(bHi)),
+                               binop(Iop_MullEven16Sx8,
+                                     binop(Iop_ShlV128, mkexpr(aHi), mkU8(16)),
+                                     binop(Iop_ShlV128, mkexpr(bHi), mkU8(16)) ),
                                mkU8(15)),
                          mkexpr(cHi)) );
 
@@ -5688,14 +5700,18 @@ static Bool dis_av_multarith ( UInt theInstr )
       assign( zLo, binop(Iop_Add32x4,
                          binop(Iop_SarN32x4,
                                binop(Iop_Add32x4, mkexpr(zKonst),
-                                     binop(Iop_MulLo32Sx4, mkexpr(aLo), mkexpr(bLo))),
+                                     binop(Iop_MullEven16Sx8,
+                                           binop(Iop_ShlV128, mkexpr(aLo), mkU8(16)),
+                                           binop(Iop_ShlV128, mkexpr(bLo), mkU8(16)) )),
                                mkU8(15)),
                          mkexpr(cLo)) );
 
       assign( zHi, binop(Iop_Add32x4,
                          binop(Iop_SarN32x4,
                                binop(Iop_Add32x4, mkexpr(zKonst),
-                                     binop(Iop_MulLo32Sx4, mkexpr(aHi), mkexpr(bHi))),
+                                     binop(Iop_MullEven16Sx8,
+                                           binop(Iop_ShlV128, mkexpr(aHi), mkU8(16)),
+                                           binop(Iop_ShlV128, mkexpr(bHi), mkU8(16)) )),
                                mkU8(15)),
                          mkexpr(cHi)) );
 
@@ -5719,10 +5735,14 @@ static Bool dis_av_multarith ( UInt theInstr )
       assign( bHi, binop(Iop_InterleaveHI16x8, mkexpr(zeros), mkexpr(vB)) );
       assign( cHi, binop(Iop_InterleaveHI16x8, mkexpr(zeros), mkexpr(vC)) );
       assign( zLo, binop(Iop_Add32x4,
-                         binop(Iop_MulLo32Ux4, mkexpr(aLo), mkexpr(bLo)),
+                         binop(Iop_MullEven16Ux8,
+                               binop(Iop_ShlV128, mkexpr(aLo), mkU8(16)),
+                               binop(Iop_ShlV128, mkexpr(bLo), mkU8(16)) ),
                          mkexpr(cLo)) );
       assign( zHi, binop(Iop_Add32x4,
-                         binop(Iop_MulLo32Ux4, mkexpr(aHi), mkexpr(bHi)),
+                         binop(Iop_MullEven16Ux8,
+                               binop(Iop_ShlV128, mkexpr(aHi), mkU8(16)),
+                               binop(Iop_ShlV128, mkexpr(bHi), mkU8(16)) ),
                          mkexpr(cHi)) );
       putVReg( vD_addr, binop(Iop_Narrow32Ux4, mkexpr(zHi), mkexpr(zLo)) );
       break;
@@ -5739,15 +5759,21 @@ static Bool dis_av_multarith ( UInt theInstr )
       IRTemp even_odd = newTemp(Ity_V128);
       IRTemp even_even = newTemp(Ity_V128);
       DIP("vmsumubm v%d,v%d,v%d,v%d\n", vD_addr, vA_addr, vB_addr, vC_addr);
-      assign( odd,  binop(Iop_MulLo16Ux8, mkexpr(vA), mkexpr(vB)) );
-      assign( even, binop(Iop_MulHi16Ux8, mkexpr(vA), mkexpr(vB)) );
+      assign( odd,  binop(Iop_MullEven8Ux16,
+                          binop(Iop_ShlV128, mkexpr(vA), mkU8(8)),
+                          binop(Iop_ShlV128, mkexpr(vB), mkU8(8)) ));
+      assign( even, binop(Iop_MullEven8Ux16, mkexpr(vA), mkexpr(vB)) );
       /* zKonst just used to separate the lanes out */
       assign( zKonst, unop(Iop_Dup16x8, mkU16(0x1)) );
 
-      assign( odd_odd,   binop(Iop_MulLo32Ux4, mkexpr(odd),  mkexpr(zKonst)) );
-      assign( odd_even,  binop(Iop_MulHi32Ux4, mkexpr(odd),  mkexpr(zKonst)) );
-      assign( even_odd,  binop(Iop_MulLo32Ux4, mkexpr(even), mkexpr(zKonst)) );
-      assign( even_even, binop(Iop_MulHi32Ux4, mkexpr(even), mkexpr(zKonst)) );
+      assign( odd_odd,   binop(Iop_MullEven16Ux8,
+                               binop(Iop_ShlV128, mkexpr(odd), mkU8(16)),
+                               binop(Iop_ShlV128, mkexpr(zKonst), mkU8(16)) ));
+      assign( odd_even,  binop(Iop_MullEven16Ux8, mkexpr(odd),  mkexpr(zKonst)) );
+      assign( even_odd,  binop(Iop_MullEven16Ux8,
+                               binop(Iop_ShlV128, mkexpr(even), mkU8(16)),
+                               binop(Iop_ShlV128, mkexpr(zKonst), mkU8(16)) ));
+      assign( even_even, binop(Iop_MullEven16Ux8, mkexpr(even), mkexpr(zKonst)) );
 
       putVReg( vD_addr,
                binop(Iop_Add32x4, mkexpr(vC),
@@ -5765,8 +5791,10 @@ static Bool dis_av_multarith ( UInt theInstr )
       IRTemp odd = newTemp(Ity_V128);
       IRTemp even = newTemp(Ity_V128);
       DIP("vmsumuhm v%d,v%d,v%d,v%d\n", vD_addr, vA_addr, vB_addr, vC_addr);
-      assign( odd,  binop(Iop_MulLo32Ux4, mkexpr(vA), mkexpr(vB)) );
-      assign( even, binop(Iop_MulHi32Ux4, mkexpr(vA), mkexpr(vB)) );
+      assign( odd,  binop(Iop_MullEven16Ux8,
+                          binop(Iop_ShlV128, mkexpr(vA), mkU8(16)),
+                          binop(Iop_ShlV128, mkexpr(vB), mkU8(16)) ));
+      assign( even, binop(Iop_MullEven16Ux8, mkexpr(vA), mkexpr(vB)) );
       putVReg( vD_addr,
                binop(Iop_Add32x4, mkexpr(vC),
                      binop(Iop_Add32x4, mkexpr(odd), mkexpr(even))) );
@@ -5781,8 +5809,10 @@ static Bool dis_av_multarith ( UInt theInstr )
       IRTemp odd = newTemp(Ity_V128);
       IRTemp even = newTemp(Ity_V128);
       DIP("vmsumshm v%d,v%d,v%d,v%d\n", vD_addr, vA_addr, vB_addr, vC_addr);
-      assign( odd,  binop(Iop_MulLo32Sx4, mkexpr(vA), mkexpr(vB)) );
-      assign( even, binop(Iop_MulHi32Sx4, mkexpr(vA), mkexpr(vB)) );
+      assign( odd,  binop(Iop_MullEven16Sx8,
+                          binop(Iop_ShlV128, mkexpr(vA), mkU8(16)),
+                          binop(Iop_ShlV128, mkexpr(vB), mkU8(16)) ));
+      assign( even, binop(Iop_MullEven16Sx8, mkexpr(vA), mkexpr(vB)) );
       putVReg( vD_addr,
                binop(Iop_Add32x4, mkexpr(vC),
                      binop(Iop_Add32x4, mkexpr(odd), mkexpr(even))) );
index 9764884ae1e6a10eae81afca4ca616a3ccf46373..f357c97b3136dfaf449a750f1999bbe91ccfee18 100644 (file)
@@ -2910,6 +2910,11 @@ Int emit_PPC32Instr ( UChar* buf, Int nbuf, PPC32Instr* i )
       case Pav_QSUBU:    opc2 = 1536; break; // vsububs
       case Pav_QSUBS:    opc2 = 1792; break; // vsubsbs
 
+      case Pav_OMULU:   opc2 =    8; break; // vmuloub
+      case Pav_OMULS:   opc2 =  264; break; // vmulosb
+      case Pav_EMULU:   opc2 =  520; break; // vmuleub
+      case Pav_EMULS:   opc2 =  776; break; // vmulesb
+
       case Pav_AVGU:     opc2 = 1026; break; // vavgub
       case Pav_AVGS:     opc2 = 1282; break; // vavgsb
       case Pav_MAXU:     opc2 =    2; break; // vmaxub
@@ -2951,10 +2956,10 @@ Int emit_PPC32Instr ( UChar* buf, Int nbuf, PPC32Instr* i )
       case Pav_QSUBU:   opc2 = 1600; break; // vsubuhs
       case Pav_QSUBS:   opc2 = 1856; break; // vsubshs
 
-      case Pav_OMULU:   opc2 =    8; break; // vmuloub
-      case Pav_OMULS:   opc2 =  264; break; // vmulosb
-      case Pav_EMULU:   opc2 =  520; break; // vmuleub
-      case Pav_EMULS:   opc2 =  776; break; // vmulesb
+      case Pav_OMULU:   opc2 =   72; break; // vmulouh
+      case Pav_OMULS:   opc2 =  328; break; // vmulosh
+      case Pav_EMULU:   opc2 =  584; break; // vmuleuh
+      case Pav_EMULS:   opc2 =  840; break; // vmulesh
 
       case Pav_AVGU:    opc2 = 1090; break; // vavguh
       case Pav_AVGS:    opc2 = 1346; break; // vavgsh
@@ -3003,11 +3008,6 @@ Int emit_PPC32Instr ( UChar* buf, Int nbuf, PPC32Instr* i )
       case Pav_QSUBU:   opc2 = 1664; break; // vsubuws
       case Pav_QSUBS:   opc2 = 1920; break; // vsubsws
 
-      case Pav_OMULU:   opc2 =   72; break; // vmulouh
-      case Pav_OMULS:   opc2 =  328; break; // vmulosh
-      case Pav_EMULU:   opc2 =  584; break; // vmuleuh
-      case Pav_EMULS:   opc2 =  840; break; // vmulesh
-
       case Pav_AVGU:    opc2 = 1154; break; // vavguw
       case Pav_AVGS:    opc2 = 1410; break; // vavgsw
 
index 137e3a7aee70b607d96abf5194fcd9099b01d381..00864ce26d5528d710f582245379538f0ea8465a 100644 (file)
@@ -3315,6 +3315,8 @@ static HReg iselVecExpr_wrk ( ISelEnv* env, IRExpr* e )
       case Iop_Max8Sx16:   op = Pav_MAXS;   goto do_AvBin8x16;
       case Iop_Min8Ux16:   op = Pav_MINU;   goto do_AvBin8x16;
       case Iop_Min8Sx16:   op = Pav_MINS;   goto do_AvBin8x16;
+      case Iop_MullEven8Ux16: op = Pav_EMULU;  goto do_AvBin8x16;
+      case Iop_MullEven8Sx16: op = Pav_EMULS;  goto do_AvBin8x16;
       case Iop_CmpEQ8x16:  op = Pav_CMPEQU; goto do_AvBin8x16;
       case Iop_CmpGT8Ux16: op = Pav_CMPGTU; goto do_AvBin8x16;
       case Iop_CmpGT8Sx16: op = Pav_CMPGTS; goto do_AvBin8x16;
@@ -3347,10 +3349,8 @@ static HReg iselVecExpr_wrk ( ISelEnv* env, IRExpr* e )
       case Iop_Max16Sx8:   op = Pav_MAXS;   goto do_AvBin16x8;
       case Iop_Min16Ux8:   op = Pav_MINU;   goto do_AvBin16x8;
       case Iop_Min16Sx8:   op = Pav_MINS;   goto do_AvBin16x8;
-      case Iop_MulLo16Ux8: op = Pav_OMULU;  goto do_AvBin16x8;
-      case Iop_MulLo16Sx8: op = Pav_OMULS;  goto do_AvBin16x8;
-      case Iop_MulHi16Ux8: op = Pav_EMULU;  goto do_AvBin16x8;
-      case Iop_MulHi16Sx8: op = Pav_EMULS;  goto do_AvBin16x8;
+      case Iop_MullEven16Ux8: op = Pav_EMULU;  goto do_AvBin16x8;
+      case Iop_MullEven16Sx8: op = Pav_EMULS;  goto do_AvBin16x8;
       case Iop_CmpEQ16x8:  op = Pav_CMPEQU; goto do_AvBin16x8;
       case Iop_CmpGT16Ux8: op = Pav_CMPGTU; goto do_AvBin16x8;
       case Iop_CmpGT16Sx8: op = Pav_CMPGTS; goto do_AvBin16x8;
@@ -3383,10 +3383,6 @@ static HReg iselVecExpr_wrk ( ISelEnv* env, IRExpr* e )
       case Iop_Max32Sx4:   op = Pav_MAXS;   goto do_AvBin32x4;
       case Iop_Min32Ux4:   op = Pav_MINU;   goto do_AvBin32x4;
       case Iop_Min32Sx4:   op = Pav_MINS;   goto do_AvBin32x4;
-      case Iop_MulLo32Ux4: op = Pav_OMULU;  goto do_AvBin32x4;
-      case Iop_MulLo32Sx4: op = Pav_OMULS;  goto do_AvBin32x4;
-      case Iop_MulHi32Ux4: op = Pav_EMULU;  goto do_AvBin32x4;
-      case Iop_MulHi32Sx4: op = Pav_EMULS;  goto do_AvBin32x4;
       case Iop_CmpEQ32x4:  op = Pav_CMPEQU; goto do_AvBin32x4;
       case Iop_CmpGT32Ux4: op = Pav_CMPGTU; goto do_AvBin32x4;
       case Iop_CmpGT32Sx4: op = Pav_CMPGTS; goto do_AvBin32x4;
index 7297ac1f3d266b9b50c1e068e086b20d9317e8dd..3e81cf95e8af0eff901859576e5fae203ba54086 100644 (file)
@@ -444,6 +444,11 @@ void ppIROp ( IROp op )
       case Iop_MulHi16Sx8: vex_printf("MulHi16Sx8"); return;
       case Iop_MulHi32Sx4: vex_printf("MulHi32Sx4"); return;
 
+      case Iop_MullEven8Ux16: vex_printf("MullEven8Ux16"); return;
+      case Iop_MullEven16Ux8: vex_printf("MullEven16Ux8"); return;
+      case Iop_MullEven8Sx16: vex_printf("MullEven8Sx16"); return;
+      case Iop_MullEven16Sx8: vex_printf("MullEven16Sx8"); return;
+
       case Iop_Avg8Ux16: vex_printf("Avg8Ux16"); return;
       case Iop_Avg16Ux8: vex_printf("Avg16Ux8"); return;
       case Iop_Avg32Ux4: vex_printf("Avg32Ux4"); return;
@@ -1556,6 +1561,8 @@ void typeOfPrimop ( IROp op, IRType* t_dst, IRType* t_arg1, IRType* t_arg2 )
       case Iop_MulLo16Sx8: case Iop_MulLo32Sx4:
       case Iop_MulHi16Ux8: case Iop_MulHi32Ux4: 
       case Iop_MulHi16Sx8: case Iop_MulHi32Sx4: 
+      case Iop_MullEven8Ux16: case Iop_MullEven16Ux8:
+      case Iop_MullEven8Sx16: case Iop_MullEven16Sx8:
       case Iop_Avg8Ux16: case Iop_Avg16Ux8: case Iop_Avg32Ux4:
       case Iop_Avg8Sx16: case Iop_Avg16Sx8: case Iop_Avg32Sx4:
       case Iop_Max8Sx16: case Iop_Max16Sx8: case Iop_Max32Sx4:
index 2f4049dbc1627506894a3f634760233992e8d2f8..47298ecfad953b2cb6b6cf1ec093b6d287a5c7f0 100644 (file)
@@ -554,6 +554,10 @@ typedef
       Iop_MulHi16Ux8, Iop_MulHi32Ux4,
       Iop_MulHi16Sx8, Iop_MulHi32Sx4,
 
+      /* (widening signed/unsigned of even lanes) */
+      Iop_MullEven8Ux16, Iop_MullEven16Ux8,
+      Iop_MullEven8Sx16, Iop_MullEven16Sx8,
+
       /* AVERAGING: note: (arg1 + arg2 + 1) >>u 1 */
       Iop_Avg8Ux16, Iop_Avg16Ux8, Iop_Avg32Ux4,
       Iop_Avg8Sx16, Iop_Avg16Sx8, Iop_Avg32Sx4,