Apply poisoning to more pointers in JSC.
[WebKit-https.git] / Source / JavaScriptCore / llint / LowLevelInterpreter64.asm
index c849109..da4adb0 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (C) 2011-2017 Apple Inc. All rights reserved.
+# Copyright (C) 2011-2018 Apple Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions
@@ -45,6 +45,7 @@ macro dispatchAfterCall()
     loadi ArgumentCount + TagOffset[cfr], PC
     loadp CodeBlock[cfr], PB
     loadp CodeBlock::m_instructions[PB], PB
+    unpoison(CodeBlockPoison, PB)
     loadisFromInstruction(1, t1)
     storeq r0, [cfr, t1, 8]
     valueProfile(r0, (CallOpCodeSize - 1), t3)
@@ -129,8 +130,8 @@ macro doVMEntry(makeCall)
     storep vm, VMEntryRecord::m_vm[sp]
     loadp VM::topCallFrame[vm], t4
     storep t4, VMEntryRecord::m_prevTopCallFrame[sp]
-    loadp VM::topVMEntryFrame[vm], t4
-    storep t4, VMEntryRecord::m_prevTopVMEntryFrame[sp]
+    loadp VM::topEntryFrame[vm], t4
+    storep t4, VMEntryRecord::m_prevTopEntryFrame[sp]
 
     loadi ProtoCallFrame::paddedArgCount[protoCallFrame], t4
     addp CallFrameHeaderSlots, t4, t4
@@ -171,8 +172,8 @@ macro doVMEntry(makeCall)
     loadp VMEntryRecord::m_vm[t4], vm
     loadp VMEntryRecord::m_prevTopCallFrame[t4], extraTempReg
     storep extraTempReg, VM::topCallFrame[vm]
-    loadp VMEntryRecord::m_prevTopVMEntryFrame[t4], extraTempReg
-    storep extraTempReg, VM::topVMEntryFrame[vm]
+    loadp VMEntryRecord::m_prevTopEntryFrame[t4], extraTempReg
+    storep extraTempReg, VM::topEntryFrame[vm]
 
     subp cfr, CalleeRegisterSaveSize, sp
 
@@ -220,7 +221,7 @@ macro doVMEntry(makeCall)
     else
         storep sp, VM::topCallFrame[vm]
     end
-    storep cfr, VM::topVMEntryFrame[vm]
+    storep cfr, VM::topEntryFrame[vm]
 
     checkStackPointerAlignment(extraTempReg, 0xbad0dc02)
 
@@ -236,8 +237,8 @@ macro doVMEntry(makeCall)
     loadp VMEntryRecord::m_vm[t4], vm
     loadp VMEntryRecord::m_prevTopCallFrame[t4], t2
     storep t2, VM::topCallFrame[vm]
-    loadp VMEntryRecord::m_prevTopVMEntryFrame[t4], t2
-    storep t2, VM::topVMEntryFrame[vm]
+    loadp VMEntryRecord::m_prevTopEntryFrame[t4], t2
+    storep t2, VM::topEntryFrame[vm]
 
     subp cfr, CalleeRegisterSaveSize, sp
 
@@ -276,7 +277,6 @@ macro makeHostFunctionCall(entry, temp)
     end
 end
 
-
 _handleUncaughtException:
     loadp Callee[cfr], t3
     andp MarkedBlockMask, t3
@@ -291,8 +291,8 @@ _handleUncaughtException:
     loadp VMEntryRecord::m_vm[t2], t3
     loadp VMEntryRecord::m_prevTopCallFrame[t2], extraTempReg
     storep extraTempReg, VM::topCallFrame[t3]
-    loadp VMEntryRecord::m_prevTopVMEntryFrame[t2], extraTempReg
-    storep extraTempReg, VM::topVMEntryFrame[t3]
+    loadp VMEntryRecord::m_prevTopEntryFrame[t2], extraTempReg
+    storep extraTempReg, VM::topEntryFrame[t3]
 
     subp cfr, CalleeRegisterSaveSize, sp
 
@@ -376,6 +376,17 @@ macro checkSwitchToJITForLoop()
         end)
 end
 
+macro loadCaged(basePtr, mask, source, dest, scratch)
+    loadp source, dest
+    if GIGACAGE_ENABLED and not C_LOOP
+        loadp basePtr, scratch
+        btpz scratch, .done
+        andp mask, dest
+        addp scratch, dest
+    .done:
+    end
+end
+
 macro loadVariable(operand, value)
     loadisFromInstruction(operand, value)
     loadq [cfr, value, 8], value
@@ -472,6 +483,7 @@ end
 macro structureIDToStructureWithScratch(structureIDThenStructure, scratch)
     loadp CodeBlock[cfr], scratch
     loadp CodeBlock::m_vm[scratch], scratch
+    unpoison(CodeBlockPoison, scratch)
     loadp VM::heap + Heap::m_structureIDTable + StructureIDTable::m_table[scratch], scratch
     loadp [scratch, structureIDThenStructure, 8], structureIDThenStructure
 end
@@ -485,6 +497,7 @@ macro loadStructureAndClobberFirstArg(cell, structure)
     loadi JSCell::m_structureID[cell], structure
     loadp CodeBlock[cfr], cell
     loadp CodeBlock::m_vm[cell], cell
+    unpoison(CodeBlockPoison, cell)
     loadp VM::heap + Heap::m_structureIDTable + StructureIDTable::m_table[cell], cell
     loadp [cell, structure, 8], structure
 end
@@ -504,7 +517,7 @@ macro functionArityCheck(doneLabel, slowPath)
     jmp _llint_throw_from_slow_path_trampoline
 
 .noError:
-    loadi CommonSlowPaths::ArityCheckData::paddedStackSpace[r1], t1
+    move r1, t1 # r1 contains slotsToAdd.
     btiz t1, .continue
     loadi PayloadOffset + ArgumentCount[cfr], t2
     addi CallFrameHeaderSlots, t2
