Bug 1885489 - Part 11: Use SnapshotIterator::readBigInt() when recovering BigInt...
[gecko.git] / js / src / jit / LIROps.yaml
blob51a123512110f5c61cb73fd22faed7c94fc94f85
1 # This Source Code Form is subject to the terms of the Mozilla Public
2 # License, v. 2.0. If a copy of the MPL was not distributed with this
3 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
5 # [SMDOC] LIR Opcodes
6 # =======================
7 # This file defines all LIR opcodes as well as LIR opcode class
8 # definitions. It is parsed by GenerateLIRFiles.py at build time to
9 # create LIROpsGenerated.h. Each opcode consists of a
10 # name and a set of attributes that are described below. Unless
11 # marked as required, attributes are optional.
13 # name [required]
14 # ====
15 # Opcode name.
16 # Possible values:
17 #   - opcode string: used as the name for LIR opcode.
19 # gen_boilerplate
20 # ===============
21 # Used to decide to generate LIR boilerplate.
22 #   - true (default): auto generate boilerplate for this LIR opcode
23 #   - false: do not generate boilerplate for this LIR opcode
25 # result_type
26 # ===========
27 # Specifies the result type that is produced by this LIR instruction.
28 # The result type can be any of the following: WordSized, BoxedValue,
29 # or Int64.
30 #   - attribute not specified (default): there is no result produced
31 #     by this LIR instruction
32 #   - result type: sets result type for this LIR instruction
34 # operands
35 # ========
36 # A list of operands to the LIR node. Each operand will be
37 # passed into and set in the instruction's constructor. A simple getter
38 # will also be auto generated for the operand. Each operand in the
39 # following list is defined by its name and an type.
40 # The type can be WordSized, BoxedValue, or Int64.
42 #   For example:
43 #     operands:
44 #       lhs: BoxedValue
45 #       rhs: WordSized
47 #   Will result in:
48 #     explicit LInstanceOfV(const LBoxAllocation& lhs, const LAllocation& rhs)
49 #         : LInstructionHelper(classOpcode) {
50 #       setBoxOperand(lhsIndex, lhs);
51 #       setOperand(rhsIndex, rhs);
52 #     }
53 #     const LAllocation* rhs() { return getOperand(0); }
55 #     static const size_t lhsIndex = 0;
56 #     static const size_t rhsIndex = BOX_PIECES;
58 #   - attribute not specified (default): no code generated
59 #   - list of operand names with their types: operand getters and setters
60 #     are generated and passed into the constructor
62 # arguments
63 # =========
64 # A list of non-LIR node arguments to the LIR op class constructor
65 # that are passed along with the operands. The arguments require
66 # both a name and a full type signature for each item in the list.
68 # For example:
69 #   offset: size_t
70 #   type: MIRType
72 # For each argument a private variable declaration will be autogenerated
73 # in the LIR op class, as well as simple accessor for that variable. The
74 # above arguments list will result in the following declarations and
75 # accessors:
77 #   size_t offset_;
78 #   MIRType type_;
80 #   size_t offset() const { return offset_; }
81 #   MIRType type() const { return type_; }
83 #   - attribute not specified (default): no code generated
84 #   - argument list: argument names and their full type signature
86 # num_temps
87 # ========
88 # Specifies the number of temporary virtual registers, LDefinitions, used by
89 # this LIR op.
90 #   - attribute not specified (default): number of temps is set to 0
91 #   - number of LDefinition temps: sets number of temps max 15
93 # call_instruction
94 # ================
95 # Used to define call instructions.
96 #   - attribute not specified (default): no code generated
97 #   - true: generates a call to setIsCall in the op's constructor
99 # mir_op
100 # ======
101 # If a LIR instruction corresponds one-to-one with a particular MIR
102 # instruction, this will generate a method that returns that MIR
103 # instruction.
104 #   - attribute not specified (default): no code generated
105 #   - true: generates a method to return MIR instruction
106 #   - mir string: returns this specified MIR instruction
109 - name: Phi
110   gen_boilerplate: false
112 - name: Box
113   gen_boilerplate: false
115 - name: OsiPoint
116   gen_boilerplate: false
118 - name: MoveGroup
119   gen_boilerplate: false
121 # Constant 32-bit integer.
122 - name: Integer
123   result_type: WordSized
124   arguments:
125     i32: int32_t
127 # Constant 64-bit integer.
128 - name: Integer64
129   result_type: Int64
130   arguments:
131     i64: int64_t
133 # Constant pointer.
134 - name: Pointer
135   result_type: WordSized
136   arguments:
137     gcptr: gc::Cell*
139 # Constant double.
140 - name: Double
141   result_type: WordSized
142   arguments:
143     value: double
145 # Constant float32.
146 - name: Float32
147   result_type: WordSized
148   arguments:
149     value: float
151 - name: Value
152   gen_boilerplate: false
154 - name: NurseryObject
155   result_type: WordSized
156   mir_op: true
158 # Formal argument for a function, returning a box. Formal arguments are
159 # initially read from the stack.
160 - name: Parameter
161   result_type: BoxedValue
163 # Stack offset for a word-sized immutable input value to a frame.
164 - name: Callee
165   result_type: WordSized
167 - name: IsConstructing
168   result_type: WordSized
170 - name: Goto
171   gen_boilerplate: false
173 - name: NewArray
174   gen_boilerplate: false
176 - name: NewArrayDynamicLength
177   result_type: WordSized
178   operands:
179     length: WordSized
180   num_temps: 1
181   mir_op: true
183 - name: NewIterator
184   result_type: WordSized
185   num_temps: 1
186   mir_op: true
188 - name: NewTypedArray
189   result_type: WordSized
190   num_temps: 2
191   mir_op: true
193 - name: NewTypedArrayDynamicLength
194   result_type: WordSized
195   operands:
196     length: WordSized
197   num_temps: 1
198   mir_op: true
200 - name: NewTypedArrayFromArray
201   result_type: WordSized
202   operands:
203     array: WordSized
204   call_instruction: true
205   mir_op: true
207 - name: NewTypedArrayFromArrayBuffer
208   result_type: WordSized
209   operands:
210     arrayBuffer: WordSized
211     byteOffset: BoxedValue
212     length: BoxedValue
213   call_instruction: true
214   mir_op: true
216 - name: BindFunction
217   result_type: WordSized
218   operands:
219     target: WordSized
220   call_instruction: true
221   num_temps: 2
222   mir_op: true
224 - name: NewBoundFunction
225   result_type: WordSized
226   num_temps: 1
227   mir_op: true
229 - name: NewObject
230   gen_boilerplate: false
232 - name: NewPlainObject
233   result_type: WordSized
234   num_temps: 3
235   mir_op: true
237 - name: NewArrayObject
238   result_type: WordSized
239   num_temps: 2
240   mir_op: true
242 # Allocates a new NamedLambdaObject.
244 # This instruction generates two possible instruction sets:
245 #   (1) An inline allocation of the call object is attempted.
246 #   (2) Otherwise, a callVM create a new object.
248 - name: NewNamedLambdaObject
249   result_type: WordSized
250   num_temps: 1
251   mir_op: true
253 # Allocates a new CallObject.
255 # This instruction generates two possible instruction sets:
256 #   (1) If the call object is extensible, this is a callVM to create the
257 #       call object.
258 #   (2) Otherwise, an inline allocation of the call object is attempted.
260 - name: NewCallObject
261   result_type: WordSized
262   num_temps: 1
263   mir_op: true
265 - name: NewStringObject
266   result_type: WordSized
267   operands:
268     input: WordSized
269   num_temps: 1
270   mir_op: true
272 - name: InitElemGetterSetter
273   operands:
274     object: WordSized
275     id: BoxedValue
276     value: WordSized
277   call_instruction: true
278   mir_op: true
280 # Takes in an Object and a Value.
281 - name: MutateProto
282   operands:
283     object: WordSized
284     value: BoxedValue
285   call_instruction: true
287 - name: InitPropGetterSetter
288   operands:
289     object: WordSized
290     value: WordSized
291   call_instruction: true
292   mir_op: true
294 - name: CheckOverRecursed
295   mir_op: true
297 - name: WasmTrap
298   mir_op: true
300 - name: WasmTrapIfNull
301   operands:
302     ref: WordSized
303   mir_op: true
305 - name: WasmRefIsSubtypeOfConcrete
306   mir_op: true
307   operands:
308     ref: WordSized
309     superSTV: WordSized
310   result_type: WordSized
311   num_temps: 2
313 - name: WasmRefIsSubtypeOfAbstract
314   mir_op: true
315   operands:
316     ref: WordSized
317   result_type: WordSized
318   num_temps: 1
320 - name: WasmRefIsSubtypeOfConcreteAndBranch
321   gen_boilerplate: false
323 - name: WasmRefIsSubtypeOfAbstractAndBranch
324   gen_boilerplate: false
326 - name: WasmNewStructObject
327   mir_op: true
328   operands:
329     instance: WordSized
330     typeDefData: WordSized
331   result_type: WordSized
332   num_temps: 2
334 - name: WasmNewArrayObject
335   mir_op: true
336   operands:
337     instance: WordSized
338     numElements: WordSized
339     typeDefData: WordSized
340   result_type: WordSized
341   num_temps: 2
343 - name: WasmReinterpret
344   gen_boilerplate: false
346 - name: WasmReinterpretFromI64
347   gen_boilerplate: false
349 - name: WasmReinterpretToI64
350   gen_boilerplate: false
352 - name: Rotate
353   gen_boilerplate: false
355 - name: RotateI64
356   gen_boilerplate: false
358 - name: InterruptCheck
359   mir_op: true
361 - name: WasmInterruptCheck
362   operands:
363     instance: WordSized
364   mir_op: true
366 - name: TypeOfV
367   result_type: WordSized
368   operands:
369     input: BoxedValue
370   num_temps: 1
371   mir_op: TypeOf
373 - name: TypeOfO
374   result_type: WordSized
375   operands:
376     object: WordSized
377   mir_op: TypeOf
379 - name: TypeOfName
380   result_type: WordSized
381   operands:
382     input: WordSized
383   mir_op: true
385 - name: TypeOfIsNonPrimitiveV
386   result_type: WordSized
387   operands:
388     input: BoxedValue
389   num_temps: 1
390   mir_op: TypeOfIs
392 - name: TypeOfIsNonPrimitiveO
393   result_type: WordSized
394   operands:
395     input: WordSized
396   mir_op: TypeOfIs
398 - name: TypeOfIsPrimitive
399   result_type: WordSized
400   operands:
401     input: BoxedValue
402   mir_op: TypeOfIs
404 - name: ToAsyncIter
405   result_type: WordSized
406   operands:
407     iterator: WordSized
408     nextMethod: BoxedValue
409   call_instruction: true
411 - name: ToPropertyKeyCache
412   result_type: BoxedValue
413   operands:
414     input: BoxedValue
415   mir_op: true
417 # Allocate an object for |new| on the caller-side,
418 # when there is no templateObject or prototype known
419 - name: CreateThis
420   result_type: BoxedValue
421   operands:
422     callee: WordSized
423     newTarget: WordSized
424   call_instruction: true
425   mir_op: true
427 # Allocate a new arguments object for the frame.
428 - name: CreateArgumentsObject
429   result_type: WordSized
430   operands:
431     callObject: WordSized
432   num_temps: 3
433   call_instruction: true
434   mir_op: true
436 - name: CreateInlinedArgumentsObject
437   gen_boilerplate: false
439 - name: GetInlinedArgument
440   gen_boilerplate: false
442 - name: GetInlinedArgumentHole
443   gen_boilerplate: false
445 # Get argument from arguments object.
446 - name: GetArgumentsObjectArg
447   result_type: BoxedValue
448   operands:
449     argsObject: WordSized
450   num_temps: 1
451   mir_op: true
453 # Set argument on arguments object.
454 - name: SetArgumentsObjectArg
455   operands:
456     argsObject: WordSized
457     value: BoxedValue
458   num_temps: 1
459   mir_op: true
461 # Load an element from an arguments object.
462 - name: LoadArgumentsObjectArg
463   result_type: BoxedValue
464   operands:
465     argsObject: WordSized
466     index: WordSized
467   num_temps: 1
469 # Load an element from an arguments object. Handles out-of-bounds accesses.
470 - name: LoadArgumentsObjectArgHole
471   result_type: BoxedValue
472   operands:
473     argsObject: WordSized
474     index: WordSized
475   num_temps: 1
477 # Return true if the element exists in the arguments object.
478 - name: InArgumentsObjectArg
479   result_type: WordSized
480   operands:
481     argsObject: WordSized
482     index: WordSized
483   num_temps: 1
485 # Return |arguments.length| unless it has been overridden.
486 - name: ArgumentsObjectLength
487   result_type: WordSized
488   operands:
489     argsObject: WordSized
491 # Create an array from an arguments object.
492 - name: ArrayFromArgumentsObject
493   result_type: WordSized
494   operands:
495     argsObject: WordSized
496   call_instruction: true
497   mir_op: true
499 # Guard that the given flags are not set on the arguments object.
500 - name: GuardArgumentsObjectFlags
501   operands:
502     argsObject: WordSized
503   num_temps: 1
504   mir_op: true
506 - name: BoundFunctionNumArgs
507   result_type: WordSized
508   operands:
509     object: WordSized
511 - name: GuardBoundFunctionIsConstructor
512   operands:
513     object: WordSized
515 # If the Value is an Object, return unbox(Value).
516 # Otherwise, return the other Object.
517 - name: ReturnFromCtor
518   result_type: WordSized
519   operands:
520     value: BoxedValue
521     object: WordSized
523 - name: BoxNonStrictThis
524   result_type: WordSized
525   operands:
526     value: BoxedValue
527   mir_op: true
529 - name: ImplicitThis
530   result_type: BoxedValue
531   operands:
532     env: WordSized
533   call_instruction: true
534   mir_op: true
536 # Writes a typed argument for a function call to the frame's argument vector.
537 - name: StackArgT
538   operands:
539     arg: WordSized
540   arguments:
541     # Index into frame-scope argument vector.
542     argslot: uint32_t
543     type: MIRType
545 # Writes a typed argument for a function call to the frame's argument vector.
546 - name: StackArgV
547   operands:
548     value: BoxedValue
549   arguments:
550     # Index into frame-scope argument vector.
551     argslot: uint32_t
553 - name: CallGeneric
554   gen_boilerplate: false
556 - name: CallKnown
557   gen_boilerplate: false
559 - name: CallNative
560   gen_boilerplate: false
562 - name: CallDOMNative
563   gen_boilerplate: false
565 - name: CallClassHook
566   gen_boilerplate: false
568 - name: Bail
570 - name: Unreachable
571   gen_boilerplate: false
573 - name: EncodeSnapshot
575 - name: UnreachableResultV
576   gen_boilerplate: false
578 - name: UnreachableResultT
579   result_type: WordSized
581 - name: GetDOMProperty
582   gen_boilerplate: false
584 - name: GetDOMMemberV
585   gen_boilerplate: false
587 - name: GetDOMMemberT
588   result_type: WordSized
589   operands:
590     object: WordSized
591   mir_op: GetDOMMember
593 - name: SetDOMProperty
594   gen_boilerplate: false
596 - name: LoadDOMExpandoValue
597   result_type: BoxedValue
598   operands:
599     proxy: WordSized
600   mir_op: true
602 - name: LoadDOMExpandoValueGuardGeneration
603   result_type: BoxedValue
604   operands:
605     proxy: WordSized
606   mir_op: true
608 - name: LoadDOMExpandoValueIgnoreGeneration
609   result_type: BoxedValue
610   operands:
611     proxy: WordSized
612   mir_op: true
614 - name: GuardDOMExpandoMissingOrGuardShape
615   operands:
616     input: BoxedValue
617   num_temps: 1
618   mir_op: true
620 - name: ApplyArgsGeneric
621   gen_boilerplate: false
623 - name: ApplyArgsObj
624   gen_boilerplate: false
626 - name: ApplyArrayGeneric
627   gen_boilerplate: false
629 - name: ConstructArgsGeneric
630   gen_boilerplate: false
632 - name: ConstructArrayGeneric
633   gen_boilerplate: false
635 - name: TestIAndBranch
636   gen_boilerplate: false
638 - name: TestI64AndBranch
639   gen_boilerplate: false
641 - name: TestDAndBranch
642   gen_boilerplate: false
644 - name: TestFAndBranch
645   gen_boilerplate: false
647 - name: TestBIAndBranch
648   gen_boilerplate: false
650 - name: TestOAndBranch
651   gen_boilerplate: false
653 - name: TestVAndBranch
654   gen_boilerplate: false
656 - name: Compare
657   gen_boilerplate: false
659 - name: CompareI64
660   gen_boilerplate: false
662 - name: CompareI64AndBranch
663   gen_boilerplate: false
665 - name: CompareAndBranch
666   gen_boilerplate: false
668 - name: CompareD
669   result_type: WordSized
670   operands:
671     left: WordSized
672     right: WordSized
673   mir_op: Compare
675 - name: CompareF
676   result_type: WordSized
677   operands:
678     left: WordSized
679     right: WordSized
680   mir_op: Compare
682 - name: CompareDAndBranch
683   gen_boilerplate: false
685 - name: CompareFAndBranch
686   gen_boilerplate: false
688 - name: CompareS
689   result_type: WordSized
690   operands:
691     left: WordSized
692     right: WordSized
693   mir_op: Compare
695 - name: CompareSInline
696   result_type: WordSized
697   operands:
698     input: WordSized
699   arguments:
700     constant: JSLinearString*
701   mir_op: Compare
703 - name: CompareSSingle
704   result_type: WordSized
705   operands:
706     input: WordSized
707   arguments:
708     jsop: JSOp
709     constant: JSLinearString*
710   num_temps: 1
711   mir_op: Compare
713 - name: CompareBigInt
714   result_type: WordSized
715   operands:
716     left: WordSized
717     right: WordSized
718   num_temps: 3
719   mir_op: Compare
721 - name: CompareBigIntInt32
722   result_type: WordSized
723   operands:
724     left: WordSized
725     right: WordSized
726   num_temps: 2
727   mir_op: Compare
729 - name: CompareBigIntDouble
730   result_type: WordSized
731   operands:
732     left: WordSized
733     right: WordSized
734   call_instruction: true
735   mir_op: Compare
737 - name: CompareBigIntString
738   result_type: WordSized
739   operands:
740     left: WordSized
741     right: WordSized
742   call_instruction: true
743   mir_op: Compare
745 - name: BitAndAndBranch
746   gen_boilerplate: false
748 # Takes a value and tests whether it is null, undefined, or is an object that
749 # emulates |undefined|, as determined by the JSCLASS_EMULATES_UNDEFINED class
750 # flag on unwrapped objects.  See also js::EmulatesUndefined.
751 - name: IsNullOrLikeUndefinedV
752   result_type: WordSized
753   operands:
754     value: BoxedValue
755   num_temps: 1
756   mir_op: Compare
758 # Takes an object pointer and tests whether it is an object that emulates
759 # |undefined|, as above.
760 - name: IsNullOrLikeUndefinedT
761   result_type: WordSized
762   operands:
763     input: WordSized
764   mir_op: Compare
766 # Takes a value and tests whether it is null.
767 - name: IsNull
768   result_type: WordSized
769   operands:
770     value: BoxedValue
771   mir_op: Compare
773 # Takes a value and tests whether it is undefined.
774 - name: IsUndefined
775   result_type: WordSized
776   operands:
777     value: BoxedValue
778   mir_op: Compare
780 - name: IsNullOrLikeUndefinedAndBranchV
781   gen_boilerplate: false
783 - name: IsNullOrLikeUndefinedAndBranchT
784   gen_boilerplate: false
786 - name: IsNullAndBranch
787   gen_boilerplate: false
789 - name: IsUndefinedAndBranch
790   gen_boilerplate: false
792 - name: SameValueDouble
793   result_type: WordSized
794   operands:
795     left: WordSized
796     right: WordSized
797   num_temps: 1
799 - name: SameValue
800   result_type: WordSized
801   operands:
802     lhs: BoxedValue
803     rhs: BoxedValue
805 # Not operation on an integer.
806 - name: NotI
807   result_type: WordSized
808   operands:
809     input: WordSized
811 # Not operation on an int64.
812 - name: NotI64
813   result_type: WordSized
814   operands:
815     inputI64: Int64
817 # Not operation on a double.
818 - name: NotD
819   result_type: WordSized
820   operands:
821     input: WordSized
822   mir_op: Not
824 # Not operation on a float32.
825 - name: NotF
826   result_type: WordSized
827   operands:
828     input: WordSized
829   mir_op: Not
831 # Not operation on a BigInt.
832 - name: NotBI
833   result_type: WordSized
834   operands:
835     input: WordSized
836   mir_op: Not
838 # Boolean complement operation on an object.
839 - name: NotO
840   result_type: WordSized
841   operands:
842     input: WordSized
843   mir_op: Not
845 # Boolean complement operation on a value.
846 - name: NotV
847   result_type: WordSized
848   operands:
849     input: BoxedValue
850   num_temps: 2
851   mir_op: Not
853 - name: BitNotI
854   gen_boilerplate: false
856 - name: BitNotI64
857   gen_boilerplate: false
859 - name: BitOpI
860   gen_boilerplate: false
862 - name: BitOpI64
863   gen_boilerplate: false
865 - name: ShiftI
866   gen_boilerplate: false
868 - name: ShiftI64
869   gen_boilerplate: false
871 - name: SignExtendInt32
872   result_type: WordSized
873   operands:
874     num: WordSized
875   arguments:
876     mode: MSignExtendInt32::Mode
878 - name: SignExtendInt64
879   gen_boilerplate: false
881 - name: UrshD
882   gen_boilerplate: false
884 - name: Return
885   gen_boilerplate: false
887 - name: Throw
888   operands:
889     value: BoxedValue
890   call_instruction: true
892 - name: ThrowWithStack
893   operands:
894     value: BoxedValue
895     stack: BoxedValue
896   call_instruction: true
898 - name: MinMaxI
899   gen_boilerplate: false
901 - name: MinMaxD
902   gen_boilerplate: false
904 - name: MinMaxF
905   gen_boilerplate: false
907 - name: MinMaxArrayI
908   gen_boilerplate: false
910 - name: MinMaxArrayD
911   gen_boilerplate: false
913 # Negative of integer
914 - name: NegI
915   result_type: WordSized
916   operands:
917     num: WordSized
919 # Negative of an int64
920 - name: NegI64
921   result_type: Int64
922   operands:
923     num: Int64
925 # Negative of double
926 - name: NegD
927   result_type: WordSized
928   operands:
929     num: WordSized
931 # Negative of float32
932 - name: NegF
933   result_type: WordSized
934   operands:
935     num: WordSized
937 # Absolute value of an integer.
938 - name: AbsI
939   result_type: WordSized
940   operands:
941     num: WordSized
942   mir_op: Abs
944 # Absolute value of a double.
945 - name: AbsD
946   result_type: WordSized
947   operands:
948     num: WordSized
950 # Absolute value of a float32.
951 - name: AbsF
952   result_type: WordSized
953   operands:
954     num: WordSized
956 - name: CopySignD
957   gen_boilerplate: false
959 - name: CopySignF
960   gen_boilerplate: false
962 # Count leading zeroes on an int32.
963 - name: ClzI
964   result_type: WordSized
965   operands:
966     num: WordSized
967   mir_op: Clz
969 # Count leading zeroes on an int64.
970 - name: ClzI64
971   result_type: Int64
972   operands:
973     num: Int64
974   mir_op: Clz
976 # Count trailing zeroes on an int32.
977 - name: CtzI
978   result_type: WordSized
979   operands:
980     num: WordSized
981   mir_op: Ctz
983 # Count trailing zeroes on an int64.
984 - name: CtzI64
985   result_type: Int64
986   operands:
987     num: Int64
988   mir_op: Ctz
990 # Count population on an int32.
991 - name: PopcntI
992   result_type: WordSized
993   operands:
994     num: WordSized
995   num_temps: 1
996   mir_op: Popcnt
998 # Count population on an int64.
999 - name: PopcntI64
1000   result_type: Int64
1001   operands:
1002     num: Int64
1003   num_temps: 1
1004   mir_op: Popcnt
1006 - name: SqrtD
1007   result_type: WordSized
1008   operands:
1009     num: WordSized
1011 - name: SqrtF
1012   result_type: WordSized
1013   operands:
1014     num: WordSized
1016 - name: Atan2D
1017   gen_boilerplate: false
1019 - name: Hypot
1020   gen_boilerplate: false
1022 # Double raised to an integer power.
1023 - name: PowI
1024   result_type: WordSized
1025   operands:
1026     value: WordSized
1027     power: WordSized
1028   call_instruction: true
1030 # Integer raised to an integer power.
1031 - name: PowII
1032   result_type: WordSized
1033   operands:
1034     value: WordSized
1035     power: WordSized
1036   num_temps: 2
1037   mir_op: Pow
1039 # Double raised to a double power.
1040 - name: PowD
1041   result_type: WordSized
1042   operands:
1043     value: WordSized
1044     power: WordSized
1045   call_instruction: true
1047 # Constant of a power of two raised to an integer power.
1048 - name: PowOfTwoI
1049   result_type: WordSized
1050   operands:
1051     power: WordSized
1052   arguments:
1053     base: uint32_t
1055 # Sign value of an integer.
1056 - name: SignI
1057   result_type: WordSized
1058   operands:
1059     num: WordSized
1061 # Sign value of an integer.
1062 - name: SignD
1063   result_type: WordSized
1064   operands:
1065     num: WordSized
1067 # Sign value of a double with expected int32 result.
1068 - name: SignDI
1069   result_type: WordSized
1070   operands:
1071     input: WordSized
1072   num_temps: 1
1074 - name: MathFunctionD
1075   gen_boilerplate: false
1077 - name: MathFunctionF
1078   gen_boilerplate: false
1080 - name: AddI
1081   gen_boilerplate: false
1083 - name: AddI64
1084   gen_boilerplate: false
1086 - name: SubI
1087   gen_boilerplate: false
1089 - name: SubI64
1090   gen_boilerplate: false
1092 - name: MulI64
1093   gen_boilerplate: false
1095 - name: MathD
1096   gen_boilerplate: false
1098 - name: MathF
1099   gen_boilerplate: false
1101 - name: ModD
1102   gen_boilerplate: false
1104 - name: ModPowTwoD
1105   gen_boilerplate: false
1107 - name: WasmBuiltinModD
1108   result_type: WordSized
1109   operands:
1110     lhs: WordSized
1111     rhs: WordSized
1112     instance: WordSized
1113   call_instruction: true
1114   mir_op: true
1116 - name: BigIntAdd
1117   gen_boilerplate: false
1119 - name: BigIntSub
1120   gen_boilerplate: false
1122 - name: BigIntMul
1123   gen_boilerplate: false
1125 - name: BigIntDiv
1126   gen_boilerplate: false
1128 - name: BigIntMod
1129   gen_boilerplate: false
1131 - name: BigIntPow
1132   gen_boilerplate: false
1134 - name: BigIntBitAnd
1135   gen_boilerplate: false
1137 - name: BigIntBitOr
1138   gen_boilerplate: false
1140 - name: BigIntBitXor
1141   gen_boilerplate: false
1143 - name: BigIntLsh
1144   gen_boilerplate: false
1146 - name: BigIntRsh
1147   gen_boilerplate: false
1149 - name: BigIntIncrement
1150   gen_boilerplate: false
1152 - name: BigIntDecrement
1153   gen_boilerplate: false
1155 - name: BigIntNegate
1156   gen_boilerplate: false
1158 - name: BigIntBitNot
1159   gen_boilerplate: false
1161 - name: Int32ToStringWithBase
1162   result_type: WordSized
1163   operands:
1164     input: WordSized
1165     base: WordSized
1166   num_temps: 2
1167   mir_op: true
1169 - name: NumberParseInt
1170   result_type: BoxedValue
1171   operands:
1172     string: WordSized
1173     radix: WordSized
1174   num_temps: 1
1175   call_instruction: true
1176   mir_op: true
1178 - name: DoubleParseInt
1179   result_type: WordSized
1180   operands:
1181     number: WordSized
1182   num_temps: 1
1183   mir_op: true
1185 # Adds two string, returning a string.
1186 - name: Concat
1187   result_type: WordSized
1188   operands:
1189     lhs: WordSized
1190     rhs: WordSized
1191   num_temps: 5
1193 # Linearize a string.
1194 - name: LinearizeString
1195   result_type: WordSized
1196   operands:
1197     str: WordSized
1198   mir_op: true
1200 # Linearize a string before a character access.
1201 - name: LinearizeForCharAccess
1202   result_type: WordSized
1203   operands:
1204     str: WordSized
1205     index: WordSized
1206   mir_op: true
1208 # Linearize a string before a code point access.
1209 - name: LinearizeForCodePointAccess
1210   result_type: WordSized
1211   operands:
1212     str: WordSized
1213     index: WordSized
1214   num_temps: 1
1215   mir_op: true
1217 # Compute the relative string index.
1218 - name: ToRelativeStringIndex
1219   result_type: WordSized
1220   operands:
1221     index: WordSized
1222     length: WordSized
1223   mir_op: true
1225 # Get uint16 character code from a string.
1226 - name: CharCodeAt
1227   result_type: WordSized
1228   operands:
1229     str: WordSized
1230     index: WordSized
1231   num_temps: 2
1233 # Get uint16 character code from a string. Return -1 on out-of-bounds.
1234 - name: CharCodeAtOrNegative
1235   result_type: WordSized
1236   operands:
1237     str: WordSized
1238     index: WordSized
1239   num_temps: 2
1241 # Get uint32 code point from a string.
1242 - name: CodePointAt
1243   result_type: WordSized
1244   operands:
1245     str: WordSized
1246     index: WordSized
1247   num_temps: 2
1249 # Get uint32 code point from a string. Return -1 on out-of-bounds.
1250 - name: CodePointAtOrNegative
1251   result_type: WordSized
1252   operands:
1253     str: WordSized
1254     index: WordSized
1255   num_temps: 2
1257 # Box the input if non-negative. Otherwise return NaN.
1258 - name: NegativeToNaN
1259   result_type: BoxedValue
1260   operands:
1261     input: WordSized
1263 # Box the input if non-negative. Otherwise return undefined.
1264 - name: NegativeToUndefined
1265   result_type: BoxedValue
1266   operands:
1267     input: WordSized
1269 # Convert uint16 character code to a string.
1270 - name: FromCharCode
1271   result_type: WordSized
1272   operands:
1273     code: WordSized
1275 # Convert non-negative input as a uint16 character code to a string. If the
1276 # input is negative, return the empty string.
1277 - name: FromCharCodeEmptyIfNegative
1278   result_type: WordSized
1279   operands:
1280     code: WordSized
1282 # Convert non-negative input as a uint16 character code to a string. If the
1283 # input is negative, return the undefined value.
1284 - name: FromCharCodeUndefinedIfNegative
1285   result_type: BoxedValue
1286   operands:
1287     code: WordSized
1289 # Convert uint32 code point to a string.
1290 - name: FromCodePoint
1291   result_type: WordSized
1292   operands:
1293     codePoint: WordSized
1294   num_temps: 2
1296 # Test if a string includes the search string.
1297 - name: StringIncludes
1298   result_type: WordSized
1299   operands:
1300     string: WordSized
1301     searchString: WordSized
1302   call_instruction: true
1304 # Test if a string includes the constant search string.
1305 - name: StringIncludesSIMD
1306   result_type: WordSized
1307   operands:
1308     string: WordSized
1309   arguments:
1310     searchString: JSLinearString*
1311   num_temps: 3
1313 # Search for the first index of the search string.
1314 - name: StringIndexOf
1315   result_type: WordSized
1316   operands:
1317     string: WordSized
1318     searchString: WordSized
1319   call_instruction: true
1321 # Search for the first index of the constant search string.
1322 - name: StringIndexOfSIMD
1323   result_type: WordSized
1324   operands:
1325     string: WordSized
1326   arguments:
1327     searchString: JSLinearString*
1328   num_temps: 3
1330 # Search for the last index of the search string.
1331 - name: StringLastIndexOf
1332   result_type: WordSized
1333   operands:
1334     string: WordSized
1335     searchString: WordSized
1336   call_instruction: true
1338 # Test if a string starts with the search string
1339 - name: StringStartsWith
1340   result_type: WordSized
1341   operands:
1342     string: WordSized
1343     searchString: WordSized
1344   call_instruction: true
1346 # Test if a string starts with the constant search string
1347 - name: StringStartsWithInline
1348   result_type: WordSized
1349   operands:
1350     string: WordSized
1351   arguments:
1352     searchString: JSLinearString*
1353   num_temps: 1
1355 # Test if a string ends with the search string
1356 - name: StringEndsWith
1357   result_type: WordSized
1358   operands:
1359     string: WordSized
1360     searchString: WordSized
1361   call_instruction: true
1363 # Test if a string ends with the constant search string
1364 - name: StringEndsWithInline
1365   result_type: WordSized
1366   operands:
1367     string: WordSized
1368   arguments:
1369     searchString: JSLinearString*
1370   num_temps: 1
1372 # Calls the ToLowerCase case conversion function. Inlines the case conversion
1373 # when possible.
1374 - name: StringToLowerCase
1375   result_type: WordSized
1376   operands:
1377     string: WordSized
1378   num_temps: 5
1379   mir_op: StringConvertCase
1381 # Calls the ToLowerCase case conversion function. Inlines the case conversion
1382 # when possible.
1383 - name: CharCodeToLowerCase
1384   result_type: WordSized
1385   operands:
1386     code: WordSized
1387   num_temps: 1
1388   mir_op: CharCodeConvertCase
1390 # Calls the ToUpperCase case conversion function.
1391 - name: StringToUpperCase
1392   result_type: WordSized
1393   operands:
1394     string: WordSized
1395   call_instruction: true
1396   mir_op: StringConvertCase
1398 # Calls the ToUpperCase case conversion function. Inlines the case conversion
1399 # when possible.
1400 - name: CharCodeToUpperCase
1401   result_type: WordSized
1402   operands:
1403     code: WordSized
1404   num_temps: 1
1405   mir_op: CharCodeConvertCase
1407 # Index of first non-whitespace character.
1408 - name: StringTrimStartIndex
1409   result_type: WordSized
1410   operands:
1411     string: WordSized
1413 # Index of last non-whitespace character.
1414 - name: StringTrimEndIndex
1415   result_type: WordSized
1416   operands:
1417     string: WordSized
1418     start: WordSized
1420 - name: StringSplit
1421   result_type: WordSized
1422   operands:
1423     string: WordSized
1424     separator: WordSized
1425   call_instruction: true
1426   mir_op: true
1428 - name: Substr
1429   result_type: WordSized
1430   operands:
1431     string: WordSized
1432     begin: WordSized
1433     length: WordSized
1434   num_temps: 3
1435   mir_op: true
1437 - name: Int32ToDouble
1438   result_type: WordSized
1439   operands:
1440     input: WordSized
1442 - name: Float32ToDouble
1443   result_type: WordSized
1444   operands:
1445     input: WordSized
1447 - name: DoubleToFloat32
1448   result_type: WordSized
1449   operands:
1450     input: WordSized
1452 - name: Int32ToFloat32
1453   result_type: WordSized
1454   operands:
1455     input: WordSized
1457 # Convert a value to a double.
1458 - name: ValueToDouble
1459   result_type: WordSized
1460   operands:
1461     input: BoxedValue
1462   mir_op: ToDouble
1464 # Convert a value to a float32.
1465 - name: ValueToFloat32
1466   result_type: WordSized
1467   operands:
1468     input: BoxedValue
1469   mir_op: ToFloat32
1471 - name: ValueToInt32
1472   gen_boilerplate: false
1474 # Convert a value to a BigInt.
1475 - name: ValueToBigInt
1476   result_type: WordSized
1477   operands:
1478     input: BoxedValue
1479   mir_op: ToBigInt
1481 # Convert a double to an int32.
1482 #   Input: floating-point Register
1483 #   Output: 32-bit integer
1484 #   Bailout: if the double cannot be converted to an integer.
1485 - name: DoubleToInt32
1486   result_type: WordSized
1487   operands:
1488     in: WordSized
1489   mir_op: ToNumberInt32
1491 # Convert a float32 to an int32.
1492 #   Input: floating-point Register
1493 #   Output: 32-bit integer
1494 #   Bailout: if the float32 cannot be converted to an integer.
1495 - name: Float32ToInt32
1496   result_type: WordSized
1497   operands:
1498     in: WordSized
1499   mir_op: ToNumberInt32
1501 # Convert a double to a truncated int32.
1502 #   Input: floating-point Register
1503 #   Output: 32-bit integer
1504 - name: TruncateDToInt32
1505   result_type: WordSized
1506   operands:
1507     in: WordSized
1508   num_temps: 1
1509   mir_op: TruncateToInt32
1511 # Convert a double to a truncated int32 with instance offset because we need it
1512 # for the slow ool path.
1513 - name: WasmBuiltinTruncateDToInt32
1514   result_type: WordSized
1515   operands:
1516     in: WordSized
1517     instance: WordSized
1518   num_temps: 1
1519   mir_op: WasmBuiltinTruncateToInt32
1521 # Convert a float32 to a truncated int32.
1522 #   Input: floating-point Register
1523 #   Output: 32-bit integer
1524 - name: TruncateFToInt32
1525   result_type: WordSized
1526   operands:
1527     in: WordSized
1528   num_temps: 1
1529   mir_op: TruncateToInt32
1531 # Convert a float32 to a truncated int32 with instance offset because we need
1532 # it for the slow ool path.
1533 - name: WasmBuiltinTruncateFToInt32
1534   result_type: WordSized
1535   operands:
1536     in: WordSized
1537     instance: WordSized
1538   num_temps: 1
1539   mir_op: WasmBuiltinTruncateToInt32
1541 - name: WasmTruncateToInt32
1542   result_type: WordSized
1543   operands:
1544     input: WordSized
1545   mir_op: true
1547 - name: WrapInt64ToInt32
1548   result_type: WordSized
1549   operands:
1550     input: Int64
1551   mir_op: true
1553 - name: ExtendInt32ToInt64
1554   result_type: Int64
1555   operands:
1556     input: WordSized
1557   mir_op: true
1559 # Convert a boolean value to a string.
1560 - name: BooleanToString
1561   result_type: WordSized
1562   operands:
1563     input: WordSized
1564   mir_op: ToString
1566 # Convert an integer hosted on one definition to a string with a function call.
1567 - name: IntToString
1568   result_type: WordSized
1569   operands:
1570     input: WordSized
1571   mir_op: ToString
1573 # Convert a double hosted on one definition to a string with a function call.
1574 - name: DoubleToString
1575   result_type: WordSized
1576   operands:
1577     input: WordSized
1578   num_temps: 1
1579   mir_op: ToString
1581 # Convert a primitive to a string with a function call.
1582 - name: ValueToString
1583   result_type: WordSized
1584   operands:
1585     input: BoxedValue
1586   num_temps: 1
1587   mir_op: ToString
1589 - name: PowHalfD
1590   gen_boilerplate: false
1592 - name: NaNToZero
1593   result_type: WordSized
1594   operands:
1595     input: WordSized
1596   num_temps: 1
1597   mir_op: true
1599 - name: OsrEntry
1600   gen_boilerplate: false
1602 # Materialize a Value stored in an interpreter frame for OSR.
1603 - name: OsrValue
1604   result_type: BoxedValue
1605   operands:
1606     entry: WordSized
1607   mir_op: true
1609 # Materialize a JSObject env chain stored in an interpreter frame for OSR.
1610 - name: OsrEnvironmentChain
1611   result_type: WordSized
1612   operands:
1613     entry: WordSized
1614   mir_op: true
1616 # Materialize a JSObject env chain stored in an interpreter frame for OSR.
1617 - name: OsrReturnValue
1618   result_type: BoxedValue
1619   operands:
1620     entry: WordSized
1621   mir_op: true
1623 - name: OsrArgumentsObject
1624   result_type: WordSized
1625   operands:
1626     entry: WordSized
1627   mir_op: true
1629 - name: RegExp
1630   result_type: WordSized
1631   num_temps: 1
1632   mir_op: true
1634 - name: RegExpMatcher
1635   result_type: BoxedValue
1636   operands:
1637     regexp: WordSized
1638     string: WordSized
1639     lastIndex: WordSized
1640   call_instruction: true
1641   mir_op: true
1643 - name: RegExpSearcher
1644   result_type: WordSized
1645   operands:
1646     regexp: WordSized
1647     string: WordSized
1648     lastIndex: WordSized
1649   call_instruction: true
1650   mir_op: true
1652 - name: RegExpSearcherLastLimit
1653   result_type: WordSized
1654   operands:
1655   num_temps: 1
1657 - name: RegExpExecMatch
1658   result_type: BoxedValue
1659   operands:
1660     regexp: WordSized
1661     string: WordSized
1662   call_instruction: true
1663   num_temps: 0
1664   mir_op: true
1666 - name: RegExpExecTest
1667   result_type: WordSized
1668   operands:
1669     regexp: WordSized
1670     string: WordSized
1671   call_instruction: true
1672   num_temps: 0
1673   mir_op: true
1675 - name: RegExpHasCaptureGroups
1676   result_type: WordSized
1677   operands:
1678     regexp: WordSized
1679     input: WordSized
1680   mir_op: true
1682 - name: RegExpPrototypeOptimizable
1683   result_type: WordSized
1684   operands:
1685     object: WordSized
1686   num_temps: 1
1687   mir_op: true
1689 - name: RegExpInstanceOptimizable
1690   result_type: WordSized
1691   operands:
1692     object: WordSized
1693     proto: WordSized
1694   num_temps: 1
1695   mir_op: true
1697 - name: GetFirstDollarIndex
1698   result_type: WordSized
1699   operands:
1700     str: WordSized
1701   num_temps: 3
1703 - name: StringReplace
1704   result_type: WordSized
1705   operands:
1706     string: WordSized
1707     pattern: WordSized
1708     replacement: WordSized
1709   call_instruction: true
1710   mir_op: true
1712 - name: BinaryValueCache
1713   result_type: BoxedValue
1714   operands:
1715     lhs: BoxedValue
1716     rhs: BoxedValue
1717   # Takes two temps: these are intended to be FloatReg0 and FloatReg1
1718   # to allow the actual cache code to safely clobber those values without
1719   # save and restore.
1720   num_temps: 2
1721   mir_op: BinaryCache
1723 - name: BinaryBoolCache
1724   result_type: WordSized
1725   operands:
1726     lhs: BoxedValue
1727     rhs: BoxedValue
1728   # Takes two temps: these are intendend to be FloatReg0 and FloatReg1
1729   # To allow the actual cache code to safely clobber those values without
1730   # save and restore.
1731   num_temps: 2
1732   mir_op: BinaryCache
1734 - name: UnaryCache
1735   result_type: BoxedValue
1736   operands:
1737     input: BoxedValue
1738   mir_op_cast: true
1740 - name: ModuleMetadata
1741   result_type: WordSized
1742   call_instruction: true
1743   mir_op: true
1745 - name: DynamicImport
1746   result_type: WordSized
1747   operands:
1748     specifier: BoxedValue
1749     options: BoxedValue
1750   call_instruction: true
1751   mir_op: true
1753 - name: Lambda
1754   result_type: WordSized
1755   operands:
1756     environmentChain: WordSized
1757   num_temps: 1
1758   mir_op: true
1760 - name: FunctionWithProto
1761   result_type: WordSized
1762   operands:
1763     envChain: WordSized
1764     prototype: WordSized
1765   call_instruction: true
1766   mir_op: true
1768 - name: SetFunName
1769   result_type: WordSized
1770   operands:
1771     fun: WordSized
1772     name: BoxedValue
1773   call_instruction: true
1774   mir_op: true
1776 - name: KeepAliveObject
1777   operands:
1778     object: WordSized
1780 - name: DebugEnterGCUnsafeRegion
1781   num_temps: 1
1783 - name: DebugLeaveGCUnsafeRegion
1784   num_temps: 1
1786 # Load the "slots" member out of a JSObject.
1787 #   Input: JSObject pointer
1788 #   Output: slots pointer
1789 - name: Slots
1790   result_type: WordSized
1791   operands:
1792     object: WordSized
1794 # Load the "elements" member out of a JSObject.
1795 #   Input: JSObject pointer
1796 #   Output: elements pointer
1797 - name: Elements
1798   result_type: WordSized
1799   operands:
1800     object: WordSized
1801   mir_op: true
1803 # Load the initialized length from an elements header.
1804 - name: InitializedLength
1805   result_type: WordSized
1806   operands:
1807     elements: WordSized
1809 # Store to the initialized length in an elements header. Note the input is an
1810 # *index*, one less than the desired initialized length.
1811 - name: SetInitializedLength
1812   operands:
1813     elements: WordSized
1814     index: WordSized
1816 # Load the length from an elements header.
1817 - name: ArrayLength
1818   result_type: WordSized
1819   operands:
1820     elements: WordSized
1822 # Store to the length in an elements header. Note the input is an *index*,
1823 # one less than the desired length.
1824 - name: SetArrayLength
1825   operands:
1826     elements: WordSized
1827     index: WordSized
1829 # Load the "length" property of a function.
1830 - name: FunctionLength
1831   result_type: WordSized
1832   operands:
1833     function: WordSized
1835 # Load the "name" property of a function.
1836 - name: FunctionName
1837   result_type: WordSized
1838   operands:
1839     function: WordSized
1841 - name: GetNextEntryForIterator
1842   result_type: WordSized
1843   operands:
1844     iter: WordSized
1845     result: WordSized
1846   num_temps: 3
1847   mir_op: true
1849 - name: ArrayBufferByteLength
1850   result_type: WordSized
1851   operands:
1852     object: WordSized
1854 - name: ArrayBufferViewLength
1855   result_type: WordSized
1856   operands:
1857     object: WordSized
1858   mir_op: true
1860 # Read the byteOffset of an array buffer view.
1861 - name: ArrayBufferViewByteOffset
1862   result_type: WordSized
1863   operands:
1864     object: WordSized
1866 # Load an array buffer view's elements vector.
1867 - name: ArrayBufferViewElements
1868   result_type: WordSized
1869   operands:
1870     object: WordSized
1872 # Return the element size of a typed array.
1873 - name: TypedArrayElementSize
1874   result_type: WordSized
1875   operands:
1876     object: WordSized
1878 # Read the length of a resizable typed array.
1879 - name: ResizableTypedArrayLength
1880   result_type: WordSized
1881   operands:
1882     object: WordSized
1883   arguments:
1884     synchronization: js::jit::Synchronization
1885   num_temps: 1
1887 # Read the possibly out-of-bounds byteOffset of a resizable typed array.
1888 - name: ResizableTypedArrayByteOffsetMaybeOutOfBounds
1889   result_type: WordSized
1890   operands:
1891     object: WordSized
1892   num_temps: 1
1894 # Read the byte length of a resizable data view.
1895 - name: ResizableDataViewByteLength
1896   result_type: WordSized
1897   operands:
1898     object: WordSized
1899   arguments:
1900     synchronization: js::jit::Synchronization
1901   num_temps: 1
1903 # Read the byte length of a growable shared array buffer.
1904 - name: GrowableSharedArrayBufferByteLength
1905   result_type: WordSized
1906   operands:
1907     object: WordSized
1909 # Guard a resizable array buffer view is in-bounds.
1910 - name: GuardResizableArrayBufferViewInBounds
1911   operands:
1912     object: WordSized
1913   num_temps: 1
1915 # Guard a resizable array buffer view is in-bounds.
1916 - name: GuardResizableArrayBufferViewInBoundsOrDetached
1917   operands:
1918     object: WordSized
1919   num_temps: 1
1921 - name: GuardHasAttachedArrayBuffer
1922   operands:
1923     object: WordSized
1924   num_temps: 1
1926 # Double to IntPtr, eligible for accessing into a TypedArray or DataView. If
1927 # the index isn't exactly representable as an IntPtr, depending on the
1928 # supportOOB flag on the MIR instruction, either bail out or produce an IntPtr
1929 # which is equivalent to an OOB access.
1930 - name: GuardNumberToIntPtrIndex
1931   result_type: WordSized
1932   operands:
1933     object: WordSized
1934   mir_op: true
1936 # Bailout if index >= length.
1937 - name: BoundsCheck
1938   operands:
1939     index: WordSized
1940     length: WordSized
1941   mir_op: true
1943 - name: BoundsCheckRange
1944   gen_boilerplate: false
1946 # Bailout if index < minimum.
1947 - name: BoundsCheckLower
1948   operands:
1949     index: WordSized
1950   mir_op: true
1952 - name: SpectreMaskIndex
1953   result_type: WordSized
1954   operands:
1955     index: WordSized
1956     length: WordSized
1957   mir_op: true
1959 - name: LoadElementV
1960   gen_boilerplate: false
1962 - name: InArray
1963   result_type: WordSized
1964   operands:
1965     elements: WordSized
1966     index: WordSized
1967     initLength: WordSized
1968   mir_op: true
1970 - name: GuardElementNotHole
1971   operands:
1972     elements: WordSized
1973     index: WordSized
1975 - name: LoadElementHole
1976   gen_boilerplate: false
1978 - name: StoreElementV
1979   gen_boilerplate: false
1981 - name: StoreElementT
1982   gen_boilerplate: false
1984 - name: StoreHoleValueElement
1985   operands:
1986     elements: WordSized
1987     index: WordSized
1989 # Like LStoreElementV, but supports indexes >= initialized length.
1990 - name: StoreElementHoleV
1991   operands:
1992     object: WordSized
1993     elements: WordSized
1994     index: WordSized
1995     value: BoxedValue
1996   num_temps: 1
1997   mir_op: StoreElementHole
1999 # Like LStoreElementT, but supports indexes >= initialized length.
2000 - name: StoreElementHoleT
2001   operands:
2002     object: WordSized
2003     elements: WordSized
2004     index: WordSized
2005     value: WordSized
2006   num_temps: 1
2007   mir_op: StoreElementHole
2009 - name: ArrayPopShift
2010   gen_boilerplate: false
2012 - name: ArrayPush
2013   result_type: WordSized
2014   operands:
2015     object: WordSized
2016     value: BoxedValue
2017   num_temps: 2
2018   mir_op: true
2020 - name: ArraySlice
2021   result_type: WordSized
2022   operands:
2023     object: WordSized
2024     begin: WordSized
2025     end: WordSized
2026   num_temps: 2
2027   call_instruction: true
2028   mir_op: true
2030 - name: ArgumentsSlice
2031   result_type: WordSized
2032   operands:
2033     object: WordSized
2034     begin: WordSized
2035     end: WordSized
2036   num_temps: 2
2037   call_instruction: true
2038   mir_op: true
2040 - name: FrameArgumentsSlice
2041   result_type: WordSized
2042   operands:
2043     begin: WordSized
2044     count: WordSized
2045   num_temps: 1
2046   mir_op: true
2048 - name: InlineArgumentsSlice
2049   gen_boilerplate: false
2051 - name: NormalizeSliceTerm
2052   result_type: WordSized
2053   operands:
2054     value: WordSized
2055     length: WordSized
2056   mir_op: true
2058 - name: ArrayJoin
2059   result_type: WordSized
2060   operands:
2061     array: WordSized
2062     separator: WordSized
2063   num_temps: 1
2064   call_instruction: true
2065   mir_op: true
2067 - name: ObjectKeys
2068   result_type: WordSized
2069   operands:
2070     object: WordSized
2071   num_temps: 0
2072   call_instruction: true
2074 - name: ObjectKeysLength
2075   result_type: WordSized
2076   operands:
2077     object: WordSized
2078   num_temps: 0
2079   call_instruction: true
2081 - name: LoadUnboxedScalar
2082   result_type: WordSized
2083   operands:
2084     elements: WordSized
2085     index: WordSized
2086   num_temps: 1
2087   mir_op: true
2089 - name: LoadUnboxedBigInt
2090   gen_boilerplate: false
2092 - name: LoadDataViewElement
2093   gen_boilerplate: false
2095 - name: LoadTypedArrayElementHole
2096   result_type: BoxedValue
2097   operands:
2098     elements: WordSized
2099     index: WordSized
2100     length: WordSized
2101   mir_op: true
2103 - name: LoadTypedArrayElementHoleBigInt
2104   gen_boilerplate: false
2106 - name: StoreUnboxedScalar
2107   operands:
2108     elements: WordSized
2109     index: WordSized
2110     value: WordSized
2111   mir_op: true
2113 - name: StoreUnboxedBigInt
2114   gen_boilerplate: false
2116 - name: StoreDataViewElement
2117   gen_boilerplate: false
2119 - name: StoreTypedArrayElementHole
2120   operands:
2121     elements: WordSized
2122     length: WordSized
2123     index: WordSized
2124     value: WordSized
2125   num_temps: 1
2126   mir_op: true
2128 - name: StoreTypedArrayElementHoleBigInt
2129   gen_boilerplate: false
2131 - name: AtomicIsLockFree
2132   result_type: WordSized
2133   operands:
2134     value: WordSized
2136 - name: CompareExchangeTypedArrayElement
2137   gen_boilerplate: false
2139 - name: AtomicExchangeTypedArrayElement
2140   gen_boilerplate: false
2142 - name: AtomicTypedArrayElementBinop
2143   gen_boilerplate: false
2145 - name: AtomicTypedArrayElementBinopForEffect
2146   gen_boilerplate: false
2148 - name: AtomicLoad64
2149   gen_boilerplate: false
2151 - name: AtomicStore64
2152   gen_boilerplate: false
2154 - name: CompareExchangeTypedArrayElement64
2155   gen_boilerplate: false
2157 - name: AtomicExchangeTypedArrayElement64
2158   gen_boilerplate: false
2160 - name: AtomicTypedArrayElementBinop64
2161   gen_boilerplate: false
2163 - name: AtomicTypedArrayElementBinopForEffect64
2164   gen_boilerplate: false
2166 - name: EffectiveAddress
2167   result_type: WordSized
2168   operands:
2169     base: WordSized
2170     index: WordSized
2171   mir_op: true
2173 - name: ClampIToUint8
2174   result_type: WordSized
2175   operands:
2176     input: WordSized
2178 - name: ClampDToUint8
2179   result_type: WordSized
2180   operands:
2181     in: WordSized
2182   num_temps: 1
2184 - name: ClampVToUint8
2185   result_type: WordSized
2186   operands:
2187     input: BoxedValue
2188   num_temps: 1
2189   mir_op: ClampToUint8
2191 - name: LoadScriptedProxyHandler
2192   result_type: WordSized
2193   operands:
2194     object: WordSized
2195   mir_op: true
2197 #ifdef JS_PUNBOX64
2198 - name: CheckScriptedProxyGetResult
2199   operands:
2200     target: BoxedValue
2201     id: BoxedValue
2202     value: BoxedValue
2203   num_temps: 2
2204   mir_op: true
2205 #endif
2207 - name: IdToStringOrSymbol
2208   result_type: BoxedValue
2209   operands:
2210     id: BoxedValue
2211   num_temps: 1
2212   mir_op: true
2214 # Load a boxed value from an object's fixed slot.
2215 - name: LoadFixedSlotV
2216   result_type: BoxedValue
2217   operands:
2218     object: WordSized
2219   mir_op: LoadFixedSlot
2221 # Load a boxed value from an object's fixed slot.
2222 # If it is a non-atom string, atomize it and update the slot.
2223 - name: LoadFixedSlotAndAtomize
2224   result_type: BoxedValue
2225   operands:
2226     object: WordSized
2227   num_temps: 1
2228   mir_op: LoadFixedSlot
2230 # Load a typed value from an object's fixed slot.
2231 - name: LoadFixedSlotT
2232   result_type: WordSized
2233   operands:
2234     object: WordSized
2235   mir_op: LoadFixedSlot
2237 - name: LoadFixedSlotAndUnbox
2238   result_type: WordSized
2239   operands:
2240     object: WordSized
2241   mir_op: true
2243 - name: LoadDynamicSlotAndUnbox
2244   result_type: WordSized
2245   operands:
2246     slots: WordSized
2247   mir_op: true
2249 - name: LoadElementAndUnbox
2250   result_type: WordSized
2251   operands:
2252     elements: WordSized
2253     index: WordSized
2254   mir_op: true
2256 - name: LoadFixedSlotUnboxAndAtomize
2257   result_type: WordSized
2258   operands:
2259     object: WordSized
2260   mir_op: LoadFixedSlotAndUnbox
2262 - name: LoadDynamicSlotUnboxAndAtomize
2263   result_type: WordSized
2264   operands:
2265     slots: WordSized
2266   mir_op: LoadDynamicSlotAndUnbox
2268 - name: AddAndStoreSlot
2269   operands:
2270     object: WordSized
2271     value: BoxedValue
2272   num_temps: 1
2273   mir_op: true
2275 - name: AllocateAndStoreSlot
2276   operands:
2277     object: WordSized
2278     value: BoxedValue
2279   num_temps: 2
2280   call_instruction: true
2281   mir_op: true
2283 - name: AddSlotAndCallAddPropHook
2284   operands:
2285     object: WordSized
2286     value: BoxedValue
2287   call_instruction: true
2288   mir_op: true
2290 # Store a boxed value to an object's fixed slot.
2291 - name: StoreFixedSlotV
2292   operands:
2293     obj: WordSized
2294     value: BoxedValue
2295   mir_op: StoreFixedSlot
2297 # Store a typed value to an object's fixed slot.
2298 - name: StoreFixedSlotT
2299   operands:
2300     obj: WordSized
2301     value: WordSized
2302   mir_op: StoreFixedSlot
2304 # Note, Name ICs always return a Value. There are no V/T variants.
2305 - name: GetNameCache
2306   result_type: BoxedValue
2307   operands:
2308     envObj: WordSized
2309   num_temps: 1
2310   mir_op: true
2312 - name: CallGetIntrinsicValue
2313   result_type: BoxedValue
2314   call_instruction: true
2315   mir_op: true
2317 - name: GetPropSuperCache
2318   result_type: BoxedValue
2319   operands:
2320     obj: WordSized
2321     receiver: BoxedValue
2322     id: BoxedValue
2323   mir_op: true
2325 # Patchable jump to stubs generated for a GetProperty cache, which loads a
2326 # boxed value.
2327 - name: GetPropertyCache
2328   result_type: BoxedValue
2329   operands:
2330     value: BoxedValue
2331     id: BoxedValue
2332   mir_op: true
2334 - name: BindNameCache
2335   result_type: WordSized
2336   operands:
2337     environmentChain: WordSized
2338   num_temps: 1
2339   mir_op: true
2341 - name: CallBindVar
2342   result_type: WordSized
2343   operands:
2344     environmentChain: WordSized
2345   mir_op: true
2347 # Load a value from an object's dslots or a slots vector.
2348 - name: LoadDynamicSlotV
2349   result_type: BoxedValue
2350   operands:
2351     in: WordSized
2352   mir_op: LoadDynamicSlot
2354 # Load a value from an object's dslots or a slots vector.
2355 # If it is a non-atom string, atomize it and update the slot.
2356 - name: LoadDynamicSlotAndAtomize
2357   result_type: BoxedValue
2358   operands:
2359     in: WordSized
2360   num_temps: 1
2361   mir_op: LoadDynamicSlot
2363 # Store a value to an object's dslots or a slots vector.
2364 - name: StoreDynamicSlotV
2365   operands:
2366     slots: WordSized
2367     value: BoxedValue
2368   mir_op: StoreDynamicSlot
2370 # Store a typed value to an object's dslots or a slots vector. This has a
2371 # few advantages over LStoreDynamicSlotV:
2372 # 1) We can bypass storing the type tag if the slot has the same type as
2373 #    the value.
2374 # 2) Better Register allocation: we can store constants and FP regs directly
2375 #    without requiring a second Register for the value.
2376 - name: StoreDynamicSlotT
2377   operands:
2378     slots: WordSized
2379     value: WordSized
2380   mir_op: StoreDynamicSlot
2382 # Read length field of a JSString*.
2383 - name: StringLength
2384   result_type: WordSized
2385   operands:
2386     string: WordSized
2388 # Take the floor of a double precision number and converts it to an int32.
2389 # Implements Math.floor().
2390 - name: Floor
2391   result_type: WordSized
2392   operands:
2393     num: WordSized
2395 # Take the floor of a single precision number and converts it to an int32.
2396 # Implements Math.floor().
2397 - name: FloorF
2398   result_type: WordSized
2399   operands:
2400     num: WordSized
2402 # Take the ceiling of a double precision number and converts it to an int32.
2403 # Implements Math.ceil().
2404 - name: Ceil
2405   result_type: WordSized
2406   operands:
2407     num: WordSized
2409 # Take the ceiling of a single precision number and converts it to an int32.
2410 # Implements Math.ceil().
2411 - name: CeilF
2412   result_type: WordSized
2413   operands:
2414     string: WordSized
2416 # Round a double precision number and converts it to an int32.
2417 # Implements Math.round().
2418 - name: Round
2419   result_type: WordSized
2420   operands:
2421     num: WordSized
2422   num_temps: 1
2423   mir_op: true
2425 # Round a single precision number and converts it to an int32.
2426 # Implements Math.round().
2427 - name: RoundF
2428   result_type: WordSized
2429   operands:
2430     num: WordSized
2431   num_temps: 1
2432   mir_op: Round
2434 # Truncates a double precision number and converts it to an int32.
2435 # Implements Math.trunc().
2436 - name: Trunc
2437   result_type: WordSized
2438   operands:
2439     num: WordSized
2441 # Truncates a single precision number and converts it to an int32.
2442 # Implements Math.trunc().
2443 - name: TruncF
2444   result_type: WordSized
2445   operands:
2446     num: WordSized
2448 # Rounds a double precision number accordingly to mir()->roundingMode(),
2449 # and keeps a double output.
2450 - name: NearbyInt
2451   result_type: WordSized
2452   operands:
2453     num: WordSized
2454   mir_op: true
2456 # Rounds a single precision number accordingly to mir()->roundingMode(),
2457 # and keeps a single output.
2458 - name: NearbyIntF
2459   result_type: WordSized
2460   operands:
2461     num: WordSized
2462   mir_op: NearbyInt
2464 # Load a function's call environment.
2465 - name: FunctionEnvironment
2466   result_type: WordSized
2467   operands:
2468     function: WordSized
2470 - name: HomeObject
2471   result_type: WordSized
2472   operands:
2473     function: WordSized
2475 - name: HomeObjectSuperBase
2476   result_type: BoxedValue
2477   operands:
2478     homeObject: WordSized
2480 - name: NewLexicalEnvironmentObject
2481   result_type: WordSized
2482   num_temps: 1
2483   mir_op: true
2485 - name: NewClassBodyEnvironmentObject
2486   result_type: WordSized
2487   num_temps: 1
2488   mir_op: true
2490 - name: NewVarEnvironmentObject
2491   result_type: WordSized
2492   num_temps: 1
2493   mir_op: true
2495 - name: MegamorphicSetElement
2496   operands:
2497     object: WordSized
2498     index: BoxedValue
2499     value: BoxedValue
2500   # On x86 we do not have enough registers to use 3 temps for this *and* take
2501   # five words worth of operands. Since it's 32-bit, though, we get two
2502   # registers from pushing `value`, which doesn't get used until the end
2503   # anyway. This is somewhat klunky, but oh well.
2504 #ifdef JS_CODEGEN_X86
2505   num_temps: 1
2506 #else
2507   num_temps: 3
2508 #endif
2509   call_instruction: true
2510   mir_op: true
2512 - name: CallDeleteProperty
2513   result_type: WordSized
2514   operands:
2515     value: BoxedValue
2516   call_instruction: true
2517   mir_op: DeleteProperty
2519 - name: CallDeleteElement
2520   result_type: WordSized
2521   operands:
2522     value: BoxedValue
2523     index: BoxedValue
2524   call_instruction: true
2525   mir_op: DeleteElement
2527 - name: ObjectToIterator
2528   result_type: WordSized
2529   operands:
2530     object: WordSized
2531   num_temps: 3
2532   mir_op: true
2534 - name: ValueToIterator
2535   result_type: WordSized
2536   operands:
2537     value: BoxedValue
2538   call_instruction: true
2539   mir_op: ValueToIterator
2541 - name: IteratorHasIndicesAndBranch
2542   gen_boilerplate: false
2544 - name: LoadSlotByIteratorIndex
2545   result_type: BoxedValue
2546   operands:
2547     object: WordSized
2548     iterator: WordSized
2550   num_temps: 2
2552 - name: StoreSlotByIteratorIndex
2553   operands:
2554     object: WordSized
2555     iterator: WordSized
2556     value: BoxedValue
2557   num_temps: 2
2558   mir_op: true
2560 # Patchable jump to stubs generated for a SetProperty cache.
2561 - name: SetPropertyCache
2562   operands:
2563     object: WordSized
2564     id: BoxedValue
2565     value: BoxedValue
2566   # Takes an additional temp: this is intendend to be FloatReg0 to allow the
2567   # actual cache code to safely clobber that value without save and restore.
2568   num_temps: 2
2569   mir_op: true
2571 - name: GetIteratorCache
2572   result_type: WordSized
2573   operands:
2574     value: BoxedValue
2575   num_temps: 2
2576   mir_op: true
2578 - name: OptimizeSpreadCallCache
2579   result_type: BoxedValue
2580   operands:
2581     value: BoxedValue
2582   num_temps: 1
2583   mir_op: true
2585 - name: IteratorMore
2586   result_type: BoxedValue
2587   operands:
2588     iterator: WordSized
2589   num_temps: 1
2590   mir_op: true
2592 - name: IsNoIterAndBranch
2593   gen_boilerplate: false
2595 - name: IteratorEnd
2596   operands:
2597     object: WordSized
2598   num_temps: 3
2599   mir_op: true
2601 - name: CloseIterCache
2602   operands:
2603     iter: WordSized
2604   num_temps: 1
2605   mir_op: true
2607 - name: OptimizeGetIteratorCache
2608   result_type: WordSized
2609   operands:
2610     value: BoxedValue
2611   num_temps: 1
2612   mir_op: true
2614 # Read the number of actual arguments.
2615 - name: ArgumentsLength
2616   result_type: WordSized
2618 # Load a value from the actual arguments.
2619 - name: GetFrameArgument
2620   result_type: BoxedValue
2621   operands:
2622     index: WordSized
2624 # Load a value from the actual arguments.
2625 # Returns undefined if |index| is larger-or-equals to |length|. Bails out if
2626 # |index| is negative.
2627 - name: GetFrameArgumentHole
2628   result_type: BoxedValue
2629   operands:
2630     index: WordSized
2631     length: WordSized
2632   num_temps: 1
2634 # Create the rest parameter.
2635 - name: Rest
2636   result_type: WordSized
2637   operands:
2638     numActuals: WordSized
2639   num_temps: 4
2640   call_instruction: true
2641   mir_op: true
2643 - name: Int32ToIntPtr
2644   result_type: WordSized
2645   operands:
2646     input: WordSized
2647   mir_op: true
2649 - name: NonNegativeIntPtrToInt32
2650   result_type: WordSized
2651   operands:
2652     input: WordSized
2654 - name: IntPtrToDouble
2655   result_type: WordSized
2656   operands:
2657     input: WordSized
2659 - name: AdjustDataViewLength
2660   result_type: WordSized
2661   operands:
2662     input: WordSized
2663   mir_op: true
2665 # Convert a Boolean to an Int64, following ToBigInt.
2666 - name: BooleanToInt64
2667   result_type: Int64
2668   operands:
2669     input: WordSized
2670   mir_op: ToInt64
2672 # Convert a String to an Int64, following ToBigInt.
2673 - name: StringToInt64
2674   result_type: Int64
2675   operands:
2676     input: WordSized
2677   mir_op: ToInt64
2679 # Simulate ToBigInt on a Value and produce a matching Int64.
2680 - name: ValueToInt64
2681   result_type: Int64
2682   operands:
2683     input: BoxedValue
2684   num_temps: 1
2685   mir_op: ToInt64
2687 # Truncate a BigInt to an unboxed int64.
2688 - name: TruncateBigIntToInt64
2689   result_type: Int64
2690   operands:
2691     input: WordSized
2692   mir_op: true
2694 # Create a new BigInt* from an unboxed int64.
2695 - name: Int64ToBigInt
2696   result_type: WordSized
2697   operands:
2698     input: Int64
2699   num_temps: 1
2700   mir_op: true
2702 # Generational write barrier used when writing an object to another object.
2703 - name: PostWriteBarrierO
2704   operands:
2705     object: WordSized
2706     value: WordSized
2707   num_temps: 1
2708   mir_op: PostWriteBarrier
2710 # Generational write barrier used when writing a string to an object.
2711 - name: PostWriteBarrierS
2712   operands:
2713     object: WordSized
2714     value: WordSized
2715   num_temps: 1
2716   mir_op: PostWriteBarrier
2718 # Generational write barrier used when writing a BigInt to an object.
2719 - name: PostWriteBarrierBI
2720   operands:
2721     object: WordSized
2722     value: WordSized
2723   num_temps: 1
2724   mir_op: PostWriteBarrier
2726 # Generational write barrier used when writing a value to another object.
2727 - name: PostWriteBarrierV
2728   operands:
2729     object: WordSized
2730     value: BoxedValue
2731   num_temps: 1
2732   mir_op: PostWriteBarrier
2734 # Generational write barrier used when writing an object to another object's
2735 # elements.
2736 - name: PostWriteElementBarrierO
2737   operands:
2738     object: WordSized
2739     value: WordSized
2740     index: WordSized
2741   num_temps: 1
2742   mir_op: PostWriteElementBarrier
2744 # Generational write barrier used when writing a string to an object's
2745 # elements.
2746 - name: PostWriteElementBarrierS
2747   operands:
2748     object: WordSized
2749     value: WordSized
2750     index: WordSized
2751   num_temps: 1
2752   mir_op: PostWriteElementBarrier
2754 # Generational write barrier used when writing a BigInt to an object's
2755 # elements.
2756 - name: PostWriteElementBarrierBI
2757   operands:
2758     object: WordSized
2759     value: WordSized
2760     index: WordSized
2761   num_temps: 1
2762   mir_op: PostWriteElementBarrier
2764 # Generational write barrier used when writing a value to another object's
2765 # elements.
2766 - name: PostWriteElementBarrierV
2767   operands:
2768     object: WordSized
2769     index: WordSized
2770     value: BoxedValue
2771   num_temps: 1
2772   mir_op: PostWriteElementBarrier
2774 # Assert in debug mode that a post write barrier can be elided.
2775 - name: AssertCanElidePostWriteBarrier
2776   operands:
2777     object: WordSized
2778     value: BoxedValue
2779   num_temps: 1
2781 # Guard against an object's identity.
2782 - name: GuardObjectIdentity
2783   operands:
2784     input: WordSized
2785     expected: WordSized
2786   mir_op: true
2788 # Guard against an function's identity.
2789 - name: GuardSpecificFunction
2790   operands:
2791     input: WordSized
2792     expected: WordSized
2794 - name: GuardSpecificAtom
2795   operands:
2796     str: WordSized
2797   num_temps: 1
2798   mir_op: true
2800 - name: GuardSpecificSymbol
2801   operands:
2802     symbol: WordSized
2803   mir_op: true
2805 - name: GuardSpecificInt32
2806   operands:
2807     num: WordSized
2808   mir_op: true
2810 - name: GuardStringToIndex
2811   result_type: WordSized
2812   operands:
2813     string: WordSized
2815 - name: GuardStringToInt32
2816   result_type: WordSized
2817   operands:
2818     string: WordSized
2819   num_temps: 1
2821 - name: GuardStringToDouble
2822   result_type: WordSized
2823   operands:
2824     string: WordSized
2825   num_temps: 2
2827 - name: GuardShape
2828   result_type: WordSized
2829   operands:
2830     in: WordSized
2831   num_temps: 1
2832   mir_op: true
2834 - name: GuardMultipleShapes
2835   result_type: WordSized
2836   operands:
2837     object: WordSized
2838     shapeList: WordSized
2839   num_temps: 4
2840   mir_op: true
2842 - name: GuardProto
2843   operands:
2844     object: WordSized
2845     expected: WordSized
2846   num_temps: 1
2848 - name: GuardNullProto
2849   operands:
2850     object: WordSized
2851   num_temps: 1
2853 - name: GuardIsNativeObject
2854   operands:
2855     object: WordSized
2856   num_temps: 1
2858 - name: GuardGlobalGeneration
2859   mir_op: true
2860   num_temps: 1
2862 - name: GuardFuse
2863   mir_op: true
2864   num_temps: 1
2866 - name: GuardIsProxy
2867   operands:
2868     object: WordSized
2869   num_temps: 1
2871 - name: GuardIsNotProxy
2872   operands:
2873     object: WordSized
2874   num_temps: 1
2876 - name: GuardIsNotDOMProxy
2877   operands:
2878     proxy: WordSized
2879   num_temps: 1
2881 - name: ProxyGet
2882   result_type: BoxedValue
2883   operands:
2884     proxy: WordSized
2885   num_temps: 1
2886   call_instruction: true
2887   mir_op: true
2889 - name: ProxyGetByValue
2890   result_type: BoxedValue
2891   operands:
2892     proxy: WordSized
2893     id: BoxedValue
2894   call_instruction: true
2896 - name: ProxyHasProp
2897   result_type: BoxedValue
2898   operands:
2899     proxy: WordSized
2900     id: BoxedValue
2901   call_instruction: true
2902   mir_op: true
2904 - name: ProxySet
2905   operands:
2906     proxy: WordSized
2907     rhs: BoxedValue
2908   num_temps: 1
2909   call_instruction: true
2910   mir_op: true
2912 - name: ProxySetByValue
2913   operands:
2914     proxy: WordSized
2915     id: BoxedValue
2916     rhs: BoxedValue
2917   call_instruction: true
2918   mir_op: true
2920 - name: CallSetArrayLength
2921   operands:
2922     obj: WordSized
2923     rhs: BoxedValue
2924   call_instruction: true
2925   mir_op: true
2927 - name: MegamorphicLoadSlot
2928   result_type: BoxedValue
2929   operands:
2930     object: WordSized
2931   num_temps: 4
2932   call_instruction: true
2933   mir_op: true
2935 - name: MegamorphicLoadSlotByValue
2936   result_type: BoxedValue
2937   operands:
2938     object: WordSized
2939     id: BoxedValue
2940   num_temps: 3
2941   call_instruction: true
2942   mir_op: true
2944 - name: MegamorphicStoreSlot
2945   operands:
2946     object: WordSized
2947     rhs: BoxedValue
2948 #ifdef JS_CODEGEN_X86
2949   num_temps: 1
2950 #else
2951   num_temps: 3
2952 #endif
2953   call_instruction: true
2954   mir_op: true
2956 - name: MegamorphicHasProp
2957   result_type: WordSized
2958   operands:
2959     object: WordSized
2960     id: BoxedValue
2961   num_temps: 3
2962   call_instruction: true
2963   mir_op: true
2965 - name: SmallObjectVariableKeyHasProp
2966   result_type: WordSized
2967   operands:
2968     id: WordSized
2969   num_temps: 0
2970   mir_op: true
2972 - name: GuardIsNotArrayBufferMaybeShared
2973   operands:
2974     object: WordSized
2975   num_temps: 1
2977 - name: GuardIsTypedArray
2978   operands:
2979     object: WordSized
2980   num_temps: 1
2982 - name: GuardIsFixedLengthTypedArray
2983   operands:
2984     object: WordSized
2985   num_temps: 1
2987 - name: GuardIsResizableTypedArray
2988   operands:
2989     object: WordSized
2990   num_temps: 1
2992 - name: GuardHasProxyHandler
2993   operands:
2994     object: WordSized
2995   mir_op: true
2997 - name: GuardNoDenseElements
2998   operands:
2999     in: WordSized
3000   num_temps: 1
3002 - name: InCache
3003   result_type: WordSized
3004   operands:
3005     lhs: BoxedValue
3006     rhs: WordSized
3007   num_temps: 1
3008   mir_op: true
3010 - name: HasOwnCache
3011   result_type: WordSized
3012   operands:
3013     value: BoxedValue
3014     id: BoxedValue
3015   mir_op: true
3017 - name: CheckPrivateFieldCache
3018   result_type: WordSized
3019   operands:
3020     value: BoxedValue
3021     id: BoxedValue
3022   mir_op: true
3024 - name: NewPrivateName
3025   result_type: WordSized
3026   call_instruction: true
3027   mir_op: true
3029 - name: InstanceOfO
3030   result_type: WordSized
3031   operands:
3032     lhs: WordSized
3033     rhs: WordSized
3034   mir_op: InstanceOf
3036 - name: InstanceOfV
3037   result_type: WordSized
3038   operands:
3039     lhs: BoxedValue
3040     rhs: WordSized
3041   mir_op: InstanceOf
3043 - name: InstanceOfCache
3044   gen_boilerplate: false
3046 - name: IsCallableO
3047   result_type: WordSized
3048   operands:
3049     object: WordSized
3050   mir_op: IsCallable
3052 - name: IsCallableV
3053   result_type: WordSized
3054   operands:
3055     object: BoxedValue
3056   num_temps: 1
3057   mir_op: IsCallable
3059 - name: IsConstructor
3060   result_type: WordSized
3061   operands:
3062     object: WordSized
3063   mir_op: true
3065 - name: IsCrossRealmArrayConstructor
3066   result_type: WordSized
3067   operands:
3068     object: WordSized
3070 - name: IsArrayO
3071   result_type: WordSized
3072   operands:
3073     object: WordSized
3074   mir_op: IsArray
3076 - name: IsArrayV
3077   result_type: WordSized
3078   operands:
3079     value: BoxedValue
3080   num_temps: 1
3081   mir_op: IsArray
3083 - name: IsTypedArray
3084   result_type: WordSized
3085   operands:
3086     object: WordSized
3087   mir_op: true
3089 - name: IsObject
3090   result_type: WordSized
3091   operands:
3092     object: BoxedValue
3093   mir_op: true
3095 - name: IsObjectAndBranch
3096   gen_boilerplate: false
3098 - name: IsNullOrUndefined
3099   result_type: WordSized
3100   operands:
3101     input: BoxedValue
3102   mir_op: true
3104 - name: IsNullOrUndefinedAndBranch
3105   gen_boilerplate: false
3107 - name: HasClass
3108   result_type: WordSized
3109   operands:
3110     lhs: WordSized
3111   mir_op: true
3113 - name: GuardToClass
3114   result_type: WordSized
3115   operands:
3116     lhs: WordSized
3117   num_temps: 1
3118   mir_op: true
3120 - name: GuardToEitherClass
3121   result_type: WordSized
3122   operands:
3123     lhs: WordSized
3124   num_temps: 1
3125   mir_op: true
3127 - name: GuardToFunction
3128   result_type: WordSized
3129   operands:
3130     lhs: WordSized
3131   num_temps: 1
3132   mir_op: true
3134 - name: ObjectClassToString
3135   result_type: WordSized
3136   operands:
3137     lhs: WordSized
3138   num_temps: 1
3139   call_instruction: true
3140   mir_op: true
3142 - name: WasmSelect
3143   gen_boilerplate: false
3145 - name: WasmSelectI64
3146   gen_boilerplate: false
3148 - name: WasmCompareAndSelect
3149   gen_boilerplate: false
3151 - name: WasmAddOffset
3152   result_type: WordSized
3153   operands:
3154     base: WordSized
3155   mir_op: true
3157 - name: WasmAddOffset64
3158   result_type: Int64
3159   operands:
3160     base: Int64
3161   mir_op: WasmAddOffset
3163 - name: WasmBoundsCheck
3164   result_type: WordSized
3165   operands:
3166     ptr: WordSized
3167     boundsCheckLimit: WordSized
3168   mir_op: true
3170 - name: WasmBoundsCheck64
3171   gen_boilerplate: false
3173 - name: WasmBoundsCheckRange32
3174   result_type: WordSized
3175   operands:
3176     index: WordSized
3177     length: WordSized
3178     limit: WordSized
3179   mir_op: true
3180   num_temps: 1
3182 - name: WasmExtendU32Index
3183   result_type: WordSized
3184   operands:
3185     input: WordSized
3186   mir_op: true
3188 - name: WasmWrapU32Index
3189   result_type: WordSized
3190   operands:
3191     input: WordSized
3192   mir_op: true
3194 - name: WasmAlignmentCheck
3195   operands:
3196     ptr: WordSized
3197   mir_op: true
3199 - name: WasmAlignmentCheck64
3200   operands:
3201     ptr: Int64
3202   mir_op: WasmAlignmentCheck
3204 - name: WasmLoadInstance
3205   result_type: WordSized
3206   operands:
3207     instance: WordSized
3208   mir_op: true
3210 - name: WasmLoadInstance64
3211   result_type: Int64
3212   operands:
3213     instance: WordSized
3214   mir_op: WasmLoadInstance
3216 - name: WasmHeapReg
3217   result_type: WordSized
3218   mir_op: true
3220 - name: WasmLoad
3221   gen_boilerplate: false
3223 - name: WasmLoadI64
3224   gen_boilerplate: false
3226 - name: WasmStore
3227   gen_boilerplate: false
3229 - name: WasmStoreI64
3230   gen_boilerplate: false
3232 - name: AsmJSLoadHeap
3233   result_type: WordSized
3234   operands:
3235     ptr: WordSized
3236     boundsCheckLimit: WordSized
3237     memoryBase: WordSized
3238   mir_op: true
3240 - name: AsmJSStoreHeap
3241   result_type: WordSized
3242   operands:
3243     ptr: WordSized
3244     value: WordSized
3245     boundsCheckLimit: WordSized
3246     memoryBase: WordSized
3247   mir_op: true
3249 - name: WasmCompareExchangeHeap
3250   gen_boilerplate: false
3252 - name: WasmFence
3254 - name: WasmAtomicExchangeHeap
3255   gen_boilerplate: false
3257 - name: WasmAtomicBinopHeap
3258   gen_boilerplate: false
3260 - name: WasmAtomicBinopHeapForEffect
3261   gen_boilerplate: false
3263 - name: WasmLoadSlot
3264   result_type: WordSized
3265   operands:
3266     containerRef: WordSized
3267   arguments:
3268     offset: size_t
3269     type: MIRType
3270     wideningOp: MWideningOp
3271     maybeTrap: MaybeTrapSiteInfo
3273 - name: WasmLoadElement
3274   result_type: WordSized
3275   operands:
3276     base: WordSized
3277     index: WordSized
3278   arguments:
3279     type: MIRType
3280     wideningOp: MWideningOp
3281     scale: Scale
3282     maybeTrap: MaybeTrapSiteInfo
3283   num_temps: 1
3285 - name: WasmLoadSlotI64
3286   result_type: Int64
3287   operands:
3288     containerRef: WordSized
3289   arguments:
3290     offset: size_t
3291     maybeTrap: MaybeTrapSiteInfo
3293 - name: WasmLoadElementI64
3294   result_type: Int64
3295   operands:
3296     base: WordSized
3297     index: WordSized
3298   arguments:
3299     maybeTrap: MaybeTrapSiteInfo
3301 - name: WasmStoreSlot
3302   operands:
3303     value: WordSized
3304     containerRef: WordSized
3305   arguments:
3306     offset: size_t
3307     type: MIRType
3308     narrowingOp: MNarrowingOp
3309     maybeTrap: MaybeTrapSiteInfo
3311 - name: WasmStoreSlotI64
3312   operands:
3313     value: Int64
3314     containerRef: WordSized
3315   arguments:
3316     offset: size_t
3317     maybeTrap: MaybeTrapSiteInfo
3319 - name: WasmStoreElement
3320   operands:
3321     base: WordSized
3322     index: WordSized
3323     value: WordSized
3324   arguments:
3325     type: MIRType
3326     narrowingOp: MNarrowingOp
3327     scale: Scale
3328     maybeTrap: MaybeTrapSiteInfo
3329   num_temps: 1
3331 - name: WasmStoreElementI64
3332   operands:
3333     base: WordSized
3334     index: WordSized
3335     value: Int64
3336   arguments:
3337     maybeTrap: MaybeTrapSiteInfo
3339 - name: WasmStoreElementRef
3340   operands:
3341     instance: WordSized
3342     base: WordSized
3343     index: WordSized
3344     value: WordSized
3345   arguments:
3346     maybeTrap: MaybeTrapSiteInfo
3347     preBarrierKind: WasmPreBarrierKind
3348   num_temps: 2
3350 - name: WasmLoadTableElement
3351   result_type: WordSized
3352   operands:
3353     elements: WordSized
3354     index: WordSized
3356 - name: WasmDerivedPointer
3357   gen_boilerplate: false
3359 - name: WasmDerivedIndexPointer
3360   gen_boilerplate: false
3362 - name: WasmStoreRef
3363   operands:
3364     instance: WordSized
3365     valueBase: WordSized
3366     value: WordSized
3367   arguments:
3368     offset: uint32_t
3369     maybeTrap: MaybeTrapSiteInfo
3370     preBarrierKind: WasmPreBarrierKind
3371   num_temps: 1
3372   mir_op: true
3374 # Generational write barrier used when writing an object to another object.
3375 - name: WasmPostWriteBarrierImmediate
3376   operands:
3377     instance: WordSized
3378     object: WordSized
3379     valueBase: WordSized
3380     value: WordSized
3381   arguments:
3382     valueOffset: uint32_t
3383   num_temps: 1
3384   mir_op: true
3386 # Ditto, but with a scaled index instead of a constant offset.
3387 - name: WasmPostWriteBarrierIndex
3388   operands:
3389     instance: WordSized
3390     object: WordSized
3391     valueBase: WordSized
3392     index: WordSized
3393     value: WordSized
3394   arguments:
3395     elemSize: uint32_t
3396   num_temps: 1
3397   mir_op: true
3399 - name: WasmParameter
3400   result_type: WordSized
3402 - name: WasmParameterI64
3403   gen_boilerplate: false
3405 - name: WasmReturn
3406   operands:
3407     rval: WordSized
3408     instance: WordSized
3410 - name: WasmReturnI64
3411   operands:
3412     rval: Int64
3413     instance: WordSized
3415 - name: WasmReturnVoid
3416   operands:
3417     rval: WordSized
3419 - name: WasmStackArg
3420   operands:
3421     arg: WordSized
3422   mir_op: true
3424 - name: WasmStackArgI64
3425   operands:
3426     arg: Int64
3427   mir_op: WasmStackArg
3429 - name: WasmNullConstant
3430   result_type: WordSized
3432 - name: WasmCallIndirectAdjunctSafepoint
3433   gen_boilerplate: false
3435 - name: WasmCall
3436   gen_boilerplate: false
3438 - name: WasmCallLandingPrePad
3439   mir_op: true
3441 - name: WasmRegisterResult
3442   gen_boilerplate: false
3444 - name: WasmRegisterPairResult
3445   gen_boilerplate: false
3447 - name: WasmStackResultArea
3448   result_type: WordSized
3449   num_temps: 1
3450   mir_op: true
3452 - name: WasmStackResult
3453   gen_boilerplate: false
3455 - name: WasmStackResult64
3456   gen_boilerplate: false
3458 - name: AssertRangeI
3459   gen_boilerplate: false
3461 - name: AssertRangeD
3462   gen_boilerplate: false
3464 - name: AssertRangeF
3465   gen_boilerplate: false
3467 - name: AssertRangeV
3468   gen_boilerplate: false
3470 - name: AssertClass
3471   operands:
3472     input: WordSized
3473   num_temps: 1
3474   mir_op: true
3476 - name: AssertShape
3477   operands:
3478     input: WordSized
3479   mir_op: true
3481 - name: GuardValue
3482   operands:
3483     input: BoxedValue
3484   mir_op: true
3486 - name: GuardNullOrUndefined
3487   operands:
3488     input: BoxedValue
3489   mir_op: true
3491 - name: GuardIsNotObject
3492   operands:
3493     input: BoxedValue
3494   mir_op: true
3496 - name: GuardFunctionFlags
3497   operands:
3498     function: WordSized
3499   mir_op: true
3501 - name: GuardFunctionIsNonBuiltinCtor
3502   operands:
3503     function: WordSized
3504   num_temps: 1
3506 - name: GuardFunctionKind
3507   operands:
3508     function: WordSized
3509   num_temps: 1
3510   mir_op: true
3512 - name: GuardFunctionScript
3513   operands:
3514     function: WordSized
3515   mir_op: true
3517 - name: IncrementWarmUpCounter
3518   num_temps: 1
3519   mir_op: true
3521 - name: LexicalCheck
3522   operands:
3523     input: BoxedValue
3524   mir_op: true
3526 - name: ThrowRuntimeLexicalError
3527   call_instruction: true
3528   mir_op: true
3530 - name: ThrowMsg
3531   call_instruction: true
3532   mir_op: true
3534 - name: GlobalDeclInstantiation
3535   mir_op: true
3537 - name: MemoryBarrier
3538   gen_boilerplate: false
3540 - name: Debugger
3541   num_temps: 1
3542   call_instruction: true
3544 - name: NewTarget
3545   result_type: BoxedValue
3547 - name: Random
3548   gen_boilerplate: false
3550 - name: CheckReturn
3551   result_type: BoxedValue
3552   operands:
3553     returnValue: BoxedValue
3554     thisValue: BoxedValue
3556 - name: CheckIsObj
3557   result_type: WordSized
3558   operands:
3559     value: BoxedValue
3560   mir_op: true
3562 - name: CheckObjCoercible
3563   operands:
3564     value: BoxedValue
3566 - name: CheckClassHeritage
3567   operands:
3568     heritage: BoxedValue
3569   num_temps: 2
3571 - name: CheckThis
3572   operands:
3573     value: BoxedValue
3575 - name: CheckThisReinit
3576   operands:
3577     thisValue: BoxedValue
3579 - name: Generator
3580   result_type: WordSized
3581   operands:
3582     callee: WordSized
3583     environmentChain: WordSized
3584     argsObject: WordSized
3585   call_instruction: true
3586   mir_op: true
3588 - name: AsyncResolve
3589   result_type: WordSized
3590   operands:
3591     generator: WordSized
3592     value: BoxedValue
3593   call_instruction: true
3594   mir_op: true
3596 - name: AsyncReject
3597   result_type: WordSized
3598   operands:
3599     generator: WordSized
3600     reason: BoxedValue
3601     stack: BoxedValue
3602   call_instruction: true
3603   mir_op: true
3605 - name: AsyncAwait
3606   result_type: WordSized
3607   operands:
3608     value: BoxedValue
3609     generator: WordSized
3610   call_instruction: true
3611   mir_op: true
3613 - name: CanSkipAwait
3614   result_type: WordSized
3615   operands:
3616     value: BoxedValue
3617   call_instruction: true
3618   mir_op: true
3620 - name: MaybeExtractAwaitValue
3621   result_type: BoxedValue
3622   operands:
3623     value: BoxedValue
3624     canSkip: WordSized
3625   call_instruction: true
3626   mir_op: true
3628 - name: DebugCheckSelfHosted
3629   operands:
3630     value: BoxedValue
3631   call_instruction: true
3633 - name: IsPackedArray
3634   result_type: WordSized
3635   operands:
3636     object: WordSized
3637   num_temps: 1
3639 - name: GuardArrayIsPacked
3640   operands:
3641     array: WordSized
3642   num_temps: 2
3643   mir_op: true
3645 - name: GetPrototypeOf
3646   result_type: BoxedValue
3647   operands:
3648     target: WordSized
3650 - name: ObjectWithProto
3651   result_type: WordSized
3652   operands:
3653     prototype: BoxedValue
3654   call_instruction: true
3656 - name: ObjectStaticProto
3657   result_type: WordSized
3658   operands:
3659     object: WordSized
3661 - name: BuiltinObject
3662   result_type: WordSized
3663   call_instruction: true
3664   mir_op: true
3666 - name: SuperFunction
3667   result_type: BoxedValue
3668   operands:
3669     callee: WordSized
3670   num_temps: 1
3672 - name: InitHomeObject
3673   result_type: WordSized
3674   operands:
3675     function: WordSized
3676     homeObject: BoxedValue
3678 - name: IsTypedArrayConstructor
3679   result_type: WordSized
3680   operands:
3681     object: WordSized
3683 - name: LoadValueTag
3684   result_type: WordSized
3685   operands:
3686     value: BoxedValue
3688 - name: GuardTagNotEqual
3689   operands:
3690     lhs: WordSized
3691     rhs: WordSized
3693 - name: LoadWrapperTarget
3694   result_type: WordSized
3695   operands:
3696     object: WordSized
3697   mir_op: true
3699 - name: GuardHasGetterSetter
3700   operands:
3701     object: WordSized
3702   num_temps: 3
3703   call_instruction: true
3704   mir_op: true
3706 - name: GuardIsExtensible
3707   operands:
3708     object: WordSized
3709   num_temps: 1
3711 - name: GuardInt32IsNonNegative
3712   operands:
3713     index: WordSized
3715 - name: GuardInt32Range
3716   operands:
3717     input: WordSized
3718   mir_op: true
3720 - name: GuardIndexIsNotDenseElement
3721   operands:
3722     object: WordSized
3723     index: WordSized
3724   num_temps: 2
3726 - name: GuardIndexIsValidUpdateOrAdd
3727   operands:
3728     object: WordSized
3729     index: WordSized
3730   num_temps: 2
3732 - name: CallAddOrUpdateSparseElement
3733   operands:
3734     object: WordSized
3735     index: WordSized
3736     value: BoxedValue
3737   call_instruction: true
3738   mir_op: true
3740 - name: CallGetSparseElement
3741   result_type: BoxedValue
3742   operands:
3743     object: WordSized
3744     index: WordSized
3745   call_instruction: true
3747 - name: CallNativeGetElement
3748   result_type: BoxedValue
3749   operands:
3750     object: WordSized
3751     index: WordSized
3752   call_instruction: true
3754 - name: CallNativeGetElementSuper
3755   result_type: BoxedValue
3756   operands:
3757     object: WordSized
3758     index: WordSized
3759     receiver: BoxedValue
3760   call_instruction: true
3762 - name: CallObjectHasSparseElement
3763   result_type: WordSized
3764   operands:
3765     object: WordSized
3766     index: WordSized
3767   num_temps: 2
3768   call_instruction: true
3770 - name: BigIntAsIntN
3771   result_type: WordSized
3772   operands:
3773     bits: WordSized
3774     input: WordSized
3775   call_instruction: true
3777 - name: BigIntAsIntN64
3778   gen_boilerplate: false
3780 - name: BigIntAsIntN32
3781   gen_boilerplate: false
3783 - name: GuardNonGCThing
3784   operands:
3785     input: BoxedValue
3787 - name: ToHashableNonGCThing
3788   result_type: BoxedValue
3789   operands:
3790     input: BoxedValue
3791   num_temps: 1
3793 - name: ToHashableString
3794   result_type: WordSized
3795   operands:
3796     input: WordSized
3798 - name: ToHashableValue
3799   result_type: BoxedValue
3800   operands:
3801     input: BoxedValue
3802   num_temps: 1
3804 - name: HashNonGCThing
3805   result_type: WordSized
3806   operands:
3807     input: BoxedValue
3808   num_temps: 1
3810 - name: HashString
3811   result_type: WordSized
3812   operands:
3813     input: WordSized
3814   num_temps: 1
3816 - name: HashSymbol
3817   result_type: WordSized
3818   operands:
3819     input: WordSized
3821 - name: HashBigInt
3822   result_type: WordSized
3823   operands:
3824     input: WordSized
3825   num_temps: 3
3827 - name: HashObject
3828   result_type: WordSized
3829   operands:
3830     setObject: WordSized
3831     input: BoxedValue
3832   num_temps: 4
3834 - name: HashValue
3835   result_type: WordSized
3836   operands:
3837     setObject: WordSized
3838     input: BoxedValue
3839   num_temps: 4
3841 - name: SetObjectHasNonBigInt
3842   result_type: WordSized
3843   operands:
3844     setObject: WordSized
3845     input: BoxedValue
3846     hash: WordSized
3847   num_temps: 2
3849 - name: SetObjectHasBigInt
3850   result_type: WordSized
3851   operands:
3852     setObject: WordSized
3853     input: BoxedValue
3854     hash: WordSized
3855   num_temps: 4
3857 - name: SetObjectHasValue
3858   result_type: WordSized
3859   operands:
3860     setObject: WordSized
3861     input: BoxedValue
3862     hash: WordSized
3863   num_temps: 4
3865 - name: SetObjectHasValueVMCall
3866   result_type: WordSized
3867   call_instruction: true
3868   operands:
3869     setObject: WordSized
3870     input: BoxedValue
3872 - name: SetObjectSize
3873   result_type: WordSized
3874   operands:
3875     setObject: WordSized
3877 - name: MapObjectHasNonBigInt
3878   result_type: WordSized
3879   operands:
3880     mapObject: WordSized
3881     input: BoxedValue
3882     hash: WordSized
3883   num_temps: 2
3885 - name: MapObjectHasBigInt
3886   result_type: WordSized
3887   operands:
3888     mapObject: WordSized
3889     input: BoxedValue
3890     hash: WordSized
3891   num_temps: 4
3893 - name: MapObjectHasValue
3894   result_type: WordSized
3895   operands:
3896     mapObject: WordSized
3897     input: BoxedValue
3898     hash: WordSized
3899   num_temps: 4
3901 - name: MapObjectHasValueVMCall
3902   result_type: WordSized
3903   call_instruction: true
3904   operands:
3905     mapObject: WordSized
3906     input: BoxedValue
3908 - name: MapObjectGetNonBigInt
3909   result_type: BoxedValue
3910   operands:
3911     mapObject: WordSized
3912     input: BoxedValue
3913     hash: WordSized
3914   num_temps: 2
3916 - name: MapObjectGetBigInt
3917   result_type: BoxedValue
3918   operands:
3919     mapObject: WordSized
3920     input: BoxedValue
3921     hash: WordSized
3922   num_temps: 4
3924 - name: MapObjectGetValue
3925   result_type: BoxedValue
3926   operands:
3927     mapObject: WordSized
3928     input: BoxedValue
3929     hash: WordSized
3930   num_temps: 4
3932 - name: MapObjectGetValueVMCall
3933   result_type: BoxedValue
3934   call_instruction: true
3935   operands:
3936     mapObject: WordSized
3937     input: BoxedValue
3939 - name: MapObjectSize
3940   result_type: WordSized
3941   operands:
3942     mapObject: WordSized
3944 - name: BigIntAsUintN
3945   result_type: WordSized
3946   operands:
3947     bits: WordSized
3948     input: WordSized
3949   call_instruction: true
3951 - name: BigIntAsUintN64
3952   gen_boilerplate: false
3954 - name: BigIntAsUintN32
3955   gen_boilerplate: false
3957 - name: IonToWasmCall
3958   gen_boilerplate: false
3960 - name: IonToWasmCallV
3961   gen_boilerplate: false
3963 - name: IonToWasmCallI64
3964   gen_boilerplate: false
3966 - name: WasmAnyRefFromJSValue
3967   result_type: WordSized
3968   operands:
3969     input: BoxedValue
3970   num_temps: 1
3972 - name: WasmAnyRefFromJSObject
3973   result_type: WordSized
3974   operands:
3975     input: WordSized
3977 - name: WasmAnyRefFromJSString
3978   result_type: WordSized
3979   operands:
3980     input: WordSized
3982 - name: WasmNewI31Ref
3983   mir_op: true
3984   result_type: WordSized
3985   operands:
3986     value: WordSized
3988 - name: WasmI31RefGet
3989   mir_op: true
3990   result_type: WordSized
3991   operands:
3992     value: WordSized
3994 # Constant Simd128
3995 - name: Simd128
3996   result_type: WordSized
3997   arguments:
3998     simd128: SimdConstant
4000 - name: WasmTernarySimd128
4001   gen_boilerplate: false
4003 - name: WasmBinarySimd128
4004   gen_boilerplate: false
4006 - name: WasmBinarySimd128WithConstant
4007   gen_boilerplate: false
4009 - name: WasmVariableShiftSimd128
4010   gen_boilerplate: false
4012 - name: WasmConstantShiftSimd128
4013   gen_boilerplate: false
4015 - name: WasmSignReplicationSimd128
4016   gen_boilerplate: false
4018 - name: WasmShuffleSimd128
4019   gen_boilerplate: false
4021 - name: WasmPermuteSimd128
4022   gen_boilerplate: false
4024 - name: WasmReplaceLaneSimd128
4025   gen_boilerplate: false
4027 - name: WasmReplaceInt64LaneSimd128
4028   gen_boilerplate: false
4030 - name: WasmScalarToSimd128
4031   gen_boilerplate: false
4033 - name: WasmInt64ToSimd128
4034   gen_boilerplate: false
4036 - name: WasmUnarySimd128
4037   gen_boilerplate: false
4039 - name: WasmReduceSimd128
4040   gen_boilerplate: false
4042 - name: WasmReduceAndBranchSimd128
4043   gen_boilerplate: false
4045 - name: WasmReduceSimd128ToInt64
4046   gen_boilerplate: false
4048 - name: WasmLoadLaneSimd128
4049   gen_boilerplate: false
4051 - name: WasmStoreLaneSimd128
4052   gen_boilerplate: false
4054 - name: Unbox
4055   gen_boilerplate: false
4057 - name: UnboxFloatingPoint
4058   gen_boilerplate: false
4060 - name: WasmUint32ToDouble
4061   gen_boilerplate: false
4063 - name: WasmUint32ToFloat32
4064   gen_boilerplate: false
4066 - name: DivI
4067   gen_boilerplate: false
4069 - name: ModI
4070   gen_boilerplate: false
4072 - name: DivPowTwoI
4073   gen_boilerplate: false
4075 - name: ModPowTwoI
4076   gen_boilerplate: false
4078 - name: TableSwitch
4079   gen_boilerplate: false
4081 - name: TableSwitchV
4082   gen_boilerplate: false
4084 - name: MulI
4085   gen_boilerplate: false
4087 #ifdef JS_CODEGEN_X86
4088 - name: BoxFloatingPoint
4089   gen_boilerplate: false
4091 - name: DivOrModI64
4092   gen_boilerplate: false
4094 - name: UDivOrModI64
4095   gen_boilerplate: false
4097 - name: DivOrModConstantI
4098   gen_boilerplate: false
4100 - name: UDivOrMod
4101   gen_boilerplate: false
4103 - name: UDivOrModConstant
4104   gen_boilerplate: false
4106 - name: WasmTruncateToInt64
4107   gen_boilerplate: false
4109 - name: Int64ToFloatingPoint
4110   gen_boilerplate: false
4112 - name: WasmAtomicLoadI64
4113   gen_boilerplate: false
4115 - name: WasmAtomicStoreI64
4116   gen_boilerplate: false
4118 - name: WasmCompareExchangeI64
4119   gen_boilerplate: false
4121 - name: WasmAtomicBinopI64
4122   gen_boilerplate: false
4124 - name: WasmAtomicExchangeI64
4125   gen_boilerplate: false
4126 #endif
4128 #ifdef JS_CODEGEN_X64
4129 - name: DivOrModI64
4130   gen_boilerplate: false
4132 - name: UDivOrModI64
4133   gen_boilerplate: false
4135 - name: DivOrModConstantI
4136   gen_boilerplate: false
4138 - name: UDivOrMod
4139   gen_boilerplate: false
4141 - name: UDivOrModConstant
4142   gen_boilerplate: false
4144 - name: WasmTruncateToInt64
4145   gen_boilerplate: false
4147 - name: Int64ToFloatingPoint
4148   gen_boilerplate: false
4149 #endif
4151 #ifdef JS_CODEGEN_ARM
4152 - name: BoxFloatingPoint
4153   gen_boilerplate: false
4155 - name: DivOrModI64
4156   gen_boilerplate: false
4158 - name: UDivOrModI64
4159   gen_boilerplate: false
4161 - name: SoftDivI
4162   gen_boilerplate: false
4164 - name: SoftModI
4165   gen_boilerplate: false
4167 - name: ModMaskI
4168   gen_boilerplate: false
4170 - name: UDiv
4171   gen_boilerplate: false
4173 - name: UMod
4174   gen_boilerplate: false
4176 - name: SoftUDivOrMod
4177   gen_boilerplate: false
4179 - name: Int64ToFloatingPointCall
4180   gen_boilerplate: false
4182 - name: WasmTruncateToInt64
4183   gen_boilerplate: false
4185 - name: WasmAtomicLoadI64
4186   gen_boilerplate: false
4188 - name: WasmAtomicStoreI64
4189   gen_boilerplate: false
4191 - name: WasmCompareExchangeI64
4192   gen_boilerplate: false
4194 - name: WasmAtomicBinopI64
4195   gen_boilerplate: false
4197 - name: WasmAtomicExchangeI64
4198   gen_boilerplate: false
4199 #endif
4201 #ifdef JS_CODEGEN_ARM64
4202 - name: DivOrModI64
4203   gen_boilerplate: false
4205 - name: UDivOrModI64
4206   gen_boilerplate: false
4208 - name: DivConstantI
4209   gen_boilerplate: false
4211 - name: UDivConstantI
4212   gen_boilerplate: false
4214 - name: ModMaskI
4215   gen_boilerplate: false
4217 - name: UDiv
4218   gen_boilerplate: false
4220 - name: UMod
4221   gen_boilerplate: false
4223 - name: WasmTruncateToInt64
4224   gen_boilerplate: false
4226 - name: Int64ToFloatingPoint
4227   gen_boilerplate: false
4228 #endif
4230 #ifdef JS_CODEGEN_MIPS32
4231 - name: BoxFloatingPoint
4232   gen_boilerplate: false
4234 - name: DivOrModI64
4235   gen_boilerplate: false
4237 - name: UDivOrModI64
4238   gen_boilerplate: false
4240 - name: UDivOrMod
4241   gen_boilerplate: false
4243 - name: ModMaskI
4244   gen_boilerplate: false
4246 - name: WasmTruncateToInt64
4247   gen_boilerplate: false
4249 - name: Int64ToFloatingPoint
4250   gen_boilerplate: false
4252 - name: WasmUnalignedLoad
4253   gen_boilerplate: false
4255 - name: WasmUnalignedLoadI64
4256   gen_boilerplate: false
4258 - name: WasmUnalignedStore
4259   gen_boilerplate: false
4261 - name: WasmUnalignedStoreI64
4262   gen_boilerplate: false
4264 - name: WasmAtomicLoadI64
4265   gen_boilerplate: false
4267 - name: WasmAtomicStoreI64
4268   gen_boilerplate: false
4270 - name: WasmCompareExchangeI64
4271   gen_boilerplate: false
4273 - name: WasmAtomicBinopI64
4274   gen_boilerplate: false
4276 - name: WasmAtomicExchangeI64
4277   gen_boilerplate: false
4278 #endif
4280 #ifdef JS_CODEGEN_MIPS64
4281 - name: DivOrModI64
4282   gen_boilerplate: false
4284 - name: UDivOrMod
4285   gen_boilerplate: false
4287 - name: UDivOrModI64
4288   gen_boilerplate: false
4290 - name: ModMaskI
4291   gen_boilerplate: false
4293 - name: WasmTruncateToInt64
4294   gen_boilerplate: false
4296 - name: Int64ToFloatingPoint
4297   gen_boilerplate: false
4299 - name: WasmUnalignedLoad
4300   gen_boilerplate: false
4302 - name: WasmUnalignedLoadI64
4303   gen_boilerplate: false
4305 - name: WasmUnalignedStore
4306   gen_boilerplate: false
4308 - name: WasmUnalignedStoreI64
4309   gen_boilerplate: false
4311 - name: WasmCompareExchangeI64
4312   gen_boilerplate: false
4314 - name: WasmAtomicBinopI64
4315   gen_boilerplate: false
4317 - name: WasmAtomicExchangeI64
4318   gen_boilerplate: false
4319 #endif
4321 #ifdef JS_CODEGEN_LOONG64
4322 - name: DivOrModI64
4323   gen_boilerplate: false
4325 - name: UDivOrMod
4326   gen_boilerplate: false
4328 - name: UDivOrModI64
4329   gen_boilerplate: false
4331 - name: ModMaskI
4332   gen_boilerplate: false
4334 - name: WasmTruncateToInt64
4335   gen_boilerplate: false
4337 - name: Int64ToFloatingPoint
4338   gen_boilerplate: false
4340 - name: WasmCompareExchangeI64
4341   gen_boilerplate: false
4343 - name: WasmAtomicBinopI64
4344   gen_boilerplate: false
4346 - name: WasmAtomicExchangeI64
4347   gen_boilerplate: false
4348 #endif
4350 #ifdef JS_CODEGEN_RISCV64
4351 - name: DivOrModI64
4352   gen_boilerplate: false
4354 - name: UDivOrMod
4355   gen_boilerplate: false
4357 - name: UDivOrModI64
4358   gen_boilerplate: false
4360 - name: ModMaskI
4361   gen_boilerplate: false
4363 - name: WasmTruncateToInt64
4364   gen_boilerplate: false
4366 - name: Int64ToFloatingPoint
4367   gen_boilerplate: false
4369 - name: WasmCompareExchangeI64
4370   gen_boilerplate: false
4372 - name: WasmAtomicBinopI64
4373   gen_boilerplate: false
4375 - name: WasmAtomicExchangeI64
4376   gen_boilerplate: false
4377 #endif
4379 #ifdef FUZZING_JS_FUZZILLI
4380 - name: FuzzilliHashT
4381   gen_boilerplate: false
4383 - name: FuzzilliHashV
4384   gen_boilerplate: false
4386 - name: FuzzilliHashStore
4387   gen_boilerplate: false
4388 #endif