Make JetStream 2
[WebKit-https.git] / PerformanceTests / JetStream2 / RexBench / OfflineAssembler / expected.js
1 /*
2  * DO NOT EDIT THIS FILE, it is autogenerated.
3  */
4
5 "use strict";
6
7 let expectedASTDumpedAsLines = [
8     "if ARMv7k",
9     "",
10     "else",
11     "    skip",
12     "end",
13     "if ARMv7s",
14     "",
15     "else",
16     "    skip",
17     "end",
18     "const PtrSize = constexpr (sizeof(void*))",
19     "if JSVALUE64",
20     "const CallFrameHeaderSlots = 5",
21     "else",
22     "const CallFrameHeaderSlots = 4",
23     "const CallFrameAlignSlots = 1",
24     "end",
25     "const SlotSize = 8",
26     "const JSEnvironmentRecord_variables = (((sizeof JSEnvironmentRecord + SlotSize) - 1) & (~(SlotSize - 1)))",
27     "const DirectArguments_storage = (((sizeof DirectArguments + SlotSize) - 1) & (~(SlotSize - 1)))",
28     "const StackAlignment = 16",
29     "const StackAlignmentSlots = 2",
30     "const StackAlignmentMask = (StackAlignment - 1)",
31     "const CallerFrameAndPCSize = (2 * PtrSize)",
32     "const CallerFrame = 0",
33     "const ReturnPC = (CallerFrame + PtrSize)",
34     "const CodeBlock = (ReturnPC + PtrSize)",
35     "const Callee = (CodeBlock + SlotSize)",
36     "const ArgumentCount = (Callee + SlotSize)",
37     "const ThisArgumentOffset = (ArgumentCount + SlotSize)",
38     "const FirstArgumentOffset = (ThisArgumentOffset + SlotSize)",
39     "const CallFrameHeaderSize = ThisArgumentOffset",
40     "if JSVALUE64",
41     "const TagBitTypeOther = 2",
42     "const TagBitBool = 4",
43     "const TagBitUndefined = 8",
44     "const ValueEmpty = 0",
45     "const ValueFalse = (TagBitTypeOther | TagBitBool)",
46     "const ValueTrue = ((TagBitTypeOther | TagBitBool) | 1)",
47     "const ValueUndefined = (TagBitTypeOther | TagBitUndefined)",
48     "const ValueNull = TagBitTypeOther",
49     "const TagTypeNumber = 18446462598732840000",
50     "const TagMask = (TagTypeNumber | TagBitTypeOther)",
51     "else",
52     "const Int32Tag = (-1)",
53     "const BooleanTag = (-2)",
54     "const NullTag = (-3)",
55     "const UndefinedTag = (-4)",
56     "const CellTag = (-5)",
57     "const EmptyValueTag = (-6)",
58     "const DeletedValueTag = (-7)",
59     "const LowestTag = DeletedValueTag",
60     "end",
61     "const PutByIdPrimaryTypeMask = constexpr (PutByIdPrimaryTypeMask)",
62     "const PutByIdPrimaryTypeSecondary = constexpr (PutByIdPrimaryTypeSecondary)",
63     "const PutByIdPrimaryTypeObjectWithStructure = constexpr (PutByIdPrimaryTypeObjectWithStructure)",
64     "const PutByIdPrimaryTypeObjectWithStructureOrOther = constexpr (PutByIdPrimaryTypeObjectWithStructureOrOther)",
65     "const PutByIdSecondaryTypeMask = constexpr (PutByIdSecondaryTypeMask)",
66     "const PutByIdSecondaryTypeBottom = constexpr (PutByIdSecondaryTypeBottom)",
67     "const PutByIdSecondaryTypeBoolean = constexpr (PutByIdSecondaryTypeBoolean)",
68     "const PutByIdSecondaryTypeOther = constexpr (PutByIdSecondaryTypeOther)",
69     "const PutByIdSecondaryTypeInt32 = constexpr (PutByIdSecondaryTypeInt32)",
70     "const PutByIdSecondaryTypeNumber = constexpr (PutByIdSecondaryTypeNumber)",
71     "const PutByIdSecondaryTypeString = constexpr (PutByIdSecondaryTypeString)",
72     "const PutByIdSecondaryTypeSymbol = constexpr (PutByIdSecondaryTypeSymbol)",
73     "const PutByIdSecondaryTypeObject = constexpr (PutByIdSecondaryTypeObject)",
74     "const PutByIdSecondaryTypeObjectOrOther = constexpr (PutByIdSecondaryTypeObjectOrOther)",
75     "const PutByIdSecondaryTypeTop = constexpr (PutByIdSecondaryTypeTop)",
76     "const CallOpCodeSize = 9",
77     "if ((X86_64 or ARM64) or C_LOOP)",
78     "const maxFrameExtentForSlowPathCall = 0",
79     "else",
80     "if ((ARM or ARMv7_TRADITIONAL) or ARMv7)",
81     "const maxFrameExtentForSlowPathCall = 24",
82     "else",
83     "if (X86 or X86_WIN)",
84     "const maxFrameExtentForSlowPathCall = 40",
85     "else",
86     "if MIPS",
87     "const maxFrameExtentForSlowPathCall = 40",
88     "else",
89     "if X86_64_WIN",
90     "const maxFrameExtentForSlowPathCall = 64",
91     "else",
92     "    skip",
93     "end",
94     "end",
95     "end",
96     "end",
97     "end",
98     "if ((X86_64 or X86_64_WIN) or ARM64)",
99     "const CalleeSaveSpaceAsVirtualRegisters = 3",
100     "else",
101     "const CalleeSaveSpaceAsVirtualRegisters = 0",
102     "end",
103     "const CalleeSaveSpaceStackAligned = ((((CalleeSaveSpaceAsVirtualRegisters * SlotSize) + StackAlignment) - 1) & (~StackAlignmentMask))",
104     "const ClearWatchpoint = constexpr (ClearWatchpoint)",
105     "const IsWatched = constexpr (IsWatched)",
106     "const IsInvalidated = constexpr (IsInvalidated)",
107     "const ShadowChickenTailMarker = constexpr (ShadowChicken::Packet::tailMarkerValue)",
108     "const ArithProfileInt = 1048576",
109     "const ArithProfileIntInt = 1179648",
110     "const ArithProfileNumber = 2097152",
111     "const ArithProfileNumberInt = 2228224",
112     "const ArithProfileNumberNumber = 2359296",
113     "const ArithProfileIntNumber = 1310720",
114     "if JSVALUE64",
115     "const PC = t4",
116     "if ARM64",
117     "const PB = csr7",
118     "const tagTypeNumber = csr8",
119     "const tagMask = csr9",
120     "else",
121     "if X86_64",
122     "const PB = csr2",
123     "const tagTypeNumber = csr3",
124     "const tagMask = csr4",
125     "else",
126     "if X86_64_WIN",
127     "const PB = csr4",
128     "const tagTypeNumber = csr5",
129     "const tagMask = csr6",
130     "else",
131     "if C_LOOP",
132     "const PB = csr0",
133     "const tagTypeNumber = csr1",
134     "const tagMask = csr2",
135     "else",
136     "    skip",
137     "end",
138     "end",
139     "end",
140     "end",
141     "macro loadisFromInstruction(offset, dest)",
142     "    loadis (offset * 8)[PB, PC, 8], dest",
143     "end",
144     "macro loadpFromInstruction(offset, dest)",
145     "    loadp (offset * 8)[PB, PC, 8], dest",
146     "end",
147     "macro storeisToInstruction(value, offset)",
148     "    storei value, (offset * 8)[PB, PC, 8]",
149     "end",
150     "macro storepToInstruction(value, offset)",
151     "    storep value, (offset * 8)[PB, PC, 8]",
152     "end",
153     "else",
154     "const PC = t4",
155     "macro loadisFromInstruction(offset, dest)",
156     "    loadis (offset * 4)[PC], dest",
157     "end",
158     "macro loadpFromInstruction(offset, dest)",
159     "    loadp (offset * 4)[PC], dest",
160     "end",
161     "macro storeisToInstruction(value, offset)",
162     "    storei value, (offset * 4)[PC]",
163     "end",
164     "end",
165     "if X86_64_WIN",
166     "const extraTempReg = t0",
167     "else",
168     "const extraTempReg = t5",
169     "end",
170     "if BIG_ENDIAN",
171     "const TagOffset = 0",
172     "const PayloadOffset = 4",
173     "else",
174     "const TagOffset = 4",
175     "const PayloadOffset = 0",
176     "end",
177     "const IsArray = constexpr (IsArray)",
178     "const IndexingShapeMask = constexpr (IndexingShapeMask)",
179     "const NoIndexingShape = constexpr (NoIndexingShape)",
180     "const Int32Shape = constexpr (Int32Shape)",
181     "const DoubleShape = constexpr (DoubleShape)",
182     "const ContiguousShape = constexpr (ContiguousShape)",
183     "const ArrayStorageShape = constexpr (ArrayStorageShape)",
184     "const SlowPutArrayStorageShape = constexpr (SlowPutArrayStorageShape)",
185     "const StringType = constexpr (StringType)",
186     "const SymbolType = constexpr (SymbolType)",
187     "const ObjectType = constexpr (ObjectType)",
188     "const FinalObjectType = constexpr (FinalObjectType)",
189     "const JSFunctionType = constexpr (JSFunctionType)",
190     "const ArrayType = constexpr (ArrayType)",
191     "const DerivedArrayType = constexpr (DerivedArrayType)",
192     "const ProxyObjectType = constexpr (ProxyObjectType)",
193     "const Int8ArrayType = constexpr (Int8ArrayType)",
194     "const Int16ArrayType = constexpr (Int16ArrayType)",
195     "const Int32ArrayType = constexpr (Int32ArrayType)",
196     "const Uint8ArrayType = constexpr (Uint8ArrayType)",
197     "const Uint8ClampedArrayType = constexpr (Uint8ClampedArrayType)",
198     "const Uint16ArrayType = constexpr (Uint16ArrayType)",
199     "const Uint32ArrayType = constexpr (Uint32ArrayType)",
200     "const Float32ArrayType = constexpr (Float32ArrayType)",
201     "const Float64ArrayType = constexpr (Float64ArrayType)",
202     "const FirstArrayType = Int8ArrayType",
203     "const LastArrayType = Float64ArrayType",
204     "const MasqueradesAsUndefined = constexpr (MasqueradesAsUndefined)",
205     "const ImplementsDefaultHasInstance = constexpr (ImplementsDefaultHasInstance)",
206     "const FirstConstantRegisterIndex = constexpr (FirstConstantRegisterIndex)",
207     "const GlobalCode = constexpr (GlobalCode)",
208     "const EvalCode = constexpr (EvalCode)",
209     "const FunctionCode = constexpr (FunctionCode)",
210     "const ModuleCode = constexpr (ModuleCode)",
211     "const LLIntReturnPC = (ArgumentCount + TagOffset)",
212     "const HashFlags8BitBuffer = 8",
213     "const firstOutOfLineOffset = 100",
214     "const GlobalProperty = constexpr (GlobalProperty)",
215     "const GlobalVar = constexpr (GlobalVar)",
216     "const GlobalLexicalVar = constexpr (GlobalLexicalVar)",
217     "const ClosureVar = constexpr (ClosureVar)",
218     "const LocalClosureVar = constexpr (LocalClosureVar)",
219     "const ModuleVar = constexpr (ModuleVar)",
220     "const GlobalPropertyWithVarInjectionChecks = constexpr (GlobalPropertyWithVarInjectionChecks)",
221     "const GlobalVarWithVarInjectionChecks = constexpr (GlobalVarWithVarInjectionChecks)",
222     "const GlobalLexicalVarWithVarInjectionChecks = constexpr (GlobalLexicalVarWithVarInjectionChecks)",
223     "const ClosureVarWithVarInjectionChecks = constexpr (ClosureVarWithVarInjectionChecks)",
224     "const ResolveTypeMask = constexpr (GetPutInfo::typeBits)",
225     "const InitializationModeMask = constexpr (GetPutInfo::initializationBits)",
226     "const InitializationModeShift = constexpr (GetPutInfo::initializationShift)",
227     "const NotInitialization = constexpr (InitializationMode::NotInitialization)",
228     "const MarkedBlockSize = constexpr (MarkedBlock::blockSize)",
229     "const MarkedBlockMask = (~(MarkedBlockSize - 1))",
230     "const BlackThreshold = constexpr (blackThreshold)",
231     "if JSVALUE64",
232     "const JSFinalObjectSizeClassIndex = 1",
233     "else",
234     "const JSFinalObjectSizeClassIndex = 3",
235     "end",
236     "const VectorBufferOffset = 0",
237     "if JSVALUE64",
238     "const VectorSizeOffset = 12",
239     "else",
240     "const VectorSizeOffset = 8",
241     "end",
242     "macro crash()",
243     "if C_LOOP",
244     "    cloopCrash ",
245     "else",
246     "    call _llint_crash",
247     "end",
248     "end",
249     "macro assert(assertion)",
250     "if ASSERT_ENABLED",
251     "    assertion(.ok)",
252     "    crash()",
253     ".ok:",
254     "else",
255     "    skip",
256     "end",
257     "end",
258     "if X86_64",
259     "macro probe(action)",
260     "    push a0, a1",
261     "    push a2, a3",
262     "    push t0, t1",
263     "    push t2, t3",
264     "    push t4, t5",
265     "    action()",
266     "    pop t5, t4",
267     "    pop t3, t2",
268     "    pop t1, t0",
269     "    pop a3, a2",
270     "    pop a1, a0",
271     "end",
272     "else",
273     "    skip",
274     "end",
275     "macro checkStackPointerAlignment(tempReg, location)",
276     "if (ARM64 or C_LOOP)",
277     "",
278     "else",
279     "if ((ARM or ARMv7) or ARMv7_TRADITIONAL)",
280     "    move sp, tempReg",
281     "    andp StackAlignmentMask, tempReg",
282     "else",
283     "    andp sp, StackAlignmentMask, tempReg",
284     "end",
285     "    btpz tempReg, .stackPointerOkay",
286     "    move location, tempReg",
287     "    break ",
288     ".stackPointerOkay:",
289     "end",
290     "end",
291     "if (((C_LOOP or ARM64) or X86_64) or X86_64_WIN)",
292     "const CalleeSaveRegisterCount = 0",
293     "else",
294     "if ((ARM or ARMv7_TRADITIONAL) or ARMv7)",
295     "const CalleeSaveRegisterCount = 7",
296     "else",
297     "if MIPS",
298     "const CalleeSaveRegisterCount = 1",
299     "else",
300     "if (X86 or X86_WIN)",
301     "const CalleeSaveRegisterCount = 3",
302     "else",
303     "    skip",
304     "end",
305     "end",
306     "end",
307     "end",
308     "const CalleeRegisterSaveSize = (CalleeSaveRegisterCount * PtrSize)",
309     "const VMEntryTotalFrameSize = ((((CalleeRegisterSaveSize + sizeof VMEntryRecord) + StackAlignment) - 1) & (~StackAlignmentMask))",
310     "macro pushCalleeSaves()",
311     "if (((C_LOOP or ARM64) or X86_64) or X86_64_WIN)",
312     "",
313     "else",
314     "if (ARM or ARMv7_TRADITIONAL)",
315     "    emit \"push {r4-r10}\"",
316     "else",
317     "if ARMv7",
318     "    emit \"push {r4-r6, r8-r11}\"",
319     "else",
320     "if MIPS",
321     "    emit \"addiu $sp, $sp, -4\"",
322     "    emit \"sw $s4, 0($sp)\"",
323     "    emit \"move $s4, $gp\"",
324     "else",
325     "if X86",
326     "    emit \"push %esi\"",
327     "    emit \"push %edi\"",
328     "    emit \"push %ebx\"",
329     "else",
330     "if X86_WIN",
331     "    emit \"push esi\"",
332     "    emit \"push edi\"",
333     "    emit \"push ebx\"",
334     "else",
335     "    skip",
336     "end",
337     "end",
338     "end",
339     "end",
340     "end",
341     "end",
342     "end",
343     "macro popCalleeSaves()",
344     "if (((C_LOOP or ARM64) or X86_64) or X86_64_WIN)",
345     "",
346     "else",
347     "if (ARM or ARMv7_TRADITIONAL)",
348     "    emit \"pop {r4-r10}\"",
349     "else",
350     "if ARMv7",
351     "    emit \"pop {r4-r6, r8-r11}\"",
352     "else",
353     "if MIPS",
354     "    emit \"lw $s4, 0($sp)\"",
355     "    emit \"addiu $sp, $sp, 4\"",
356     "else",
357     "if X86",
358     "    emit \"pop %ebx\"",
359     "    emit \"pop %edi\"",
360     "    emit \"pop %esi\"",
361     "else",
362     "if X86_WIN",
363     "    emit \"pop ebx\"",
364     "    emit \"pop edi\"",
365     "    emit \"pop esi\"",
366     "else",
367     "    skip",
368     "end",
369     "end",
370     "end",
371     "end",
372     "end",
373     "end",
374     "end",
375     "macro preserveCallerPCAndCFR()",
376     "if ((((C_LOOP or ARM) or ARMv7) or ARMv7_TRADITIONAL) or MIPS)",
377     "    push lr",
378     "    push cfr",
379     "else",
380     "if (((X86 or X86_WIN) or X86_64) or X86_64_WIN)",
381     "    push cfr",
382     "else",
383     "if ARM64",
384     "    push cfr, lr",
385     "else",
386     "    error",
387     "end",
388     "end",
389     "end",
390     "    move sp, cfr",
391     "end",
392     "macro restoreCallerPCAndCFR()",
393     "    move cfr, sp",
394     "if ((((C_LOOP or ARM) or ARMv7) or ARMv7_TRADITIONAL) or MIPS)",
395     "    pop cfr",
396     "    pop lr",
397     "else",
398     "if (((X86 or X86_WIN) or X86_64) or X86_64_WIN)",
399     "    pop cfr",
400     "else",
401     "if ARM64",
402     "    pop lr, cfr",
403     "else",
404     "    skip",
405     "end",
406     "end",
407     "end",
408     "end",
409     "macro preserveCalleeSavesUsedByLLInt()",
410     "    subp CalleeSaveSpaceStackAligned, sp",
411     "if C_LOOP",
412     "",
413     "else",
414     "if (ARM or ARMv7_TRADITIONAL)",
415     "",
416     "else",
417     "if ARMv7",
418     "",
419     "else",
420     "if ARM64",
421     "    emit \"stp x27, x28, [x29, #-16]\"",
422     "    emit \"stp xzr, x26, [x29, #-32]\"",
423     "else",
424     "if MIPS",
425     "",
426     "else",
427     "if X86",
428     "",
429     "else",
430     "if X86_WIN",
431     "",
432     "else",
433     "if X86_64",
434     "    storep csr4, (-8)[cfr]",
435     "    storep csr3, (-16)[cfr]",
436     "    storep csr2, (-24)[cfr]",
437     "else",
438     "if X86_64_WIN",
439     "    storep csr6, (-8)[cfr]",
440     "    storep csr5, (-16)[cfr]",
441     "    storep csr4, (-24)[cfr]",
442     "else",
443     "    skip",
444     "end",
445     "end",
446     "end",
447     "end",
448     "end",
449     "end",
450     "end",
451     "end",
452     "end",
453     "end",
454     "macro restoreCalleeSavesUsedByLLInt()",
455     "if C_LOOP",
456     "",
457     "else",
458     "if (ARM or ARMv7_TRADITIONAL)",
459     "",
460     "else",
461     "if ARMv7",
462     "",
463     "else",
464     "if ARM64",
465     "    emit \"ldp xzr, x26, [x29, #-32]\"",
466     "    emit \"ldp x27, x28, [x29, #-16]\"",
467     "else",
468     "if MIPS",
469     "",
470     "else",
471     "if X86",
472     "",
473     "else",
474     "if X86_WIN",
475     "",
476     "else",
477     "if X86_64",
478     "    loadp (-24)[cfr], csr2",
479     "    loadp (-16)[cfr], csr3",
480     "    loadp (-8)[cfr], csr4",
481     "else",
482     "if X86_64_WIN",
483     "    loadp (-24)[cfr], csr4",
484     "    loadp (-16)[cfr], csr5",
485     "    loadp (-8)[cfr], csr6",
486     "else",
487     "    skip",
488     "end",
489     "end",
490     "end",
491     "end",
492     "end",
493     "end",
494     "end",
495     "end",
496     "end",
497     "end",
498     "macro copyCalleeSavesToVMEntryFrameCalleeSavesBuffer(vm, temp)",
499     "if ((ARM64 or X86_64) or X86_64_WIN)",
500     "    loadp VM::topVMEntryFrame[vm], temp",
501     "    vmEntryRecord(temp, temp)",
502     "    leap VMEntryRecord::calleeSaveRegistersBuffer[temp], temp",
503     "if ARM64",
504     "    storep csr0, 0[temp]",
505     "    storep csr1, 8[temp]",
506     "    storep csr2, 16[temp]",
507     "    storep csr3, 24[temp]",
508     "    storep csr4, 32[temp]",
509     "    storep csr5, 40[temp]",
510     "    storep csr6, 48[temp]",
511     "    storep csr7, 56[temp]",
512     "    storep csr8, 64[temp]",
513     "    storep csr9, 72[temp]",
514     "    stored csfr0, 80[temp]",
515     "    stored csfr1, 88[temp]",
516     "    stored csfr2, 96[temp]",
517     "    stored csfr3, 104[temp]",
518     "    stored csfr4, 112[temp]",
519     "    stored csfr5, 120[temp]",
520     "    stored csfr6, 128[temp]",
521     "    stored csfr7, 136[temp]",
522     "else",
523     "if X86_64",
524     "    storep csr0, 0[temp]",
525     "    storep csr1, 8[temp]",
526     "    storep csr2, 16[temp]",
527     "    storep csr3, 24[temp]",
528     "    storep csr4, 32[temp]",
529     "else",
530     "if X86_64_WIN",
531     "    storep csr0, 0[temp]",
532     "    storep csr1, 8[temp]",
533     "    storep csr2, 16[temp]",
534     "    storep csr3, 24[temp]",
535     "    storep csr4, 32[temp]",
536     "    storep csr5, 40[temp]",
537     "    storep csr6, 48[temp]",
538     "else",
539     "    skip",
540     "end",
541     "end",
542     "end",
543     "else",
544     "    skip",
545     "end",
546     "end",
547     "macro restoreCalleeSavesFromVMEntryFrameCalleeSavesBuffer(vm, temp)",
548     "if ((ARM64 or X86_64) or X86_64_WIN)",
549     "    loadp VM::topVMEntryFrame[vm], temp",
550     "    vmEntryRecord(temp, temp)",
551     "    leap VMEntryRecord::calleeSaveRegistersBuffer[temp], temp",
552     "if ARM64",
553     "    loadp 0[temp], csr0",
554     "    loadp 8[temp], csr1",
555     "    loadp 16[temp], csr2",
556     "    loadp 24[temp], csr3",
557     "    loadp 32[temp], csr4",
558     "    loadp 40[temp], csr5",
559     "    loadp 48[temp], csr6",
560     "    loadp 56[temp], csr7",
561     "    loadp 64[temp], csr8",
562     "    loadp 72[temp], csr9",
563     "    loadd 80[temp], csfr0",
564     "    loadd 88[temp], csfr1",
565     "    loadd 96[temp], csfr2",
566     "    loadd 104[temp], csfr3",
567     "    loadd 112[temp], csfr4",
568     "    loadd 120[temp], csfr5",
569     "    loadd 128[temp], csfr6",
570     "    loadd 136[temp], csfr7",
571     "else",
572     "if X86_64",
573     "    loadp 0[temp], csr0",
574     "    loadp 8[temp], csr1",
575     "    loadp 16[temp], csr2",
576     "    loadp 24[temp], csr3",
577     "    loadp 32[temp], csr4",
578     "else",
579     "if X86_64_WIN",
580     "    loadp 0[temp], csr0",
581     "    loadp 8[temp], csr1",
582     "    loadp 16[temp], csr2",
583     "    loadp 24[temp], csr3",
584     "    loadp 32[temp], csr4",
585     "    loadp 40[temp], csr5",
586     "    loadp 48[temp], csr6",
587     "else",
588     "    skip",
589     "end",
590     "end",
591     "end",
592     "else",
593     "    skip",
594     "end",
595     "end",
596     "macro preserveReturnAddressAfterCall(destinationRegister)",
597     "if (((((C_LOOP or ARM) or ARMv7) or ARMv7_TRADITIONAL) or ARM64) or MIPS)",
598     "    move lr, destinationRegister",
599     "else",
600     "if (((X86 or X86_WIN) or X86_64) or X86_64_WIN)",
601     "    pop destinationRegister",
602     "else",
603     "    error",
604     "end",
605     "end",
606     "end",
607     "macro functionPrologue()",
608     "if (((X86 or X86_WIN) or X86_64) or X86_64_WIN)",
609     "    push cfr",
610     "else",
611     "if ARM64",
612     "    push cfr, lr",
613     "else",
614     "if ((((C_LOOP or ARM) or ARMv7) or ARMv7_TRADITIONAL) or MIPS)",
615     "    push lr",
616     "    push cfr",
617     "else",
618     "    skip",
619     "end",
620     "end",
621     "end",
622     "    move sp, cfr",
623     "end",
624     "macro functionEpilogue()",
625     "if (((X86 or X86_WIN) or X86_64) or X86_64_WIN)",
626     "    pop cfr",
627     "else",
628     "if ARM64",
629     "    pop lr, cfr",
630     "else",
631     "if ((((C_LOOP or ARM) or ARMv7) or ARMv7_TRADITIONAL) or MIPS)",
632     "    pop cfr",
633     "    pop lr",
634     "else",
635     "    skip",
636     "end",
637     "end",
638     "end",
639     "end",
640     "macro vmEntryRecord(entryFramePointer, resultReg)",
641     "    subp entryFramePointer, VMEntryTotalFrameSize, resultReg",
642     "end",
643     "macro getFrameRegisterSizeForCodeBlock(codeBlock, size)",
644     "    loadi CodeBlock::m_numCalleeLocals[codeBlock], size",
645     "    lshiftp 3, size",
646     "    addp maxFrameExtentForSlowPathCall, size",
647     "end",
648     "macro restoreStackPointerAfterCall()",
649     "    loadp CodeBlock[cfr], t2",
650     "    getFrameRegisterSizeForCodeBlock(t2, t2)",
651     "if ARMv7",
652     "    subp cfr, t2, t2",
653     "    move t2, sp",
654     "else",
655     "    subp cfr, t2, sp",
656     "end",
657     "end",
658     "macro traceExecution()",
659     "if COLLECT_STATS",
660     "    callSlowPath(_llint_count_opcode)",
661     "else",
662     "    skip",
663     "end",
664     "if EXECUTION_TRACING",
665     "    callSlowPath(_llint_trace)",
666     "else",
667     "    skip",
668     "end",
669     "end",
670     "macro traceSlowPathExecution()",
671     "if COLLECT_STATS",
672     "    callSlowPath(_llint_count_opcode_slow_path)",
673     "else",
674     "    skip",
675     "end",
676     "end",
677     "macro callOpcodeSlowPath(slowPath)",
678     "    traceSlowPathExecution()",
679     "    callSlowPath(slowPath)",
680     "end",
681     "macro callTargetFunction(callee)",
682     "if C_LOOP",
683     "    cloopCallJSFunction callee",
684     "else",
685     "    call callee",
686     "end",
687     "    restoreStackPointerAfterCall()",
688     "    dispatchAfterCall()",
689     "end",
690     "macro prepareForRegularCall(callee, temp1, temp2, temp3)",
691     "    addp CallerFrameAndPCSize, sp",
692     "end",
693     "macro prepareForTailCall(callee, temp1, temp2, temp3)",
694     "    restoreCalleeSavesUsedByLLInt()",
695     "    loadi (PayloadOffset + ArgumentCount)[cfr], temp2",
696     "    loadp CodeBlock[cfr], temp1",
697     "    loadp CodeBlock::m_numParameters[temp1], temp1",
698     "    bilteq temp1, temp2, .noArityFixup",
699     "    move temp1, temp2",
700     ".noArityFixup:",
701     "    muli SlotSize, temp2",
702     "    addi ((StackAlignment - 1) + CallFrameHeaderSize), temp2",
703     "    andi (~StackAlignmentMask), temp2",
704     "    move cfr, temp1",
705     "    addp temp2, temp1",
706     "    loadi (PayloadOffset + ArgumentCount)[sp], temp2",
707     "    muli SlotSize, temp2",
708     "    addi ((StackAlignment - 1) + CallFrameHeaderSize), temp2",
709     "    andi (~StackAlignmentMask), temp2",
710     "if (((((ARM or ARMv7_TRADITIONAL) or ARMv7) or ARM64) or C_LOOP) or MIPS)",
711     "    addp (2 * PtrSize), sp",
712     "    subi (2 * PtrSize), temp2",
713     "    loadp PtrSize[cfr], lr",
714     "else",
715     "    addp PtrSize, sp",
716     "    subi PtrSize, temp2",
717     "    loadp PtrSize[cfr], temp3",
718     "    storep temp3, 0[sp]",
719     "end",
720     "    subp temp2, temp1",
721     "    loadp 0[cfr], cfr",
722     ".copyLoop:",
723     "    subi PtrSize, temp2",
724     "    loadp 0[sp, temp2, 1], temp3",
725     "    storep temp3, 0[temp1, temp2, 1]",
726     "    btinz temp2, .copyLoop",
727     "    move temp1, sp",
728     "    jmp callee",
729     "end",
730     "macro slowPathForCall(slowPath, prepareCall)",
731     "    traceSlowPathExecution()",
732     "    callCallSlowPath(slowPath, macro (callee, calleeFramePtr)",
733     "    btpz calleeFramePtr, .dontUpdateSP",
734     "    move calleeFramePtr, sp",
735     "    prepareCall(callee, t2, t3, t4)",
736     ".dontUpdateSP:",
737     "    callTargetFunction(callee)",
738     "end)",
739     "end",
740     "macro arrayProfile(cellAndIndexingType, profile, scratch)",
741     "const cell = cellAndIndexingType",
742     "const indexingType = cellAndIndexingType",
743     "    loadi JSCell::m_structureID[cell], scratch",
744     "    storei scratch, ArrayProfile::m_lastSeenStructureID[profile]",
745     "    loadb JSCell::m_indexingTypeAndMisc[cell], indexingType",
746     "end",
747     "macro skipIfIsRememberedOrInEden(cell, slowPath)",
748     "    memfence ",
749     "    bba JSCell::m_cellState[cell], BlackThreshold, .done",
750     "    slowPath()",
751     ".done:",
752     "end",
753     "macro notifyWrite(set, slow)",
754     "    bbneq WatchpointSet::m_state[set], IsInvalidated, slow",
755     "end",
756     "macro checkSwitchToJIT(increment, action)",
757     "    loadp CodeBlock[cfr], t0",
758     "    baddis increment, (CodeBlock::m_llintExecuteCounter + BaselineExecutionCounter::m_counter)[t0], .continue",
759     "    action()",
760     ".continue:",
761     "end",
762     "macro checkSwitchToJITForEpilogue()",
763     "    checkSwitchToJIT(10, macro ()",
764     "    callOpcodeSlowPath(_llint_replace)",
765     "end)",
766     "end",
767     "macro assertNotConstant(index)",
768     "    assert(macro (ok)",
769     "    bilt index, FirstConstantRegisterIndex, ok",
770     "end)",
771     "end",
772     "macro functionForCallCodeBlockGetter(targetRegister)",
773     "if JSVALUE64",
774     "    loadp Callee[cfr], targetRegister",
775     "else",
776     "    loadp (Callee + PayloadOffset)[cfr], targetRegister",
777     "end",
778     "    loadp JSFunction::m_executable[targetRegister], targetRegister",
779     "    loadp FunctionExecutable::m_codeBlockForCall[targetRegister], targetRegister",
780     "end",
781     "macro functionForConstructCodeBlockGetter(targetRegister)",
782     "if JSVALUE64",
783     "    loadp Callee[cfr], targetRegister",
784     "else",
785     "    loadp (Callee + PayloadOffset)[cfr], targetRegister",
786     "end",
787     "    loadp JSFunction::m_executable[targetRegister], targetRegister",
788     "    loadp FunctionExecutable::m_codeBlockForConstruct[targetRegister], targetRegister",
789     "end",
790     "macro notFunctionCodeBlockGetter(targetRegister)",
791     "    loadp CodeBlock[cfr], targetRegister",
792     "end",
793     "macro functionCodeBlockSetter(sourceRegister)",
794     "    storep sourceRegister, CodeBlock[cfr]",
795     "end",
796     "macro notFunctionCodeBlockSetter(sourceRegister)",
797     "",
798     "end",
799     "macro prologue(codeBlockGetter, codeBlockSetter, osrSlowPath, traceSlowPath)",
800     "    preserveCallerPCAndCFR()",
801     "if EXECUTION_TRACING",
802     "    subp maxFrameExtentForSlowPathCall, sp",
803     "    callSlowPath(traceSlowPath)",
804     "    addp maxFrameExtentForSlowPathCall, sp",
805     "else",
806     "    skip",
807     "end",
808     "    codeBlockGetter(t1)",
809     "if (notC_LOOP)",
810     "    baddis 5, (CodeBlock::m_llintExecuteCounter + BaselineExecutionCounter::m_counter)[t1], .continue",
811     "if JSVALUE64",
812     "    move cfr, a0",
813     "    move PC, a1",
814     "    cCall2(osrSlowPath)",
815     "else",
816     "    subp 8, sp",
817     "    move cfr, a0",
818     "    move PC, a1",
819     "    cCall2(osrSlowPath)",
820     "    addp 8, sp",
821     "end",
822     "    btpz r0, .recover",
823     "    move cfr, sp",
824     "if ARM64",
825     "    pop lr, cfr",
826     "else",
827     "if (((ARM or ARMv7) or ARMv7_TRADITIONAL) or MIPS)",
828     "    pop cfr",
829     "    pop lr",
830     "else",
831     "    pop cfr",
832     "end",
833     "end",
834     "    jmp r0",
835     ".recover:",
836     "    codeBlockGetter(t1)",
837     ".continue:",
838     "else",
839     "    skip",
840     "end",
841     "    codeBlockSetter(t1)",
842     "    preserveCalleeSavesUsedByLLInt()",
843     "if JSVALUE64",
844     "    loadp CodeBlock::m_instructions[t1], PB",
845     "    move 0, PC",
846     "else",
847     "    loadp CodeBlock::m_instructions[t1], PC",
848     "end",
849     "    getFrameRegisterSizeForCodeBlock(t1, t0)",
850     "    subp cfr, t0, t0",
851     "    bpa t0, cfr, .needStackCheck",
852     "    loadp CodeBlock::m_vm[t1], t2",
853     "if C_LOOP",
854     "    bpbeq VM::m_cloopStackLimit[t2], t0, .stackHeightOK",
855     "else",
856     "    bpbeq VM::m_softStackLimit[t2], t0, .stackHeightOK",
857     "end",
858     ".needStackCheck:",
859     "    subp maxFrameExtentForSlowPathCall, sp",
860     "    callSlowPath(_llint_stack_check)",
861     "    bpeq r1, 0, .stackHeightOKGetCodeBlock",
862     "    move r1, cfr",
863     "    dispatch(0)",
864     ".stackHeightOKGetCodeBlock:",
865     "    codeBlockGetter(t1)",
866     "    getFrameRegisterSizeForCodeBlock(t1, t0)",
867     "    subp cfr, t0, t0",
868     ".stackHeightOK:",
869     "    move t0, sp",
870     "if JSVALUE64",
871     "    move TagTypeNumber, tagTypeNumber",
872     "    addp TagBitTypeOther, tagTypeNumber, tagMask",
873     "else",
874     "    skip",
875     "end",
876     "end",
877     "macro functionInitialization(profileArgSkip)",
878     "    loadi CodeBlock::m_numParameters[t1], t0",
879     "    addp (-profileArgSkip), t0",
880     "    assert(macro (ok)",
881     "    bpgteq t0, 0, ok",
882     "end)",
883     "    btpz t0, .argumentProfileDone",
884     "    loadp (CodeBlock::m_argumentValueProfiles + VectorBufferOffset)[t1], t3",
885     "    mulp sizeof ValueProfile, t0, t2",
886     "    lshiftp 3, t0",
887     "    addp t2, t3",
888     ".argumentProfileLoop:",
889     "if JSVALUE64",
890     "    loadq ((ThisArgumentOffset - 8) + (profileArgSkip * 8))[cfr, t0, 1], t2",
891     "    subp sizeof ValueProfile, t3",
892     "    storeq t2, ((profileArgSkip * sizeof ValueProfile) + ValueProfile::m_buckets)[t3]",
893     "else",
894     "    loadi (((ThisArgumentOffset + TagOffset) - 8) + (profileArgSkip * 8))[cfr, t0, 1], t2",
895     "    subp sizeof ValueProfile, t3",
896     "    storei t2, (((profileArgSkip * sizeof ValueProfile) + ValueProfile::m_buckets) + TagOffset)[t3]",
897     "    loadi (((ThisArgumentOffset + PayloadOffset) - 8) + (profileArgSkip * 8))[cfr, t0, 1], t2",
898     "    storei t2, (((profileArgSkip * sizeof ValueProfile) + ValueProfile::m_buckets) + PayloadOffset)[t3]",
899     "end",
900     "    baddpnz (-8), t0, .argumentProfileLoop",
901     ".argumentProfileDone:",
902     "end",
903     "macro doReturn()",
904     "    restoreCalleeSavesUsedByLLInt()",
905     "    restoreCallerPCAndCFR()",
906     "    ret ",
907     "end",
908     "if C_LOOP",
909     "_llint_vm_entry_to_javascript:",
910     "else",
911     "_vmEntryToJavaScript:",
912     "end",
913     "    doVMEntry(makeJavaScriptCall)",
914     "if C_LOOP",
915     "_llint_vm_entry_to_native:",
916     "else",
917     "_vmEntryToNative:",
918     "end",
919     "    doVMEntry(makeHostFunctionCall)",
920     "if (notC_LOOP)",
921     "_sanitizeStackForVMImpl:",
922     "if (X86 or X86_WIN)",
923     "    loadp 4[sp], a0",
924     "else",
925     "    skip",
926     "end",
927     "const vm = a0",
928     "const address = a1",
929     "const zeroValue = a2",
930     "    loadp VM::m_lastStackTop[vm], address",
931     "    bpbeq sp, address, .zeroFillDone",
932     "    move 0, zeroValue",
933     ".zeroFillLoop:",
934     "    storep zeroValue, 0[address]",
935     "    addp PtrSize, address",
936     "    bpa sp, address, .zeroFillLoop",
937     ".zeroFillDone:",
938     "    move sp, address",
939     "    storep address, VM::m_lastStackTop[vm]",
940     "    ret ",
941     "_vmEntryRecord:",
942     "if (X86 or X86_WIN)",
943     "    loadp 4[sp], a0",
944     "else",
945     "    skip",
946     "end",
947     "    vmEntryRecord(a0, r0)",
948     "    ret ",
949     "else",
950     "    skip",
951     "end",
952     "if C_LOOP",
953     "_llint_entry:",
954     "    crash()",
955     "else",
956     "macro initPCRelative(pcBase)",
957     "if (((X86_64 or X86_64_WIN) or X86) or X86_WIN)",
958     "    call _relativePCBase",
959     "_relativePCBase:",
960     "    pop pcBase",
961     "else",
962     "if ARM64",
963     "",
964     "else",
965     "if ARMv7",
966     "_relativePCBase:",
967     "    move pc, pcBase",
968     "    subp 3, pcBase",
969     "else",
970     "if (ARM or ARMv7_TRADITIONAL)",
971     "_relativePCBase:",
972     "    move pc, pcBase",
973     "    subp 8, pcBase",
974     "else",
975     "if MIPS",
976     "    la _relativePCBase, pcBase",
977     "    setcallreg pcBase",
978     "_relativePCBase:",
979     "else",
980     "    skip",
981     "end",
982     "end",
983     "end",
984     "end",
985     "end",
986     "end",
987     "macro setEntryAddress(index, label)",
988     "if (X86_64 or X86_64_WIN)",
989     "    leap (label - _relativePCBase)[t1], t3",
990     "    move index, t4",
991     "    storep t3, 0[a0, t4, 8]",
992     "else",
993     "if (X86 or X86_WIN)",
994     "    leap (label - _relativePCBase)[t1], t3",
995     "    move index, t4",
996     "    storep t3, 0[a0, t4, 4]",
997     "else",
998     "if ARM64",
999     "    pcrtoaddr label, t1",
1000     "    move index, t4",
1001     "    storep t1, 0[a0, t4, 8]",
1002     "else",
1003     "if ((ARM or ARMv7) or ARMv7_TRADITIONAL)",
1004     "    mvlbl (label - _relativePCBase), t4",
1005     "    addp t4, t1, t4",
1006     "    move index, t3",
1007     "    storep t4, 0[a0, t3, 4]",
1008     "else",
1009     "if MIPS",
1010     "    la label, t4",
1011     "    la _relativePCBase, t3",
1012     "    subp t3, t4",
1013     "    addp t4, t1, t4",
1014     "    move index, t3",
1015     "    storep t4, 0[a0, t3, 4]",
1016     "else",
1017     "    skip",
1018     "end",
1019     "end",
1020     "end",
1021     "end",
1022     "end",
1023     "end",
1024     "_llint_entry:",
1025     "    functionPrologue()",
1026     "    pushCalleeSaves()",
1027     "if (X86 or X86_WIN)",
1028     "    loadp 20[sp], a0",
1029     "else",
1030     "    skip",
1031     "end",
1032     "    initPCRelative(t1)",
1033     "    setEntryAddress(0, _llint_op_enter)",
1034     "    setEntryAddress(1, _llint_op_get_scope)",
1035     "    setEntryAddress(2, _llint_op_create_direct_arguments)",
1036     "    setEntryAddress(3, _llint_op_create_scoped_arguments)",
1037     "    setEntryAddress(4, _llint_op_create_cloned_arguments)",
1038     "    setEntryAddress(5, _llint_op_create_this)",
1039     "    setEntryAddress(6, _llint_op_get_argument)",
1040     "    setEntryAddress(7, _llint_op_argument_count)",
1041     "    setEntryAddress(8, _llint_op_to_this)",
1042     "    setEntryAddress(9, _llint_op_check_tdz)",
1043     "    setEntryAddress(10, _llint_op_new_object)",
1044     "    setEntryAddress(11, _llint_op_new_array)",
1045     "    setEntryAddress(12, _llint_op_new_array_with_size)",
1046     "    setEntryAddress(13, _llint_op_new_array_with_spread)",
1047     "    setEntryAddress(14, _llint_op_spread)",
1048     "    setEntryAddress(15, _llint_op_new_array_buffer)",
1049     "    setEntryAddress(16, _llint_op_new_regexp)",
1050     "    setEntryAddress(17, _llint_op_mov)",
1051     "    setEntryAddress(18, _llint_op_not)",
1052     "    setEntryAddress(19, _llint_op_eq)",
1053     "    setEntryAddress(20, _llint_op_eq_null)",
1054     "    setEntryAddress(21, _llint_op_neq)",
1055     "    setEntryAddress(22, _llint_op_neq_null)",
1056     "    setEntryAddress(23, _llint_op_stricteq)",
1057     "    setEntryAddress(24, _llint_op_nstricteq)",
1058     "    setEntryAddress(25, _llint_op_less)",
1059     "    setEntryAddress(26, _llint_op_lesseq)",
1060     "    setEntryAddress(27, _llint_op_greater)",
1061     "    setEntryAddress(28, _llint_op_greatereq)",
1062     "    setEntryAddress(29, _llint_op_inc)",
1063     "    setEntryAddress(30, _llint_op_dec)",
1064     "    setEntryAddress(31, _llint_op_to_number)",
1065     "    setEntryAddress(32, _llint_op_to_string)",
1066     "    setEntryAddress(33, _llint_op_negate)",
1067     "    setEntryAddress(34, _llint_op_add)",
1068     "    setEntryAddress(35, _llint_op_mul)",
1069     "    setEntryAddress(36, _llint_op_div)",
1070     "    setEntryAddress(37, _llint_op_mod)",
1071     "    setEntryAddress(38, _llint_op_sub)",
1072     "    setEntryAddress(39, _llint_op_pow)",
1073     "    setEntryAddress(40, _llint_op_lshift)",
1074     "    setEntryAddress(41, _llint_op_rshift)",
1075     "    setEntryAddress(42, _llint_op_urshift)",
1076     "    setEntryAddress(43, _llint_op_unsigned)",
1077     "    setEntryAddress(44, _llint_op_bitand)",
1078     "    setEntryAddress(45, _llint_op_bitxor)",
1079     "    setEntryAddress(46, _llint_op_bitor)",
1080     "    setEntryAddress(47, _llint_op_overrides_has_instance)",
1081     "    setEntryAddress(48, _llint_op_instanceof)",
1082     "    setEntryAddress(49, _llint_op_instanceof_custom)",
1083     "    setEntryAddress(50, _llint_op_typeof)",
1084     "    setEntryAddress(51, _llint_op_is_empty)",
1085     "    setEntryAddress(52, _llint_op_is_undefined)",
1086     "    setEntryAddress(53, _llint_op_is_boolean)",
1087     "    setEntryAddress(54, _llint_op_is_number)",
1088     "    setEntryAddress(55, _llint_op_is_object)",
1089     "    setEntryAddress(56, _llint_op_is_object_or_null)",
1090     "    setEntryAddress(57, _llint_op_is_function)",
1091     "    setEntryAddress(58, _llint_op_is_cell_with_type)",
1092     "    setEntryAddress(59, _llint_op_in)",
1093     "    setEntryAddress(60, _llint_op_get_array_length)",
1094     "    setEntryAddress(61, _llint_op_get_by_id)",
1095     "    setEntryAddress(62, _llint_op_get_by_id_proto_load)",
1096     "    setEntryAddress(63, _llint_op_get_by_id_unset)",
1097     "    setEntryAddress(64, _llint_op_get_by_id_with_this)",
1098     "    setEntryAddress(65, _llint_op_get_by_val_with_this)",
1099     "    setEntryAddress(66, _llint_op_try_get_by_id)",
1100     "    setEntryAddress(67, _llint_op_put_by_id)",
1101     "    setEntryAddress(68, _llint_op_put_by_id_with_this)",
1102     "    setEntryAddress(69, _llint_op_del_by_id)",
1103     "    setEntryAddress(70, _llint_op_get_by_val)",
1104     "    setEntryAddress(71, _llint_op_put_by_val)",
1105     "    setEntryAddress(72, _llint_op_put_by_val_with_this)",
1106     "    setEntryAddress(73, _llint_op_put_by_val_direct)",
1107     "    setEntryAddress(74, _llint_op_del_by_val)",
1108     "    setEntryAddress(75, _llint_op_put_by_index)",
1109     "    setEntryAddress(76, _llint_op_put_getter_by_id)",
1110     "    setEntryAddress(77, _llint_op_put_setter_by_id)",
1111     "    setEntryAddress(78, _llint_op_put_getter_setter_by_id)",
1112     "    setEntryAddress(79, _llint_op_put_getter_by_val)",
1113     "    setEntryAddress(80, _llint_op_put_setter_by_val)",
1114     "    setEntryAddress(81, _llint_op_define_data_property)",
1115     "    setEntryAddress(82, _llint_op_define_accessor_property)",
1116     "    setEntryAddress(83, _llint_op_jmp)",
1117     "    setEntryAddress(84, _llint_op_jtrue)",
1118     "    setEntryAddress(85, _llint_op_jfalse)",
1119     "    setEntryAddress(86, _llint_op_jeq_null)",
1120     "    setEntryAddress(87, _llint_op_jneq_null)",
1121     "    setEntryAddress(88, _llint_op_jneq_ptr)",
1122     "    setEntryAddress(89, _llint_op_jless)",
1123     "    setEntryAddress(90, _llint_op_jlesseq)",
1124     "    setEntryAddress(91, _llint_op_jgreater)",
1125     "    setEntryAddress(92, _llint_op_jgreatereq)",
1126     "    setEntryAddress(93, _llint_op_jnless)",
1127     "    setEntryAddress(94, _llint_op_jnlesseq)",
1128     "    setEntryAddress(95, _llint_op_jngreater)",
1129     "    setEntryAddress(96, _llint_op_jngreatereq)",
1130     "    setEntryAddress(97, _llint_op_loop_hint)",
1131     "    setEntryAddress(98, _llint_op_switch_imm)",
1132     "    setEntryAddress(99, _llint_op_switch_char)",
1133     "    setEntryAddress(100, _llint_op_switch_string)",
1134     "    setEntryAddress(101, _llint_op_new_func)",
1135     "    setEntryAddress(102, _llint_op_new_func_exp)",
1136     "    setEntryAddress(103, _llint_op_new_generator_func)",
1137     "    setEntryAddress(104, _llint_op_new_generator_func_exp)",
1138     "    setEntryAddress(105, _llint_op_new_async_func)",
1139     "    setEntryAddress(106, _llint_op_new_async_func_exp)",
1140     "    setEntryAddress(107, _llint_op_set_function_name)",
1141     "    setEntryAddress(108, _llint_op_call)",
1142     "    setEntryAddress(109, _llint_op_tail_call)",
1143     "    setEntryAddress(110, _llint_op_call_eval)",
1144     "    setEntryAddress(111, _llint_op_call_varargs)",
1145     "    setEntryAddress(112, _llint_op_tail_call_varargs)",
1146     "    setEntryAddress(113, _llint_op_tail_call_forward_arguments)",
1147     "    setEntryAddress(114, _llint_op_ret)",
1148     "    setEntryAddress(115, _llint_op_construct)",
1149     "    setEntryAddress(116, _llint_op_construct_varargs)",
1150     "    setEntryAddress(117, _llint_op_strcat)",
1151     "    setEntryAddress(118, _llint_op_to_primitive)",
1152     "    setEntryAddress(119, _llint_op_resolve_scope)",
1153     "    setEntryAddress(120, _llint_op_get_from_scope)",
1154     "    setEntryAddress(121, _llint_op_put_to_scope)",
1155     "    setEntryAddress(122, _llint_op_get_from_arguments)",
1156     "    setEntryAddress(123, _llint_op_put_to_arguments)",
1157     "    setEntryAddress(124, _llint_op_push_with_scope)",
1158     "    setEntryAddress(125, _llint_op_create_lexical_environment)",
1159     "    setEntryAddress(126, _llint_op_get_parent_scope)",
1160     "    setEntryAddress(127, _llint_op_catch)",
1161     "    setEntryAddress(128, _llint_op_throw)",
1162     "    setEntryAddress(129, _llint_op_throw_static_error)",
1163     "    setEntryAddress(130, _llint_op_debug)",
1164     "    setEntryAddress(131, _llint_op_end)",
1165     "    setEntryAddress(132, _llint_op_profile_type)",
1166     "    setEntryAddress(133, _llint_op_profile_control_flow)",
1167     "    setEntryAddress(134, _llint_op_get_enumerable_length)",
1168     "    setEntryAddress(135, _llint_op_has_indexed_property)",
1169     "    setEntryAddress(136, _llint_op_has_structure_property)",
1170     "    setEntryAddress(137, _llint_op_has_generic_property)",
1171     "    setEntryAddress(138, _llint_op_get_direct_pname)",
1172     "    setEntryAddress(139, _llint_op_get_property_enumerator)",
1173     "    setEntryAddress(140, _llint_op_enumerator_structure_pname)",
1174     "    setEntryAddress(141, _llint_op_enumerator_generic_pname)",
1175     "    setEntryAddress(142, _llint_op_to_index_string)",
1176     "    setEntryAddress(143, _llint_op_assert)",
1177     "    setEntryAddress(144, _llint_op_unreachable)",
1178     "    setEntryAddress(145, _llint_op_create_rest)",
1179     "    setEntryAddress(146, _llint_op_get_rest_length)",
1180     "    setEntryAddress(147, _llint_op_yield)",
1181     "    setEntryAddress(148, _llint_op_check_traps)",
1182     "    setEntryAddress(149, _llint_op_log_shadow_chicken_prologue)",
1183     "    setEntryAddress(150, _llint_op_log_shadow_chicken_tail)",
1184     "    setEntryAddress(151, _llint_op_resolve_scope_for_hoisting_func_decl_in_eval)",
1185     "    setEntryAddress(152, _llint_op_nop)",
1186     "    setEntryAddress(153, _llint_program_prologue)",
1187     "    setEntryAddress(154, _llint_eval_prologue)",
1188     "    setEntryAddress(155, _llint_module_program_prologue)",
1189     "    setEntryAddress(156, _llint_function_for_call_prologue)",
1190     "    setEntryAddress(157, _llint_function_for_construct_prologue)",
1191     "    setEntryAddress(158, _llint_function_for_call_arity_check)",
1192     "    setEntryAddress(159, _llint_function_for_construct_arity_check)",
1193     "    setEntryAddress(160, _llint_generic_return_point)",
1194     "    setEntryAddress(161, _llint_throw_from_slow_path_trampoline)",
1195     "    setEntryAddress(162, _llint_throw_during_call_trampoline)",
1196     "    setEntryAddress(163, _llint_native_call_trampoline)",
1197     "    setEntryAddress(164, _llint_native_construct_trampoline)",
1198     "    setEntryAddress(165, _handleUncaughtException)",
1199     "    popCalleeSaves()",
1200     "    functionEpilogue()",
1201     "    ret ",
1202     "end",
1203     "_llint_program_prologue:",
1204     "    prologue(notFunctionCodeBlockGetter, notFunctionCodeBlockSetter, _llint_entry_osr, _llint_trace_prologue)",
1205     "    dispatch(0)",
1206     "_llint_module_program_prologue:",
1207     "    prologue(notFunctionCodeBlockGetter, notFunctionCodeBlockSetter, _llint_entry_osr, _llint_trace_prologue)",
1208     "    dispatch(0)",
1209     "_llint_eval_prologue:",
1210     "    prologue(notFunctionCodeBlockGetter, notFunctionCodeBlockSetter, _llint_entry_osr, _llint_trace_prologue)",
1211     "    dispatch(0)",
1212     "_llint_function_for_call_prologue:",
1213     "    prologue(functionForCallCodeBlockGetter, functionCodeBlockSetter, _llint_entry_osr_function_for_call, _llint_trace_prologue_function_for_call)",
1214     "    functionInitialization(0)",
1215     "    dispatch(0)",
1216     "_llint_function_for_construct_prologue:",
1217     "    prologue(functionForConstructCodeBlockGetter, functionCodeBlockSetter, _llint_entry_osr_function_for_construct, _llint_trace_prologue_function_for_construct)",
1218     "    functionInitialization(1)",
1219     "    dispatch(0)",
1220     "_llint_function_for_call_arity_check:",
1221     "    prologue(functionForCallCodeBlockGetter, functionCodeBlockSetter, _llint_entry_osr_function_for_call_arityCheck, _llint_trace_arityCheck_for_call)",
1222     "    functionArityCheck(.functionForCallBegin, _slow_path_call_arityCheck)",
1223     ".functionForCallBegin:",
1224     "    functionInitialization(0)",
1225     "    dispatch(0)",
1226     "_llint_function_for_construct_arity_check:",
1227     "    prologue(functionForConstructCodeBlockGetter, functionCodeBlockSetter, _llint_entry_osr_function_for_construct_arityCheck, _llint_trace_arityCheck_for_construct)",
1228     "    functionArityCheck(.functionForConstructBegin, _slow_path_construct_arityCheck)",
1229     ".functionForConstructBegin:",
1230     "    functionInitialization(1)",
1231     "    dispatch(0)",
1232     "if JSVALUE64",
1233     "macro jumpToInstruction()",
1234     "    jmp 0[PB, PC, 8]",
1235     "end",
1236     "macro dispatch(advance)",
1237     "    addp advance, PC",
1238     "    jumpToInstruction()",
1239     "end",
1240     "macro dispatchInt(advance)",
1241     "    addi advance, PC",
1242     "    jumpToInstruction()",
1243     "end",
1244     "macro dispatchIntIndirect(offset)",
1245     "    dispatchInt((offset * 8)[PB, PC, 8])",
1246     "end",
1247     "macro dispatchAfterCall()",
1248     "    loadi (ArgumentCount + TagOffset)[cfr], PC",
1249     "    loadp CodeBlock[cfr], PB",
1250     "    loadp CodeBlock::m_instructions[PB], PB",
1251     "    loadisFromInstruction(1, t1)",
1252     "    storeq r0, 0[cfr, t1, 8]",
1253     "    valueProfile(r0, (CallOpCodeSize - 1), t3)",
1254     "    dispatch(CallOpCodeSize)",
1255     "end",
1256     "macro cCall2(function)",
1257     "    checkStackPointerAlignment(t4, 3134242818)",
1258     "if (X86_64 or ARM64)",
1259     "    call function",
1260     "else",
1261     "if X86_64_WIN",
1262     "    move a1, a2",
1263     "    move a0, a1",
1264     "    subp 48, sp",
1265     "    move sp, a0",
1266     "    addp 32, a0",
1267     "    call function",
1268     "    addp 48, sp",
1269     "    move 8[r0], r1",
1270     "    move 0[r0], r0",
1271     "else",
1272     "if C_LOOP",
1273     "    cloopCallSlowPath function, a0, a1",
1274     "else",
1275     "    error",
1276     "end",
1277     "end",
1278     "end",
1279     "end",
1280     "macro cCall2Void(function)",
1281     "if C_LOOP",
1282     "    cloopCallSlowPathVoid function, a0, a1",
1283     "else",
1284     "if X86_64_WIN",
1285     "    subp 32, sp",
1286     "    call function",
1287     "    addp 32, sp",
1288     "else",
1289     "    cCall2(function)",
1290     "end",
1291     "end",
1292     "end",
1293     "macro cCall4(function)",
1294     "    checkStackPointerAlignment(t4, 3134242820)",
1295     "if (X86_64 or ARM64)",
1296     "    call function",
1297     "else",
1298     "if X86_64_WIN",
1299     "    subp 64, sp",
1300     "    call function",
1301     "    addp 64, sp",
1302     "else",
1303     "    error",
1304     "end",
1305     "end",
1306     "end",
1307     "macro doVMEntry(makeCall)",
1308     "    functionPrologue()",
1309     "    pushCalleeSaves()",
1310     "const entry = a0",
1311     "const vm = a1",
1312     "const protoCallFrame = a2",
1313     "    vmEntryRecord(cfr, sp)",
1314     "    checkStackPointerAlignment(t4, 3134249985)",
1315     "    storep vm, VMEntryRecord::m_vm[sp]",
1316     "    loadp VM::topCallFrame[vm], t4",
1317     "    storep t4, VMEntryRecord::m_prevTopCallFrame[sp]",
1318     "    loadp VM::topVMEntryFrame[vm], t4",
1319     "    storep t4, VMEntryRecord::m_prevTopVMEntryFrame[sp]",
1320     "    loadi ProtoCallFrame::paddedArgCount[protoCallFrame], t4",
1321     "    addp CallFrameHeaderSlots, t4, t4",
1322     "    lshiftp 3, t4",
1323     "    subp sp, t4, t3",
1324     "    bqbeq sp, t3, .throwStackOverflow",
1325     "if C_LOOP",
1326     "    bpaeq t3, VM::m_cloopStackLimit[vm], .stackHeightOK",
1327     "else",
1328     "    bpaeq t3, VM::m_softStackLimit[vm], .stackHeightOK",
1329     "end",
1330     "if C_LOOP",
1331     "    move entry, t4",
1332     "    move vm, t5",
1333     "    cloopCallSlowPath _llint_stack_check_at_vm_entry, vm, t3",
1334     "    bpeq t0, 0, .stackCheckFailed",
1335     "    move t4, entry",
1336     "    move t5, vm",
1337     "    jmp .stackHeightOK",
1338     ".stackCheckFailed:",
1339     "    move t4, entry",
1340     "    move t5, vm",
1341     "else",
1342     "    skip",
1343     "end",
1344     ".throwStackOverflow:",
1345     "    move vm, a0",
1346     "    move protoCallFrame, a1",
1347     "    cCall2(_llint_throw_stack_overflow_error)",
1348     "    vmEntryRecord(cfr, t4)",
1349     "    loadp VMEntryRecord::m_vm[t4], vm",
1350     "    loadp VMEntryRecord::m_prevTopCallFrame[t4], extraTempReg",
1351     "    storep extraTempReg, VM::topCallFrame[vm]",
1352     "    loadp VMEntryRecord::m_prevTopVMEntryFrame[t4], extraTempReg",
1353     "    storep extraTempReg, VM::topVMEntryFrame[vm]",
1354     "    subp cfr, CalleeRegisterSaveSize, sp",
1355     "    popCalleeSaves()",
1356     "    functionEpilogue()",
1357     "    ret ",
1358     ".stackHeightOK:",
1359     "    move t3, sp",
1360     "    move 4, t3",
1361     ".copyHeaderLoop:",
1362     "    subi 1, t3",
1363     "    loadq 0[protoCallFrame, t3, 8], extraTempReg",
1364     "    storeq extraTempReg, CodeBlock[sp, t3, 8]",
1365     "    btinz t3, .copyHeaderLoop",
1366     "    loadi (PayloadOffset + ProtoCallFrame::argCountAndCodeOriginValue)[protoCallFrame], t4",
1367     "    subi 1, t4",
1368     "    loadi ProtoCallFrame::paddedArgCount[protoCallFrame], extraTempReg",
1369     "    subi 1, extraTempReg",
1370     "    bieq t4, extraTempReg, .copyArgs",
1371     "    move ValueUndefined, t3",
1372     ".fillExtraArgsLoop:",
1373     "    subi 1, extraTempReg",
1374     "    storeq t3, (ThisArgumentOffset + 8)[sp, extraTempReg, 8]",
1375     "    bineq t4, extraTempReg, .fillExtraArgsLoop",
1376     ".copyArgs:",
1377     "    loadp ProtoCallFrame::args[protoCallFrame], t3",
1378     ".copyArgsLoop:",
1379     "    btiz t4, .copyArgsDone",
1380     "    subi 1, t4",
1381     "    loadq 0[t3, t4, 8], extraTempReg",
1382     "    storeq extraTempReg, (ThisArgumentOffset + 8)[sp, t4, 8]",
1383     "    jmp .copyArgsLoop",
1384     ".copyArgsDone:",
1385     "if ARM64",
1386     "    move sp, t4",
1387     "    storep t4, VM::topCallFrame[vm]",
1388     "else",
1389     "    storep sp, VM::topCallFrame[vm]",
1390     "end",
1391     "    storep cfr, VM::topVMEntryFrame[vm]",
1392     "    checkStackPointerAlignment(extraTempReg, 3134249986)",
1393     "    makeCall(entry, t3)",
1394     "    checkStackPointerAlignment(t2, 3134249987)",
1395     "    vmEntryRecord(cfr, t4)",
1396     "    loadp VMEntryRecord::m_vm[t4], vm",
1397     "    loadp VMEntryRecord::m_prevTopCallFrame[t4], t2",
1398     "    storep t2, VM::topCallFrame[vm]",
1399     "    loadp VMEntryRecord::m_prevTopVMEntryFrame[t4], t2",
1400     "    storep t2, VM::topVMEntryFrame[vm]",
1401     "    subp cfr, CalleeRegisterSaveSize, sp",
1402     "    popCalleeSaves()",
1403     "    functionEpilogue()",
1404     "    ret ",
1405     "end",
1406     "macro makeJavaScriptCall(entry, temp)",
1407     "    addp 16, sp",
1408     "if C_LOOP",
1409     "    cloopCallJSFunction entry",
1410     "else",
1411     "    call entry",
1412     "end",
1413     "    subp 16, sp",
1414     "end",
1415     "macro makeHostFunctionCall(entry, temp)",
1416     "    move entry, temp",
1417     "    storep cfr, 0[sp]",
1418     "    move sp, a0",
1419     "if C_LOOP",
1420     "    storep lr, 8[sp]",
1421     "    cloopCallNative temp",
1422     "else",
1423     "if X86_64_WIN",
1424     "    subp 32, sp",
1425     "    call temp",
1426     "    addp 32, sp",
1427     "else",
1428     "    call temp",
1429     "end",
1430     "end",
1431     "end",
1432     "_handleUncaughtException:",
1433     "    loadp Callee[cfr], t3",
1434     "    andp MarkedBlockMask, t3",
1435     "    loadp MarkedBlock::m_vm[t3], t3",
1436     "    restoreCalleeSavesFromVMEntryFrameCalleeSavesBuffer(t3, t0)",
1437     "    loadp VM::callFrameForCatch[t3], cfr",
1438     "    storep 0, VM::callFrameForCatch[t3]",
1439     "    loadp CallerFrame[cfr], cfr",
1440     "    vmEntryRecord(cfr, t2)",
1441     "    loadp VMEntryRecord::m_vm[t2], t3",
1442     "    loadp VMEntryRecord::m_prevTopCallFrame[t2], extraTempReg",
1443     "    storep extraTempReg, VM::topCallFrame[t3]",
1444     "    loadp VMEntryRecord::m_prevTopVMEntryFrame[t2], extraTempReg",
1445     "    storep extraTempReg, VM::topVMEntryFrame[t3]",
1446     "    subp cfr, CalleeRegisterSaveSize, sp",
1447     "    popCalleeSaves()",
1448     "    functionEpilogue()",
1449     "    ret ",
1450     "macro prepareStateForCCall()",
1451     "    leap 0[PB, PC, 8], PC",
1452     "end",
1453     "macro restoreStateAfterCCall()",
1454     "    move r0, PC",
1455     "    subp PB, PC",
1456     "    rshiftp 3, PC",
1457     "end",
1458     "macro callSlowPath(slowPath)",
1459     "    prepareStateForCCall()",
1460     "    move cfr, a0",
1461     "    move PC, a1",
1462     "    cCall2(slowPath)",
1463     "    restoreStateAfterCCall()",
1464     "end",
1465     "macro traceOperand(fromWhere, operand)",
1466     "    prepareStateForCCall()",
1467     "    move fromWhere, a2",
1468     "    move operand, a3",
1469     "    move cfr, a0",
1470     "    move PC, a1",
1471     "    cCall4(_llint_trace_operand)",
1472     "    restoreStateAfterCCall()",
1473     "end",
1474     "macro traceValue(fromWhere, operand)",
1475     "    prepareStateForCCall()",
1476     "    move fromWhere, a2",
1477     "    move operand, a3",
1478     "    move cfr, a0",
1479     "    move PC, a1",
1480     "    cCall4(_llint_trace_value)",
1481     "    restoreStateAfterCCall()",
1482     "end",
1483     "macro callCallSlowPath(slowPath, action)",
1484     "    storei PC, (ArgumentCount + TagOffset)[cfr]",
1485     "    prepareStateForCCall()",
1486     "    move cfr, a0",
1487     "    move PC, a1",
1488     "    cCall2(slowPath)",
1489     "    action(r0, r1)",
1490     "end",
1491     "macro callTrapHandler(throwHandler)",
1492     "    storei PC, (ArgumentCount + TagOffset)[cfr]",
1493     "    prepareStateForCCall()",
1494     "    move cfr, a0",
1495     "    move PC, a1",
1496     "    cCall2(_llint_slow_path_handle_traps)",
1497     "    btpnz r0, throwHandler",
1498     "    loadi (ArgumentCount + TagOffset)[cfr], PC",
1499     "end",
1500     "macro checkSwitchToJITForLoop()",
1501     "    checkSwitchToJIT(1, macro ()",
1502     "    storei PC, (ArgumentCount + TagOffset)[cfr]",
1503     "    prepareStateForCCall()",
1504     "    move cfr, a0",
1505     "    move PC, a1",
1506     "    cCall2(_llint_loop_osr)",
1507     "    btpz r0, .recover",
1508     "    move r1, sp",
1509     "    jmp r0",
1510     ".recover:",
1511     "    loadi (ArgumentCount + TagOffset)[cfr], PC",
1512     "end)",
1513     "end",
1514     "macro loadCaged(basePtr, source, dest, scratch)",
1515     "    loadp source, dest",
1516     "if (GIGACAGE_ENABLED and (notC_LOOP))",
1517     "    loadp basePtr, scratch",
1518     "    btpz scratch, .done",
1519     "    andp constexpr (GIGACAGE_MASK), dest",
1520     "    addp scratch, dest",
1521     ".done:",
1522     "else",
1523     "    skip",
1524     "end",
1525     "end",
1526     "macro loadVariable(operand, value)",
1527     "    loadisFromInstruction(operand, value)",
1528     "    loadq 0[cfr, value, 8], value",
1529     "end",
1530     "macro loadConstantOrVariable(index, value)",
1531     "    bpgteq index, FirstConstantRegisterIndex, .constant",
1532     "    loadq 0[cfr, index, 8], value",
1533     "    jmp .done",
1534     ".constant:",
1535     "    loadp CodeBlock[cfr], value",
1536     "    loadp (CodeBlock::m_constantRegisters + VectorBufferOffset)[value], value",
1537     "    subp FirstConstantRegisterIndex, index",
1538     "    loadq 0[value, index, 8], value",
1539     ".done:",
1540     "end",
1541     "macro loadConstantOrVariableInt32(index, value, slow)",
1542     "    loadConstantOrVariable(index, value)",
1543     "    bqb value, tagTypeNumber, slow",
1544     "end",
1545     "macro loadConstantOrVariableCell(index, value, slow)",
1546     "    loadConstantOrVariable(index, value)",
1547     "    btqnz value, tagMask, slow",
1548     "end",
1549     "macro writeBarrierOnOperand(cellOperand)",
1550     "    loadisFromInstruction(cellOperand, t1)",
1551     "    loadConstantOrVariableCell(t1, t2, .writeBarrierDone)",
1552     "    skipIfIsRememberedOrInEden(t2, macro ()",
1553     "    push PB, PC",
1554     "    move t2, a1",
1555     "    move cfr, a0",
1556     "    cCall2Void(_llint_write_barrier_slow)",
1557     "    pop PC, PB",
1558     "end)",
1559     ".writeBarrierDone:",
1560     "end",
1561     "macro writeBarrierOnOperands(cellOperand, valueOperand)",
1562     "    loadisFromInstruction(valueOperand, t1)",
1563     "    loadConstantOrVariableCell(t1, t0, .writeBarrierDone)",
1564     "    btpz t0, .writeBarrierDone",
1565     "    writeBarrierOnOperand(cellOperand)",
1566     ".writeBarrierDone:",
1567     "end",
1568     "macro writeBarrierOnGlobal(valueOperand, loadHelper)",
1569     "    loadisFromInstruction(valueOperand, t1)",
1570     "    loadConstantOrVariableCell(t1, t0, .writeBarrierDone)",
1571     "    btpz t0, .writeBarrierDone",
1572     "    loadHelper(t3)",
1573     "    skipIfIsRememberedOrInEden(t3, macro ()",
1574     "    push PB, PC",
1575     "    move cfr, a0",
1576     "    move t3, a1",
1577     "    cCall2Void(_llint_write_barrier_slow)",
1578     "    pop PC, PB",
1579     "end)",
1580     ".writeBarrierDone:",
1581     "end",
1582     "macro writeBarrierOnGlobalObject(valueOperand)",
1583     "    writeBarrierOnGlobal(valueOperand, macro (registerToStoreGlobal)",
1584     "    loadp CodeBlock[cfr], registerToStoreGlobal",
1585     "    loadp CodeBlock::m_globalObject[registerToStoreGlobal], registerToStoreGlobal",
1586     "end)",
1587     "end",
1588     "macro writeBarrierOnGlobalLexicalEnvironment(valueOperand)",
1589     "    writeBarrierOnGlobal(valueOperand, macro (registerToStoreGlobal)",
1590     "    loadp CodeBlock[cfr], registerToStoreGlobal",
1591     "    loadp CodeBlock::m_globalObject[registerToStoreGlobal], registerToStoreGlobal",
1592     "    loadp JSGlobalObject::m_globalLexicalEnvironment[registerToStoreGlobal], registerToStoreGlobal",
1593     "end)",
1594     "end",
1595     "macro valueProfile(value, operand, scratch)",
1596     "    loadpFromInstruction(operand, scratch)",
1597     "    storeq value, ValueProfile::m_buckets[scratch]",
1598     "end",
1599     "macro structureIDToStructureWithScratch(structureIDThenStructure, scratch)",
1600     "    loadp CodeBlock[cfr], scratch",
1601     "    loadp CodeBlock::m_vm[scratch], scratch",
1602     "    loadp ((VM::heap + Heap::m_structureIDTable) + StructureIDTable::m_table)[scratch], scratch",
1603     "    loadp 0[scratch, structureIDThenStructure, 8], structureIDThenStructure",
1604     "end",
1605     "macro loadStructureWithScratch(cell, structure, scratch)",
1606     "    loadi JSCell::m_structureID[cell], structure",
1607     "    structureIDToStructureWithScratch(structure, scratch)",
1608     "end",
1609     "macro loadStructureAndClobberFirstArg(cell, structure)",
1610     "    loadi JSCell::m_structureID[cell], structure",
1611     "    loadp CodeBlock[cfr], cell",
1612     "    loadp CodeBlock::m_vm[cell], cell",
1613     "    loadp ((VM::heap + Heap::m_structureIDTable) + StructureIDTable::m_table)[cell], cell",
1614     "    loadp 0[cell, structure, 8], structure",
1615     "end",
1616     "macro functionArityCheck(doneLabel, slowPath)",
1617     "    loadi (PayloadOffset + ArgumentCount)[cfr], t0",
1618     "    biaeq t0, CodeBlock::m_numParameters[t1], doneLabel",
1619     "    prepareStateForCCall()",
1620     "    move cfr, a0",
1621     "    move PC, a1",
1622     "    cCall2(slowPath)",
1623     "    btiz r0, .noError",
1624     "    move r1, cfr",
1625     "    jmp _llint_throw_from_slow_path_trampoline",
1626     ".noError:",
1627     "    loadi CommonSlowPaths::ArityCheckData::paddedStackSpace[r1], t1",
1628     "    btiz t1, .continue",
1629     "    loadi (PayloadOffset + ArgumentCount)[cfr], t2",
1630     "    addi CallFrameHeaderSlots, t2",
1631     "    move t1, t3",
1632     "    andi (StackAlignmentSlots - 1), t3",
1633     "    btiz t3, .noExtraSlot",
1634     "    move ValueUndefined, t0",
1635     ".fillExtraSlots:",
1636     "    storeq t0, 0[cfr, t2, 8]",
1637     "    addi 1, t2",
1638     "    bsubinz 1, t3, .fillExtraSlots",
1639     "    andi (~(StackAlignmentSlots - 1)), t1",
1640     "    btiz t1, .continue",
1641     ".noExtraSlot:",
1642     "    negq t1",
1643     "    move cfr, t3",
1644     "    subp (CalleeSaveSpaceAsVirtualRegisters * 8), t3",
1645     "    addi CalleeSaveSpaceAsVirtualRegisters, t2",
1646     "    move t1, t0",
1647     "    lshiftp 3, t0",
1648     "    addp t0, cfr",
1649     "    addp t0, sp",
1650     ".copyLoop:",
1651     "    loadq 0[t3], t0",
1652     "    storeq t0, 0[t3, t1, 8]",
1653     "    addp 8, t3",
1654     "    bsubinz 1, t2, .copyLoop",
1655     "    move t1, t2",
1656     "    move ValueUndefined, t0",
1657     ".fillLoop:",
1658     "    storeq t0, 0[t3, t1, 8]",
1659     "    addp 8, t3",
1660     "    baddinz 1, t2, .fillLoop",
1661     ".continue:",
1662     "    loadp CodeBlock[cfr], t1",
1663     "    loadp CodeBlock::m_instructions[t1], PB",
1664     "    move 0, PC",
1665     "    jmp doneLabel",
1666     "end",
1667     "macro branchIfException(label)",
1668     "    loadp Callee[cfr], t3",
1669     "    andp MarkedBlockMask, t3",
1670     "    loadp MarkedBlock::m_vm[t3], t3",
1671     "    btqz VM::m_exception[t3], .noException",
1672     "    jmp label",
1673     ".noException:",
1674     "end",
1675     "_llint_op_enter:",
1676     "    traceExecution()",
1677     "    checkStackPointerAlignment(t2, 3735879905)",
1678     "    loadp CodeBlock[cfr], t2",
1679     "    loadi CodeBlock::m_numVars[t2], t2",
1680     "    subq CalleeSaveSpaceAsVirtualRegisters, t2",
1681     "    move cfr, t1",
1682     "    subq (CalleeSaveSpaceAsVirtualRegisters * 8), t1",
1683     "    btiz t2, .opEnterDone",
1684     "    move ValueUndefined, t0",
1685     "    negi t2",
1686     "    sxi2q t2, t2",
1687     ".opEnterLoop:",
1688     "    storeq t0, 0[t1, t2, 8]",
1689     "    addq 1, t2",
1690     "    btqnz t2, .opEnterLoop",
1691     ".opEnterDone:",
1692     "    callOpcodeSlowPath(_slow_path_enter)",
1693     "    dispatch(constexpr (op_enter_length))",
1694     "_llint_op_get_argument:",
1695     "    traceExecution()",
1696     "    loadisFromInstruction(1, t1)",
1697     "    loadisFromInstruction(2, t2)",
1698     "    loadi (PayloadOffset + ArgumentCount)[cfr], t0",
1699     "    bilteq t0, t2, .opGetArgumentOutOfBounds",
1700     "    loadq ThisArgumentOffset[cfr, t2, 8], t0",
1701     "    storeq t0, 0[cfr, t1, 8]",
1702     "    valueProfile(t0, 3, t2)",
1703     "    dispatch(constexpr (op_get_argument_length))",
1704     ".opGetArgumentOutOfBounds:",
1705     "    storeq ValueUndefined, 0[cfr, t1, 8]",
1706     "    valueProfile(ValueUndefined, 3, t2)",
1707     "    dispatch(constexpr (op_get_argument_length))",
1708     "_llint_op_argument_count:",
1709     "    traceExecution()",
1710     "    loadisFromInstruction(1, t1)",
1711     "    loadi (PayloadOffset + ArgumentCount)[cfr], t0",
1712     "    subi 1, t0",
1713     "    orq TagTypeNumber, t0",
1714     "    storeq t0, 0[cfr, t1, 8]",
1715     "    dispatch(constexpr (op_argument_count_length))",
1716     "_llint_op_get_scope:",
1717     "    traceExecution()",
1718     "    loadp Callee[cfr], t0",
1719     "    loadp JSCallee::m_scope[t0], t0",
1720     "    loadisFromInstruction(1, t1)",
1721     "    storeq t0, 0[cfr, t1, 8]",
1722     "    dispatch(constexpr (op_get_scope_length))",
1723     "_llint_op_to_this:",
1724     "    traceExecution()",
1725     "    loadisFromInstruction(1, t0)",
1726     "    loadq 0[cfr, t0, 8], t0",
1727     "    btqnz t0, tagMask, .opToThisSlow",
1728     "    bbneq JSCell::m_type[t0], FinalObjectType, .opToThisSlow",
1729     "    loadStructureWithScratch(t0, t1, t2)",
1730     "    loadpFromInstruction(2, t2)",
1731     "    bpneq t1, t2, .opToThisSlow",
1732     "    dispatch(constexpr (op_to_this_length))",
1733     ".opToThisSlow:",
1734     "    callOpcodeSlowPath(_slow_path_to_this)",
1735     "    dispatch(constexpr (op_to_this_length))",
1736     "_llint_op_check_tdz:",
1737     "    traceExecution()",
1738     "    loadisFromInstruction(1, t0)",
1739     "    loadConstantOrVariable(t0, t1)",
1740     "    bqneq t1, ValueEmpty, .opNotTDZ",
1741     "    callOpcodeSlowPath(_slow_path_throw_tdz_error)",
1742     ".opNotTDZ:",
1743     "    dispatch(constexpr (op_check_tdz_length))",
1744     "_llint_op_mov:",
1745     "    traceExecution()",
1746     "    loadisFromInstruction(2, t1)",
1747     "    loadisFromInstruction(1, t0)",
1748     "    loadConstantOrVariable(t1, t2)",
1749     "    storeq t2, 0[cfr, t0, 8]",
1750     "    dispatch(constexpr (op_mov_length))",
1751     "_llint_op_not:",
1752     "    traceExecution()",
1753     "    loadisFromInstruction(2, t0)",
1754     "    loadisFromInstruction(1, t1)",
1755     "    loadConstantOrVariable(t0, t2)",
1756     "    xorq ValueFalse, t2",
1757     "    btqnz t2, (~1), .opNotSlow",
1758     "    xorq ValueTrue, t2",
1759     "    storeq t2, 0[cfr, t1, 8]",
1760     "    dispatch(constexpr (op_not_length))",
1761     ".opNotSlow:",
1762     "    callOpcodeSlowPath(_slow_path_not)",
1763     "    dispatch(constexpr (op_not_length))",
1764     "macro equalityComparison(integerComparison, slowPath)",
1765     "    traceExecution()",
1766     "    loadisFromInstruction(3, t0)",
1767     "    loadisFromInstruction(2, t2)",
1768     "    loadisFromInstruction(1, t3)",
1769     "    loadConstantOrVariableInt32(t0, t1, .slow)",
1770     "    loadConstantOrVariableInt32(t2, t0, .slow)",
1771     "    integerComparison(t0, t1, t0)",
1772     "    orq ValueFalse, t0",
1773     "    storeq t0, 0[cfr, t3, 8]",
1774     "    dispatch(4)",
1775     ".slow:",
1776     "    callOpcodeSlowPath(slowPath)",
1777     "    dispatch(4)",
1778     "end",
1779     "_llint_op_eq:",
1780     "    equalityComparison(macro (left, right, result)",
1781     "    cieq left, right, result",
1782     "end, _slow_path_eq)",
1783     "_llint_op_neq:",
1784     "    equalityComparison(macro (left, right, result)",
1785     "    cineq left, right, result",
1786     "end, _slow_path_neq)",
1787     "macro equalNullComparison()",
1788     "    loadisFromInstruction(2, t0)",
1789     "    loadq 0[cfr, t0, 8], t0",
1790     "    btqnz t0, tagMask, .immediate",
1791     "    btbnz JSCell::m_flags[t0], MasqueradesAsUndefined, .masqueradesAsUndefined",
1792     "    move 0, t0",
1793     "    jmp .done",
1794     ".masqueradesAsUndefined:",
1795     "    loadStructureWithScratch(t0, t2, t1)",
1796     "    loadp CodeBlock[cfr], t0",
1797     "    loadp CodeBlock::m_globalObject[t0], t0",
1798     "    cpeq Structure::m_globalObject[t2], t0, t0",
1799     "    jmp .done",
1800     ".immediate:",
1801     "    andq (~TagBitUndefined), t0",
1802     "    cqeq t0, ValueNull, t0",
1803     ".done:",
1804     "end",
1805     "_llint_op_eq_null:",
1806     "    traceExecution()",
1807     "    equalNullComparison()",
1808     "    loadisFromInstruction(1, t1)",
1809     "    orq ValueFalse, t0",
1810     "    storeq t0, 0[cfr, t1, 8]",
1811     "    dispatch(constexpr (op_eq_null_length))",
1812     "_llint_op_neq_null:",
1813     "    traceExecution()",
1814     "    equalNullComparison()",
1815     "    loadisFromInstruction(1, t1)",
1816     "    xorq ValueTrue, t0",
1817     "    storeq t0, 0[cfr, t1, 8]",
1818     "    dispatch(constexpr (op_neq_null_length))",
1819     "macro strictEq(equalityOperation, slowPath)",
1820     "    traceExecution()",
1821     "    loadisFromInstruction(3, t0)",
1822     "    loadisFromInstruction(2, t2)",
1823     "    loadConstantOrVariable(t0, t1)",
1824     "    loadConstantOrVariable(t2, t0)",
1825     "    move t0, t2",
1826     "    orq t1, t2",
1827     "    btqz t2, tagMask, .slow",
1828     "    bqaeq t0, tagTypeNumber, .leftOK",
1829     "    btqnz t0, tagTypeNumber, .slow",
1830     ".leftOK:",
1831     "    bqaeq t1, tagTypeNumber, .rightOK",
1832     "    btqnz t1, tagTypeNumber, .slow",
1833     ".rightOK:",
1834     "    equalityOperation(t0, t1, t0)",
1835     "    loadisFromInstruction(1, t1)",
1836     "    orq ValueFalse, t0",
1837     "    storeq t0, 0[cfr, t1, 8]",
1838     "    dispatch(4)",
1839     ".slow:",
1840     "    callOpcodeSlowPath(slowPath)",
1841     "    dispatch(4)",
1842     "end",
1843     "_llint_op_stricteq:",
1844     "    strictEq(macro (left, right, result)",
1845     "    cqeq left, right, result",
1846     "end, _slow_path_stricteq)",
1847     "_llint_op_nstricteq:",
1848     "    strictEq(macro (left, right, result)",
1849     "    cqneq left, right, result",
1850     "end, _slow_path_nstricteq)",
1851     "macro preOp(arithmeticOperation, slowPath)",
1852     "    traceExecution()",
1853     "    loadisFromInstruction(1, t0)",
1854     "    loadq 0[cfr, t0, 8], t1",
1855     "    bqb t1, tagTypeNumber, .slow",
1856     "    arithmeticOperation(t1, .slow)",
1857     "    orq tagTypeNumber, t1",
1858     "    storeq t1, 0[cfr, t0, 8]",
1859     "    dispatch(2)",
1860     ".slow:",
1861     "    callOpcodeSlowPath(slowPath)",
1862     "    dispatch(2)",
1863     "end",
1864     "_llint_op_inc:",
1865     "    preOp(macro (value, slow)",
1866     "    baddio 1, value, slow",
1867     "end, _slow_path_inc)",
1868     "_llint_op_dec:",
1869     "    preOp(macro (value, slow)",
1870     "    bsubio 1, value, slow",
1871     "end, _slow_path_dec)",
1872     "_llint_op_to_number:",
1873     "    traceExecution()",
1874     "    loadisFromInstruction(2, t0)",
1875     "    loadisFromInstruction(1, t1)",
1876     "    loadConstantOrVariable(t0, t2)",
1877     "    bqaeq t2, tagTypeNumber, .opToNumberIsImmediate",
1878     "    btqz t2, tagTypeNumber, .opToNumberSlow",
1879     ".opToNumberIsImmediate:",
1880     "    storeq t2, 0[cfr, t1, 8]",
1881     "    valueProfile(t2, 3, t0)",
1882     "    dispatch(constexpr (op_to_number_length))",
1883     ".opToNumberSlow:",
1884     "    callOpcodeSlowPath(_slow_path_to_number)",
1885     "    dispatch(constexpr (op_to_number_length))",
1886     "_llint_op_to_string:",
1887     "    traceExecution()",
1888     "    loadisFromInstruction(2, t1)",
1889     "    loadisFromInstruction(1, t2)",
1890     "    loadConstantOrVariable(t1, t0)",
1891     "    btqnz t0, tagMask, .opToStringSlow",
1892     "    bbneq JSCell::m_type[t0], StringType, .opToStringSlow",
1893     ".opToStringIsString:",
1894     "    storeq t0, 0[cfr, t2, 8]",
1895     "    dispatch(constexpr (op_to_string_length))",
1896     ".opToStringSlow:",
1897     "    callOpcodeSlowPath(_slow_path_to_string)",
1898     "    dispatch(constexpr (op_to_string_length))",
1899     "_llint_op_negate:",
1900     "    traceExecution()",
1901     "    loadisFromInstruction(2, t0)",
1902     "    loadisFromInstruction(1, t1)",
1903     "    loadConstantOrVariable(t0, t3)",
1904     "    loadisFromInstruction(3, t2)",
1905     "    bqb t3, tagTypeNumber, .opNegateNotInt",
1906     "    btiz t3, 2147483647, .opNegateSlow",
1907     "    negi t3",
1908     "    ori ArithProfileInt, t2",
1909     "    orq tagTypeNumber, t3",
1910     "    storeisToInstruction(t2, 3)",
1911     "    storeq t3, 0[cfr, t1, 8]",
1912     "    dispatch(constexpr (op_negate_length))",
1913     ".opNegateNotInt:",
1914     "    btqz t3, tagTypeNumber, .opNegateSlow",
1915     "    xorq 9223372036854776000, t3",
1916     "    ori ArithProfileNumber, t2",
1917     "    storeq t3, 0[cfr, t1, 8]",
1918     "    storeisToInstruction(t2, 3)",
1919     "    dispatch(constexpr (op_negate_length))",
1920     ".opNegateSlow:",
1921     "    callOpcodeSlowPath(_slow_path_negate)",
1922     "    dispatch(constexpr (op_negate_length))",
1923     "macro binaryOpCustomStore(integerOperationAndStore, doubleOperation, slowPath)",
1924     "    loadisFromInstruction(3, t0)",
1925     "    loadisFromInstruction(2, t2)",
1926     "    loadConstantOrVariable(t0, t1)",
1927     "    loadConstantOrVariable(t2, t0)",
1928     "    bqb t0, tagTypeNumber, .op1NotInt",
1929     "    bqb t1, tagTypeNumber, .op2NotInt",
1930     "    loadisFromInstruction(1, t2)",
1931     "    integerOperationAndStore(t1, t0, .slow, t2)",
1932     "    loadisFromInstruction(4, t1)",
1933     "    ori ArithProfileIntInt, t1",
1934     "    storeisToInstruction(t1, 4)",
1935     "    dispatch(5)",
1936     ".op1NotInt:",
1937     "    btqz t0, tagTypeNumber, .slow",
1938     "    bqaeq t1, tagTypeNumber, .op1NotIntOp2Int",
1939     "    btqz t1, tagTypeNumber, .slow",
1940     "    addq tagTypeNumber, t1",
1941     "    fq2d t1, ft1",
1942     "    loadisFromInstruction(4, t2)",
1943     "    ori ArithProfileNumberNumber, t2",
1944     "    storeisToInstruction(t2, 4)",
1945     "    jmp .op1NotIntReady",
1946     ".op1NotIntOp2Int:",
1947     "    loadisFromInstruction(4, t2)",
1948     "    ori ArithProfileNumberInt, t2",
1949     "    storeisToInstruction(t2, 4)",
1950     "    ci2d t1, ft1",
1951     ".op1NotIntReady:",
1952     "    loadisFromInstruction(1, t2)",
1953     "    addq tagTypeNumber, t0",
1954     "    fq2d t0, ft0",
1955     "    doubleOperation(ft1, ft0)",
1956     "    fd2q ft0, t0",
1957     "    subq tagTypeNumber, t0",
1958     "    storeq t0, 0[cfr, t2, 8]",
1959     "    dispatch(5)",
1960     ".op2NotInt:",
1961     "    loadisFromInstruction(1, t2)",
1962     "    btqz t1, tagTypeNumber, .slow",
1963     "    loadisFromInstruction(4, t3)",
1964     "    ori ArithProfileIntNumber, t3",
1965     "    storeisToInstruction(t3, 4)",
1966     "    ci2d t0, ft0",
1967     "    addq tagTypeNumber, t1",
1968     "    fq2d t1, ft1",
1969     "    doubleOperation(ft1, ft0)",
1970     "    fd2q ft0, t0",
1971     "    subq tagTypeNumber, t0",
1972     "    storeq t0, 0[cfr, t2, 8]",
1973     "    dispatch(5)",
1974     ".slow:",
1975     "    callOpcodeSlowPath(slowPath)",
1976     "    dispatch(5)",
1977     "end",
1978     "macro binaryOp(integerOperation, doubleOperation, slowPath)",
1979     "    binaryOpCustomStore(macro (left, right, slow, index)",
1980     "    integerOperation(left, right, slow)",
1981     "    orq tagTypeNumber, right",
1982     "    storeq right, 0[cfr, index, 8]",
1983     "end, doubleOperation, slowPath)",
1984     "end",
1985     "_llint_op_add:",
1986     "    traceExecution()",
1987     "    binaryOp(macro (left, right, slow)",
1988     "    baddio left, right, slow",
1989     "end, macro (left, right)",
1990     "    addd left, right",
1991     "end, _slow_path_add)",
1992     "_llint_op_mul:",
1993     "    traceExecution()",
1994     "    binaryOpCustomStore(macro (left, right, slow, index)",
1995     "    move right, t3",
1996     "    bmulio left, t3, slow",
1997     "    btinz t3, .done",
1998     "    bilt left, 0, slow",
1999     "    bilt right, 0, slow",
2000     ".done:",
2001     "    orq tagTypeNumber, t3",
2002     "    storeq t3, 0[cfr, index, 8]",
2003     "end, macro (left, right)",
2004     "    muld left, right",
2005     "end, _slow_path_mul)",
2006     "_llint_op_sub:",
2007     "    traceExecution()",
2008     "    binaryOp(macro (left, right, slow)",
2009     "    bsubio left, right, slow",
2010     "end, macro (left, right)",
2011     "    subd left, right",
2012     "end, _slow_path_sub)",
2013     "_llint_op_div:",
2014     "    traceExecution()",
2015     "if (X86_64 or X86_64_WIN)",
2016     "    binaryOpCustomStore(macro (left, right, slow, index)",
2017     "    btiz left, slow",
2018     "    bineq left, (-1), .notNeg2TwoThe31DivByNeg1",
2019     "    bieq right, (-2147483648), .slow",
2020     ".notNeg2TwoThe31DivByNeg1:",
2021     "    btinz right, .intOK",
2022     "    bilt left, 0, slow",
2023     ".intOK:",
2024     "    move left, t3",
2025     "    move right, t0",
2026     "    cdqi ",
2027     "    idivi t3",
2028     "    btinz t1, slow",
2029     "    orq tagTypeNumber, t0",
2030     "    storeq t0, 0[cfr, index, 8]",
2031     "end, macro (left, right)",
2032     "    divd left, right",
2033     "end, _slow_path_div)",
2034     "else",
2035     "    callOpcodeSlowPath(_slow_path_div)",
2036     "    dispatch(constexpr (op_div_length))",
2037     "end",
2038     "macro bitOp(operation, slowPath, advance)",
2039     "    loadisFromInstruction(3, t0)",
2040     "    loadisFromInstruction(2, t2)",
2041     "    loadisFromInstruction(1, t3)",
2042     "    loadConstantOrVariable(t0, t1)",
2043     "    loadConstantOrVariable(t2, t0)",
2044     "    bqb t0, tagTypeNumber, .slow",
2045     "    bqb t1, tagTypeNumber, .slow",
2046     "    operation(t1, t0)",
2047     "    orq tagTypeNumber, t0",
2048     "    storeq t0, 0[cfr, t3, 8]",
2049     "    dispatch(advance)",
2050     ".slow:",
2051     "    callOpcodeSlowPath(slowPath)",
2052     "    dispatch(advance)",
2053     "end",
2054     "_llint_op_lshift:",
2055     "    traceExecution()",
2056     "    bitOp(macro (left, right)",
2057     "    lshifti left, right",
2058     "end, _slow_path_lshift, constexpr (op_lshift_length))",
2059     "_llint_op_rshift:",
2060     "    traceExecution()",
2061     "    bitOp(macro (left, right)",
2062     "    rshifti left, right",
2063     "end, _slow_path_rshift, constexpr (op_rshift_length))",
2064     "_llint_op_urshift:",
2065     "    traceExecution()",
2066     "    bitOp(macro (left, right)",
2067     "    urshifti left, right",
2068     "end, _slow_path_urshift, constexpr (op_urshift_length))",
2069     "_llint_op_unsigned:",
2070     "    traceExecution()",
2071     "    loadisFromInstruction(1, t0)",
2072     "    loadisFromInstruction(2, t1)",
2073     "    loadConstantOrVariable(t1, t2)",
2074     "    bilt t2, 0, .opUnsignedSlow",
2075     "    storeq t2, 0[cfr, t0, 8]",
2076     "    dispatch(constexpr (op_unsigned_length))",
2077     ".opUnsignedSlow:",
2078     "    callOpcodeSlowPath(_slow_path_unsigned)",
2079     "    dispatch(constexpr (op_unsigned_length))",
2080     "_llint_op_bitand:",
2081     "    traceExecution()",
2082     "    bitOp(macro (left, right)",
2083     "    andi left, right",
2084     "end, _slow_path_bitand, constexpr (op_bitand_length))",
2085     "_llint_op_bitxor:",
2086     "    traceExecution()",
2087     "    bitOp(macro (left, right)",
2088     "    xori left, right",
2089     "end, _slow_path_bitxor, constexpr (op_bitxor_length))",
2090     "_llint_op_bitor:",
2091     "    traceExecution()",
2092     "    bitOp(macro (left, right)",
2093     "    ori left, right",
2094     "end, _slow_path_bitor, constexpr (op_bitor_length))",
2095     "_llint_op_overrides_has_instance:",
2096     "    traceExecution()",
2097     "    loadisFromInstruction(1, t3)",
2098     "    loadisFromInstruction(3, t1)",
2099     "    loadConstantOrVariable(t1, t0)",
2100     "    loadp CodeBlock[cfr], t2",
2101     "    loadp CodeBlock::m_globalObject[t2], t2",
2102     "    loadp JSGlobalObject::m_functionProtoHasInstanceSymbolFunction[t2], t2",
2103     "    bqneq t0, t2, .opOverridesHasInstanceNotDefaultSymbol",
2104     "    loadisFromInstruction(2, t1)",
2105     "    loadConstantOrVariable(t1, t0)",
2106     "    tbz JSCell::m_flags[t0], ImplementsDefaultHasInstance, t1",
2107     "    orq ValueFalse, t1",
2108     "    storeq t1, 0[cfr, t3, 8]",
2109     "    dispatch(constexpr (op_overrides_has_instance_length))",
2110     ".opOverridesHasInstanceNotDefaultSymbol:",
2111     "    storeq ValueTrue, 0[cfr, t3, 8]",
2112     "    dispatch(constexpr (op_overrides_has_instance_length))",
2113     "_llint_op_instanceof_custom:",
2114     "    traceExecution()",
2115     "    callOpcodeSlowPath(_llint_slow_path_instanceof_custom)",
2116     "    dispatch(constexpr (op_instanceof_custom_length))",
2117     "_llint_op_is_empty:",
2118     "    traceExecution()",
2119     "    loadisFromInstruction(2, t1)",
2120     "    loadisFromInstruction(1, t2)",
2121     "    loadConstantOrVariable(t1, t0)",
2122     "    cqeq t0, ValueEmpty, t3",
2123     "    orq ValueFalse, t3",
2124     "    storeq t3, 0[cfr, t2, 8]",
2125     "    dispatch(constexpr (op_is_empty_length))",
2126     "_llint_op_is_undefined:",
2127     "    traceExecution()",
2128     "    loadisFromInstruction(2, t1)",
2129     "    loadisFromInstruction(1, t2)",
2130     "    loadConstantOrVariable(t1, t0)",
2131     "    btqz t0, tagMask, .opIsUndefinedCell",
2132     "    cqeq t0, ValueUndefined, t3",
2133     "    orq ValueFalse, t3",
2134     "    storeq t3, 0[cfr, t2, 8]",
2135     "    dispatch(constexpr (op_is_undefined_length))",
2136     ".opIsUndefinedCell:",
2137     "    btbnz JSCell::m_flags[t0], MasqueradesAsUndefined, .masqueradesAsUndefined",
2138     "    move ValueFalse, t1",
2139     "    storeq t1, 0[cfr, t2, 8]",
2140     "    dispatch(constexpr (op_is_undefined_length))",
2141     ".masqueradesAsUndefined:",
2142     "    loadStructureWithScratch(t0, t3, t1)",
2143     "    loadp CodeBlock[cfr], t1",
2144     "    loadp CodeBlock::m_globalObject[t1], t1",
2145     "    cpeq Structure::m_globalObject[t3], t1, t0",
2146     "    orq ValueFalse, t0",
2147     "    storeq t0, 0[cfr, t2, 8]",
2148     "    dispatch(constexpr (op_is_undefined_length))",
2149     "_llint_op_is_boolean:",
2150     "    traceExecution()",
2151     "    loadisFromInstruction(2, t1)",
2152     "    loadisFromInstruction(1, t2)",
2153     "    loadConstantOrVariable(t1, t0)",
2154     "    xorq ValueFalse, t0",
2155     "    tqz t0, (~1), t0",
2156     "    orq ValueFalse, t0",
2157     "    storeq t0, 0[cfr, t2, 8]",
2158     "    dispatch(constexpr (op_is_boolean_length))",
2159     "_llint_op_is_number:",
2160     "    traceExecution()",
2161     "    loadisFromInstruction(2, t1)",
2162     "    loadisFromInstruction(1, t2)",
2163     "    loadConstantOrVariable(t1, t0)",
2164     "    tqnz t0, tagTypeNumber, t1",
2165     "    orq ValueFalse, t1",
2166     "    storeq t1, 0[cfr, t2, 8]",
2167     "    dispatch(constexpr (op_is_number_length))",
2168     "_llint_op_is_cell_with_type:",
2169     "    traceExecution()",
2170     "    loadisFromInstruction(3, t0)",
2171     "    loadisFromInstruction(2, t1)",
2172     "    loadisFromInstruction(1, t2)",
2173     "    loadConstantOrVariable(t1, t3)",
2174     "    btqnz t3, tagMask, .notCellCase",
2175     "    cbeq JSCell::m_type[t3], t0, t1",
2176     "    orq ValueFalse, t1",
2177     "    storeq t1, 0[cfr, t2, 8]",
2178     "    dispatch(constexpr (op_is_cell_with_type_length))",
2179     ".notCellCase:",
2180     "    storeq ValueFalse, 0[cfr, t2, 8]",
2181     "    dispatch(constexpr (op_is_cell_with_type_length))",
2182     "_llint_op_is_object:",
2183     "    traceExecution()",
2184     "    loadisFromInstruction(2, t1)",
2185     "    loadisFromInstruction(1, t2)",
2186     "    loadConstantOrVariable(t1, t0)",
2187     "    btqnz t0, tagMask, .opIsObjectNotCell",
2188     "    cbaeq JSCell::m_type[t0], ObjectType, t1",
2189     "    orq ValueFalse, t1",
2190     "    storeq t1, 0[cfr, t2, 8]",
2191     "    dispatch(constexpr (op_is_object_length))",
2192     ".opIsObjectNotCell:",
2193     "    storeq ValueFalse, 0[cfr, t2, 8]",
2194     "    dispatch(constexpr (op_is_object_length))",
2195     "macro loadPropertyAtVariableOffset(propertyOffsetAsInt, objectAndStorage, value)",
2196     "    bilt propertyOffsetAsInt, firstOutOfLineOffset, .isInline",
2197     "    loadCaged(_g_jsValueGigacageBasePtr, JSObject::m_butterfly[objectAndStorage], objectAndStorage, value)",
2198     "    negi propertyOffsetAsInt",
2199     "    sxi2q propertyOffsetAsInt, propertyOffsetAsInt",
2200     "    jmp .ready",
2201     ".isInline:",
2202     "    addp (sizeof JSObject - ((firstOutOfLineOffset - 2) * 8)), objectAndStorage",
2203     ".ready:",
2204     "    loadq ((firstOutOfLineOffset - 2) * 8)[objectAndStorage, propertyOffsetAsInt, 8], value",
2205     "end",
2206     "macro storePropertyAtVariableOffset(propertyOffsetAsInt, objectAndStorage, value, scratch)",
2207     "    bilt propertyOffsetAsInt, firstOutOfLineOffset, .isInline",
2208     "    loadCaged(_g_jsValueGigacageBasePtr, JSObject::m_butterfly[objectAndStorage], objectAndStorage, scratch)",
2209     "    negi propertyOffsetAsInt",
2210     "    sxi2q propertyOffsetAsInt, propertyOffsetAsInt",
2211     "    jmp .ready",
2212     ".isInline:",
2213     "    addp (sizeof JSObject - ((firstOutOfLineOffset - 2) * 8)), objectAndStorage",
2214     ".ready:",
2215     "    storeq value, ((firstOutOfLineOffset - 2) * 8)[objectAndStorage, propertyOffsetAsInt, 8]",
2216     "end",
2217     "_llint_op_get_by_id:",
2218     "    traceExecution()",
2219     "    loadisFromInstruction(2, t0)",
2220     "    loadConstantOrVariableCell(t0, t3, .opGetByIdSlow)",
2221     "    loadi JSCell::m_structureID[t3], t1",
2222     "    loadisFromInstruction(4, t2)",
2223     "    bineq t2, t1, .opGetByIdSlow",
2224     "    loadisFromInstruction(5, t1)",
2225     "    loadisFromInstruction(1, t2)",
2226     "    loadPropertyAtVariableOffset(t1, t3, t0)",
2227     "    storeq t0, 0[cfr, t2, 8]",
2228     "    valueProfile(t0, 8, t1)",
2229     "    dispatch(constexpr (op_get_by_id_length))",
2230     ".opGetByIdSlow:",
2231     "    callOpcodeSlowPath(_llint_slow_path_get_by_id)",
2232     "    dispatch(constexpr (op_get_by_id_length))",
2233     "_llint_op_get_by_id_proto_load:",
2234     "    traceExecution()",
2235     "    loadisFromInstruction(2, t0)",
2236     "    loadConstantOrVariableCell(t0, t3, .opGetByIdProtoSlow)",
2237     "    loadi JSCell::m_structureID[t3], t1",
2238     "    loadisFromInstruction(4, t2)",
2239     "    bineq t2, t1, .opGetByIdProtoSlow",
2240     "    loadisFromInstruction(5, t1)",
2241     "    loadpFromInstruction(6, t3)",
2242     "    loadisFromInstruction(1, t2)",
2243     "    loadPropertyAtVariableOffset(t1, t3, t0)",
2244     "    storeq t0, 0[cfr, t2, 8]",
2245     "    valueProfile(t0, 8, t1)",
2246     "    dispatch(constexpr (op_get_by_id_proto_load_length))",
2247     ".opGetByIdProtoSlow:",
2248     "    callOpcodeSlowPath(_llint_slow_path_get_by_id)",
2249     "    dispatch(constexpr (op_get_by_id_proto_load_length))",
2250     "_llint_op_get_by_id_unset:",
2251     "    traceExecution()",
2252     "    loadisFromInstruction(2, t0)",
2253     "    loadConstantOrVariableCell(t0, t3, .opGetByIdUnsetSlow)",
2254     "    loadi JSCell::m_structureID[t3], t1",
2255     "    loadisFromInstruction(4, t2)",
2256     "    bineq t2, t1, .opGetByIdUnsetSlow",
2257     "    loadisFromInstruction(1, t2)",
2258     "    storeq ValueUndefined, 0[cfr, t2, 8]",
2259     "    valueProfile(ValueUndefined, 8, t1)",
2260     "    dispatch(constexpr (op_get_by_id_unset_length))",
2261     ".opGetByIdUnsetSlow:",
2262     "    callOpcodeSlowPath(_llint_slow_path_get_by_id)",
2263     "    dispatch(constexpr (op_get_by_id_unset_length))",
2264     "_llint_op_get_array_length:",
2265     "    traceExecution()",
2266     "    loadisFromInstruction(2, t0)",
2267     "    loadpFromInstruction(4, t1)",
2268     "    loadConstantOrVariableCell(t0, t3, .opGetArrayLengthSlow)",
2269     "    move t3, t2",
2270     "    arrayProfile(t2, t1, t0)",
2271     "    btiz t2, IsArray, .opGetArrayLengthSlow",
2272     "    btiz t2, IndexingShapeMask, .opGetArrayLengthSlow",
2273     "    loadisFromInstruction(1, t1)",
2274     "    loadCaged(_g_jsValueGigacageBasePtr, JSObject::m_butterfly[t3], t0, t2)",
2275     "    loadi ((-sizeof IndexingHeader) + IndexingHeader::u.lengths.publicLength)[t0], t0",
2276     "    bilt t0, 0, .opGetArrayLengthSlow",
2277     "    orq tagTypeNumber, t0",
2278     "    valueProfile(t0, 8, t2)",
2279     "    storeq t0, 0[cfr, t1, 8]",
2280     "    dispatch(constexpr (op_get_array_length_length))",
2281     ".opGetArrayLengthSlow:",
2282     "    callOpcodeSlowPath(_llint_slow_path_get_by_id)",
2283     "    dispatch(constexpr (op_get_array_length_length))",
2284     "_llint_op_put_by_id:",
2285     "    traceExecution()",
2286     "    loadisFromInstruction(1, t3)",
2287     "    loadConstantOrVariableCell(t3, t0, .opPutByIdSlow)",
2288     "    loadisFromInstruction(4, t2)",
2289     "    bineq t2, JSCell::m_structureID[t0], .opPutByIdSlow",
2290     "    loadisFromInstruction(3, t1)",
2291     "    loadConstantOrVariable(t1, t3)",
2292     "    loadpFromInstruction(8, t1)",
2293     "    btpnz t1, PutByIdPrimaryTypeMask, .opPutByIdTypeCheckObjectWithStructureOrOther",
2294     "    andp PutByIdSecondaryTypeMask, t1",
2295     "    bplt t1, PutByIdSecondaryTypeString, .opPutByIdTypeCheckLessThanString",
2296     "    bplt t1, PutByIdSecondaryTypeObjectOrOther, .opPutByIdTypeCheckLessThanObjectOrOther",
2297     "    bpeq t1, PutByIdSecondaryTypeTop, .opPutByIdDoneCheckingTypes",
2298     "    btqz t3, tagMask, .opPutByIdTypeCheckObject",
2299     ".opPutByIdTypeCheckOther:",
2300     "    andq (~TagBitUndefined), t3",
2301     "    bqeq t3, ValueNull, .opPutByIdDoneCheckingTypes",
2302     "    jmp .opPutByIdSlow",
2303     ".opPutByIdTypeCheckLessThanObjectOrOther:",
2304     "    btqnz t3, tagMask, .opPutByIdSlow",
2305     "    bpeq t1, PutByIdSecondaryTypeObject, .opPutByIdTypeCheckObject",
2306     "    bpeq t1, PutByIdSecondaryTypeSymbol, .opPutByIdTypeCheckSymbol",
2307     "    bbeq JSCell::m_type[t3], StringType, .opPutByIdDoneCheckingTypes",
2308     "    jmp .opPutByIdSlow",
2309     ".opPutByIdTypeCheckObject:",
2310     "    bbaeq JSCell::m_type[t3], ObjectType, .opPutByIdDoneCheckingTypes",
2311     "    jmp .opPutByIdSlow",
2312     ".opPutByIdTypeCheckSymbol:",
2313     "    bbeq JSCell::m_type[t3], SymbolType, .opPutByIdDoneCheckingTypes",
2314     "    jmp .opPutByIdSlow",
2315     ".opPutByIdTypeCheckLessThanString:",
2316     "    bplt t1, PutByIdSecondaryTypeInt32, .opPutByIdTypeCheckLessThanInt32",
2317     "    bpeq t1, PutByIdSecondaryTypeNumber, .opPutByIdTypeCheckNumber",
2318     "    bqaeq t3, tagTypeNumber, .opPutByIdDoneCheckingTypes",
2319     "    jmp .opPutByIdSlow",
2320     ".opPutByIdTypeCheckNumber:",
2321     "    btqnz t3, tagTypeNumber, .opPutByIdDoneCheckingTypes",
2322     "    jmp .opPutByIdSlow",
2323     ".opPutByIdTypeCheckLessThanInt32:",
2324     "    bpneq t1, PutByIdSecondaryTypeBoolean, .opPutByIdTypeCheckBottomOrOther",
2325     "    xorq ValueFalse, t3",
2326     "    btqz t3, (~1), .opPutByIdDoneCheckingTypes",
2327     "    jmp .opPutByIdSlow",
2328     ".opPutByIdTypeCheckBottomOrOther:",
2329     "    bpeq t1, PutByIdSecondaryTypeOther, .opPutByIdTypeCheckOther",
2330     "    jmp .opPutByIdSlow",
2331     ".opPutByIdTypeCheckObjectWithStructureOrOther:",
2332     "    btqz t3, tagMask, .opPutByIdTypeCheckObjectWithStructure",
2333     "    btpnz t1, PutByIdPrimaryTypeObjectWithStructureOrOther, .opPutByIdTypeCheckOther",
2334     "    jmp .opPutByIdSlow",
2335     ".opPutByIdTypeCheckObjectWithStructure:",
2336     "    urshiftp 3, t1",
2337     "    bineq t1, JSCell::m_structureID[t3], .opPutByIdSlow",
2338     ".opPutByIdDoneCheckingTypes:",
2339     "    loadisFromInstruction(6, t1)",
2340     "    btiz t1, .opPutByIdNotTransition",
2341     "    loadpFromInstruction(7, t3)",
2342     "    btpz t3, .opPutByIdTransitionDirect",
2343     "    loadp StructureChain::m_vector[t3], t3",
2344     "    assert(macro (ok)",
2345     "    btpnz t3, ok",
2346     "end)",
2347     "    structureIDToStructureWithScratch(t2, t1)",
2348     "    loadq Structure::m_prototype[t2], t2",
2349     "    bqeq t2, ValueNull, .opPutByIdTransitionChainDone",
2350     ".opPutByIdTransitionChainLoop:",
2351     "    loadp 0[t3], t1",
2352     "    loadi JSCell::m_structureID[t2], t2",
2353     "    bineq t2, (Structure::m_blob + StructureIDBlob::u.fields.structureID)[t1], .opPutByIdSlow",
2354     "    addp 8, t3",
2355     "    loadq Structure::m_prototype[t1], t2",
2356     "    bqneq t2, ValueNull, .opPutByIdTransitionChainLoop",
2357     ".opPutByIdTransitionChainDone:",
2358     "    loadisFromInstruction(6, t1)",
2359     ".opPutByIdTransitionDirect:",
2360     "    storei t1, JSCell::m_structureID[t0]",
2361     "    writeBarrierOnOperand(1)",
2362     "    loadisFromInstruction(1, t1)",
2363     "    loadConstantOrVariable(t1, t0)",
2364     ".opPutByIdNotTransition:",
2365     "    loadisFromInstruction(3, t1)",
2366     "    loadConstantOrVariable(t1, t2)",
2367     "    loadisFromInstruction(5, t1)",
2368     "    storePropertyAtVariableOffset(t1, t0, t2, t3)",
2369     "    writeBarrierOnOperands(1, 3)",
2370     "    dispatch(constexpr (op_put_by_id_length))",
2371     ".opPutByIdSlow:",
2372     "    callOpcodeSlowPath(_llint_slow_path_put_by_id)",
2373     "    dispatch(constexpr (op_put_by_id_length))",
2374     "macro finishGetByVal(result, scratch)",
2375     "    loadisFromInstruction(1, scratch)",
2376     "    storeq result, 0[cfr, scratch, 8]",
2377     "    valueProfile(result, 5, scratch)",
2378     "    dispatch(6)",
2379     "end",
2380     "macro finishIntGetByVal(result, scratch)",
2381     "    orq tagTypeNumber, result",
2382     "    finishGetByVal(result, scratch)",
2383     "end",
2384     "macro finishDoubleGetByVal(result, scratch1, scratch2)",
2385     "    fd2q result, scratch1",
2386     "    subq tagTypeNumber, scratch1",
2387     "    finishGetByVal(scratch1, scratch2)",
2388     "end",
2389     "_llint_op_get_by_val:",
2390     "    traceExecution()",
2391     "    loadisFromInstruction(2, t2)",
2392     "    loadConstantOrVariableCell(t2, t0, .opGetByValSlow)",
2393     "    loadpFromInstruction(4, t3)",
2394     "    move t0, t2",
2395     "    arrayProfile(t2, t3, t1)",
2396     "    loadisFromInstruction(3, t3)",
2397     "    loadConstantOrVariableInt32(t3, t1, .opGetByValSlow)",
2398     "    sxi2q t1, t1",
2399     "    loadCaged(_g_jsValueGigacageBasePtr, JSObject::m_butterfly[t0], t3, t5)",
2400     "    andi IndexingShapeMask, t2",
2401     "    bieq t2, Int32Shape, .opGetByValIsContiguous",
2402     "    bineq t2, ContiguousShape, .opGetByValNotContiguous",
2403     ".opGetByValIsContiguous:",
2404     "    biaeq t1, ((-sizeof IndexingHeader) + IndexingHeader::u.lengths.publicLength)[t3], .opGetByValOutOfBounds",
2405     "    loadisFromInstruction(1, t0)",
2406     "    loadq 0[t3, t1, 8], t2",
2407     "    btqz t2, .opGetByValOutOfBounds",
2408     "    jmp .opGetByValDone",
2409     ".opGetByValNotContiguous:",
2410     "    bineq t2, DoubleShape, .opGetByValNotDouble",
2411     "    biaeq t1, ((-sizeof IndexingHeader) + IndexingHeader::u.lengths.publicLength)[t3], .opGetByValOutOfBounds",
2412     "    loadis 8[PB, PC, 8], t0",
2413     "    loadd 0[t3, t1, 8], ft0",
2414     "    bdnequn ft0, ft0, .opGetByValOutOfBounds",
2415     "    fd2q ft0, t2",
2416     "    subq tagTypeNumber, t2",
2417     "    jmp .opGetByValDone",
2418     ".opGetByValNotDouble:",
2419     "    subi ArrayStorageShape, t2",
2420     "    bia t2, (SlowPutArrayStorageShape - ArrayStorageShape), .opGetByValNotIndexedStorage",
2421     "    biaeq t1, ((-sizeof IndexingHeader) + IndexingHeader::u.lengths.vectorLength)[t3], .opGetByValOutOfBounds",
2422     "    loadisFromInstruction(1, t0)",
2423     "    loadq ArrayStorage::m_vector[t3, t1, 8], t2",
2424     "    btqz t2, .opGetByValOutOfBounds",
2425     ".opGetByValDone:",
2426     "    storeq t2, 0[cfr, t0, 8]",
2427     "    valueProfile(t2, 5, t0)",
2428     "    dispatch(constexpr (op_get_by_val_length))",
2429     ".opGetByValOutOfBounds:",
2430     "    loadpFromInstruction(4, t0)",
2431     "    storeb 1, ArrayProfile::m_outOfBounds[t0]",
2432     "    jmp .opGetByValSlow",
2433     ".opGetByValNotIndexedStorage:",
2434     "    loadb JSCell::m_type[t0], t2",
2435     "    subi FirstArrayType, t2",
2436     "    bia t2, (LastArrayType - FirstArrayType), .opGetByValSlow",
2437     "    loadCaged(_g_primitiveGigacageBasePtr, JSArrayBufferView::m_vector[t0], t3, t5)",
2438     "    biaeq t1, JSArrayBufferView::m_length[t0], .opGetByValSlow",
2439     "    bia t2, (Uint8ClampedArrayType - FirstArrayType), .opGetByValAboveUint8ClampedArray",
2440     "    bia t2, (Int16ArrayType - FirstArrayType), .opGetByValInt32ArrayOrUint8Array",
2441     "    bineq t2, (Int8ArrayType - FirstArrayType), .opGetByValInt16Array",
2442     "    loadbs 0[t3, t1, 1], t0",
2443     "    finishIntGetByVal(t0, t1)",
2444     ".opGetByValInt16Array:",
2445     "    loadhs 0[t3, t1, 2], t0",
2446     "    finishIntGetByVal(t0, t1)",
2447     ".opGetByValInt32ArrayOrUint8Array:",
2448     "    bieq t2, (Int32ArrayType - FirstArrayType), .opGetByValInt32Array",
2449     "    loadb 0[t3, t1, 1], t0",
2450     "    finishIntGetByVal(t0, t1)",
2451     ".opGetByValInt32Array:",
2452     "    loadi 0[t3, t1, 4], t0",
2453     "    finishIntGetByVal(t0, t1)",
2454     ".opGetByValAboveUint8ClampedArray:",
2455     "    bia t2, (Uint32ArrayType - FirstArrayType), .opGetByValAboveUint32Array",
2456     "    bieq t2, (Uint32ArrayType - FirstArrayType), .opGetByValUint32Array",
2457     "    loadh 0[t3, t1, 2], t0",
2458     "    finishIntGetByVal(t0, t1)",
2459     ".opGetByValUint32Array:",
2460     "    loadi 0[t3, t1, 4], t0",
2461     "    bilt t0, 0, .opGetByValSlow",
2462     "    finishIntGetByVal(t0, t1)",
2463     ".opGetByValAboveUint32Array:",
2464     "    bieq t2, (Float32ArrayType - FirstArrayType), .opGetByValSlow",
2465     "    loadd 0[t3, t1, 8], ft0",
2466     "    bdnequn ft0, ft0, .opGetByValSlow",
2467     "    finishDoubleGetByVal(ft0, t0, t1)",
2468     ".opGetByValSlow:",
2469     "    callOpcodeSlowPath(_llint_slow_path_get_by_val)",
2470     "    dispatch(constexpr (op_get_by_val_length))",
2471     "macro contiguousPutByVal(storeCallback)",
2472     "    biaeq t3, ((-sizeof IndexingHeader) + IndexingHeader::u.lengths.publicLength)[t0], .outOfBounds",
2473     ".storeResult:",
2474     "    loadisFromInstruction(3, t2)",
2475     "    storeCallback(t2, t1, 0[t0, t3, 8])",
2476     "    dispatch(5)",
2477     ".outOfBounds:",
2478     "    biaeq t3, ((-sizeof IndexingHeader) + IndexingHeader::u.lengths.vectorLength)[t0], .opPutByValOutOfBounds",
2479     "    loadp 32[PB, PC, 8], t2",
2480     "    storeb 1, ArrayProfile::m_mayStoreToHole[t2]",
2481     "    addi 1, t3, t2",
2482     "    storei t2, ((-sizeof IndexingHeader) + IndexingHeader::u.lengths.publicLength)[t0]",
2483     "    jmp .storeResult",
2484     "end",
2485     "macro putByVal(slowPath)",
2486     "    traceExecution()",
2487     "    loadisFromInstruction(1, t0)",
2488     "    loadConstantOrVariableCell(t0, t1, .opPutByValSlow)",
2489     "    loadpFromInstruction(4, t3)",
2490     "    move t1, t2",
2491     "    arrayProfile(t2, t3, t0)",
2492     "    loadisFromInstruction(2, t0)",
2493     "    loadConstantOrVariableInt32(t0, t3, .opPutByValSlow)",
2494     "    sxi2q t3, t3",
2495     "    loadCaged(_g_jsValueGigacageBasePtr, JSObject::m_butterfly[t1], t0, t5)",
2496     "    andi IndexingShapeMask, t2",
2497     "    bineq t2, Int32Shape, .opPutByValNotInt32",
2498     "    contiguousPutByVal(macro (operand, scratch, address)",
2499     "    loadConstantOrVariable(operand, scratch)",
2500     "    bpb scratch, tagTypeNumber, .opPutByValSlow",
2501     "    storep scratch, address",
2502     "    writeBarrierOnOperands(1, 3)",
2503     "end)",
2504     ".opPutByValNotInt32:",
2505     "    bineq t2, DoubleShape, .opPutByValNotDouble",
2506     "    contiguousPutByVal(macro (operand, scratch, address)",
2507     "    loadConstantOrVariable(operand, scratch)",
2508     "    bqb scratch, tagTypeNumber, .notInt",
2509     "    ci2d scratch, ft0",
2510     "    jmp .ready",
2511     ".notInt:",
2512     "    addp tagTypeNumber, scratch",
2513     "    fq2d scratch, ft0",
2514     "    bdnequn ft0, ft0, .opPutByValSlow",
2515     ".ready:",
2516     "    stored ft0, address",
2517     "    writeBarrierOnOperands(1, 3)",
2518     "end)",
2519     ".opPutByValNotDouble:",
2520     "    bineq t2, ContiguousShape, .opPutByValNotContiguous",
2521     "    contiguousPutByVal(macro (operand, scratch, address)",
2522     "    loadConstantOrVariable(operand, scratch)",
2523     "    storep scratch, address",
2524     "    writeBarrierOnOperands(1, 3)",
2525     "end)",
2526     ".opPutByValNotContiguous:",
2527     "    bineq t2, ArrayStorageShape, .opPutByValSlow",
2528     "    biaeq t3, ((-sizeof IndexingHeader) + IndexingHeader::u.lengths.vectorLength)[t0], .opPutByValOutOfBounds",
2529     "    btqz ArrayStorage::m_vector[t0, t3, 8], .opPutByValArrayStorageEmpty",
2530     ".opPutByValArrayStorageStoreResult:",
2531     "    loadisFromInstruction(3, t2)",
2532     "    loadConstantOrVariable(t2, t1)",
2533     "    storeq t1, ArrayStorage::m_vector[t0, t3, 8]",
2534     "    writeBarrierOnOperands(1, 3)",
2535     "    dispatch(5)",
2536     ".opPutByValArrayStorageEmpty:",
2537     "    loadpFromInstruction(4, t1)",
2538     "    storeb 1, ArrayProfile::m_mayStoreToHole[t1]",
2539     "    addi 1, ArrayStorage::m_numValuesInVector[t0]",
2540     "    bib t3, ((-sizeof IndexingHeader) + IndexingHeader::u.lengths.publicLength)[t0], .opPutByValArrayStorageStoreResult",
2541     "    addi 1, t3, t1",
2542     "    storei t1, ((-sizeof IndexingHeader) + IndexingHeader::u.lengths.publicLength)[t0]",
2543     "    jmp .opPutByValArrayStorageStoreResult",
2544     ".opPutByValOutOfBounds:",
2545     "    loadpFromInstruction(4, t0)",
2546     "    storeb 1, ArrayProfile::m_outOfBounds[t0]",
2547     ".opPutByValSlow:",
2548     "    callOpcodeSlowPath(slowPath)",
2549     "    dispatch(5)",
2550     "end",
2551     "_llint_op_put_by_val:",
2552     "    putByVal(_llint_slow_path_put_by_val)",
2553     "_llint_op_put_by_val_direct:",
2554     "    putByVal(_llint_slow_path_put_by_val_direct)",
2555     "_llint_op_jmp:",
2556     "    traceExecution()",
2557     "    dispatchIntIndirect(1)",
2558     "macro jumpTrueOrFalse(conditionOp, slow)",
2559     "    loadisFromInstruction(1, t1)",
2560     "    loadConstantOrVariable(t1, t0)",
2561     "    xorq ValueFalse, t0",
2562     "    btqnz t0, (-1), .slow",
2563     "    conditionOp(t0, .target)",
2564     "    dispatch(3)",
2565     ".target:",
2566     "    dispatchIntIndirect(2)",
2567     ".slow:",
2568     "    callOpcodeSlowPath(slow)",
2569     "    dispatch(0)",
2570     "end",
2571     "macro equalNull(cellHandler, immediateHandler)",
2572     "    loadisFromInstruction(1, t0)",
2573     "    assertNotConstant(t0)",
2574     "    loadq 0[cfr, t0, 8], t0",
2575     "    btqnz t0, tagMask, .immediate",
2576     "    loadStructureWithScratch(t0, t2, t1)",
2577     "    cellHandler(t2, JSCell::m_flags[t0], .target)",
2578     "    dispatch(3)",
2579     ".target:",
2580     "    dispatchIntIndirect(2)",
2581     ".immediate:",
2582     "    andq (~TagBitUndefined), t0",
2583     "    immediateHandler(t0, .target)",
2584     "    dispatch(3)",
2585     "end",
2586     "_llint_op_jeq_null:",
2587     "    traceExecution()",
2588     "    equalNull(macro (structure, value, target)",
2589     "    btbz value, MasqueradesAsUndefined, .notMasqueradesAsUndefined",
2590     "    loadp CodeBlock[cfr], t0",
2591     "    loadp CodeBlock::m_globalObject[t0], t0",
2592     "    bpeq Structure::m_globalObject[structure], t0, target",
2593     ".notMasqueradesAsUndefined:",
2594     "end, macro (value, target)",
2595     "    bqeq value, ValueNull, target",
2596     "end)",
2597     "_llint_op_jneq_null:",
2598     "    traceExecution()",
2599     "    equalNull(macro (structure, value, target)",
2600     "    btbz value, MasqueradesAsUndefined, target",
2601     "    loadp CodeBlock[cfr], t0",
2602     "    loadp CodeBlock::m_globalObject[t0], t0",
2603     "    bpneq Structure::m_globalObject[structure], t0, target",
2604     "end, macro (value, target)",
2605     "    bqneq value, ValueNull, target",
2606     "end)",
2607     "_llint_op_jneq_ptr:",
2608     "    traceExecution()",
2609     "    loadisFromInstruction(1, t0)",
2610     "    loadisFromInstruction(2, t1)",
2611     "    loadp CodeBlock[cfr], t2",
2612     "    loadp CodeBlock::m_globalObject[t2], t2",
2613     "    loadp JSGlobalObject::m_specialPointers[t2, t1, 8], t1",
2614     "    bpneq t1, 0[cfr, t0, 8], .opJneqPtrTarget",
2615     "    dispatch(5)",
2616     ".opJneqPtrTarget:",
2617     "    storei 1, 32[PB, PC, 8]",
2618     "    dispatchIntIndirect(3)",
2619     "macro compare(integerCompare, doubleCompare, slowPath)",
2620     "    loadisFromInstruction(1, t2)",
2621     "    loadisFromInstruction(2, t3)",
2622     "    loadConstantOrVariable(t2, t0)",
2623     "    loadConstantOrVariable(t3, t1)",
2624     "    bqb t0, tagTypeNumber, .op1NotInt",
2625     "    bqb t1, tagTypeNumber, .op2NotInt",
2626     "    integerCompare(t0, t1, .jumpTarget)",
2627     "    dispatch(4)",
2628     ".op1NotInt:",
2629     "    btqz t0, tagTypeNumber, .slow",
2630     "    bqb t1, tagTypeNumber, .op1NotIntOp2NotInt",
2631     "    ci2d t1, ft1",
2632     "    jmp .op1NotIntReady",
2633     ".op1NotIntOp2NotInt:",
2634     "    btqz t1, tagTypeNumber, .slow",
2635     "    addq tagTypeNumber, t1",
2636     "    fq2d t1, ft1",
2637     ".op1NotIntReady:",
2638     "    addq tagTypeNumber, t0",
2639     "    fq2d t0, ft0",
2640     "    doubleCompare(ft0, ft1, .jumpTarget)",
2641     "    dispatch(4)",
2642     ".op2NotInt:",
2643     "    ci2d t0, ft0",
2644     "    btqz t1, tagTypeNumber, .slow",
2645     "    addq tagTypeNumber, t1",
2646     "    fq2d t1, ft1",
2647     "    doubleCompare(ft0, ft1, .jumpTarget)",
2648     "    dispatch(4)",
2649     ".jumpTarget:",
2650     "    dispatchIntIndirect(3)",
2651     ".slow:",
2652     "    callOpcodeSlowPath(slowPath)",
2653     "    dispatch(0)",
2654     "end",
2655     "_llint_op_switch_imm:",
2656     "    traceExecution()",
2657     "    loadisFromInstruction(3, t2)",
2658     "    loadisFromInstruction(1, t3)",
2659     "    loadConstantOrVariable(t2, t1)",
2660     "    loadp CodeBlock[cfr], t2",
2661     "    loadp CodeBlock::m_rareData[t2], t2",
2662     "    muli sizeof SimpleJumpTable, t3",
2663     "    loadp (CodeBlock::RareData::m_switchJumpTables + VectorBufferOffset)[t2], t2",
2664     "    addp t3, t2",
2665     "    bqb t1, tagTypeNumber, .opSwitchImmNotInt",
2666     "    subi SimpleJumpTable::min[t2], t1",
2667     "    biaeq t1, (SimpleJumpTable::branchOffsets + VectorSizeOffset)[t2], .opSwitchImmFallThrough",
2668     "    loadp (SimpleJumpTable::branchOffsets + VectorBufferOffset)[t2], t3",
2669     "    loadis 0[t3, t1, 4], t1",
2670     "    btiz t1, .opSwitchImmFallThrough",
2671     "    dispatch(t1)",
2672     ".opSwitchImmNotInt:",
2673     "    btqnz t1, tagTypeNumber, .opSwitchImmSlow",
2674     ".opSwitchImmFallThrough:",
2675     "    dispatchIntIndirect(2)",
2676     ".opSwitchImmSlow:",
2677     "    callOpcodeSlowPath(_llint_slow_path_switch_imm)",
2678     "    dispatch(0)",
2679     "_llint_op_switch_char:",
2680     "    traceExecution()",
2681     "    loadisFromInstruction(3, t2)",
2682     "    loadisFromInstruction(1, t3)",
2683     "    loadConstantOrVariable(t2, t1)",
2684     "    loadp CodeBlock[cfr], t2",
2685     "    loadp CodeBlock::m_rareData[t2], t2",
2686     "    muli sizeof SimpleJumpTable, t3",
2687     "    loadp (CodeBlock::RareData::m_switchJumpTables + VectorBufferOffset)[t2], t2",
2688     "    addp t3, t2",
2689     "    btqnz t1, tagMask, .opSwitchCharFallThrough",
2690     "    bbneq JSCell::m_type[t1], StringType, .opSwitchCharFallThrough",
2691     "    bineq JSString::m_length[t1], 1, .opSwitchCharFallThrough",
2692     "    loadp JSString::m_value[t1], t0",
2693     "    btpz t0, .opSwitchOnRope",
2694     "    loadp StringImpl::m_data8[t0], t1",
2695     "    btinz StringImpl::m_hashAndFlags[t0], HashFlags8BitBuffer, .opSwitchChar8Bit",
2696     "    loadh 0[t1], t0",
2697     "    jmp .opSwitchCharReady",
2698     ".opSwitchChar8Bit:",
2699     "    loadb 0[t1], t0",
2700     ".opSwitchCharReady:",
2701     "    subi SimpleJumpTable::min[t2], t0",
2702     "    biaeq t0, (SimpleJumpTable::branchOffsets + VectorSizeOffset)[t2], .opSwitchCharFallThrough",
2703     "    loadp (SimpleJumpTable::branchOffsets + VectorBufferOffset)[t2], t2",
2704     "    loadis 0[t2, t0, 4], t1",
2705     "    btiz t1, .opSwitchCharFallThrough",
2706     "    dispatch(t1)",
2707     ".opSwitchCharFallThrough:",
2708     "    dispatchIntIndirect(2)",
2709     ".opSwitchOnRope:",
2710     "    callOpcodeSlowPath(_llint_slow_path_switch_char)",
2711     "    dispatch(0)",
2712     "macro arrayProfileForCall()",
2713     "    loadisFromInstruction(4, t3)",
2714     "    negp t3",
2715     "    loadq ThisArgumentOffset[cfr, t3, 8], t0",
2716     "    btqnz t0, tagMask, .done",
2717     "    loadpFromInstruction((CallOpCodeSize - 2), t1)",
2718     "    loadi JSCell::m_structureID[t0], t3",
2719     "    storei t3, ArrayProfile::m_lastSeenStructureID[t1]",
2720     ".done:",
2721     "end",
2722     "macro doCall(slowPath, prepareCall)",
2723     "    loadisFromInstruction(2, t0)",
2724     "    loadpFromInstruction(5, t1)",
2725     "    loadp LLIntCallLinkInfo::callee[t1], t2",
2726     "    loadConstantOrVariable(t0, t3)",
2727     "    bqneq t3, t2, .opCallSlow",
2728     "    loadisFromInstruction(4, t3)",
2729     "    lshifti 3, t3",
2730     "    negp t3",
2731     "    addp cfr, t3",
2732     "    storeq t2, Callee[t3]",
2733     "    loadisFromInstruction(3, t2)",
2734     "    storei PC, (ArgumentCount + TagOffset)[cfr]",
2735     "    storei t2, (ArgumentCount + PayloadOffset)[t3]",
2736     "    move t3, sp",
2737     "    prepareCall(LLIntCallLinkInfo::machineCodeTarget[t1], t2, t3, t4)",
2738     "    callTargetFunction(LLIntCallLinkInfo::machineCodeTarget[t1])",
2739     ".opCallSlow:",
2740     "    slowPathForCall(slowPath, prepareCall)",
2741     "end",
2742     "_llint_op_ret:",
2743     "    traceExecution()",
2744     "    checkSwitchToJITForEpilogue()",
2745     "    loadisFromInstruction(1, t2)",
2746     "    loadConstantOrVariable(t2, r0)",
2747     "    doReturn()",
2748     "_llint_op_to_primitive:",
2749     "    traceExecution()",
2750     "    loadisFromInstruction(2, t2)",
2751     "    loadisFromInstruction(1, t3)",
2752     "    loadConstantOrVariable(t2, t0)",
2753     "    btqnz t0, tagMask, .opToPrimitiveIsImm",
2754     "    bbaeq JSCell::m_type[t0], ObjectType, .opToPrimitiveSlowCase",
2755     ".opToPrimitiveIsImm:",
2756     "    storeq t0, 0[cfr, t3, 8]",
2757     "    dispatch(constexpr (op_to_primitive_length))",
2758     ".opToPrimitiveSlowCase:",
2759     "    callOpcodeSlowPath(_slow_path_to_primitive)",
2760     "    dispatch(constexpr (op_to_primitive_length))",
2761     "_llint_op_catch:",
2762     "    loadp Callee[cfr], t3",
2763     "    andp MarkedBlockMask, t3",
2764     "    loadp MarkedBlock::m_vm[t3], t3",
2765     "    restoreCalleeSavesFromVMEntryFrameCalleeSavesBuffer(t3, t0)",
2766     "    loadp VM::callFrameForCatch[t3], cfr",
2767     "    storep 0, VM::callFrameForCatch[t3]",
2768     "    restoreStackPointerAfterCall()",
2769     "    loadp CodeBlock[cfr], PB",
2770     "    loadp CodeBlock::m_instructions[PB], PB",
2771     "    loadp VM::targetInterpreterPCForThrow[t3], PC",
2772     "    subp PB, PC",
2773     "    rshiftp 3, PC",
2774     "    callOpcodeSlowPath(_llint_slow_path_check_if_exception_is_uncatchable_and_notify_profiler)",
2775     "    bpeq r1, 0, .isCatchableException",
2776     "    jmp _llint_throw_from_slow_path_trampoline",
2777     ".isCatchableException:",
2778     "    loadp Callee[cfr], t3",
2779     "    andp MarkedBlockMask, t3",
2780     "    loadp MarkedBlock::m_vm[t3], t3",
2781     "    loadq VM::m_exception[t3], t0",
2782     "    storeq 0, VM::m_exception[t3]",
2783     "    loadisFromInstruction(1, t2)",
2784     "    storeq t0, 0[cfr, t2, 8]",
2785     "    loadq Exception::m_value[t0], t3",
2786     "    loadisFromInstruction(2, t2)",
2787     "    storeq t3, 0[cfr, t2, 8]",
2788     "    traceExecution()",
2789     "    dispatch(constexpr (op_catch_length))",
2790     "_llint_op_end:",
2791     "    traceExecution()",
2792     "    checkSwitchToJITForEpilogue()",
2793     "    loadisFromInstruction(1, t0)",
2794     "    assertNotConstant(t0)",
2795     "    loadq 0[cfr, t0, 8], r0",
2796     "    doReturn()",
2797     "_llint_throw_from_slow_path_trampoline:",
2798     "    loadp Callee[cfr], t1",
2799     "    andp MarkedBlockMask, t1",
2800     "    loadp MarkedBlock::m_vm[t1], t1",
2801     "    copyCalleeSavesToVMEntryFrameCalleeSavesBuffer(t1, t2)",
2802     "    callSlowPath(_llint_slow_path_handle_exception)",
2803     "    loadp Callee[cfr], t1",
2804     "    andp MarkedBlockMask, t1",
2805     "    loadp MarkedBlock::m_vm[t1], t1",
2806     "    jmp VM::targetMachinePCForThrow[t1]",
2807     "_llint_throw_during_call_trampoline:",
2808     "    preserveReturnAddressAfterCall(t2)",
2809     "    jmp _llint_throw_from_slow_path_trampoline",
2810     "macro nativeCallTrampoline(executableOffsetToFunction)",
2811     "    functionPrologue()",
2812     "    storep 0, CodeBlock[cfr]",
2813     "    loadp Callee[cfr], t0",
2814     "    andp MarkedBlockMask, t0, t1",
2815     "    loadp MarkedBlock::m_vm[t1], t1",
2816     "    storep cfr, VM::topCallFrame[t1]",
2817     "if (ARM64 or C_LOOP)",
2818     "    storep lr, ReturnPC[cfr]",
2819     "else",
2820     "    skip",
2821     "end",
2822     "    move cfr, a0",
2823     "    loadp Callee[cfr], t1",
2824     "    loadp JSFunction::m_executable[t1], t1",
2825     "    checkStackPointerAlignment(t3, 3735879681)",
2826     "if C_LOOP",
2827     "    cloopCallNative executableOffsetToFunction[t1]",
2828     "else",
2829     "if X86_64_WIN",
2830     "    subp 32, sp",
2831     "else",
2832     "    skip",
2833     "end",
2834     "    call executableOffsetToFunction[t1]",
2835     "if X86_64_WIN",
2836     "    addp 32, sp",
2837     "else",
2838     "    skip",
2839     "end",
2840     "end",
2841     "    loadp Callee[cfr], t3",
2842     "    andp MarkedBlockMask, t3",
2843     "    loadp MarkedBlock::m_vm[t3], t3",
2844     "    btqnz VM::m_exception[t3], .handleException",
2845     "    functionEpilogue()",
2846     "    ret ",
2847     ".handleException:",
2848     "    storep cfr, VM::topCallFrame[t3]",
2849     "    jmp _llint_throw_from_slow_path_trampoline",
2850     "end",
2851     "macro getConstantScope(dst)",
2852     "    loadpFromInstruction(6, t0)",
2853     "    loadisFromInstruction(dst, t1)",
2854     "    storeq t0, 0[cfr, t1, 8]",
2855     "end",
2856     "macro varInjectionCheck(slowPath)",
2857     "    loadp CodeBlock[cfr], t0",
2858     "    loadp CodeBlock::m_globalObject[t0], t0",
2859     "    loadp JSGlobalObject::m_varInjectionWatchpoint[t0], t0",
2860     "    bbeq WatchpointSet::m_state[t0], IsInvalidated, slowPath",
2861     "end",
2862     "macro resolveScope()",
2863     "    loadisFromInstruction(5, t2)",
2864     "    loadisFromInstruction(2, t0)",
2865     "    loadp 0[cfr, t0, 8], t0",
2866     "    btiz t2, .resolveScopeLoopEnd",
2867     ".resolveScopeLoop:",
2868     "    loadp JSScope::m_next[t0], t0",
2869     "    subi 1, t2",
2870     "    btinz t2, .resolveScopeLoop",
2871     ".resolveScopeLoopEnd:",
2872     "    loadisFromInstruction(1, t1)",
2873     "    storeq t0, 0[cfr, t1, 8]",
2874     "end",
2875     "_llint_op_resolve_scope:",
2876     "    traceExecution()",
2877     "    loadisFromInstruction(4, t0)",
2878     "    bineq t0, GlobalProperty, .rGlobalVar",
2879     "    getConstantScope(1)",
2880     "    dispatch(constexpr (op_resolve_scope_length))",
2881     ".rGlobalVar:",
2882     "    bineq t0, GlobalVar, .rGlobalLexicalVar",
2883     "    getConstantScope(1)",
2884     "    dispatch(constexpr (op_resolve_scope_length))",
2885     ".rGlobalLexicalVar:",
2886     "    bineq t0, GlobalLexicalVar, .rClosureVar",
2887     "    getConstantScope(1)",
2888     "    dispatch(constexpr (op_resolve_scope_length))",
2889     ".rClosureVar:",
2890     "    bineq t0, ClosureVar, .rModuleVar",
2891     "    resolveScope()",
2892     "    dispatch(constexpr (op_resolve_scope_length))",
2893     ".rModuleVar:",
2894     "    bineq t0, ModuleVar, .rGlobalPropertyWithVarInjectionChecks",
2895     "    getConstantScope(1)",
2896     "    dispatch(constexpr (op_resolve_scope_length))",
2897     ".rGlobalPropertyWithVarInjectionChecks:",
2898     "    bineq t0, GlobalPropertyWithVarInjectionChecks, .rGlobalVarWithVarInjectionChecks",
2899     "    varInjectionCheck(.rDynamic)",
2900     "    getConstantScope(1)",
2901     "    dispatch(constexpr (op_resolve_scope_length))",
2902     ".rGlobalVarWithVarInjectionChecks:",
2903     "    bineq t0, GlobalVarWithVarInjectionChecks, .rGlobalLexicalVarWithVarInjectionChecks",
2904     "    varInjectionCheck(.rDynamic)",
2905     "    getConstantScope(1)",
2906     "    dispatch(constexpr (op_resolve_scope_length))",
2907     ".rGlobalLexicalVarWithVarInjectionChecks:",
2908     "    bineq t0, GlobalLexicalVarWithVarInjectionChecks, .rClosureVarWithVarInjectionChecks",
2909     "    varInjectionCheck(.rDynamic)",
2910     "    getConstantScope(1)",
2911     "    dispatch(constexpr (op_resolve_scope_length))",
2912     ".rClosureVarWithVarInjectionChecks:",
2913     "    bineq t0, ClosureVarWithVarInjectionChecks, .rDynamic",
2914     "    varInjectionCheck(.rDynamic)",
2915     "    resolveScope()",
2916     "    dispatch(constexpr (op_resolve_scope_length))",
2917     ".rDynamic:",
2918     "    callOpcodeSlowPath(_slow_path_resolve_scope)",
2919     "    dispatch(constexpr (op_resolve_scope_length))",
2920     "macro loadWithStructureCheck(operand, slowPath)",
2921     "    loadisFromInstruction(operand, t0)",
2922     "    loadq 0[cfr, t0, 8], t0",
2923     "    loadStructureWithScratch(t0, t2, t1)",
2924     "    loadpFromInstruction(5, t1)",
2925     "    bpneq t2, t1, slowPath",
2926     "end",
2927     "macro getProperty()",
2928     "    loadisFromInstruction(6, t1)",
2929     "    loadPropertyAtVariableOffset(t1, t0, t2)",
2930     "    valueProfile(t2, 7, t0)",
2931     "    loadisFromInstruction(1, t0)",
2932     "    storeq t2, 0[cfr, t0, 8]",
2933     "end",
2934     "macro getGlobalVar(tdzCheckIfNecessary)",
2935     "    loadpFromInstruction(6, t0)",
2936     "    loadq 0[t0], t0",
2937     "    tdzCheckIfNecessary(t0)",
2938     "    valueProfile(t0, 7, t1)",
2939     "    loadisFromInstruction(1, t1)",
2940     "    storeq t0, 0[cfr, t1, 8]",
2941     "end",
2942     "macro getClosureVar()",
2943     "    loadisFromInstruction(6, t1)",
2944     "    loadq JSEnvironmentRecord_variables[t0, t1, 8], t0",
2945     "    valueProfile(t0, 7, t1)",
2946     "    loadisFromInstruction(1, t1)",
2947     "    storeq t0, 0[cfr, t1, 8]",
2948     "end",
2949     "_llint_op_get_from_scope:",
2950     "    traceExecution()",
2951     "    loadisFromInstruction(4, t0)",
2952     "    andi ResolveTypeMask, t0",
2953     "    bineq t0, GlobalProperty, .gGlobalVar",
2954     "    loadWithStructureCheck(2, .gDynamic)",
2955     "    getProperty()",
2956     "    dispatch(constexpr (op_get_from_scope_length))",
2957     ".gGlobalVar:",
2958     "    bineq t0, GlobalVar, .gGlobalLexicalVar",
2959     "    getGlobalVar(macro (v)",
2960     "",
2961     "end)",
2962     "    dispatch(constexpr (op_get_from_scope_length))",
2963     ".gGlobalLexicalVar:",
2964     "    bineq t0, GlobalLexicalVar, .gClosureVar",
2965     "    getGlobalVar(macro (value)",
2966     "    bqeq value, ValueEmpty, .gDynamic",
2967     "end)",
2968     "    dispatch(constexpr (op_get_from_scope_length))",
2969     ".gClosureVar:",
2970     "    bineq t0, ClosureVar, .gGlobalPropertyWithVarInjectionChecks",
2971     "    loadVariable(2, t0)",
2972     "    getClosureVar()",
2973     "    dispatch(constexpr (op_get_from_scope_length))",
2974     ".gGlobalPropertyWithVarInjectionChecks:",
2975     "    bineq t0, GlobalPropertyWithVarInjectionChecks, .gGlobalVarWithVarInjectionChecks",
2976     "    loadWithStructureCheck(2, .gDynamic)",
2977     "    getProperty()",
2978     "    dispatch(constexpr (op_get_from_scope_length))",
2979     ".gGlobalVarWithVarInjectionChecks:",
2980     "    bineq t0, GlobalVarWithVarInjectionChecks, .gGlobalLexicalVarWithVarInjectionChecks",
2981     "    varInjectionCheck(.gDynamic)",
2982     "    getGlobalVar(macro (v)",
2983     "",
2984     "end)",
2985     "    dispatch(constexpr (op_get_from_scope_length))",
2986     ".gGlobalLexicalVarWithVarInjectionChecks:",
2987     "    bineq t0, GlobalLexicalVarWithVarInjectionChecks, .gClosureVarWithVarInjectionChecks",
2988     "    varInjectionCheck(.gDynamic)",
2989     "    getGlobalVar(macro (value)",
2990     "    bqeq value, ValueEmpty, .gDynamic",
2991     "end)",
2992     "    dispatch(constexpr (op_get_from_scope_length))",
2993     ".gClosureVarWithVarInjectionChecks:",
2994     "    bineq t0, ClosureVarWithVarInjectionChecks, .gDynamic",
2995     "    varInjectionCheck(.gDynamic)",
2996     "    loadVariable(2, t0)",
2997     "    getClosureVar()",
2998     "    dispatch(constexpr (op_get_from_scope_length))",
2999     ".gDynamic:",
3000     "    callOpcodeSlowPath(_llint_slow_path_get_from_scope)",
3001     "    dispatch(constexpr (op_get_from_scope_length))",
3002     "macro putProperty()",
3003     "    loadisFromInstruction(3, t1)",
3004     "    loadConstantOrVariable(t1, t2)",
3005     "    loadisFromInstruction(6, t1)",
3006     "    storePropertyAtVariableOffset(t1, t0, t2, t3)",
3007     "end",
3008     "macro putGlobalVariable()",
3009     "    loadisFromInstruction(3, t0)",
3010     "    loadConstantOrVariable(t0, t1)",
3011     "    loadpFromInstruction(5, t2)",
3012     "    loadpFromInstruction(6, t0)",
3013     "    notifyWrite(t2, .pDynamic)",
3014     "    storeq t1, 0[t0]",
3015     "end",
3016     "macro putClosureVar()",
3017     "    loadisFromInstruction(3, t1)",
3018     "    loadConstantOrVariable(t1, t2)",
3019     "    loadisFromInstruction(6, t1)",
3020     "    storeq t2, JSEnvironmentRecord_variables[t0, t1, 8]",
3021     "end",
3022     "macro putLocalClosureVar()",
3023     "    loadisFromInstruction(3, t1)",
3024     "    loadConstantOrVariable(t1, t2)",
3025     "    loadpFromInstruction(5, t3)",
3026     "    btpz t3, .noVariableWatchpointSet",
3027     "    notifyWrite(t3, .pDynamic)",
3028     ".noVariableWatchpointSet:",
3029     "    loadisFromInstruction(6, t1)",
3030     "    storeq t2, JSEnvironmentRecord_variables[t0, t1, 8]",
3031     "end",
3032     "macro checkTDZInGlobalPutToScopeIfNecessary()",
3033     "    loadisFromInstruction(4, t0)",
3034     "    andi InitializationModeMask, t0",
3035     "    rshifti InitializationModeShift, t0",
3036     "    bineq&nb