@@ -549,6 +562,7 @@ macro functionArityCheck(doneLabel, slowPath)
     # Reload CodeBlock and reset PC, since the slow_path clobbered them.
     loadp CodeBlock[cfr], t1
     loadp CodeBlock::m_instructions[t1], PB
+    unpoison(CodeBlockPoison, PB)
     move 0, PC
     jmp doneLabel
 end
@@ -582,7 +596,7 @@ _llint_op_enter:
     btqnz t2, .opEnterLoop
 .opEnterDone:
     callOpcodeSlowPath(_slow_path_enter)
-    dispatch(1)
+    dispatch(constexpr op_enter_length)
 
 
 _llint_op_get_argument:
@@ -594,12 +608,12 @@ _llint_op_get_argument:
     loadq ThisArgumentOffset[cfr, t2, 8], t0
     storeq t0, [cfr, t1, 8]
     valueProfile(t0, 3, t2)
-    dispatch(4)
+    dispatch(constexpr op_get_argument_length)
 
 .opGetArgumentOutOfBounds:
     storeq ValueUndefined, [cfr, t1, 8]
     valueProfile(ValueUndefined, 3, t2)
-    dispatch(4)
+    dispatch(constexpr op_get_argument_length)
 
 
 _llint_op_argument_count:
@@ -609,7 +623,7 @@ _llint_op_argument_count:
     subi 1, t0
     orq TagTypeNumber, t0
     storeq t0, [cfr, t1, 8]
-    dispatch(2)
+    dispatch(constexpr op_argument_count_length)
 
 
 _llint_op_get_scope:
@@ -618,7 +632,7 @@ _llint_op_get_scope:
     loadp JSCallee::m_scope[t0], t0
     loadisFromInstruction(1, t1)
     storeq t0, [cfr, t1, 8]
-    dispatch(2)
+    dispatch(constexpr op_get_scope_length)
 
 
 _llint_op_to_this:
@@ -630,11 +644,11 @@ _llint_op_to_this:
     loadStructureWithScratch(t0, t1, t2)
     loadpFromInstruction(2, t2)
     bpneq t1, t2, .opToThisSlow
-    dispatch(4)
+    dispatch(constexpr op_to_this_length)
 
 .opToThisSlow:
     callOpcodeSlowPath(_slow_path_to_this)
-    dispatch(4)
+    dispatch(constexpr op_to_this_length)
 
 
 _llint_op_check_tdz:
@@ -645,7 +659,7 @@ _llint_op_check_tdz:
     callOpcodeSlowPath(_slow_path_throw_tdz_error)
 
 .opNotTDZ:
-    dispatch(2)
+    dispatch(constexpr op_check_tdz_length)
 
 
 _llint_op_mov:
@@ -654,7 +668,7 @@ _llint_op_mov:
     loadisFromInstruction(1, t0)
     loadConstantOrVariable(t1, t2)
     storeq t2, [cfr, t0, 8]
-    dispatch(3)
+    dispatch(constexpr op_mov_length)
 
 
 _llint_op_not:
@@ -666,11 +680,11 @@ _llint_op_not:
     btqnz t2, ~1, .opNotSlow
     xorq ValueTrue, t2
     storeq t2, [cfr, t1, 8]
-    dispatch(3)
+    dispatch(constexpr op_not_length)
 
 .opNotSlow:
     callOpcodeSlowPath(_slow_path_not)
-    dispatch(3)
+    dispatch(constexpr op_not_length)
 
 
 macro equalityComparison(integerComparison, slowPath)
@@ -727,7 +741,7 @@ _llint_op_eq_null:
     loadisFromInstruction(1, t1)
     orq ValueFalse, t0
     storeq t0, [cfr, t1, 8]
-    dispatch(3)
+    dispatch(constexpr op_eq_null_length)
 
 
 _llint_op_neq_null:
@@ -736,7 +750,7 @@ _llint_op_neq_null:
     loadisFromInstruction(1, t1)
     xorq ValueTrue, t0
     storeq t0, [cfr, t1, 8]
-    dispatch(3)
+    dispatch(constexpr op_neq_null_length)
 
 
 macro strictEq(equalityOperation, slowPath)
@@ -814,11 +828,11 @@ _llint_op_to_number:
 .opToNumberIsImmediate:
     storeq t2, [cfr, t1, 8]
     valueProfile(t2, 3, t0)
-    dispatch(4)
+    dispatch(constexpr op_to_number_length)
 
 .opToNumberSlow:
     callOpcodeSlowPath(_slow_path_to_number)
-    dispatch(4)
+    dispatch(constexpr op_to_number_length)
 
 
 _llint_op_to_string:
@@ -830,11 +844,27 @@ _llint_op_to_string:
     bbneq JSCell::m_type[t0], StringType, .opToStringSlow
 .opToStringIsString:
     storeq t0, [cfr, t2, 8]
-    dispatch(3)
+    dispatch(constexpr op_to_string_length)
 
 .opToStringSlow:
     callOpcodeSlowPath(_slow_path_to_string)
-    dispatch(3)
+    dispatch(constexpr op_to_string_length)
+
+
+_llint_op_to_object:
+    traceExecution()
+    loadisFromInstruction(2, t0)
+    loadisFromInstruction(1, t1)
+    loadConstantOrVariable(t0, t2)
+    btqnz t2, tagMask, .opToObjectSlow
+    bbb JSCell::m_type[t2], ObjectType, .opToObjectSlow
+    storeq t2, [cfr, t1, 8]
+    valueProfile(t2, 4, t0)
+    dispatch(constexpr op_to_object_length)
+
+.opToObjectSlow:
+    callOpcodeSlowPath(_slow_path_to_object)
+    dispatch(constexpr op_to_object_length)
 
 
 _llint_op_negate:
