Title: [279436] branches/safari-612.1.21-branch/Source/_javascript_Core

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));
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to