Diff
Modified: branches/safari-612.1.21-branch/Source/_javascript_Core/ChangeLog (279435 => 279436)
--- branches/safari-612.1.21-branch/Source/_javascript_Core/ChangeLog 2021-06-30 22:18:46 UTC (rev 279435)
+++ branches/safari-612.1.21-branch/Source/_javascript_Core/ChangeLog 2021-06-30 22:18:50 UTC (rev 279436)
@@ -1,5 +1,9 @@
2021-06-30 Alan Coon <[email protected]>
+ Revert r279249. rdar://problem/79987808
+
+2021-06-30 Alan Coon <[email protected]>
+
Revert r279253. rdar://problem/79987808
2021-06-25 Commit Queue <[email protected]>
Modified: branches/safari-612.1.21-branch/Source/_javascript_Core/assembler/MacroAssemblerARM64.h (279435 => 279436)
--- branches/safari-612.1.21-branch/Source/_javascript_Core/assembler/MacroAssemblerARM64.h 2021-06-30 22:18:46 UTC (rev 279435)
+++ branches/safari-612.1.21-branch/Source/_javascript_Core/assembler/MacroAssemblerARM64.h 2021-06-30 22:18:50 UTC (rev 279436)
@@ -2753,15 +2753,12 @@
}
// Bit field operations:
- void bitFieldInsert32(RegisterID source, TrustedImm32 lsb, TrustedImm32 width, RegisterID dest)
- {
- m_assembler.bfi<32>(dest, source, lsb.m_value, width.m_value);
- }
// destBitOffset is the top bit of the destination where the bits should be copied to. Zero is the lowest order bit.
- void bitFieldInsert64(RegisterID source, TrustedImm32 lsb, TrustedImm32 width, RegisterID dest)
+ void bitFieldInsert64(RegisterID source, unsigned destBitOffset, unsigned width, RegisterID dest)
{
- m_assembler.bfi<64>(dest, source, lsb.m_value, width.m_value);
+ ASSERT(width <= 64 - destBitOffset && destBitOffset < 64);
+ m_assembler.bfi<64>(dest, source, destBitOffset, width);
}
// Forwards / external control flow operations:
Modified: branches/safari-612.1.21-branch/Source/_javascript_Core/assembler/testmasm.cpp (279435 => 279436)
--- branches/safari-612.1.21-branch/Source/_javascript_Core/assembler/testmasm.cpp 2021-06-30 22:18:46 UTC (rev 279435)
+++ branches/safari-612.1.21-branch/Source/_javascript_Core/assembler/testmasm.cpp 2021-06-30 22:18:50 UTC (rev 279436)
@@ -1089,6 +1089,30 @@
}
}
+void testUbfx32()
+{
+ uint32_t src = ""
+ Vector<uint32_t> imms = { 0, 1, 30, 31, 32, 62, 63, 64 };
+ for (auto lsb : imms) {
+ for (auto width : imms) {
+ if (lsb >= 0 && width > 0 && lsb + width < 32) {
+ auto ubfx32 = compile([=] (CCallHelpers& jit) {
+ emitFunctionPrologue(jit);
+
+ jit.ubfx32(GPRInfo::returnValueGPR,
+ CCallHelpers::TrustedImm32(lsb),
+ CCallHelpers::TrustedImm32(width),
+ GPRInfo::returnValueGPR);
+
+ emitFunctionEpilogue(jit);
+ jit.ret();
+ });
+ CHECK_EQ(invoke<uint32_t>(ubfx32, src), ((src >> lsb) & ((1U << width) - 1U)));
+ }
+ }
+ }
+}
+
void testMulSubSignExtend32()
{
// d = a - SExt32(n) * SExt32(m)
@@ -1112,34 +1136,10 @@
}
}
-void testUbfx32()
-{
- uint32_t src = ""
- Vector<uint32_t> imms = { 0, 1, 5, 7, 30, 31, 32, 42, 56, 62, 63, 64 };
- for (auto lsb : imms) {
- for (auto width : imms) {
- if (lsb >= 0 && width > 0 && lsb + width < 32) {
- auto ubfx32 = compile([=] (CCallHelpers& jit) {
- emitFunctionPrologue(jit);
-
- jit.ubfx32(GPRInfo::argumentGPR0,
- CCallHelpers::TrustedImm32(lsb),
- CCallHelpers::TrustedImm32(width),
- GPRInfo::returnValueGPR);
-
- emitFunctionEpilogue(jit);
- jit.ret();
- });
- CHECK_EQ(invoke<uint32_t>(ubfx32, src), ((src >> lsb) & ((1U << width) - 1U)));
- }
- }
- }
-}
-
void testUbfx64()
{
- uint64_t src = ""
- Vector<uint32_t> imms = { 0, 1, 5, 7, 30, 31, 32, 42, 56, 62, 63, 64 };
+ uint64_t src = ""
+ Vector<uint32_t> imms = { 0, 1, 30, 31, 32, 62, 63, 64 };
for (auto lsb : imms) {
for (auto width : imms) {
if (lsb >= 0 && width > 0 && lsb + width < 64) {
@@ -1146,7 +1146,7 @@
auto ubfx64 = compile([=] (CCallHelpers& jit) {
emitFunctionPrologue(jit);
- jit.ubfx64(GPRInfo::argumentGPR0,
+ jit.ubfx64(GPRInfo::returnValueGPR,
CCallHelpers::TrustedImm32(lsb),
CCallHelpers::TrustedImm32(width),
GPRInfo::returnValueGPR);
@@ -1162,8 +1162,8 @@
void testUbfiz32()
{
- uint32_t src = ""
- Vector<uint32_t> imms = { 0, 1, 5, 7, 30, 31, 32, 42, 56, 62, 63, 64 };
+ uint32_t src = ""
+ Vector<uint32_t> imms = { 0, 1, 30, 31, 32, 62, 63, 64 };
for (auto lsb : imms) {
for (auto width : imms) {
if (lsb >= 0 && width > 0 && lsb + width < 32) {
@@ -1170,7 +1170,7 @@
auto ubfiz32 = compile([=] (CCallHelpers& jit) {
emitFunctionPrologue(jit);
- jit.ubfiz32(GPRInfo::argumentGPR0,
+ jit.ubfiz32(GPRInfo::returnValueGPR,
CCallHelpers::TrustedImm32(lsb),
CCallHelpers::TrustedImm32(width),
GPRInfo::returnValueGPR);
@@ -1187,8 +1187,8 @@
void testUbfiz64()
{
- uint64_t src = ""
- Vector<uint32_t> imms = { 0, 1, 5, 7, 30, 31, 32, 42, 56, 62, 63, 64 };
+ uint64_t src = ""
+ Vector<uint32_t> imms = { 0, 1, 30, 31, 32, 62, 63, 64 };
for (auto lsb : imms) {
for (auto width : imms) {
if (lsb >= 0 && width > 0 && lsb + width < 64) {
@@ -1195,7 +1195,7 @@
auto ubfiz64 = compile([=] (CCallHelpers& jit) {
emitFunctionPrologue(jit);
- jit.ubfiz64(GPRInfo::argumentGPR0,
+ jit.ubfiz64(GPRInfo::returnValueGPR,
CCallHelpers::TrustedImm32(lsb),
CCallHelpers::TrustedImm32(width),
GPRInfo::returnValueGPR);
@@ -1209,66 +1209,6 @@
}
}
}
-
-void testBitFieldInsert32()
-{
- uint32_t src = ""
- uint32_t dst = 0xf0f0f0f0;
- Vector<uint32_t> imms = { 0, 1, 5, 7, 30, 31, 32, 42, 56, 62, 63, 64 };
- for (auto lsb : imms) {
- for (auto width : imms) {
- if (lsb >= 0 && width > 0 && lsb + width < 32) {
- auto bfi32 = compile([=] (CCallHelpers& jit) {
- emitFunctionPrologue(jit);
-
- jit.bitFieldInsert64(GPRInfo::argumentGPR0,
- CCallHelpers::TrustedImm32(lsb),
- CCallHelpers::TrustedImm32(width),
- GPRInfo::argumentGPR1);
- jit.move(GPRInfo::argumentGPR1, GPRInfo::returnValueGPR);
-
- emitFunctionEpilogue(jit);
- jit.ret();
- });
- uint32_t mask1 = (1U << width) - 1U;
- uint32_t mask2 = ~(mask1 << lsb);
- uint32_t rhs = invoke<uint32_t>(bfi32, src, dst);
- uint32_t lhs = ((src & mask1) << lsb) | (dst & mask2);
- CHECK_EQ(rhs, lhs);
- }
- }
- }
-}
-
-void testBitFieldInsert64()
-{
- uint64_t src = ""
- uint64_t dst = 0xf0f0f0f0f0f0f0f0;
- Vector<uint32_t> imms = { 0, 1, 5, 7, 30, 31, 32, 42, 56, 62, 63, 64 };
- for (auto lsb : imms) {
- for (auto width : imms) {
- if (lsb >= 0 && width > 0 && lsb + width < 64) {
- auto bfi64 = compile([=] (CCallHelpers& jit) {
- emitFunctionPrologue(jit);
-
- jit.bitFieldInsert64(GPRInfo::argumentGPR0,
- CCallHelpers::TrustedImm32(lsb),
- CCallHelpers::TrustedImm32(width),
- GPRInfo::argumentGPR1);
- jit.move(GPRInfo::argumentGPR1, GPRInfo::returnValueGPR);
-
- emitFunctionEpilogue(jit);
- jit.ret();
- });
- uint64_t mask1 = (1ULL << width) - 1ULL;
- uint64_t mask2 = ~(mask1 << lsb);
- uint64_t rhs = invoke<uint64_t>(bfi64, src, dst);
- uint64_t lhs = ((src & mask1) << lsb) | (dst & mask2);
- CHECK_EQ(rhs, lhs);
- }
- }
- }
-}
#endif
#if CPU(X86) || CPU(X86_64) || CPU(ARM64)
@@ -3440,8 +3380,6 @@
RUN(testUbfx64());
RUN(testUbfiz32());
RUN(testUbfiz64());
- RUN(testBitFieldInsert32());
- RUN(testBitFieldInsert64());
#endif
#if CPU(X86) || CPU(X86_64) || CPU(ARM64)
Modified: branches/safari-612.1.21-branch/Source/_javascript_Core/b3/B3LowerToAir.cpp (279435 => 279436)
--- branches/safari-612.1.21-branch/Source/_javascript_Core/b3/B3LowerToAir.cpp 2021-06-30 22:18:46 UTC (rev 279435)
+++ branches/safari-612.1.21-branch/Source/_javascript_Core/b3/B3LowerToAir.cpp 2021-06-30 22:18:50 UTC (rev 279436)
@@ -2761,19 +2761,18 @@
return;
}
- // UBFX Pattern: dest = (src >> lsb) & mask
- // Where: mask = (1 << width) - 1
+ // UBFX Pattern: dest = (src >> lsb) & mask where mask = (1 << width) - 1
auto tryAppendUBFX = [&] () -> bool {
- Air::Opcode opcode = opcodeForType(Ubfx32, Ubfx64, m_value->type());
- if (!isValidForm(opcode, Arg::Tmp, Arg::Imm, Arg::Imm, Arg::Tmp))
- return false;
if (left->opcode() != ZShr || !canBeInternal(left))
return false;
-
Value* srcValue = left->child(0);
Value* lsbValue = left->child(1);
- if (m_locked.contains(srcValue) || !imm(lsbValue) || lsbValue->asInt() < 0 || !right->hasInt())
+
+ Air::Opcode opcode = opcodeForType(Ubfx32, Ubfx64, srcValue->type());
+ if (!isValidForm(opcode, Arg::Tmp, Arg::Imm, Arg::Imm, Arg::Tmp))
return false;
+ if (!imm(lsbValue) || lsbValue->asInt() < 0 || !right->hasInt())
+ return false;
uint64_t lsb = lsbValue->asInt();
uint64_t mask = right->asInt();
@@ -2797,67 +2796,8 @@
}
case BitOr: {
- Value* left = m_value->child(0);
- Value* right = m_value->child(1);
-
- // BFI Pattern: d = ((n & mask1) << lsb) | (d & mask2)
- // Where: mask1 = ((1 << width) - 1)
- // mask2 = ~(mask1 << lsb)
- auto tryAppendBFI = [&] (Value* left, Value* right) -> bool {
- Air::Opcode opcode = opcodeForType(BitFieldInsert32, BitFieldInsert64, m_value->type());
- if (!isValidForm(opcode, Arg::Tmp, Arg::Imm, Arg::Imm, Arg::Tmp))
- return false;
- if (left->opcode() != Shl || !canBeInternal(left))
- return false;
- if (right->opcode() != BitAnd || !canBeInternal(right))
- return false;
- if (left->child(0)->opcode() != BitAnd || !canBeInternal(left->child(0)))
- return false;
-
- Value* nValue = left->child(0)->child(0);
- Value* maskValue1 = left->child(0)->child(1);
- Value* lsbValue = left->child(1);
- Value* dValue = right->child(0);
- Value* maskValue2 = right->child(1);
- if (m_locked.contains(nValue) || m_locked.contains(dValue))
- return false;
- if (!maskValue1->hasInt() || !imm(lsbValue) || lsbValue->asInt() < 0 || !maskValue2->hasInt())
- return false;
-
- uint64_t lsb = lsbValue->asInt();
- uint64_t mask1 = maskValue1->asInt();
- if (!mask1 || mask1 & (mask1 + 1))
- return false;
- uint64_t datasize = opcode == BitFieldInsert32 ? 32 : 64;
- uint64_t width = WTF::bitCount(mask1);
- if (lsb + width > datasize)
- return false;
-
- uint64_t mask2 = maskValue2->asInt();
-
- auto isValidMask2 = [&] () -> bool {
- uint64_t mask = ((mask1 << lsb) ^ mask2);
- uint64_t lowerSet = 0xffffffff;
- uint64_t fullSet = 0xffffffffffffffff;
- return datasize == 32 ? !((mask & lowerSet) ^ lowerSet) : !(mask ^ fullSet);
- };
-
- if (!isValidMask2())
- return false;
-
- Tmp result = tmp(m_value);
- append(relaxedMoveForType(m_value->type()), tmp(dValue), result);
- append(opcode, tmp(nValue), imm(lsbValue), imm(width), result);
- commitInternal(left->child(0));
- commitInternal(left);
- commitInternal(right);
- return true;
- };
-
- if (tryAppendBFI(left, right) || tryAppendBFI(right, left))
- return;
-
- appendBinOp<Or32, Or64, OrDouble, OrFloat, Commutative>(left, right);
+ appendBinOp<Or32, Or64, OrDouble, OrFloat, Commutative>(
+ m_value->child(0), m_value->child(1));
return;
}
@@ -2896,19 +2836,18 @@
Value* left = m_value->child(0);
Value* right = m_value->child(1);
- // UBFIZ Pattern: d = (n & mask) << lsb
- // Where: mask = (1 << width) - 1
+ // UBFIZ Pattern: d = (n & mask) << lsb where mask = (1 << width) - 1
auto tryAppendUBFZ = [&] () -> bool {
- Air::Opcode opcode = opcodeForType(Ubfiz32, Ubfiz64, m_value->type());
- if (!isValidForm(opcode, Arg::Tmp, Arg::Imm, Arg::Imm, Arg::Tmp))
- return false;
if (left->opcode() != BitAnd || !canBeInternal(left))
return false;
-
Value* nValue = left->child(0);
Value* maskValue = left->child(1);
- if (m_locked.contains(nValue) || !maskValue->hasInt() || !imm(right) || right->asInt() < 0)
+
+ Air::Opcode opcode = opcodeForType(Ubfiz32, Ubfiz64, nValue->type());
+ if (!isValidForm(opcode, Arg::Tmp, Arg::Imm, Arg::Imm, Arg::Tmp))
return false;
+ if (!maskValue->hasInt() || !imm(right) || right->asInt() < 0)
+ return false;
uint64_t lsb = right->asInt();
uint64_t mask = maskValue->asInt();
Modified: branches/safari-612.1.21-branch/Source/_javascript_Core/b3/air/AirOpcode.opcodes (279435 => 279436)
--- branches/safari-612.1.21-branch/Source/_javascript_Core/b3/air/AirOpcode.opcodes 2021-06-30 22:18:46 UTC (rev 279435)
+++ branches/safari-612.1.21-branch/Source/_javascript_Core/b3/air/AirOpcode.opcodes 2021-06-30 22:18:50 UTC (rev 279436)
@@ -375,12 +375,6 @@
arm64: Ubfiz64 U:G:64, U:G:32, U:G:32, D:G:64
Tmp, Imm, Imm, Tmp
-arm64: BitFieldInsert32 U:G:32, U:G:32, U:G:32, ZD:G:32
- Tmp, Imm, Imm, Tmp
-
-arm64: BitFieldInsert64 U:G:64, U:G:32, U:G:32, D:G:64
- Tmp, Imm, Imm, Tmp
-
64: And64 U:G:64, U:G:64, D:G:64
Tmp, Tmp, Tmp
arm64: BitImm64, Tmp, Tmp
Modified: branches/safari-612.1.21-branch/Source/_javascript_Core/b3/testb3.h (279435 => 279436)
--- branches/safari-612.1.21-branch/Source/_javascript_Core/b3/testb3.h 2021-06-30 22:18:46 UTC (rev 279435)
+++ branches/safari-612.1.21-branch/Source/_javascript_Core/b3/testb3.h 2021-06-30 22:18:50 UTC (rev 279436)
@@ -428,8 +428,6 @@
void testUbfiz64AndShiftMaskValue();
void testUbfiz64ShiftAnd();
void testUbfiz64AndShift();
-void testBitFieldInsert32();
-void testBitFieldInsert64();
void testBitAndZeroShiftRightArgImmMask32();
void testBitAndZeroShiftRightArgImmMask64();
void testBasicSelect();
Modified: branches/safari-612.1.21-branch/Source/_javascript_Core/b3/testb3_2.cpp (279435 => 279436)
--- branches/safari-612.1.21-branch/Source/_javascript_Core/b3/testb3_2.cpp 2021-06-30 22:18:46 UTC (rev 279435)
+++ branches/safari-612.1.21-branch/Source/_javascript_Core/b3/testb3_2.cpp 2021-06-30 22:18:50 UTC (rev 279436)
@@ -3158,154 +3158,6 @@
}
}
-void testBitFieldInsert32()
-{
- if (JSC::Options::defaultB3OptLevel() < 2)
- return;
- uint32_t d = 0xf0f0f0f0;
- uint32_t n = 0xffffffff;
- Vector<uint32_t> lsbs = { 1, 2, 14, 30, 30 };
- Vector<uint32_t> widths = { 30, 3, 17, 1, 2 };
-
- // Test Pattern: d = ((n & mask1) << lsb) | (d & mask2)
- // Where: mask1 = ((1 << width) - 1)
- // mask2 = ~(mask1 << lsb)
- auto test1 = [&] (uint32_t lsb, uint32_t mask1, uint32_t mask2) -> uint32_t {
- Procedure proc;
- BasicBlock* root = proc.addBlock();
-
- Value* dValue = root->appendNew<Value>(
- proc, Trunc, Origin(),
- root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0));
- Value* nValue = root->appendNew<Value>(
- proc, Trunc, Origin(),
- root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR1));
- Value* lsbValue = root->appendNew<Const32Value>(proc, Origin(), lsb);
- Value* maskValue1 = root->appendNew<Const32Value>(proc, Origin(), mask1);
- Value* maskValue2 = root->appendNew<Const32Value>(proc, Origin(), mask2);
-
- Value* leftAndValue = root->appendNew<Value>(proc, BitAnd, Origin(), nValue, maskValue1);
- Value* shiftValue = root->appendNew<Value>(proc, Shl, Origin(), leftAndValue, lsbValue);
- Value* rightAndValue = root->appendNew<Value>(proc, BitAnd, Origin(), dValue, maskValue2);
- root->appendNewControlValue(
- proc, Return, Origin(),
- root->appendNew<Value>(proc, BitOr, Origin(), shiftValue, rightAndValue));
-
- auto code = compileProc(proc);
- if (isARM64())
- checkUsesInstruction(*code, "bfi");
- return invoke<uint32_t>(*code, d, n);
- };
-
- // Test Pattern: d = (d & mask2) | ((n & mask1) << lsb)
- // Where: mask1 = ((1 << width) - 1)
- // mask2 = ~(mask1 << lsb)
- auto test2 = [&] (uint32_t lsb, uint32_t mask1, uint32_t mask2) -> uint32_t {
- Procedure proc;
- BasicBlock* root = proc.addBlock();
-
- Value* dValue = root->appendNew<Value>(
- proc, Trunc, Origin(),
- root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0));
- Value* nValue = root->appendNew<Value>(
- proc, Trunc, Origin(),
- root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR1));
- Value* lsbValue = root->appendNew<Const32Value>(proc, Origin(), lsb);
- Value* maskValue1 = root->appendNew<Const32Value>(proc, Origin(), mask1);
- Value* maskValue2 = root->appendNew<Const32Value>(proc, Origin(), mask2);
-
- Value* leftAndValue = root->appendNew<Value>(proc, BitAnd, Origin(), dValue, maskValue2);
- Value* rightAndValue = root->appendNew<Value>(proc, BitAnd, Origin(), nValue, maskValue1);
- Value* shiftValue = root->appendNew<Value>(proc, Shl, Origin(), rightAndValue, lsbValue);
- root->appendNewControlValue(
- proc, Return, Origin(),
- root->appendNew<Value>(proc, BitOr, Origin(), leftAndValue, shiftValue));
-
- auto code = compileProc(proc);
- if (isARM64())
- checkUsesInstruction(*code, "bfi");
- return invoke<uint32_t>(*code, d, n);
- };
-
- for (size_t i = 0; i < lsbs.size(); ++i) {
- uint32_t lsb = lsbs.at(i);
- uint32_t mask1 = (1U << widths.at(i)) - 1U;
- uint32_t mask2 = ~(mask1 << lsb);
- CHECK(test1(lsb, mask1, mask2) == (((n & mask1) << lsb) | (d & mask2)));
- CHECK(test2(lsb, mask1, mask2) == ((d & mask2) | ((n & mask1) << lsb)));
- }
-}
-
-void testBitFieldInsert64()
-{
- if (JSC::Options::defaultB3OptLevel() < 2)
- return;
- uint64_t d = 0xf0f0f0f0f0f0f0f0;
- uint64_t n = 0xffffffffffffffff;
- Vector<uint64_t> lsbs = { 1, 30, 14, 62, 62 };
- Vector<uint64_t> widths = { 62, 33, 17, 1, 2 };
-
- // Test Pattern: d = ((n & mask1) << lsb) | (d & mask2)
- // Where: mask1 = ((1 << width) - 1)
- // mask2 = ~(mask1 << lsb)
- auto test1 = [&] (uint64_t lsb, uint64_t mask1, uint64_t mask2) -> uint64_t {
- Procedure proc;
- BasicBlock* root = proc.addBlock();
-
- Value* dValue = root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0);
- Value* nValue = root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR1);
- Value* lsbValue = root->appendNew<Const32Value>(proc, Origin(), lsb);
- Value* maskValue1 = root->appendNew<Const64Value>(proc, Origin(), mask1);
- Value* maskValue2 = root->appendNew<Const64Value>(proc, Origin(), mask2);
-
- Value* leftAndValue = root->appendNew<Value>(proc, BitAnd, Origin(), nValue, maskValue1);
- Value* shiftValue = root->appendNew<Value>(proc, Shl, Origin(), leftAndValue, lsbValue);
- Value* rightAndValue = root->appendNew<Value>(proc, BitAnd, Origin(), dValue, maskValue2);
- root->appendNewControlValue(
- proc, Return, Origin(),
- root->appendNew<Value>(proc, BitOr, Origin(), shiftValue, rightAndValue));
-
- auto code = compileProc(proc);
- if (isARM64())
- checkUsesInstruction(*code, "bfi");
- return invoke<uint64_t>(*code, d, n);
- };
-
- // Test Pattern: d = (d & mask2) | ((n & mask1) << lsb)
- // Where: mask1 = ((1 << width) - 1)
- // mask2 = ~(mask1 << lsb)
- auto test2 = [&] (uint64_t lsb, uint64_t mask1, uint64_t mask2) -> uint64_t {
- Procedure proc;
- BasicBlock* root = proc.addBlock();
-
- Value* dValue = root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0);
- Value* nValue = root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR1);
- Value* lsbValue = root->appendNew<Const32Value>(proc, Origin(), lsb);
- Value* maskValue1 = root->appendNew<Const64Value>(proc, Origin(), mask1);
- Value* maskValue2 = root->appendNew<Const64Value>(proc, Origin(), mask2);
-
- Value* leftAndValue = root->appendNew<Value>(proc, BitAnd, Origin(), dValue, maskValue2);
- Value* rightAndValue = root->appendNew<Value>(proc, BitAnd, Origin(), nValue, maskValue1);
- Value* shiftValue = root->appendNew<Value>(proc, Shl, Origin(), rightAndValue, lsbValue);
- root->appendNewControlValue(
- proc, Return, Origin(),
- root->appendNew<Value>(proc, BitOr, Origin(), leftAndValue, shiftValue));
-
- auto code = compileProc(proc);
- if (isARM64())
- checkUsesInstruction(*code, "bfi");
- return invoke<uint64_t>(*code, d, n);
- };
-
- for (size_t i = 0; i < lsbs.size(); ++i) {
- uint64_t lsb = lsbs.at(i);
- uint64_t mask1 = (1ULL << widths.at(i)) - 1ULL;
- uint64_t mask2 = ~(mask1 << lsb);
- CHECK(test1(lsb, mask1, mask2) == (((n & mask1) << lsb) | (d & mask2)));
- CHECK(test2(lsb, mask1, mask2) == ((d & mask2) | ((n & mask1) << lsb)));
- }
-}
-
void testBitAndZeroShiftRightArgImmMask32()
{
// Turn this: (tmp >> imm) & mask
@@ -4198,8 +4050,6 @@
RUN(testUbfiz64AndShiftMaskValue());
RUN(testUbfiz64ShiftAnd());
RUN(testUbfiz64AndShift());
- RUN(testBitFieldInsert32());
- RUN(testBitFieldInsert64());
RUN(testBitAndZeroShiftRightArgImmMask32());
RUN(testBitAndZeroShiftRightArgImmMask64());
RUN(testBitAndArgs(43, 43));