@@ -850,18 +880,18 @@ _llint_op_negate:
     orq tagTypeNumber, t3
     storeisToInstruction(t2, 3)
     storeq t3, [cfr, t1, 8]
-    dispatch(4)
+    dispatch(constexpr op_negate_length)
 .opNegateNotInt:
     btqz t3, tagTypeNumber, .opNegateSlow
     xorq 0x8000000000000000, t3
     ori ArithProfileNumber, t2
     storeq t3, [cfr, t1, 8]
     storeisToInstruction(t2, 3)
-    dispatch(4)
+    dispatch(constexpr op_negate_length)
 
 .opNegateSlow:
     callOpcodeSlowPath(_slow_path_negate)
-    dispatch(4)
+    dispatch(constexpr op_negate_length)
 
 
 macro binaryOpCustomStore(integerOperationAndStore, doubleOperation, slowPath)
@@ -994,7 +1024,7 @@ _llint_op_div:
             _slow_path_div)
     else
         callOpcodeSlowPath(_slow_path_div)
-        dispatch(5)
+        dispatch(constexpr op_div_length)
     end
 
 
@@ -1021,7 +1051,7 @@ _llint_op_lshift:
     bitOp(
         macro (left, right) lshifti left, right end,
         _slow_path_lshift,
-        4)
+        constexpr op_lshift_length)
 
 
 _llint_op_rshift:
@@ -1029,7 +1059,7 @@ _llint_op_rshift:
     bitOp(
         macro (left, right) rshifti left, right end,
         _slow_path_rshift,
-        4)
+        constexpr op_rshift_length)
 
 
 _llint_op_urshift:
@@ -1037,7 +1067,7 @@ _llint_op_urshift:
     bitOp(
         macro (left, right) urshifti left, right end,
         _slow_path_urshift,
-        4)
+        constexpr op_urshift_length)
 
 
 _llint_op_unsigned:
@@ -1047,10 +1077,10 @@ _llint_op_unsigned:
     loadConstantOrVariable(t1, t2)
     bilt t2, 0, .opUnsignedSlow
     storeq t2, [cfr, t0, 8]
-    dispatch(3)
+    dispatch(constexpr op_unsigned_length)
 .opUnsignedSlow:
     callOpcodeSlowPath(_slow_path_unsigned)
-    dispatch(3)
+    dispatch(constexpr op_unsigned_length)
 
 
 _llint_op_bitand:
@@ -1058,7 +1088,7 @@ _llint_op_bitand:
     bitOp(
         macro (left, right) andi left, right end,
         _slow_path_bitand,
-        5)
+        constexpr op_bitand_length)
 
 
 _llint_op_bitxor:
@@ -1066,7 +1096,7 @@ _llint_op_bitxor:
     bitOp(
         macro (left, right) xori left, right end,
         _slow_path_bitxor,
-        5)
+        constexpr op_bitxor_length)
 
 
 _llint_op_bitor:
@@ -1074,36 +1104,36 @@ _llint_op_bitor:
     bitOp(
         macro (left, right) ori left, right end,
         _slow_path_bitor,
-        5)
+        constexpr op_bitor_length)
 
 
 _llint_op_overrides_has_instance:
     traceExecution()
-    loadisFromInstruction(1, t3)
+    loadisFromStruct(OpOverridesHasInstance::m_dst, t3)
 
-    loadisFromInstruction(3, t1)
+    loadisFromStruct(OpOverridesHasInstance::m_hasInstanceValue, t1)
     loadConstantOrVariable(t1, t0)
     loadp CodeBlock[cfr], t2
     loadp CodeBlock::m_globalObject[t2], t2
     loadp JSGlobalObject::m_functionProtoHasInstanceSymbolFunction[t2], t2
     bqneq t0, t2, .opOverridesHasInstanceNotDefaultSymbol
 
-    loadisFromInstruction(2, t1)
+    loadisFromStruct(OpOverridesHasInstance::m_constructor, t1)
     loadConstantOrVariable(t1, t0)
     tbz JSCell::m_flags[t0], ImplementsDefaultHasInstance, t1
     orq ValueFalse, t1
     storeq t1, [cfr, t3, 8]
-    dispatch(4)
+    dispatch(constexpr op_overrides_has_instance_length)
 
 .opOverridesHasInstanceNotDefaultSymbol:
     storeq ValueTrue, [cfr, t3, 8]
-    dispatch(4)
+    dispatch(constexpr op_overrides_has_instance_length)
 
 
 _llint_op_instanceof_custom:
     traceExecution()
     callOpcodeSlowPath(_llint_slow_path_instanceof_custom)
-    dispatch(5)
+    dispatch(constexpr op_instanceof_custom_length)
 
 
 _llint_op_is_empty:
@@ -1114,7 +1144,7 @@ _llint_op_is_empty:
     cqeq t0, ValueEmpty, t3
     orq ValueFalse, t3
     storeq t3, [cfr, t2, 8]
-    dispatch(3)
+    dispatch(constexpr op_is_empty_length)
 
 
 _llint_op_is_undefined:
@@ -1126,12 +1156,12 @@ _llint_op_is_undefined:
     cqeq t0, ValueUndefined, t3
     orq ValueFalse, t3
     storeq t3, [cfr, t2, 8]
-    dispatch(3)
+    dispatch(constexpr op_is_undefined_length)
 .opIsUndefinedCell:
     btbnz JSCell::m_flags[t0], MasqueradesAsUndefined, .masqueradesAsUndefined
     move ValueFalse, t1
     storeq t1, [cfr, t2, 8]
-    dispatch(3)
+    dispatch(constexpr op_is_undefined_length)
 .masqueradesAsUndefined:
     loadStructureWithScratch(t0, t3, t1)
     loadp CodeBlock[cfr], t1
@@ -1139,7 +1169,7 @@ _llint_op_is_undefined:
     cpeq Structure::m_globalObject[t3], t1, t0
     orq ValueFalse, t0
     storeq t0, [cfr, t2, 8]
