Rename Iop_QSalN*, Iop_QShlN* and Iop_QShlN*S so as to more accurately
reflect what they actually do, which is a zero-fill shift left followed
by one of three flavours of saturation (S->S, U->U or S->U).
git-svn-id: svn://svn.valgrind.org/vex/trunk@2924 8f6e269a-dfd6-0310-a8e1-e2731360e62c
diff --git a/priv/guest_arm64_toIR.c b/priv/guest_arm64_toIR.c
index 997565c..9e27d90 100644
--- a/priv/guest_arm64_toIR.c
+++ b/priv/guest_arm64_toIR.c
@@ -921,23 +921,26 @@
return ops[sizeNarrow];
}
-static IROp mkVecQSHLNSATU2U ( UInt size ) {
+static IROp mkVecQSHLNSATUU ( UInt size ) {
const IROp ops[4]
- = { Iop_QShlN8x16, Iop_QShlN16x8, Iop_QShlN32x4, Iop_QShlN64x2 };
+ = { Iop_QShlNsatUU8x16, Iop_QShlNsatUU16x8,
+ Iop_QShlNsatUU32x4, Iop_QShlNsatUU64x2 };
vassert(size < 4);
return ops[size];
}
-static IROp mkVecQSHLNSATS2S ( UInt size ) {
+static IROp mkVecQSHLNSATSS ( UInt size ) {
const IROp ops[4]
- = { Iop_QSalN8x16, Iop_QSalN16x8, Iop_QSalN32x4, Iop_QSalN64x2 };
+ = { Iop_QShlNsatSS8x16, Iop_QShlNsatSS16x8,
+ Iop_QShlNsatSS32x4, Iop_QShlNsatSS64x2 };
vassert(size < 4);
return ops[size];
}
-static IROp mkVecQSHLNSATS2U ( UInt size ) {
+static IROp mkVecQSHLNSATSU ( UInt size ) {
const IROp ops[4]
- = { Iop_QShlN8Sx16, Iop_QShlN16Sx8, Iop_QShlN32Sx4, Iop_QShlN64Sx2 };
+ = { Iop_QShlNsatSU8x16, Iop_QShlNsatSU16x8,
+ Iop_QShlNsatSU32x4, Iop_QShlNsatSU64x2 };
vassert(size < 4);
return ops[size];
}
@@ -6609,7 +6612,7 @@
/* UQSHL */
if (vex_streq(nm, "uqshl")) {
- IROp qop = mkVecQSHLNSATU2U(size);
+ IROp qop = mkVecQSHLNSATUU(size);
assign(*res, binop(qop, mkexpr(src), mkU8(shift)));
if (shift == 0) {
/* No shift means no saturation. */
@@ -6629,7 +6632,7 @@
/* SQSHL */
if (vex_streq(nm, "sqshl")) {
- IROp qop = mkVecQSHLNSATS2S(size);
+ IROp qop = mkVecQSHLNSATSS(size);
assign(*res, binop(qop, mkexpr(src), mkU8(shift)));
if (shift == 0) {
/* No shift means no saturation. */
@@ -6657,7 +6660,7 @@
/* SQSHLU */
if (vex_streq(nm, "sqshlu")) {
- IROp qop = mkVecQSHLNSATS2U(size);
+ IROp qop = mkVecQSHLNSATSU(size);
assign(*res, binop(qop, mkexpr(src), mkU8(shift)));
if (shift == 0) {
/* If there's no shift, saturation depends on the top bit
diff --git a/priv/guest_arm_toIR.c b/priv/guest_arm_toIR.c
index 64e5d6e..2070254 100644
--- a/priv/guest_arm_toIR.c
+++ b/priv/guest_arm_toIR.c
@@ -6257,19 +6257,19 @@
if (A & 1) {
switch (size) {
case 0:
- op = Q ? Iop_QShlN8x16 : Iop_QShlN8x8;
+ op = Q ? Iop_QShlNsatUU8x16 : Iop_QShlNsatUU8x8;
op_rev = Q ? Iop_ShrN8x16 : Iop_ShrN8x8;
break;
case 1:
- op = Q ? Iop_QShlN16x8 : Iop_QShlN16x4;
+ op = Q ? Iop_QShlNsatUU16x8 : Iop_QShlNsatUU16x4;
op_rev = Q ? Iop_ShrN16x8 : Iop_ShrN16x4;
break;
case 2:
- op = Q ? Iop_QShlN32x4 : Iop_QShlN32x2;
+ op = Q ? Iop_QShlNsatUU32x4 : Iop_QShlNsatUU32x2;
op_rev = Q ? Iop_ShrN32x4 : Iop_ShrN32x2;
break;
case 3:
- op = Q ? Iop_QShlN64x2 : Iop_QShlN64x1;
+ op = Q ? Iop_QShlNsatUU64x2 : Iop_QShlNsatUU64x1;
op_rev = Q ? Iop_ShrN64x2 : Iop_Shr64;
break;
default:
@@ -6281,19 +6281,19 @@
} else {
switch (size) {
case 0:
- op = Q ? Iop_QShlN8Sx16 : Iop_QShlN8Sx8;
+ op = Q ? Iop_QShlNsatSU8x16 : Iop_QShlNsatSU8x8;
op_rev = Q ? Iop_ShrN8x16 : Iop_ShrN8x8;
break;
case 1:
- op = Q ? Iop_QShlN16Sx8 : Iop_QShlN16Sx4;
+ op = Q ? Iop_QShlNsatSU16x8 : Iop_QShlNsatSU16x4;
op_rev = Q ? Iop_ShrN16x8 : Iop_ShrN16x4;
break;
case 2:
- op = Q ? Iop_QShlN32Sx4 : Iop_QShlN32Sx2;
+ op = Q ? Iop_QShlNsatSU32x4 : Iop_QShlNsatSU32x2;
op_rev = Q ? Iop_ShrN32x4 : Iop_ShrN32x2;
break;
case 3:
- op = Q ? Iop_QShlN64Sx2 : Iop_QShlN64Sx1;
+ op = Q ? Iop_QShlNsatSU64x2 : Iop_QShlNsatSU64x1;
op_rev = Q ? Iop_ShrN64x2 : Iop_Shr64;
break;
default:
@@ -6308,19 +6308,19 @@
return False;
switch (size) {
case 0:
- op = Q ? Iop_QSalN8x16 : Iop_QSalN8x8;
+ op = Q ? Iop_QShlNsatSS8x16 : Iop_QShlNsatSS8x8;
op_rev = Q ? Iop_SarN8x16 : Iop_SarN8x8;
break;
case 1:
- op = Q ? Iop_QSalN16x8 : Iop_QSalN16x4;
+ op = Q ? Iop_QShlNsatSS16x8 : Iop_QShlNsatSS16x4;
op_rev = Q ? Iop_SarN16x8 : Iop_SarN16x4;
break;
case 2:
- op = Q ? Iop_QSalN32x4 : Iop_QSalN32x2;
+ op = Q ? Iop_QShlNsatSS32x4 : Iop_QShlNsatSS32x2;
op_rev = Q ? Iop_SarN32x4 : Iop_SarN32x2;
break;
case 3:
- op = Q ? Iop_QSalN64x2 : Iop_QSalN64x1;
+ op = Q ? Iop_QShlNsatSS64x2 : Iop_QShlNsatSS64x1;
op_rev = Q ? Iop_SarN64x2 : Iop_Sar64;
break;
default:
diff --git a/priv/host_arm64_isel.c b/priv/host_arm64_isel.c
index 71ee7a6..3915ae1 100644
--- a/priv/host_arm64_isel.c
+++ b/priv/host_arm64_isel.c
@@ -3316,10 +3316,10 @@
//ZZ res, argL, size, False));
//ZZ return res;
//ZZ }
-//ZZ case Iop_QSalN8x8:
-//ZZ case Iop_QSalN16x4:
-//ZZ case Iop_QSalN32x2:
-//ZZ case Iop_QSalN64x1: {
+//ZZ case Iop_QShlNsatSS8x8:
+//ZZ case Iop_QShlNsatSS16x4:
+//ZZ case Iop_QShlNsatSS32x2:
+//ZZ case Iop_QShlNsatSS64x1: {
//ZZ HReg res = newVRegD(env);
//ZZ HReg argL = iselNeon64Expr(env, e->Iex.Binop.arg1);
//ZZ UInt size, imm;
@@ -3330,10 +3330,10 @@
//ZZ }
//ZZ imm = e->Iex.Binop.arg2->Iex.Const.con->Ico.U8;
//ZZ switch (e->Iex.Binop.op) {
-//ZZ case Iop_QSalN8x8: size = 8 | imm; break;
-//ZZ case Iop_QSalN16x4: size = 16 | imm; break;
-//ZZ case Iop_QSalN32x2: size = 32 | imm; break;
-//ZZ case Iop_QSalN64x1: size = 64 | imm; break;
+//ZZ case Iop_QShlNsatSS8x8: size = 8 | imm; break;
+//ZZ case Iop_QShlNsatSS16x4: size = 16 | imm; break;
+//ZZ case Iop_QShlNsatSS32x2: size = 32 | imm; break;
+//ZZ case Iop_QShlNsatSS64x1: size = 64 | imm; break;
//ZZ default: vassert(0);
//ZZ }
//ZZ addInstr(env, ARMInstr_NUnary(ARMneon_VQSHLNSS,
@@ -5580,10 +5580,10 @@
//ZZ res, argL, size, True));
//ZZ return res;
//ZZ }
-//ZZ case Iop_QSalN8x16:
-//ZZ case Iop_QSalN16x8:
-//ZZ case Iop_QSalN32x4:
-//ZZ case Iop_QSalN64x2: {
+//ZZ case Iop_QShlNsatSS8x16:
+//ZZ case Iop_QShlNsatSS16x8:
+//ZZ case Iop_QShlNsatSS32x4:
+//ZZ case Iop_QShlNsatSS64x2: {
//ZZ HReg res = newVRegV(env);
//ZZ HReg argL = iselNeonExpr(env, e->Iex.Binop.arg1);
//ZZ UInt size, imm;
@@ -5594,10 +5594,10 @@
//ZZ }
//ZZ imm = e->Iex.Binop.arg2->Iex.Const.con->Ico.U8;
//ZZ switch (e->Iex.Binop.op) {
-//ZZ case Iop_QSalN8x16: size = 8 | imm; break;
-//ZZ case Iop_QSalN16x8: size = 16 | imm; break;
-//ZZ case Iop_QSalN32x4: size = 32 | imm; break;
-//ZZ case Iop_QSalN64x2: size = 64 | imm; break;
+//ZZ case Iop_QShlNsatSS8x16: size = 8 | imm; break;
+//ZZ case Iop_QShlNsatSS16x8: size = 16 | imm; break;
+//ZZ case Iop_QShlNsatSS32x4: size = 32 | imm; break;
+//ZZ case Iop_QShlNsatSS64x2: size = 64 | imm; break;
//ZZ default: vassert(0);
//ZZ }
//ZZ addInstr(env, ARMInstr_NUnary(ARMneon_VQSHLNSS,
@@ -5610,12 +5610,12 @@
case Iop_SarN16x8: case Iop_SarN8x16:
case Iop_ShlN64x2: case Iop_ShlN32x4:
case Iop_ShlN16x8: case Iop_ShlN8x16:
- case Iop_QShlN64x2: case Iop_QShlN32x4:
- case Iop_QShlN16x8: case Iop_QShlN8x16:
- case Iop_QSalN64x2: case Iop_QSalN32x4:
- case Iop_QSalN16x8: case Iop_QSalN8x16:
- case Iop_QShlN64Sx2: case Iop_QShlN32Sx4:
- case Iop_QShlN16Sx8: case Iop_QShlN8Sx16:
+ case Iop_QShlNsatUU64x2: case Iop_QShlNsatUU32x4:
+ case Iop_QShlNsatUU16x8: case Iop_QShlNsatUU8x16:
+ case Iop_QShlNsatSS64x2: case Iop_QShlNsatSS32x4:
+ case Iop_QShlNsatSS16x8: case Iop_QShlNsatSS8x16:
+ case Iop_QShlNsatSU64x2: case Iop_QShlNsatSU32x4:
+ case Iop_QShlNsatSU16x8: case Iop_QShlNsatSU8x16:
{
IRExpr* argL = e->Iex.Binop.arg1;
IRExpr* argR = e->Iex.Binop.arg2;
@@ -5626,58 +5626,58 @@
ARM64VecShiftOp op = ARM64vecsh_INVALID;
/* Establish the instruction to use. */
switch (e->Iex.Binop.op) {
- case Iop_ShrN64x2: op = ARM64vecsh_USHR64x2; break;
- case Iop_ShrN32x4: op = ARM64vecsh_USHR32x4; break;
- case Iop_ShrN16x8: op = ARM64vecsh_USHR16x8; break;
- case Iop_ShrN8x16: op = ARM64vecsh_USHR8x16; break;
- case Iop_SarN64x2: op = ARM64vecsh_SSHR64x2; break;
- case Iop_SarN32x4: op = ARM64vecsh_SSHR32x4; break;
- case Iop_SarN16x8: op = ARM64vecsh_SSHR16x8; break;
- case Iop_SarN8x16: op = ARM64vecsh_SSHR8x16; break;
- case Iop_ShlN64x2: op = ARM64vecsh_SHL64x2; break;
- case Iop_ShlN32x4: op = ARM64vecsh_SHL32x4; break;
- case Iop_ShlN16x8: op = ARM64vecsh_SHL16x8; break;
- case Iop_ShlN8x16: op = ARM64vecsh_SHL8x16; break;
- case Iop_QShlN64x2: op = ARM64vecsh_UQSHL64x2; break;
- case Iop_QShlN32x4: op = ARM64vecsh_UQSHL32x4; break;
- case Iop_QShlN16x8: op = ARM64vecsh_UQSHL16x8; break;
- case Iop_QShlN8x16: op = ARM64vecsh_UQSHL8x16; break;
- case Iop_QSalN64x2: op = ARM64vecsh_SQSHL64x2; break;
- case Iop_QSalN32x4: op = ARM64vecsh_SQSHL32x4; break;
- case Iop_QSalN16x8: op = ARM64vecsh_SQSHL16x8; break;
- case Iop_QSalN8x16: op = ARM64vecsh_SQSHL8x16; break;
- case Iop_QShlN64Sx2: op = ARM64vecsh_SQSHLU64x2; break;
- case Iop_QShlN32Sx4: op = ARM64vecsh_SQSHLU32x4; break;
- case Iop_QShlN16Sx8: op = ARM64vecsh_SQSHLU16x8; break;
- case Iop_QShlN8Sx16: op = ARM64vecsh_SQSHLU8x16; break;
+ case Iop_ShrN64x2: op = ARM64vecsh_USHR64x2; break;
+ case Iop_ShrN32x4: op = ARM64vecsh_USHR32x4; break;
+ case Iop_ShrN16x8: op = ARM64vecsh_USHR16x8; break;
+ case Iop_ShrN8x16: op = ARM64vecsh_USHR8x16; break;
+ case Iop_SarN64x2: op = ARM64vecsh_SSHR64x2; break;
+ case Iop_SarN32x4: op = ARM64vecsh_SSHR32x4; break;
+ case Iop_SarN16x8: op = ARM64vecsh_SSHR16x8; break;
+ case Iop_SarN8x16: op = ARM64vecsh_SSHR8x16; break;
+ case Iop_ShlN64x2: op = ARM64vecsh_SHL64x2; break;
+ case Iop_ShlN32x4: op = ARM64vecsh_SHL32x4; break;
+ case Iop_ShlN16x8: op = ARM64vecsh_SHL16x8; break;
+ case Iop_ShlN8x16: op = ARM64vecsh_SHL8x16; break;
+ case Iop_QShlNsatUU64x2: op = ARM64vecsh_UQSHL64x2; break;
+ case Iop_QShlNsatUU32x4: op = ARM64vecsh_UQSHL32x4; break;
+ case Iop_QShlNsatUU16x8: op = ARM64vecsh_UQSHL16x8; break;
+ case Iop_QShlNsatUU8x16: op = ARM64vecsh_UQSHL8x16; break;
+ case Iop_QShlNsatSS64x2: op = ARM64vecsh_SQSHL64x2; break;
+ case Iop_QShlNsatSS32x4: op = ARM64vecsh_SQSHL32x4; break;
+ case Iop_QShlNsatSS16x8: op = ARM64vecsh_SQSHL16x8; break;
+ case Iop_QShlNsatSS8x16: op = ARM64vecsh_SQSHL8x16; break;
+ case Iop_QShlNsatSU64x2: op = ARM64vecsh_SQSHLU64x2; break;
+ case Iop_QShlNsatSU32x4: op = ARM64vecsh_SQSHLU32x4; break;
+ case Iop_QShlNsatSU16x8: op = ARM64vecsh_SQSHLU16x8; break;
+ case Iop_QShlNsatSU8x16: op = ARM64vecsh_SQSHLU8x16; break;
default: vassert(0);
}
/* Establish the shift limits, for sanity check purposes only. */
switch (e->Iex.Binop.op) {
- case Iop_ShrN64x2: limLo = 1; limHi = 64; break;
- case Iop_ShrN32x4: limLo = 1; limHi = 32; break;
- case Iop_ShrN16x8: limLo = 1; limHi = 16; break;
- case Iop_ShrN8x16: limLo = 1; limHi = 8; break;
- case Iop_SarN64x2: limLo = 1; limHi = 64; break;
- case Iop_SarN32x4: limLo = 1; limHi = 32; break;
- case Iop_SarN16x8: limLo = 1; limHi = 16; break;
- case Iop_SarN8x16: limLo = 1; limHi = 8; break;
- case Iop_ShlN64x2: limLo = 0; limHi = 63; break;
- case Iop_ShlN32x4: limLo = 0; limHi = 31; break;
- case Iop_ShlN16x8: limLo = 0; limHi = 15; break;
- case Iop_ShlN8x16: limLo = 0; limHi = 7; break;
- case Iop_QShlN64x2: limLo = 0; limHi = 63; break;
- case Iop_QShlN32x4: limLo = 0; limHi = 31; break;
- case Iop_QShlN16x8: limLo = 0; limHi = 15; break;
- case Iop_QShlN8x16: limLo = 0; limHi = 7; break;
- case Iop_QSalN64x2: limLo = 0; limHi = 63; break;
- case Iop_QSalN32x4: limLo = 0; limHi = 31; break;
- case Iop_QSalN16x8: limLo = 0; limHi = 15; break;
- case Iop_QSalN8x16: limLo = 0; limHi = 7; break;
- case Iop_QShlN64Sx2: limLo = 0; limHi = 63; break;
- case Iop_QShlN32Sx4: limLo = 0; limHi = 31; break;
- case Iop_QShlN16Sx8: limLo = 0; limHi = 15; break;
- case Iop_QShlN8Sx16: limLo = 0; limHi = 7; break;
+ case Iop_ShrN64x2: limLo = 1; limHi = 64; break;
+ case Iop_ShrN32x4: limLo = 1; limHi = 32; break;
+ case Iop_ShrN16x8: limLo = 1; limHi = 16; break;
+ case Iop_ShrN8x16: limLo = 1; limHi = 8; break;
+ case Iop_SarN64x2: limLo = 1; limHi = 64; break;
+ case Iop_SarN32x4: limLo = 1; limHi = 32; break;
+ case Iop_SarN16x8: limLo = 1; limHi = 16; break;
+ case Iop_SarN8x16: limLo = 1; limHi = 8; break;
+ case Iop_ShlN64x2: limLo = 0; limHi = 63; break;
+ case Iop_ShlN32x4: limLo = 0; limHi = 31; break;
+ case Iop_ShlN16x8: limLo = 0; limHi = 15; break;
+ case Iop_ShlN8x16: limLo = 0; limHi = 7; break;
+ case Iop_QShlNsatUU64x2: limLo = 0; limHi = 63; break;
+ case Iop_QShlNsatUU32x4: limLo = 0; limHi = 31; break;
+ case Iop_QShlNsatUU16x8: limLo = 0; limHi = 15; break;
+ case Iop_QShlNsatUU8x16: limLo = 0; limHi = 7; break;
+ case Iop_QShlNsatSS64x2: limLo = 0; limHi = 63; break;
+ case Iop_QShlNsatSS32x4: limLo = 0; limHi = 31; break;
+ case Iop_QShlNsatSS16x8: limLo = 0; limHi = 15; break;
+ case Iop_QShlNsatSS8x16: limLo = 0; limHi = 7; break;
+ case Iop_QShlNsatSU64x2: limLo = 0; limHi = 63; break;
+ case Iop_QShlNsatSU32x4: limLo = 0; limHi = 31; break;
+ case Iop_QShlNsatSU16x8: limLo = 0; limHi = 15; break;
+ case Iop_QShlNsatSU8x16: limLo = 0; limHi = 7; break;
default: vassert(0);
}
/* For left shifts, the allowable amt values are
diff --git a/priv/host_arm_isel.c b/priv/host_arm_isel.c
index 8235282..6b18689 100644
--- a/priv/host_arm_isel.c
+++ b/priv/host_arm_isel.c
@@ -2672,72 +2672,72 @@
res, argL, argR, size, False));
return res;
}
- case Iop_QShlN8x8:
- case Iop_QShlN16x4:
- case Iop_QShlN32x2:
- case Iop_QShlN64x1: {
+ case Iop_QShlNsatUU8x8:
+ case Iop_QShlNsatUU16x4:
+ case Iop_QShlNsatUU32x2:
+ case Iop_QShlNsatUU64x1: {
HReg res = newVRegD(env);
HReg argL = iselNeon64Expr(env, e->Iex.Binop.arg1);
UInt size, imm;
if (e->Iex.Binop.arg2->tag != Iex_Const ||
typeOfIRExpr(env->type_env, e->Iex.Binop.arg2) != Ity_I8) {
- vpanic("ARM taget supports Iop_QShlNAxB with constant "
+ vpanic("ARM target supports Iop_QShlNsatUUAxB with constant "
"second argument only\n");
}
imm = e->Iex.Binop.arg2->Iex.Const.con->Ico.U8;
switch (e->Iex.Binop.op) {
- case Iop_QShlN8x8: size = 8 | imm; break;
- case Iop_QShlN16x4: size = 16 | imm; break;
- case Iop_QShlN32x2: size = 32 | imm; break;
- case Iop_QShlN64x1: size = 64 | imm; break;
+ case Iop_QShlNsatUU8x8: size = 8 | imm; break;
+ case Iop_QShlNsatUU16x4: size = 16 | imm; break;
+ case Iop_QShlNsatUU32x2: size = 32 | imm; break;
+ case Iop_QShlNsatUU64x1: size = 64 | imm; break;
default: vassert(0);
}
addInstr(env, ARMInstr_NUnary(ARMneon_VQSHLNUU,
res, argL, size, False));
return res;
}
- case Iop_QShlN8Sx8:
- case Iop_QShlN16Sx4:
- case Iop_QShlN32Sx2:
- case Iop_QShlN64Sx1: {
+ case Iop_QShlNsatSU8x8:
+ case Iop_QShlNsatSU16x4:
+ case Iop_QShlNsatSU32x2:
+ case Iop_QShlNsatSU64x1: {
HReg res = newVRegD(env);
HReg argL = iselNeon64Expr(env, e->Iex.Binop.arg1);
UInt size, imm;
if (e->Iex.Binop.arg2->tag != Iex_Const ||
typeOfIRExpr(env->type_env, e->Iex.Binop.arg2) != Ity_I8) {
- vpanic("ARM taget supports Iop_QShlNAxB with constant "
+ vpanic("ARM target supports Iop_QShlNsatSUAxB with constant "
"second argument only\n");
}
imm = e->Iex.Binop.arg2->Iex.Const.con->Ico.U8;
switch (e->Iex.Binop.op) {
- case Iop_QShlN8Sx8: size = 8 | imm; break;
- case Iop_QShlN16Sx4: size = 16 | imm; break;
- case Iop_QShlN32Sx2: size = 32 | imm; break;
- case Iop_QShlN64Sx1: size = 64 | imm; break;
+ case Iop_QShlNsatSU8x8: size = 8 | imm; break;
+ case Iop_QShlNsatSU16x4: size = 16 | imm; break;
+ case Iop_QShlNsatSU32x2: size = 32 | imm; break;
+ case Iop_QShlNsatSU64x1: size = 64 | imm; break;
default: vassert(0);
}
addInstr(env, ARMInstr_NUnary(ARMneon_VQSHLNUS,
res, argL, size, False));
return res;
}
- case Iop_QSalN8x8:
- case Iop_QSalN16x4:
- case Iop_QSalN32x2:
- case Iop_QSalN64x1: {
+ case Iop_QShlNsatSS8x8:
+ case Iop_QShlNsatSS16x4:
+ case Iop_QShlNsatSS32x2:
+ case Iop_QShlNsatSS64x1: {
HReg res = newVRegD(env);
HReg argL = iselNeon64Expr(env, e->Iex.Binop.arg1);
UInt size, imm;
if (e->Iex.Binop.arg2->tag != Iex_Const ||
typeOfIRExpr(env->type_env, e->Iex.Binop.arg2) != Ity_I8) {
- vpanic("ARM taget supports Iop_QShlNAxB with constant "
+ vpanic("ARM target supports Iop_QShlNsatSSAxB with constant "
"second argument only\n");
}
imm = e->Iex.Binop.arg2->Iex.Const.con->Ico.U8;
switch (e->Iex.Binop.op) {
- case Iop_QSalN8x8: size = 8 | imm; break;
- case Iop_QSalN16x4: size = 16 | imm; break;
- case Iop_QSalN32x2: size = 32 | imm; break;
- case Iop_QSalN64x1: size = 64 | imm; break;
+ case Iop_QShlNsatSS8x8: size = 8 | imm; break;
+ case Iop_QShlNsatSS16x4: size = 16 | imm; break;
+ case Iop_QShlNsatSS32x2: size = 32 | imm; break;
+ case Iop_QShlNsatSS64x1: size = 64 | imm; break;
default: vassert(0);
}
addInstr(env, ARMInstr_NUnary(ARMneon_VQSHLNSS,
@@ -4842,72 +4842,72 @@
res, argL, argR, size, True));
return res;
}
- case Iop_QShlN8x16:
- case Iop_QShlN16x8:
- case Iop_QShlN32x4:
- case Iop_QShlN64x2: {
+ case Iop_QShlNsatUU8x16:
+ case Iop_QShlNsatUU16x8:
+ case Iop_QShlNsatUU32x4:
+ case Iop_QShlNsatUU64x2: {
HReg res = newVRegV(env);
HReg argL = iselNeonExpr(env, e->Iex.Binop.arg1);
UInt size, imm;
if (e->Iex.Binop.arg2->tag != Iex_Const ||
typeOfIRExpr(env->type_env, e->Iex.Binop.arg2) != Ity_I8) {
- vpanic("ARM taget supports Iop_QShlNAxB with constant "
+ vpanic("ARM target supports Iop_QShlNsatUUAxB with constant "
"second argument only\n");
}
imm = e->Iex.Binop.arg2->Iex.Const.con->Ico.U8;
switch (e->Iex.Binop.op) {
- case Iop_QShlN8x16: size = 8 | imm; break;
- case Iop_QShlN16x8: size = 16 | imm; break;
- case Iop_QShlN32x4: size = 32 | imm; break;
- case Iop_QShlN64x2: size = 64 | imm; break;
+ case Iop_QShlNsatUU8x16: size = 8 | imm; break;
+ case Iop_QShlNsatUU16x8: size = 16 | imm; break;
+ case Iop_QShlNsatUU32x4: size = 32 | imm; break;
+ case Iop_QShlNsatUU64x2: size = 64 | imm; break;
default: vassert(0);
}
addInstr(env, ARMInstr_NUnary(ARMneon_VQSHLNUU,
res, argL, size, True));
return res;
}
- case Iop_QShlN8Sx16:
- case Iop_QShlN16Sx8:
- case Iop_QShlN32Sx4:
- case Iop_QShlN64Sx2: {
+ case Iop_QShlNsatSU8x16:
+ case Iop_QShlNsatSU16x8:
+ case Iop_QShlNsatSU32x4:
+ case Iop_QShlNsatSU64x2: {
HReg res = newVRegV(env);
HReg argL = iselNeonExpr(env, e->Iex.Binop.arg1);
UInt size, imm;
if (e->Iex.Binop.arg2->tag != Iex_Const ||
typeOfIRExpr(env->type_env, e->Iex.Binop.arg2) != Ity_I8) {
- vpanic("ARM taget supports Iop_QShlNASxB with constant "
+ vpanic("ARM target supports Iop_QShlNsatSUAxB with constant "
"second argument only\n");
}
imm = e->Iex.Binop.arg2->Iex.Const.con->Ico.U8;
switch (e->Iex.Binop.op) {
- case Iop_QShlN8Sx16: size = 8 | imm; break;
- case Iop_QShlN16Sx8: size = 16 | imm; break;
- case Iop_QShlN32Sx4: size = 32 | imm; break;
- case Iop_QShlN64Sx2: size = 64 | imm; break;
+ case Iop_QShlNsatSU8x16: size = 8 | imm; break;
+ case Iop_QShlNsatSU16x8: size = 16 | imm; break;
+ case Iop_QShlNsatSU32x4: size = 32 | imm; break;
+ case Iop_QShlNsatSU64x2: size = 64 | imm; break;
default: vassert(0);
}
addInstr(env, ARMInstr_NUnary(ARMneon_VQSHLNUS,
res, argL, size, True));
return res;
}
- case Iop_QSalN8x16:
- case Iop_QSalN16x8:
- case Iop_QSalN32x4:
- case Iop_QSalN64x2: {
+ case Iop_QShlNsatSS8x16:
+ case Iop_QShlNsatSS16x8:
+ case Iop_QShlNsatSS32x4:
+ case Iop_QShlNsatSS64x2: {
HReg res = newVRegV(env);
HReg argL = iselNeonExpr(env, e->Iex.Binop.arg1);
UInt size, imm;
if (e->Iex.Binop.arg2->tag != Iex_Const ||
typeOfIRExpr(env->type_env, e->Iex.Binop.arg2) != Ity_I8) {
- vpanic("ARM taget supports Iop_QShlNAxB with constant "
+ vpanic("ARM target supports Iop_QShlNsatSSAxB with constant "
"second argument only\n");
}
imm = e->Iex.Binop.arg2->Iex.Const.con->Ico.U8;
switch (e->Iex.Binop.op) {
- case Iop_QSalN8x16: size = 8 | imm; break;
- case Iop_QSalN16x8: size = 16 | imm; break;
- case Iop_QSalN32x4: size = 32 | imm; break;
- case Iop_QSalN64x2: size = 64 | imm; break;
+ case Iop_QShlNsatSS8x16: size = 8 | imm; break;
+ case Iop_QShlNsatSS16x8: size = 16 | imm; break;
+ case Iop_QShlNsatSS32x4: size = 32 | imm; break;
+ case Iop_QShlNsatSS64x2: size = 64 | imm; break;
default: vassert(0);
}
addInstr(env, ARMInstr_NUnary(ARMneon_VQSHLNSS,
diff --git a/priv/ir_defs.c b/priv/ir_defs.c
index ed23fd9..50f161d 100644
--- a/priv/ir_defs.c
+++ b/priv/ir_defs.c
@@ -559,18 +559,18 @@
case Iop_QSal16x4: vex_printf("QSal16x4"); return;
case Iop_QSal32x2: vex_printf("QSal32x2"); return;
case Iop_QSal64x1: vex_printf("QSal64x1"); return;
- case Iop_QShlN8x8: vex_printf("QShlN8x8"); return;
- case Iop_QShlN16x4: vex_printf("QShlN16x4"); return;
- case Iop_QShlN32x2: vex_printf("QShlN32x2"); return;
- case Iop_QShlN64x1: vex_printf("QShlN64x1"); return;
- case Iop_QShlN8Sx8: vex_printf("QShlN8Sx8"); return;
- case Iop_QShlN16Sx4: vex_printf("QShlN16Sx4"); return;
- case Iop_QShlN32Sx2: vex_printf("QShlN32Sx2"); return;
- case Iop_QShlN64Sx1: vex_printf("QShlN64Sx1"); return;
- case Iop_QSalN8x8: vex_printf("QSalN8x8"); return;
- case Iop_QSalN16x4: vex_printf("QSalN16x4"); return;
- case Iop_QSalN32x2: vex_printf("QSalN32x2"); return;
- case Iop_QSalN64x1: vex_printf("QSalN64x1"); return;
+ case Iop_QShlNsatUU8x8: vex_printf("QShlNsatUU8x8"); return;
+ case Iop_QShlNsatUU16x4: vex_printf("QShlNsatUU16x4"); return;
+ case Iop_QShlNsatUU32x2: vex_printf("QShlNsatUU32x2"); return;
+ case Iop_QShlNsatUU64x1: vex_printf("QShlNsatUU64x1"); return;
+ case Iop_QShlNsatSU8x8: vex_printf("QShlNsatSU8x8"); return;
+ case Iop_QShlNsatSU16x4: vex_printf("QShlNsatSU16x4"); return;
+ case Iop_QShlNsatSU32x2: vex_printf("QShlNsatSU32x2"); return;
+ case Iop_QShlNsatSU64x1: vex_printf("QShlNsatSU64x1"); return;
+ case Iop_QShlNsatSS8x8: vex_printf("QShlNsatSS8x8"); return;
+ case Iop_QShlNsatSS16x4: vex_printf("QShlNsatSS16x4"); return;
+ case Iop_QShlNsatSS32x2: vex_printf("QShlNsatSS32x2"); return;
+ case Iop_QShlNsatSS64x1: vex_printf("QShlNsatSS64x1"); return;
case Iop_Sar8x8: vex_printf("Sar8x8"); return;
case Iop_Sar16x4: vex_printf("Sar16x4"); return;
case Iop_Sar32x2: vex_printf("Sar32x2"); return;
@@ -874,18 +874,18 @@
case Iop_QShl16x8: vex_printf("QShl16x8"); return;
case Iop_QShl32x4: vex_printf("QShl32x4"); return;
case Iop_QShl64x2: vex_printf("QShl64x2"); return;
- case Iop_QSalN8x16: vex_printf("QSalN8x16"); return;
- case Iop_QSalN16x8: vex_printf("QSalN16x8"); return;
- case Iop_QSalN32x4: vex_printf("QSalN32x4"); return;
- case Iop_QSalN64x2: vex_printf("QSalN64x2"); return;
- case Iop_QShlN8x16: vex_printf("QShlN8x16"); return;
- case Iop_QShlN16x8: vex_printf("QShlN16x8"); return;
- case Iop_QShlN32x4: vex_printf("QShlN32x4"); return;
- case Iop_QShlN64x2: vex_printf("QShlN64x2"); return;
- case Iop_QShlN8Sx16: vex_printf("QShlN8Sx16"); return;
- case Iop_QShlN16Sx8: vex_printf("QShlN16Sx8"); return;
- case Iop_QShlN32Sx4: vex_printf("QShlN32Sx4"); return;
- case Iop_QShlN64Sx2: vex_printf("QShlN64Sx2"); return;
+ case Iop_QShlNsatSS8x16: vex_printf("QShlNsatSS8x16"); return;
+ case Iop_QShlNsatSS16x8: vex_printf("QShlNsatSS16x8"); return;
+ case Iop_QShlNsatSS32x4: vex_printf("QShlNsatSS32x4"); return;
+ case Iop_QShlNsatSS64x2: vex_printf("QShlNsatSS64x2"); return;
+ case Iop_QShlNsatUU8x16: vex_printf("QShlNsatUU8x16"); return;
+ case Iop_QShlNsatUU16x8: vex_printf("QShlNsatUU16x8"); return;
+ case Iop_QShlNsatUU32x4: vex_printf("QShlNsatUU32x4"); return;
+ case Iop_QShlNsatUU64x2: vex_printf("QShlNsatUU64x2"); return;
+ case Iop_QShlNsatSU8x16: vex_printf("QShlNsatSU8x16"); return;
+ case Iop_QShlNsatSU16x8: vex_printf("QShlNsatSU16x8"); return;
+ case Iop_QShlNsatSU32x4: vex_printf("QShlNsatSU32x4"); return;
+ case Iop_QShlNsatSU64x2: vex_printf("QShlNsatSU64x2"); return;
case Iop_Shr8x16: vex_printf("Shr8x16"); return;
case Iop_Shr16x8: vex_printf("Shr16x8"); return;
case Iop_Shr32x4: vex_printf("Shr32x4"); return;
@@ -2545,12 +2545,12 @@
case Iop_ShlN32x2: case Iop_ShlN16x4: case Iop_ShlN8x8:
case Iop_ShrN32x2: case Iop_ShrN16x4: case Iop_ShrN8x8:
case Iop_SarN32x2: case Iop_SarN16x4: case Iop_SarN8x8:
- case Iop_QShlN8x8: case Iop_QShlN16x4:
- case Iop_QShlN32x2: case Iop_QShlN64x1:
- case Iop_QShlN8Sx8: case Iop_QShlN16Sx4:
- case Iop_QShlN32Sx2: case Iop_QShlN64Sx1:
- case Iop_QSalN8x8: case Iop_QSalN16x4:
- case Iop_QSalN32x2: case Iop_QSalN64x1:
+ case Iop_QShlNsatUU8x8: case Iop_QShlNsatUU16x4:
+ case Iop_QShlNsatUU32x2: case Iop_QShlNsatUU64x1:
+ case Iop_QShlNsatSU8x8: case Iop_QShlNsatSU16x4:
+ case Iop_QShlNsatSU32x2: case Iop_QShlNsatSU64x1:
+ case Iop_QShlNsatSS8x8: case Iop_QShlNsatSS16x4:
+ case Iop_QShlNsatSS32x2: case Iop_QShlNsatSS64x1:
BINARY(Ity_I64,Ity_I8, Ity_I64);
case Iop_Shl8: case Iop_Shr8: case Iop_Sar8:
@@ -2983,12 +2983,12 @@
case Iop_ShrN32x4: case Iop_ShrN64x2:
case Iop_SarN8x16: case Iop_SarN16x8:
case Iop_SarN32x4: case Iop_SarN64x2:
- case Iop_QShlN8x16: case Iop_QShlN16x8:
- case Iop_QShlN32x4: case Iop_QShlN64x2:
- case Iop_QShlN8Sx16: case Iop_QShlN16Sx8:
- case Iop_QShlN32Sx4: case Iop_QShlN64Sx2:
- case Iop_QSalN8x16: case Iop_QSalN16x8:
- case Iop_QSalN32x4: case Iop_QSalN64x2:
+ case Iop_QShlNsatUU8x16: case Iop_QShlNsatUU16x8:
+ case Iop_QShlNsatUU32x4: case Iop_QShlNsatUU64x2:
+ case Iop_QShlNsatSU8x16: case Iop_QShlNsatSU16x8:
+ case Iop_QShlNsatSU32x4: case Iop_QShlNsatSU64x2:
+ case Iop_QShlNsatSS8x16: case Iop_QShlNsatSS16x8:
+ case Iop_QShlNsatSS32x4: case Iop_QShlNsatSS64x2:
case Iop_SHA256: case Iop_SHA512:
case Iop_QandQShrNnarrow16Uto8Ux8:
case Iop_QandQShrNnarrow32Uto16Ux4:
diff --git a/pub/libvex_ir.h b/pub/libvex_ir.h
index b494afa..9431acb 100644
--- a/pub/libvex_ir.h
+++ b/pub/libvex_ir.h
@@ -919,9 +919,12 @@
Iop_QShl8x8, Iop_QShl16x4, Iop_QShl32x2, Iop_QShl64x1,
Iop_QSal8x8, Iop_QSal16x4, Iop_QSal32x2, Iop_QSal64x1,
/* VECTOR x INTEGER SATURATING SHIFT */
- Iop_QShlN8Sx8, Iop_QShlN16Sx4, Iop_QShlN32Sx2, Iop_QShlN64Sx1,
- Iop_QShlN8x8, Iop_QShlN16x4, Iop_QShlN32x2, Iop_QShlN64x1,
- Iop_QSalN8x8, Iop_QSalN16x4, Iop_QSalN32x2, Iop_QSalN64x1,
+ Iop_QShlNsatSU8x8, Iop_QShlNsatSU16x4,
+ Iop_QShlNsatSU32x2, Iop_QShlNsatSU64x1,
+ Iop_QShlNsatUU8x8, Iop_QShlNsatUU16x4,
+ Iop_QShlNsatUU32x2, Iop_QShlNsatUU64x1,
+ Iop_QShlNsatSS8x8, Iop_QShlNsatSS16x4,
+ Iop_QShlNsatSS32x2, Iop_QShlNsatSS64x1,
/* NARROWING (binary)
-- narrow 2xI64 into 1xI64, hi half from left arg */
@@ -1534,9 +1537,12 @@
Iop_QShl8x16, Iop_QShl16x8, Iop_QShl32x4, Iop_QShl64x2,
Iop_QSal8x16, Iop_QSal16x8, Iop_QSal32x4, Iop_QSal64x2,
/* VECTOR x INTEGER SATURATING SHIFT */
- Iop_QShlN8Sx16, Iop_QShlN16Sx8, Iop_QShlN32Sx4, Iop_QShlN64Sx2,
- Iop_QShlN8x16, Iop_QShlN16x8, Iop_QShlN32x4, Iop_QShlN64x2,
- Iop_QSalN8x16, Iop_QSalN16x8, Iop_QSalN32x4, Iop_QSalN64x2,
+ Iop_QShlNsatSU8x16, Iop_QShlNsatSU16x8,
+ Iop_QShlNsatSU32x4, Iop_QShlNsatSU64x2,
+ Iop_QShlNsatUU8x16, Iop_QShlNsatUU16x8,
+ Iop_QShlNsatUU32x4, Iop_QShlNsatUU64x2,
+ Iop_QShlNsatSS8x16, Iop_QShlNsatSS16x8,
+ Iop_QShlNsatSS32x4, Iop_QShlNsatSS64x2,
/* VECTOR x VECTOR BIDIRECTIONAL SATURATING (& MAYBE ROUNDING) SHIFT */
/* The least significant 8 bits of each lane of the second