return assignNew(mce, Ity_I64, binop(Iop_And64, a1, a2));
}
-static IRAtom* mkDifD128 ( MCEnv* mce, IRAtom* a1, IRAtom* a2 ) {
+static IRAtom* mkDifDV128 ( MCEnv* mce, IRAtom* a1, IRAtom* a2 ) {
tl_assert(isShadowAtom(mce,a1));
tl_assert(isShadowAtom(mce,a2));
- return assignNew(mce, Ity_V128, binop(Iop_And128, a1, a2));
+ return assignNew(mce, Ity_V128, binop(Iop_AndV128, a1, a2));
}
/* --------- Undefined-if-either-undefined --------- */
return assignNew(mce, Ity_I64, binop(Iop_Or64, a1, a2));
}
-static IRAtom* mkUifU128 ( MCEnv* mce, IRAtom* a1, IRAtom* a2 ) {
+static IRAtom* mkUifUV128 ( MCEnv* mce, IRAtom* a1, IRAtom* a2 ) {
tl_assert(isShadowAtom(mce,a1));
tl_assert(isShadowAtom(mce,a2));
- return assignNew(mce, Ity_V128, binop(Iop_Or128, a1, a2));
+ return assignNew(mce, Ity_V128, binop(Iop_OrV128, a1, a2));
}
static IRAtom* mkUifU ( MCEnv* mce, IRType vty, IRAtom* a1, IRAtom* a2 ) {
case Ity_I16: return mkUifU16(mce, a1, a2);
case Ity_I32: return mkUifU32(mce, a1, a2);
case Ity_I64: return mkUifU64(mce, a1, a2);
- case Ity_V128: return mkUifU128(mce, a1, a2);
+ case Ity_V128: return mkUifUV128(mce, a1, a2);
default:
VG_(printf)("\n"); ppIRType(vty); VG_(printf)("\n");
VG_(tool_panic)("memcheck:mkUifU");
return assignNew(mce, Ity_I64, binop(Iop_Or64, data, vbits));
}
-static IRAtom* mkImproveAND128 ( MCEnv* mce, IRAtom* data, IRAtom* vbits )
+static IRAtom* mkImproveANDV128 ( MCEnv* mce, IRAtom* data, IRAtom* vbits )
{
tl_assert(isOriginalAtom(mce, data));
tl_assert(isShadowAtom(mce, vbits));
tl_assert(sameKindedAtoms(data, vbits));
- return assignNew(mce, Ity_V128, binop(Iop_Or128, data, vbits));
+ return assignNew(mce, Ity_V128, binop(Iop_OrV128, data, vbits));
}
/* ImproveOR(data, vbits) = ~data OR vbits. Defined (0) data 1s give
vbits) );
}
-static IRAtom* mkImproveOR128 ( MCEnv* mce, IRAtom* data, IRAtom* vbits )
+static IRAtom* mkImproveORV128 ( MCEnv* mce, IRAtom* data, IRAtom* vbits )
{
tl_assert(isOriginalAtom(mce, data));
tl_assert(isShadowAtom(mce, vbits));
tl_assert(sameKindedAtoms(data, vbits));
return assignNew(
mce, Ity_V128,
- binop(Iop_Or128,
- assignNew(mce, Ity_V128, unop(Iop_Not128, data)),
+ binop(Iop_OrV128,
+ assignNew(mce, Ity_V128, unop(Iop_NotV128, data)),
vbits) );
}
return assignNew(mce, Ity_I64, unop(Iop_1Sto64, tmp1));
case Ity_V128:
tmp1 = assignNew(mce, Ity_I64, unop(Iop_1Sto64, tmp1));
- tmp1 = assignNew(mce, Ity_V128, binop(Iop_64HLto128, tmp1, tmp1));
+ tmp1 = assignNew(mce, Ity_V128, binop(Iop_64HLtoV128, tmp1, tmp1));
return tmp1;
default:
ppIRType(dst_ty);
/* All-lanes versions are straightforward:
- binary32Fx4(x,y) ==> PCast32x4(UifU128(x#,y#))
+ binary32Fx4(x,y) ==> PCast32x4(UifUV128(x#,y#))
unary32Fx4(x,y) ==> PCast32x4(x#)
Lowest-lane-only versions are more complex:
- binary32F0x4(x,y) ==> Set128lo32(
+ binary32F0x4(x,y) ==> SetV128lo32(
x#,
- PCast32(128to32(UifU128(x#,y#)))
+ PCast32(V128to32(UifUV128(x#,y#)))
)
This is perhaps not so obvious. In particular, it's faster to
- do a 128-bit UifU and then take the bottom 32 bits than the more
+ do a V128-bit UifU and then take the bottom 32 bits than the more
obvious scheme of taking the bottom 32 bits of each operand
and doing a 32-bit UifU. Basically since UifU is fast and
chopping lanes off vector values is slow.
Finally:
- unary32F0x4(x) ==> Set128lo32(
+ unary32F0x4(x) ==> SetV128lo32(
x#,
- PCast32(128to32(x#))
+ PCast32(V128to32(x#))
)
Where:
IRAtom* at;
tl_assert(isShadowAtom(mce, vatomX));
tl_assert(isShadowAtom(mce, vatomY));
- at = mkUifU128(mce, vatomX, vatomY);
+ at = mkUifUV128(mce, vatomX, vatomY);
at = assignNew(mce, Ity_V128, mkPCast32x4(mce, at));
return at;
}
IRAtom* at;
tl_assert(isShadowAtom(mce, vatomX));
tl_assert(isShadowAtom(mce, vatomY));
- at = mkUifU128(mce, vatomX, vatomY);
- at = assignNew(mce, Ity_I32, unop(Iop_128to32, at));
+ at = mkUifUV128(mce, vatomX, vatomY);
+ at = assignNew(mce, Ity_I32, unop(Iop_V128to32, at));
at = mkPCastTo(mce, Ity_I32, at);
- at = assignNew(mce, Ity_V128, binop(Iop_Set128lo32, vatomX, at));
+ at = assignNew(mce, Ity_V128, binop(Iop_SetV128lo32, vatomX, at));
return at;
}
{
IRAtom* at;
tl_assert(isShadowAtom(mce, vatomX));
- at = assignNew(mce, Ity_I32, unop(Iop_128to32, vatomX));
+ at = assignNew(mce, Ity_I32, unop(Iop_V128to32, vatomX));
at = mkPCastTo(mce, Ity_I32, at);
- at = assignNew(mce, Ity_V128, binop(Iop_Set128lo32, vatomX, at));
+ at = assignNew(mce, Ity_V128, binop(Iop_SetV128lo32, vatomX, at));
return at;
}
IRAtom* at;
tl_assert(isShadowAtom(mce, vatomX));
tl_assert(isShadowAtom(mce, vatomY));
- at = mkUifU128(mce, vatomX, vatomY);
+ at = mkUifUV128(mce, vatomX, vatomY);
at = assignNew(mce, Ity_V128, mkPCast64x2(mce, at));
return at;
}
IRAtom* at;
tl_assert(isShadowAtom(mce, vatomX));
tl_assert(isShadowAtom(mce, vatomY));
- at = mkUifU128(mce, vatomX, vatomY);
- at = assignNew(mce, Ity_I64, unop(Iop_128to64, at));
+ at = mkUifUV128(mce, vatomX, vatomY);
+ at = assignNew(mce, Ity_I64, unop(Iop_V128to64, at));
at = mkPCastTo(mce, Ity_I64, at);
- at = assignNew(mce, Ity_V128, binop(Iop_Set128lo64, vatomX, at));
+ at = assignNew(mce, Ity_V128, binop(Iop_SetV128lo64, vatomX, at));
return at;
}
{
IRAtom* at;
tl_assert(isShadowAtom(mce, vatomX));
- at = assignNew(mce, Ity_I64, unop(Iop_128to64, vatomX));
+ at = assignNew(mce, Ity_I64, unop(Iop_V128to64, vatomX));
at = mkPCastTo(mce, Ity_I64, at);
- at = assignNew(mce, Ity_V128, binop(Iop_Set128lo64, vatomX, at));
+ at = assignNew(mce, Ity_V128, binop(Iop_SetV128lo64, vatomX, at));
return at;
}
op.
*/
static
-IRAtom* vectorNarrow128 ( MCEnv* mce, IROp narrow_op,
+IRAtom* vectorNarrowV128 ( MCEnv* mce, IROp narrow_op,
IRAtom* vatom1, IRAtom* vatom2)
{
IRAtom *at1, *at2, *at3;
case Iop_QNarrow32Sx4: pcast = mkPCast32x4; break;
case Iop_QNarrow16Sx8: pcast = mkPCast16x8; break;
case Iop_QNarrow16Ux8: pcast = mkPCast16x8; break;
- default: VG_(tool_panic)("vectorNarrow128");
+ default: VG_(tool_panic)("vectorNarrowV128");
}
tl_assert(isShadowAtom(mce,vatom1));
tl_assert(isShadowAtom(mce,vatom2));
/* Simple ... UifU the args and per-lane pessimise the results. */
-/* --- 128-bit versions --- */
+/* --- V128-bit versions --- */
static
IRAtom* binary8Ix16 ( MCEnv* mce, IRAtom* vatom1, IRAtom* vatom2 )
{
IRAtom* at;
- at = mkUifU128(mce, vatom1, vatom2);
+ at = mkUifUV128(mce, vatom1, vatom2);
at = mkPCast8x16(mce, at);
return at;
}
IRAtom* binary16Ix8 ( MCEnv* mce, IRAtom* vatom1, IRAtom* vatom2 )
{
IRAtom* at;
- at = mkUifU128(mce, vatom1, vatom2);
+ at = mkUifUV128(mce, vatom1, vatom2);
at = mkPCast16x8(mce, at);
return at;
}
IRAtom* binary32Ix4 ( MCEnv* mce, IRAtom* vatom1, IRAtom* vatom2 )
{
IRAtom* at;
- at = mkUifU128(mce, vatom1, vatom2);
+ at = mkUifUV128(mce, vatom1, vatom2);
at = mkPCast32x4(mce, at);
return at;
}
IRAtom* binary64Ix2 ( MCEnv* mce, IRAtom* vatom1, IRAtom* vatom2 )
{
IRAtom* at;
- at = mkUifU128(mce, vatom1, vatom2);
+ at = mkUifUV128(mce, vatom1, vatom2);
at = mkPCast64x2(mce, at);
return at;
}
case Iop_InterleaveHI8x8:
return assignNew(mce, Ity_I64, binop(op, vatom1, vatom2));
- /* 128-bit SIMD */
+ /* V128-bit SIMD */
case Iop_ShrN16x8:
case Iop_ShrN32x4:
case Iop_QNarrow32Sx4:
case Iop_QNarrow16Sx8:
case Iop_QNarrow16Ux8:
- return vectorNarrow128(mce, op, vatom1, vatom2);
+ return vectorNarrowV128(mce, op, vatom1, vatom2);
case Iop_Sub64Fx2:
case Iop_Mul64Fx2:
case Iop_Add32F0x4:
return binary32F0x4(mce, vatom1, vatom2);
- /* 128-bit data-steering */
- case Iop_Set128lo32:
- case Iop_Set128lo64:
- case Iop_64HLto128:
+ /* V128-bit data-steering */
+ case Iop_SetV128lo32:
+ case Iop_SetV128lo64:
+ case Iop_64HLtoV128:
case Iop_InterleaveLO64x2:
case Iop_InterleaveLO32x4:
case Iop_InterleaveLO16x8:
complainIfUndefined(mce, atom2);
return assignNew(mce, Ity_I64, binop(op, vatom1, atom2));
- case Iop_And128:
- uifu = mkUifU128; difd = mkDifD128;
- and_or_ty = Ity_V128; improve = mkImproveAND128; goto do_And_Or;
+ case Iop_AndV128:
+ uifu = mkUifUV128; difd = mkDifDV128;
+ and_or_ty = Ity_V128; improve = mkImproveANDV128; goto do_And_Or;
case Iop_And64:
uifu = mkUifU64; difd = mkDifD64;
and_or_ty = Ity_I64; improve = mkImproveAND64; goto do_And_Or;
uifu = mkUifU8; difd = mkDifD8;
and_or_ty = Ity_I8; improve = mkImproveAND8; goto do_And_Or;
- case Iop_Or128:
- uifu = mkUifU128; difd = mkDifD128;
- and_or_ty = Ity_V128; improve = mkImproveOR128; goto do_And_Or;
+ case Iop_OrV128:
+ uifu = mkUifUV128; difd = mkDifDV128;
+ and_or_ty = Ity_V128; improve = mkImproveORV128; goto do_And_Or;
case Iop_Or64:
uifu = mkUifU64; difd = mkDifD64;
and_or_ty = Ity_I64; improve = mkImproveOR64; goto do_And_Or;
return mkUifU32(mce, vatom1, vatom2);
case Iop_Xor64:
return mkUifU64(mce, vatom1, vatom2);
- case Iop_Xor128:
- return mkUifU128(mce, vatom1, vatom2);
+ case Iop_XorV128:
+ return mkUifUV128(mce, vatom1, vatom2);
default:
ppIROp(op);
case Iop_Recip32F0x4:
return unary32F0x4(mce, vatom);
- case Iop_32Uto128:
- case Iop_64Uto128:
+ case Iop_32UtoV128:
+ case Iop_64UtoV128:
return assignNew(mce, Ity_V128, unop(op, vatom));
case Iop_F32toF64:
case Iop_32Sto64:
case Iop_32Uto64:
- case Iop_128to64:
- case Iop_128HIto64:
+ case Iop_V128to64:
+ case Iop_V128HIto64:
return assignNew(mce, Ity_I64, unop(op, vatom));
case Iop_64to32:
case Iop_ReinterpF64asI64:
case Iop_ReinterpI64asF64:
case Iop_ReinterpI32asF32:
- case Iop_Not128:
+ case Iop_NotV128:
case Iop_Not64:
case Iop_Not32:
case Iop_Not16:
v64hi = expr2vbits_LDle_WRK(mce, Ity_I64, addr, bias+8);
return assignNew( mce,
Ity_V128,
- binop(Iop_64HLto128, v64hi, v64lo));
+ binop(Iop_64HLtoV128, v64hi, v64lo));
default:
VG_(tool_panic)("expr2vbits_LDle");
}
if (ty == Ity_V128) {
- /* 128-bit case */
+ /* V128-bit case */
/* See comment in next clause re 64-bit regparms */
eBias0 = tyAddr==Ity_I32 ? mkU32(bias) : mkU64(bias);
addrLo64 = assignNew(mce, tyAddr, binop(mkAdd, addr, eBias0) );
- vdataLo64 = assignNew(mce, Ity_I64, unop(Iop_128to64, vdata));
+ vdataLo64 = assignNew(mce, Ity_I64, unop(Iop_V128to64, vdata));
diLo64 = unsafeIRDirty_0_N(
1/*regparms*/, hname, helper,
mkIRExprVec_2( addrLo64, vdataLo64 ));
eBias8 = tyAddr==Ity_I32 ? mkU32(bias+8) : mkU64(bias+8);
addrHi64 = assignNew(mce, tyAddr, binop(mkAdd, addr, eBias8) );
- vdataHi64 = assignNew(mce, Ity_I64, unop(Iop_128HIto64, vdata));
+ vdataHi64 = assignNew(mce, Ity_I64, unop(Iop_V128HIto64, vdata));
diHi64 = unsafeIRDirty_0_N(
1/*regparms*/, hname, helper,
mkIRExprVec_2( addrHi64, vdataHi64 ));