-    dispatch(3)
+    dispatch(constexpr op_is_undefined_length)
 
 
 _llint_op_is_boolean:
@@ -1151,7 +1181,7 @@ _llint_op_is_boolean:
     tqz t0, ~1, t0
     orq ValueFalse, t0
     storeq t0, [cfr, t2, 8]
-    dispatch(3)
+    dispatch(constexpr op_is_boolean_length)
 
 
 _llint_op_is_number:
@@ -1162,7 +1192,7 @@ _llint_op_is_number:
     tqnz t0, tagTypeNumber, t1
     orq ValueFalse, t1
     storeq t1, [cfr, t2, 8]
-    dispatch(3)
+    dispatch(constexpr op_is_number_length)
 
 
 _llint_op_is_cell_with_type:
@@ -1175,10 +1205,10 @@ _llint_op_is_cell_with_type:
     cbeq JSCell::m_type[t3], t0, t1
     orq ValueFalse, t1
     storeq t1, [cfr, t2, 8]
-    dispatch(4)
+    dispatch(constexpr op_is_cell_with_type_length)
 .notCellCase:
     storeq ValueFalse, [cfr, t2, 8]
-    dispatch(4)
+    dispatch(constexpr op_is_cell_with_type_length)
 
 
 _llint_op_is_object:
@@ -1190,10 +1220,10 @@ _llint_op_is_object:
     cbaeq JSCell::m_type[t0], ObjectType, t1
     orq ValueFalse, t1
     storeq t1, [cfr, t2, 8]
-    dispatch(3)
+    dispatch(constexpr op_is_object_length)
 .opIsObjectNotCell:
     storeq ValueFalse, [cfr, t2, 8]
-    dispatch(3)
+    dispatch(constexpr op_is_object_length)
 
 
 macro loadPropertyAtVariableOffset(propertyOffsetAsInt, objectAndStorage, value)
@@ -1233,11 +1263,11 @@ _llint_op_get_by_id:
     loadPropertyAtVariableOffset(t1, t3, t0)
     storeq t0, [cfr, t2, 8]
     valueProfile(t0, 8, t1)
-    dispatch(9)
+    dispatch(constexpr op_get_by_id_length)
 
 .opGetByIdSlow:
     callOpcodeSlowPath(_llint_slow_path_get_by_id)
-    dispatch(9)
+    dispatch(constexpr op_get_by_id_length)
 
 
 _llint_op_get_by_id_proto_load:
@@ -1253,11 +1283,11 @@ _llint_op_get_by_id_proto_load:
     loadPropertyAtVariableOffset(t1, t3, t0)
     storeq t0, [cfr, t2, 8]
     valueProfile(t0, 8, t1)
-    dispatch(9)
+    dispatch(constexpr op_get_by_id_proto_load_length)
 
 .opGetByIdProtoSlow:
     callOpcodeSlowPath(_llint_slow_path_get_by_id)
-    dispatch(9)
+    dispatch(constexpr op_get_by_id_proto_load_length)
 
 
 _llint_op_get_by_id_unset:
@@ -1270,11 +1300,11 @@ _llint_op_get_by_id_unset:
     loadisFromInstruction(1, t2)
     storeq ValueUndefined, [cfr, t2, 8]
     valueProfile(ValueUndefined, 8, t1)
-    dispatch(9)
+    dispatch(constexpr op_get_by_id_unset_length)
 
 .opGetByIdUnsetSlow:
     callOpcodeSlowPath(_llint_slow_path_get_by_id)
-    dispatch(9)
+    dispatch(constexpr op_get_by_id_unset_length)
 
 
 _llint_op_get_array_length:
@@ -1287,17 +1317,17 @@ _llint_op_get_array_length:
     btiz t2, IsArray, .opGetArrayLengthSlow
     btiz t2, IndexingShapeMask, .opGetArrayLengthSlow
     loadisFromInstruction(1, t1)
-    loadp JSObject::m_butterfly[t3], t0
+    loadCaged(_g_gigacageBasePtrs + Gigacage::BasePtrs::jsValue, constexpr JSVALUE_GIGACAGE_MASK, JSObject::m_butterfly[t3], t0, t2)
     loadi -sizeof IndexingHeader + IndexingHeader::u.lengths.publicLength[t0], t0
     bilt t0, 0, .opGetArrayLengthSlow
     orq tagTypeNumber, t0
     valueProfile(t0, 8, t2)
     storeq t0, [cfr, t1, 8]
-    dispatch(9)
+    dispatch(constexpr op_get_array_length_length)
 
 .opGetArrayLengthSlow:
     callOpcodeSlowPath(_llint_slow_path_get_by_id)
-    dispatch(9)
+    dispatch(constexpr op_get_array_length_length)
 
 
 _llint_op_put_by_id:
@@ -1436,11 +1466,11 @@ _llint_op_put_by_id:
     loadisFromInstruction(5, t1)
     storePropertyAtVariableOffset(t1, t0, t2)
     writeBarrierOnOperands(1, 3)
-    dispatch(9)
+    dispatch(constexpr op_put_by_id_length)
 
 .opPutByIdSlow:
     callOpcodeSlowPath(_llint_slow_path_put_by_id)
-    dispatch(9)
+    dispatch(constexpr op_put_by_id_length)
 
 macro finishGetByVal(result, scratch)
     loadisFromInstruction(1, scratch)
@@ -1470,13 +1500,14 @@ _llint_op_get_by_val:
     loadisFromInstruction(3, t3)
     loadConstantOrVariableInt32(t3, t1, .opGetByValSlow)
     sxi2q t1, t1
-    loadp JSObject::m_butterfly[t0], t3
+    loadCaged(_g_gigacageBasePtrs + Gigacage::BasePtrs::jsValue, constexpr JSVALUE_GIGACAGE_MASK, JSObject::m_butterfly[t0], t3, t5)
     andi IndexingShapeMask, t2
     bieq t2, Int32Shape, .opGetByValIsContiguous
     bineq t2, ContiguousShape, .opGetByValNotContiguous
-.opGetByValIsContiguous:
 
+.opGetByValIsContiguous:
     biaeq t1, -sizeof IndexingHeader + IndexingHeader::u.lengths.publicLength[t3], .opGetByValOutOfBounds
+    andi JSObject::m_butterflyIndexingMask[t0], t1
     loadisFromInstruction(1, t0)
     loadq [t3, t1, 8], t2
     btqz t2, .opGetByValOutOfBounds
@@ -1485,7 +1516,8 @@ _llint_op_get_by_val:
 .opGetByValNotContiguous:
     bineq t2, DoubleShape, .opGetByValNotDouble
     biaeq t1, -sizeof IndexingHeader + IndexingHeader::u.lengths.publicLength[t3], .opGetByValOutOfBounds
-    loadis 8[PB, PC, 8], t0
+    andi JSObject::m_butterflyIndexingMask[t0], t1
+    loadisFromInstruction(1 ,t0)
     loadd [t3, t1, 8], ft0
     bdnequn ft0, ft0, .opGetByValOutOfBounds
     fd2q ft0, t2
@@ -1496,6 +1528,7 @@ _llint_op_get_by_val:
     subi ArrayStorageShape, t2
     bia t2, SlowPutArrayStorageShape - ArrayStorageShape, .opGetByValNotIndexedStorage
     biaeq t1, -sizeof IndexingHeader + IndexingHeader::u.lengths.vectorLength[t3], .opGetByValOutOfBounds
+    andi JSObject::m_butterflyIndexingMask[t0], t1
     loadisFromInstruction(1, t0)
     loadq ArrayStorage::m_vector[t3, t1, 8], t2
     btqz t2, .opGetByValOutOfBounds
@@ -1503,7 +1536,7 @@ _llint_op_get_by_val:
 .opGetByValDone:
     storeq t2, [cfr, t0, 8]
     valueProfile(t2, 5, t0)
-    dispatch(6)
+    dispatch(constexpr op_get_by_val_length)
 
 .opGetByValOutOfBounds:
     loadpFromInstruction(4, t0)
@@ -1517,7 +1550,7 @@ _llint_op_get_by_val:
     bia t2, LastArrayType - FirstArrayType, .opGetByValSlow
     
     # Sweet, now we know that we have a typed array. Do some basic things now.
-    loadp JSArrayBufferView::m_vector[t0], t3
+    loadCaged(_g_gigacageBasePtrs + Gigacage::BasePtrs::primitive, constexpr PRIMITIVE_GIGACAGE_MASK, JSArrayBufferView::m_vector[t0], t3, t5)
     biaeq t1, JSArrayBufferView::m_length[t0], .opGetByValSlow
     
     # Now bisect through the various types. Note that we can treat Uint8ArrayType and
@@ -1579,7 +1612,7 @@ _llint_op_get_by_val:
 
 .opGetByValSlow:
     callOpcodeSlowPath(_llint_slow_path_get_by_val)
-    dispatch(6)
+    dispatch(constexpr op_get_by_val_length)
 
 
 macro contiguousPutByVal(storeCallback)
@@ -1608,7 +1641,7 @@ macro putByVal(slowPath)
     loadisFromInstruction(2, t0)
     loadConstantOrVariableInt32(t0, t3, .opPutByValSlow)
     sxi2q t3, t3
-    loadp JSObject::m_butterfly[t1], t0
+    loadCaged(_g_gigacageBasePtrs + Gigacage::BasePtrs::jsValue, constexpr JSVALUE_GIGACAGE_MASK, JSObject::m_butterfly[t1], t0, t5)
     andi IndexingShapeMask, t2
     bineq t2, Int32Shape, .opPutByValNotInt32
     contiguousPutByVal(
@@ -1802,6 +1835,33 @@ macro compare(integerCompare, doubleCompare, slowPath)
 end
 
 
+macro compareUnsignedJump(integerCompare)
+    loadisFromInstruction(1, t2)
+    loadisFromInstruction(2, t3)
+    loadConstantOrVariable(t2, t0)
+    loadConstantOrVariable(t3, t1)
+    integerCompare(t0, t1, .jumpTarget)
+    dispatch(4)
+
+.jumpTarget:
+    dispatchIntIndirect(3)
+end
+
+
+macro compareUnsigned(integerCompareAndSet)
+    traceExecution()
+    loadisFromInstruction(3, t0)
+    loadisFromInstruction(2, t2)
+    loadisFromInstruction(1, t3)
+    loadConstantOrVariable(t0, t1)
+    loadConstantOrVariable(t2, t0)
+    integerCompareAndSet(t0, t1, t0)
+    orq ValueFalse, t0
+    storeq t0, [cfr, t3, 8]
+    dispatch(4)
+end
+
+
 _llint_op_switch_imm:
     traceExecution()
     loadisFromInstruction(3, t2)
@@ -1893,8 +1953,15 @@ macro doCall(slowPath, prepareCall)
     storei PC, ArgumentCount + TagOffset[cfr]
     storei t2, ArgumentCount + PayloadOffset[t3]
     move t3, sp
-    prepareCall(LLIntCallLinkInfo::machineCodeTarget[t1], t2, t3, t4)
-    callTargetFunction(LLIntCallLinkInfo::machineCodeTarget[t1])
+    if POISON
+        loadp _g_jitCodePoison, t2
+        xorp LLIntCallLinkInfo::machineCodeTarget[t1], t2
+        prepareCall(t2, t1, t3, t4)
+        callTargetFunction(t2)
+    else
+        prepareCall(LLIntCallLinkInfo::machineCodeTarget[t1], t2, t3, t4)
+        callTargetFunction(LLIntCallLinkInfo::machineCodeTarget[t1])
+    end
 
 .opCallSlow:
     slowPathForCall(slowPath, prepareCall)
@@ -1917,11 +1984,11 @@ _llint_op_to_primitive:
     bbaeq JSCell::m_type[t0], ObjectType, .opToPrimitiveSlowCase
 .opToPrimitiveIsImm:
     storeq t0, [cfr, t3, 8]
-    dispatch(3)
+    dispatch(constexpr op_to_primitive_length)
 
 .opToPrimitiveSlowCase:
     callOpcodeSlowPath(_slow_path_to_primitive)
-    dispatch(3)
+    dispatch(constexpr op_to_primitive_length)
 
 
 _llint_op_catch:
@@ -1940,6 +2007,7 @@ _llint_op_catch:
 
     loadp CodeBlock[cfr], PB
     loadp CodeBlock::m_instructions[PB], PB
+    unpoison(CodeBlockPoison, PB)
     loadp VM::targetInterpreterPCForThrow[t3], PC
     subp PB, PC
     rshiftp 3, PC
@@ -1963,7 +2031,10 @@ _llint_op_catch:
     storeq t3, [cfr, t2, 8]
 
     traceExecution()
-    dispatch(3)
+
+    callOpcodeSlowPath(_llint_slow_path_profile_catch)
+
+    dispatch(constexpr op_catch_length)
 
 
 _llint_op_end:
@@ -2013,14 +2084,61 @@ macro nativeCallTrampoline(executableOffsetToFunction)
     loadp JSFunction::m_executable[t1], t1
     checkStackPointerAlignment(t3, 0xdead0001)
     if C_LOOP
-        cloopCallNative executableOffsetToFunction[t1]
+        loadp _g_nativeCodePoison, t2
+        xorp executableOffsetToFunction[t1], t2
+        cloopCallNative t2
     else
         if X86_64_WIN
             subp 32, sp
+            call executableOffsetToFunction[t1]
+            addp 32, sp
+        else
+            loadp _g_nativeCodePoison, t2
+            xorp executableOffsetToFunction[t1], t2
+            call t2
         end
-        call executableOffsetToFunction[t1]
+    end
+
+    loadp Callee[cfr], t3
+    andp MarkedBlockMask, t3
+    loadp MarkedBlock::m_vm[t3], t3
+
+    btqnz VM::m_exception[t3], .handleException
+
+    functionEpilogue()
+    ret
+
+.handleException:
+    storep cfr, VM::topCallFrame[t3]
+    jmp _llint_throw_from_slow_path_trampoline
+end
+
+macro internalFunctionCallTrampoline(offsetOfFunction)
+    functionPrologue()
+    storep 0, CodeBlock[cfr]
+    loadp Callee[cfr], t0
+    andp MarkedBlockMask, t0, t1
+    loadp MarkedBlock::m_vm[t1], t1
+    storep cfr, VM::topCallFrame[t1]
+    if ARM64 or C_LOOP
+        storep lr, ReturnPC[cfr]
+    end
+    move cfr, a0
+    loadp Callee[cfr], t1
+    checkStackPointerAlignment(t3, 0xdead0001)
+    if C_LOOP
+        loadp _g_nativeCodePoison, t2
+        xorp offsetOfFunction[t1], t2
+        cloopCallNative t2
+    else
         if X86_64_WIN
+            subp 32, sp
+            call offsetOfFunction[t1]
             addp 32, sp
+        else
+            loadp _g_nativeCodePoison, t2
+            xorp offsetOfFunction[t1], t2
+            call t2
         end
     end
 
@@ -2075,55 +2193,55 @@ _llint_op_resolve_scope:
 #rGlobalProperty:
     bineq t0, GlobalProperty, .rGlobalVar
     getConstantScope(1)
-    dispatch(7)
+    dispatch(constexpr op_resolve_scope_length)
 
 .rGlobalVar:
     bineq t0, GlobalVar, .rGlobalLexicalVar
     getConstantScope(1)
-    dispatch(7)
+    dispatch(constexpr op_resolve_scope_length)
 
 .rGlobalLexicalVar:
     bineq t0, GlobalLexicalVar, .rClosureVar
     getConstantScope(1)
-    dispatch(7)
+    dispatch(constexpr op_resolve_scope_length)
 
 .rClosureVar:
     bineq t0, ClosureVar, .rModuleVar
     resolveScope()
-    dispatch(7)
+    dispatch(constexpr op_resolve_scope_length)
 
 .rModuleVar:
     bineq t0, ModuleVar, .rGlobalPropertyWithVarInjectionChecks
     getConstantScope(1)
-    dispatch(7)
+    dispatch(constexpr op_resolve_scope_length)
 
 .rGlobalPropertyWithVarInjectionChecks:
     bineq t0, GlobalPropertyWithVarInjectionChecks, .rGlobalVarWithVarInjectionChecks
     varInjectionCheck(.rDynamic)
     getConstantScope(1)
-    dispatch(7)
+    dispatch(constexpr op_resolve_scope_length)
 
 .rGlobalVarWithVarInjectionChecks:
     bineq t0, GlobalVarWithVarInjectionChecks, .rGlobalLexicalVarWithVarInjectionChecks
     varInjectionCheck(.rDynamic)
     getConstantScope(1)
-    dispatch(7)
+    dispatch(constexpr op_resolve_scope_length)
 
 .rGlobalLexicalVarWithVarInjectionChecks:
     bineq t0, GlobalLexicalVarWithVarInjectionChecks, .rClosureVarWithVarInjectionChecks
     varInjectionCheck(.rDynamic)
     getConstantScope(1)
-    dispatch(7)
+    dispatch(constexpr op_resolve_scope_length)
 
 .rClosureVarWithVarInjectionChecks:
     bineq t0, ClosureVarWithVarInjectionChecks, .rDynamic
     varInjectionCheck(.rDynamic)
     resolveScope()
-    dispatch(7)
+    dispatch(constexpr op_resolve_scope_length)
 
 .rDynamic:
     callOpcodeSlowPath(_slow_path_resolve_scope)
-    dispatch(7)
+    dispatch(constexpr op_resolve_scope_length)
 
 
 macro loadWithStructureCheck(operand, slowPath)
@@ -2153,7 +2271,7 @@ end
 
 macro getClosureVar()
     loadisFromInstruction(6, t1)
-    loadq JSEnvironmentRecord_variables[t0, t1, 8], t0
+    loadq JSLexicalEnvironment_variables[t0, t1, 8], t0
     valueProfile(t0, 7, t1)
     loadisFromInstruction(1, t1)
     storeq t0, [cfr, t1, 8]
@@ -2168,12 +2286,12 @@ _llint_op_get_from_scope:
     bineq t0, GlobalProperty, .gGlobalVar
     loadWithStructureCheck(2, .gDynamic)
     getProperty()
-    dispatch(8)
+    dispatch(constexpr op_get_from_scope_length)
 
 .gGlobalVar:
     bineq t0, GlobalVar, .gGlobalLexicalVar
     getGlobalVar(macro(v) end)
-    dispatch(8)
+    dispatch(constexpr op_get_from_scope_length)
 
 .gGlobalLexicalVar:
     bineq t0, GlobalLexicalVar, .gClosureVar
@@ -2181,25 +2299,25 @@ _llint_op_get_from_scope:
         macro (value)
             bqeq value, ValueEmpty, .gDynamic
         end)
-    dispatch(8)
+    dispatch(constexpr op_get_from_scope_length)
 
 .gClosureVar:
     bineq t0, ClosureVar, .gGlobalPropertyWithVarInjectionChecks
     loadVariable(2, t0)
     getClosureVar()
-    dispatch(8)
+    dispatch(constexpr op_get_from_scope_length)
 
 .gGlobalPropertyWithVarInjectionChecks:
     bineq t0, GlobalPropertyWithVarInjectionChecks, .gGlobalVarWithVarInjectionChecks
     loadWithStructureCheck(2, .gDynamic)
     getProperty()
-    dispatch(8)
+    dispatch(constexpr op_get_from_scope_length)
 
 .gGlobalVarWithVarInjectionChecks:
     bineq t0, GlobalVarWithVarInjectionChecks, .gGlobalLexicalVarWithVarInjectionChecks
     varInjectionCheck(.gDynamic)
     getGlobalVar(macro(v) end)
-    dispatch(8)
+    dispatch(constexpr op_get_from_scope_length)
 
 .gGlobalLexicalVarWithVarInjectionChecks:
     bineq t0, GlobalLexicalVarWithVarInjectionChecks, .gClosureVarWithVarInjectionChecks
@@ -2208,18 +2326,18 @@ _llint_op_get_from_scope:
         macro (value)
             bqeq value, ValueEmpty, .gDynamic
         end)
-    dispatch(8)
+    dispatch(constexpr op_get_from_scope_length)
 
 .gClosureVarWithVarInjectionChecks:
     bineq t0, ClosureVarWithVarInjectionChecks, .gDynamic
     varInjectionCheck(.gDynamic)
     loadVariable(2, t0)
     getClosureVar()
-    dispatch(8)
+    dispatch(constexpr op_get_from_scope_length)
 
 .gDynamic:
     callOpcodeSlowPath(_llint_slow_path_get_from_scope)
-    dispatch(8)
+    dispatch(constexpr op_get_from_scope_length)
 
 
 macro putProperty()
@@ -2242,7 +2360,7 @@ macro putClosureVar()
     loadisFromInstruction(3, t1)
     loadConstantOrVariable(t1, t2)
     loadisFromInstruction(6, t1)
-    storeq t2, JSEnvironmentRecord_variables[t0, t1, 8]
+    storeq t2, JSLexicalEnvironment_variables[t0, t1, 8]
 end
 
 macro putLocalClosureVar()
@@ -2253,7 +2371,7 @@ macro putLocalClosureVar()
     notifyWrite(t3, .pDynamic)
 .noVariableWatchpointSet:
     loadisFromInstruction(6, t1)
-    storeq t2, JSEnvironmentRecord_variables[t0, t1, 8]
+    storeq t2, JSLexicalEnvironment_variables[t0, t1, 8]
 end
 
 macro checkTDZInGlobalPutToScopeIfNecessary()
@@ -2278,48 +2396,48 @@ _llint_op_put_to_scope:
     loadVariable(1, t0)
     putLocalClosureVar()
     writeBarrierOnOperands(1, 3)
-    dispatch(7)
+    dispatch(constexpr op_put_to_scope_length)
 
 .pGlobalProperty:
     bineq t0, GlobalProperty, .pGlobalVar
     loadWithStructureCheck(1, .pDynamic)
     putProperty()
     writeBarrierOnOperands(1, 3)
-    dispatch(7)
+    dispatch(constexpr op_put_to_scope_length)
 
 .pGlobalVar:
     bineq t0, GlobalVar, .pGlobalLexicalVar
     writeBarrierOnGlobalObject(3)
     putGlobalVariable()
-    dispatch(7)
+    dispatch(constexpr op_put_to_scope_length)
 
 .pGlobalLexicalVar:
     bineq t0, GlobalLexicalVar, .pClosureVar
     writeBarrierOnGlobalLexicalEnvironment(3)
     checkTDZInGlobalPutToScopeIfNecessary()
     putGlobalVariable()
-    dispatch(7)
+    dispatch(constexpr op_put_to_scope_length)
 
 .pClosureVar:
     bineq t0, ClosureVar, .pGlobalPropertyWithVarInjectionChecks
     loadVariable(1, t0)
     putClosureVar()
     writeBarrierOnOperands(1, 3)
-    dispatch(7)
+    dispatch(constexpr op_put_to_scope_length)
 
 .pGlobalPropertyWithVarInjectionChecks:
     bineq t0, GlobalPropertyWithVarInjectionChecks, .pGlobalVarWithVarInjectionChecks
     loadWithStructureCheck(1, .pDynamic)
     putProperty()
     writeBarrierOnOperands(1, 3)
-    dispatch(7)
+    dispatch(constexpr op_put_to_scope_length)
 
 .pGlobalVarWithVarInjectionChecks:
     bineq t0, GlobalVarWithVarInjectionChecks, .pGlobalLexicalVarWithVarInjectionChecks
     writeBarrierOnGlobalObject(3)
     varInjectionCheck(.pDynamic)
     putGlobalVariable()
-    dispatch(7)
+    dispatch(constexpr op_put_to_scope_length)
 
 .pGlobalLexicalVarWithVarInjectionChecks:
     bineq t0, GlobalLexicalVarWithVarInjectionChecks, .pClosureVarWithVarInjectionChecks
@@ -2327,7 +2445,7 @@ _llint_op_put_to_scope:
     varInjectionCheck(.pDynamic)
     checkTDZInGlobalPutToScopeIfNecessary()
     putGlobalVariable()
-    dispatch(7)
+    dispatch(constexpr op_put_to_scope_length)
 
 .pClosureVarWithVarInjectionChecks:
     bineq t0, ClosureVarWithVarInjectionChecks, .pModuleVar
@@ -2335,16 +2453,16 @@ _llint_op_put_to_scope:
     loadVariable(1, t0)
     putClosureVar()
     writeBarrierOnOperands(1, 3)
-    dispatch(7)
+    dispatch(constexpr op_put_to_scope_length)
 
 .pModuleVar:
     bineq t0, ModuleVar, .pDynamic
     callOpcodeSlowPath(_slow_path_throw_strict_mode_readonly_property_write_error)
-    dispatch(7)
+    dispatch(constexpr op_put_to_scope_length)
 
 .pDynamic:
     callOpcodeSlowPath(_llint_slow_path_put_to_scope)
-    dispatch(7)
+    dispatch(constexpr op_put_to_scope_length)
 
 
 _llint_op_get_from_arguments:
@@ -2355,7 +2473,7 @@ _llint_op_get_from_arguments:
     valueProfile(t0, 4, t1)
     loadisFromInstruction(1, t1)
     storeq t0, [cfr, t1, 8]
-    dispatch(5)
+    dispatch(constexpr op_get_from_arguments_length)
 
 
 _llint_op_put_to_arguments:
@@ -2366,7 +2484,7 @@ _llint_op_put_to_arguments:
     loadConstantOrVariable(t3, t2)
     storeq t2, DirectArguments_storage[t0, t1, 8]
     writeBarrierOnOperands(1, 3)
-    dispatch(4)
+    dispatch(constexpr op_put_to_arguments_length)
 
 
 _llint_op_get_parent_scope:
@@ -2375,13 +2493,14 @@ _llint_op_get_parent_scope:
     loadp JSScope::m_next[t0], t0
     loadisFromInstruction(1, t1)
     storeq t0, [cfr, t1, 8]
-    dispatch(3)
+    dispatch(constexpr op_get_parent_scope_length)
 
 
 _llint_op_profile_type:
     traceExecution()
     loadp CodeBlock[cfr], t1
     loadp CodeBlock::m_vm[t1], t1
+    unpoison(CodeBlockPoison, t1)
     # t1 is holding the pointer to the typeProfilerLog.
     loadp VM::m_typeProfilerLog[t1], t1
     # t2 is holding the pointer to the current log entry.
@@ -2416,13 +2535,13 @@ _llint_op_profile_type:
     callOpcodeSlowPath(_slow_path_profile_type_clear_log)
 
 .opProfileTypeDone:
-    dispatch(6)
+    dispatch(constexpr op_profile_type_length)
 
 _llint_op_profile_control_flow:
     traceExecution()
     loadpFromInstruction(1, t0)
     addq 1, BasicBlockLocation::m_executionCount[t0]
-    dispatch(2)
+    dispatch(constexpr op_profile_control_flow_length)
 
 
 _llint_op_get_rest_length:
@@ -2439,7 +2558,7 @@ _llint_op_get_rest_length:
     orq tagTypeNumber, t0
     loadisFromInstruction(1, t1)
     storeq t0, [cfr, t1, 8]
-    dispatch(3)
+    dispatch(constexpr op_get_rest_length_length)
 
 
 _llint_op_log_shadow_chicken_prologue:
@@ -2452,10 +2571,10 @@ _llint_op_log_shadow_chicken_prologue:
     storep t1, ShadowChicken::Packet::callee[t0]
     loadVariable(1, t1)
     storep t1, ShadowChicken::Packet::scope[t0]
-    dispatch(2)
+    dispatch(constexpr op_log_shadow_chicken_prologue_length)
 .opLogShadowChickenPrologueSlow:
     callOpcodeSlowPath(_llint_slow_path_log_shadow_chicken_prologue)
-    dispatch(2)
+    dispatch(constexpr op_log_shadow_chicken_prologue_length)
 
 
 _llint_op_log_shadow_chicken_tail:
@@ -2470,7 +2589,7 @@ _llint_op_log_shadow_chicken_tail:
     loadp CodeBlock[cfr], t1
     storep t1, ShadowChicken::Packet::codeBlock[t0]
     storei PC, ShadowChicken::Packet::callSiteIndex[t0]
-    dispatch(3)
+    dispatch(constexpr op_log_shadow_chicken_tail_length)
 .opLogShadowChickenTailSlow:
     callOpcodeSlowPath(_llint_slow_path_log_shadow_chicken_tail)
-    dispatch(3)
+    dispatch(constexpr op_log_shadow_chicken_tail_length)