Bug 1695778 - (Core-Wasm-EH-Ion) part 4: Support reftypes in exceptions. r=rhunt
[gecko.git] / js / src / jit / LIROps.yaml
blob8d59b6b257437b237dbeb5b07ddc6d83fd05398a
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.
67
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:
76 #   
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: NewObject
217   gen_boilerplate: false
219 - name: NewPlainObject
220   result_type: WordSized
221   num_temps: 3
222   mir_op: true
224 - name: NewArrayObject
225   result_type: WordSized
226   num_temps: 2
227   mir_op: true
229 # Allocates a new NamedLambdaObject.
231 # This instruction generates two possible instruction sets:
232 #   (1) An inline allocation of the call object is attempted.
233 #   (2) Otherwise, a callVM create a new object.
235 - name: NewNamedLambdaObject
236   result_type: WordSized
237   num_temps: 1
238   mir_op: true
240 # Allocates a new CallObject.
242 # This instruction generates two possible instruction sets:
243 #   (1) If the call object is extensible, this is a callVM to create the
244 #       call object.
245 #   (2) Otherwise, an inline allocation of the call object is attempted.
247 - name: NewCallObject
248   result_type: WordSized
249   num_temps: 1
250   mir_op: true
252 - name: NewStringObject
253   result_type: WordSized
254   operands:
255     input: WordSized
256   num_temps: 1
257   mir_op: true
259 - name: InitElemGetterSetter
260   operands:
261     object: WordSized
262     id: BoxedValue
263     value: WordSized
264   call_instruction: true
265   mir_op: true
267 # Takes in an Object and a Value.
268 - name: MutateProto
269   operands:
270     object: WordSized
271     value: BoxedValue
272   call_instruction: true
274 - name: InitPropGetterSetter
275   operands:
276     object: WordSized
277     value: WordSized
278   call_instruction: true
279   mir_op: true
281 - name: CheckOverRecursed
282   mir_op: true
284 - name: WasmTrap
285   mir_op: true
287 - name: WasmReinterpret
288   gen_boilerplate: false
290 - name: WasmReinterpretFromI64
291   gen_boilerplate: false
293 - name: WasmReinterpretToI64
294   gen_boilerplate: false
296 - name: Rotate
297   gen_boilerplate: false
299 - name: RotateI64
300   gen_boilerplate: false
302 - name: InterruptCheck
303   mir_op: true
305 - name: WasmInterruptCheck
306   operands:
307     tlsPtr: WordSized
308   mir_op: true
310 - name: TypeOfV
311   result_type: WordSized
312   operands:
313     input: BoxedValue
314   num_temps: 1
315   mir_op: TypeOf
317 - name: TypeOfO
318   result_type: WordSized
319   operands:
320     object: WordSized
321   mir_op: TypeOf
323 - name: TypeOfName
324   result_type: WordSized
325   operands:
326     input: WordSized
327   mir_op: true
329 - name: TypeOfIsNonPrimitiveV
330   result_type: WordSized
331   operands:
332     input: BoxedValue
333   num_temps: 1
334   mir_op: TypeOfIs
336 - name: TypeOfIsNonPrimitiveO
337   result_type: WordSized
338   operands:
339     input: WordSized
340   mir_op: TypeOfIs
342 - name: TypeOfIsPrimitive
343   result_type: WordSized
344   operands:
345     input: BoxedValue
346   mir_op: TypeOfIs
348 - name: ToAsyncIter
349   result_type: WordSized
350   operands:
351     iterator: WordSized
352     nextMethod: BoxedValue
353   call_instruction: true
355 - name: ToPropertyKeyCache
356   result_type: BoxedValue
357   operands:
358     input: BoxedValue
359   mir_op: true
361 # Allocate an object for |new| on the caller-side,
362 # when there is no templateObject or prototype known
363 - name: CreateThis
364   result_type: BoxedValue
365   operands:
366     callee: WordSized
367     newTarget: WordSized
368   call_instruction: true
369   mir_op: true
371 # Allocate a new arguments object for the frame.
372 - name: CreateArgumentsObject
373   result_type: WordSized
374   operands:
375     callObject: WordSized
376   num_temps: 3
377   call_instruction: true
378   mir_op: true
380 - name: CreateInlinedArgumentsObject
381   gen_boilerplate: false
383 - name: GetInlinedArgument
384   gen_boilerplate: false
386 - name: GetInlinedArgumentHole
387   gen_boilerplate: false
389 # Get argument from arguments object.
390 - name: GetArgumentsObjectArg
391   result_type: BoxedValue
392   operands:
393     argsObject: WordSized
394   num_temps: 1
395   mir_op: true
397 # Set argument on arguments object.
398 - name: SetArgumentsObjectArg
399   operands:
400     argsObject: WordSized
401     value: BoxedValue
402   num_temps: 1
403   mir_op: true
405 # Load an element from an arguments object.
406 - name: LoadArgumentsObjectArg
407   result_type: BoxedValue
408   operands:
409     argsObject: WordSized
410     index: WordSized
411   num_temps: 1
413 # Load an element from an arguments object. Handles out-of-bounds accesses.
414 - name: LoadArgumentsObjectArgHole
415   result_type: BoxedValue
416   operands:
417     argsObject: WordSized
418     index: WordSized
419   num_temps: 1
421 # Return true if the element exists in the arguments object.
422 - name: InArgumentsObjectArg
423   result_type: WordSized
424   operands:
425     argsObject: WordSized
426     index: WordSized
427   num_temps: 1
429 # Return |arguments.length| unless it has been overridden.
430 - name: ArgumentsObjectLength
431   result_type: WordSized
432   operands:
433     argsObject: WordSized
435 # Create an array from an arguments object.
436 - name: ArrayFromArgumentsObject
437   result_type: WordSized
438   operands:
439     argsObject: WordSized
440   call_instruction: true
441   mir_op: true
443 # Guard that the given flags are not set on the arguments object.
444 - name: GuardArgumentsObjectFlags
445   operands:
446     argsObject: WordSized
447   num_temps: 1
448   mir_op: true
450 # If the Value is an Object, return unbox(Value).
451 # Otherwise, return the other Object.
452 - name: ReturnFromCtor
453   result_type: WordSized
454   operands:
455     value: BoxedValue
456     object: WordSized
458 - name: BoxNonStrictThis
459   result_type: WordSized
460   operands:
461     value: BoxedValue
462   mir_op: true
464 - name: ImplicitThis
465   result_type: BoxedValue
466   operands:
467     env: WordSized
468   call_instruction: true
469   mir_op: true
471 # Writes a typed argument for a function call to the frame's argument vector.
472 - name: StackArgT
473   operands:
474     arg: WordSized
475   arguments:
476     # Index into frame-scope argument vector.
477     argslot: uint32_t
478     type: MIRType
480 # Writes a typed argument for a function call to the frame's argument vector.
481 - name: StackArgV
482   operands:
483     value: BoxedValue
484   arguments:
485     # Index into frame-scope argument vector.
486     argslot: uint32_t
488 - name: CallGeneric
489   gen_boilerplate: false
491 - name: CallKnown
492   gen_boilerplate: false
494 - name: CallNative
495   gen_boilerplate: false
497 - name: CallDOMNative
498   gen_boilerplate: false
500 - name: Bail
502 - name: Unreachable
503   gen_boilerplate: false
505 - name: EncodeSnapshot
507 - name: UnreachableResultV
508   gen_boilerplate: false
510 - name: UnreachableResultT
511   result_type: WordSized
513 - name: GetDOMProperty
514   gen_boilerplate: false
516 - name: GetDOMMemberV
517   gen_boilerplate: false
519 - name: GetDOMMemberT
520   result_type: WordSized
521   operands:
522     object: WordSized
523   mir_op: GetDOMMember
525 - name: SetDOMProperty
526   gen_boilerplate: false
528 - name: LoadDOMExpandoValue
529   result_type: BoxedValue
530   operands:
531     proxy: WordSized
532   mir_op: true
534 - name: LoadDOMExpandoValueGuardGeneration
535   result_type: BoxedValue
536   operands:
537     proxy: WordSized
538   mir_op: true
540 - name: LoadDOMExpandoValueIgnoreGeneration
541   result_type: BoxedValue
542   operands:
543     proxy: WordSized
544   mir_op: true
546 - name: GuardDOMExpandoMissingOrGuardShape
547   operands:
548     input: BoxedValue
549   num_temps: 1
550   mir_op: true
552 - name: ApplyArgsGeneric
553   gen_boilerplate: false
555 - name: ApplyArgsObj
556   gen_boilerplate: false
558 - name: ApplyArrayGeneric
559   gen_boilerplate: false
561 - name: ConstructArgsGeneric
562   gen_boilerplate: false
564 - name: ConstructArrayGeneric
565   gen_boilerplate: false
567 - name: TestIAndBranch
568   gen_boilerplate: false
570 - name: TestI64AndBranch
571   gen_boilerplate: false
573 - name: TestDAndBranch
574   gen_boilerplate: false
576 - name: TestFAndBranch
577   gen_boilerplate: false
579 - name: TestBIAndBranch
580   gen_boilerplate: false
582 - name: TestOAndBranch
583   gen_boilerplate: false
585 - name: TestVAndBranch
586   gen_boilerplate: false
588 - name: Compare
589   gen_boilerplate: false
591 - name: CompareI64
592   gen_boilerplate: false
594 - name: CompareI64AndBranch
595   gen_boilerplate: false
597 - name: CompareAndBranch
598   gen_boilerplate: false
600 - name: CompareD
601   result_type: WordSized
602   operands:
603     left: WordSized
604     right: WordSized
605   mir_op: Compare
607 - name: CompareF
608   result_type: WordSized
609   operands:
610     left: WordSized
611     right: WordSized
612   mir_op: Compare
614 - name: CompareDAndBranch
615   gen_boilerplate: false
617 - name: CompareFAndBranch
618   gen_boilerplate: false
620 - name: CompareS
621   result_type: WordSized
622   operands:
623     left: WordSized
624     right: WordSized
625   mir_op: Compare
627 - name: CompareSInline
628   result_type: WordSized
629   operands:
630     input: WordSized
631   arguments:
632     constant: JSLinearString*
633   mir_op: Compare
635 - name: CompareBigInt
636   result_type: WordSized
637   operands:
638     left: WordSized
639     right: WordSized
640   num_temps: 3
641   mir_op: Compare
643 - name: CompareBigIntInt32
644   result_type: WordSized
645   operands:
646     left: WordSized
647     right: WordSized
648   num_temps: 2
649   mir_op: Compare
651 - name: CompareBigIntDouble
652   result_type: WordSized
653   operands:
654     left: WordSized
655     right: WordSized
656   num_temps: 1
657   call_instruction: true
658   mir_op: Compare
660 - name: CompareBigIntString
661   result_type: WordSized
662   operands:
663     left: WordSized
664     right: WordSized
665   call_instruction: true
666   mir_op: Compare
668 - name: BitAndAndBranch
669   gen_boilerplate: false
671 # Takes a value and tests whether it is null, undefined, or is an object that
672 # emulates |undefined|, as determined by the JSCLASS_EMULATES_UNDEFINED class
673 # flag on unwrapped objects.  See also js::EmulatesUndefined.
674 - name: IsNullOrLikeUndefinedV
675   result_type: WordSized
676   operands:
677     value: BoxedValue
678   num_temps: 2
679   mir_op: Compare
681 # Takes an object pointer and tests whether it is an object that emulates
682 # |undefined|, as above.
683 - name: IsNullOrLikeUndefinedT
684   result_type: WordSized
685   operands:
686     input: WordSized
687   mir_op: Compare
689 - name: IsNullOrLikeUndefinedAndBranchV
690   gen_boilerplate: false
692 - name: IsNullOrLikeUndefinedAndBranchT
693   gen_boilerplate: false
695 - name: SameValueDouble
696   result_type: WordSized
697   operands:
698     left: WordSized
699     right: WordSized
700   num_temps: 1
702 - name: SameValue
703   result_type: WordSized
704   operands:
705     lhs: BoxedValue
706     rhs: BoxedValue
708 # Not operation on an integer.
709 - name: NotI
710   result_type: WordSized
711   operands:
712     input: WordSized
714 # Not operation on an int64.
715 - name: NotI64
716   result_type: WordSized
717   operands:
718     inputI64: Int64
720 # Not operation on a double.
721 - name: NotD
722   result_type: WordSized
723   operands:
724     input: WordSized
725   mir_op: Not
727 # Not operation on a float32.
728 - name: NotF
729   result_type: WordSized
730   operands:
731     input: WordSized
732   mir_op: Not
734 # Not operation on a BigInt.
735 - name: NotBI
736   result_type: WordSized
737   operands:
738     input: WordSized
739   mir_op: Not
741 # Boolean complement operation on an object.
742 - name: NotO
743   result_type: WordSized
744   operands:
745     input: WordSized
746   mir_op: Not
748 # Boolean complement operation on a value.
749 - name: NotV
750   result_type: WordSized
751   operands:
752     input: BoxedValue
753   num_temps: 3
754   mir_op: Not
756 - name: BitNotI
757   gen_boilerplate: false
759 - name: BitNotI64
760   gen_boilerplate: false
762 - name: BitOpI
763   gen_boilerplate: false
765 - name: BitOpI64
766   gen_boilerplate: false
768 - name: ShiftI
769   gen_boilerplate: false
771 - name: ShiftI64
772   gen_boilerplate: false
774 - name: SignExtendInt32
775   result_type: WordSized
776   operands:
777     num: WordSized
778   arguments:
779     mode: MSignExtendInt32::Mode
781 - name: SignExtendInt64
782   gen_boilerplate: false
784 - name: UrshD
785   gen_boilerplate: false
787 - name: Return
788   gen_boilerplate: false
790 - name: Throw
791   operands:
792     value: BoxedValue
793   call_instruction: true
795 - name: MinMaxI
796   gen_boilerplate: false
798 - name: MinMaxD
799   gen_boilerplate: false
801 - name: MinMaxF
802   gen_boilerplate: false
804 - name: MinMaxArrayI
805   gen_boilerplate: false
807 - name: MinMaxArrayD
808   gen_boilerplate: false
810 # Negative of integer
811 - name: NegI
812   result_type: WordSized
813   operands:
814     num: WordSized
816 # Negative of an int64
817 - name: NegI64
818   result_type: Int64
819   operands:
820     num: Int64
822 # Negative of double
823 - name: NegD
824   result_type: WordSized
825   operands:
826     num: WordSized
828 # Negative of float32
829 - name: NegF
830   result_type: WordSized
831   operands:
832     num: WordSized
834 # Absolute value of an integer.
835 - name: AbsI
836   result_type: WordSized
837   operands:
838     num: WordSized
839   mir_op: Abs
841 # Absolute value of a double.
842 - name: AbsD
843   result_type: WordSized
844   operands:
845     num: WordSized
847 # Absolute value of a float32.
848 - name: AbsF
849   result_type: WordSized
850   operands:
851     num: WordSized
853 - name: CopySignD
854   gen_boilerplate: false
856 - name: CopySignF
857   gen_boilerplate: false
859 # Count leading zeroes on an int32.
860 - name: ClzI
861   result_type: WordSized
862   operands:
863     num: WordSized
864   mir_op: Clz
866 # Count leading zeroes on an int64.
867 - name: ClzI64
868   result_type: Int64
869   operands:
870     num: Int64
871   mir_op: Clz
873 # Count trailing zeroes on an int32.
874 - name: CtzI
875   result_type: WordSized
876   operands:
877     num: WordSized
878   mir_op: Ctz
880 # Count trailing zeroes on an int64.
881 - name: CtzI64
882   result_type: Int64
883   operands:
884     num: Int64
885   mir_op: Ctz
887 # Count population on an int32.
888 - name: PopcntI
889   result_type: WordSized
890   operands:
891     num: WordSized
892   num_temps: 1
893   mir_op: Popcnt
895 # Count population on an int64.
896 - name: PopcntI64
897   result_type: Int64
898   operands:
899     num: Int64
900   num_temps: 1
901   mir_op: Popcnt
903 - name: SqrtD
904   result_type: WordSized
905   operands:
906     num: WordSized
908 - name: SqrtF
909   result_type: WordSized
910   operands:
911     num: WordSized
913 - name: Atan2D
914   gen_boilerplate: false
916 - name: Hypot
917   gen_boilerplate: false
919 # Double raised to an integer power.
920 - name: PowI
921   result_type: WordSized
922   operands:
923     value: WordSized
924     power: WordSized
925   num_temps: 1
926   call_instruction: true
928 # Integer raised to an integer power.
929 - name: PowII
930   result_type: WordSized
931   operands:
932     value: WordSized
933     power: WordSized
934   num_temps: 2
935   mir_op: Pow
937 # Double raised to a double power.
938 - name: PowD
939   result_type: WordSized
940   operands:
941     value: WordSized
942     power: WordSized
943   num_temps: 1
944   call_instruction: true
946 # Constant of a power of two raised to an integer power.
947 - name: PowOfTwoI
948   result_type: WordSized
949   operands:
950     power: WordSized
951   arguments:
952     base: uint32_t
954 # Sign value of an integer.
955 - name: SignI
956   result_type: WordSized
957   operands:
958     num: WordSized
960 # Sign value of an integer.
961 - name: SignD
962   result_type: WordSized
963   operands:
964     num: WordSized
966 # Sign value of a double with expected int32 result.
967 - name: SignDI
968   result_type: WordSized
969   operands:
970     input: WordSized
971   num_temps: 1
973 - name: MathFunctionD
974   gen_boilerplate: false
976 - name: MathFunctionF
977   gen_boilerplate: false
979 - name: AddI
980   gen_boilerplate: false
982 - name: AddI64
983   gen_boilerplate: false
985 - name: SubI
986   gen_boilerplate: false
988 - name: SubI64
989   gen_boilerplate: false
991 - name: MulI64
992   gen_boilerplate: false
994 - name: MathD
995   gen_boilerplate: false
997 - name: MathF
998   gen_boilerplate: false
1000 - name: ModD
1001   gen_boilerplate: false
1003 - name: ModPowTwoD
1004   gen_boilerplate: false
1006 - name: WasmBuiltinModD
1007   result_type: WordSized
1008   operands:
1009     lhs: WordSized
1010     rhs: WordSized
1011     tls: WordSized
1012   call_instruction: true
1013   mir_op: true
1015 - name: BigIntAdd
1016   gen_boilerplate: false
1018 - name: BigIntSub
1019   gen_boilerplate: false
1021 - name: BigIntMul
1022   gen_boilerplate: false
1024 - name: BigIntDiv
1025   gen_boilerplate: false
1027 - name: BigIntMod
1028   gen_boilerplate: false
1030 - name: BigIntPow
1031   gen_boilerplate: false
1033 - name: BigIntBitAnd
1034   gen_boilerplate: false
1036 - name: BigIntBitOr
1037   gen_boilerplate: false
1039 - name: BigIntBitXor
1040   gen_boilerplate: false
1042 - name: BigIntLsh
1043   gen_boilerplate: false
1045 - name: BigIntRsh
1046   gen_boilerplate: false
1048 - name: BigIntIncrement
1049   gen_boilerplate: false
1051 - name: BigIntDecrement
1052   gen_boilerplate: false
1054 - name: BigIntNegate
1055   gen_boilerplate: false
1057 - name: BigIntBitNot
1058   gen_boilerplate: false
1060 # Adds two string, returning a string.
1061 - name: Concat
1062   result_type: WordSized
1063   operands:
1064     lhs: WordSized
1065     rhs: WordSized
1066   num_temps: 5
1068 # Get uint16 character code from a string.
1069 - name: CharCodeAt
1070   result_type: WordSized
1071   operands:
1072     str: WordSized
1073     index: WordSized
1074   num_temps: 1
1076 # Convert uint16 character code to a string.
1077 - name: FromCharCode
1078   result_type: WordSized
1079   operands:
1080     code: WordSized
1082 # Convert uint32 code point to a string.
1083 - name: FromCodePoint
1084   result_type: WordSized
1085   operands:
1086     codePoint: WordSized
1087   num_temps: 2
1089 # Calls the ToLowerCase or ToUpperCase case conversion function.
1090 - name: StringConvertCase
1091   result_type: WordSized
1092   operands:
1093     string: WordSized
1094   call_instruction: true
1095   mir_op: true
1097 - name: StringSplit
1098   result_type: WordSized
1099   operands:
1100     string: WordSized
1101     separator: WordSized
1102   call_instruction: true
1103   mir_op: true
1105 - name: Substr
1106   result_type: WordSized
1107   operands:
1108     string: WordSized
1109     begin: WordSized
1110     length: WordSized
1111   num_temps: 3
1112   mir_op: StringSplit
1114 - name: Int32ToDouble
1115   result_type: WordSized
1116   operands:
1117     input: WordSized
1119 - name: Float32ToDouble
1120   result_type: WordSized
1121   operands:
1122     input: WordSized
1124 - name: DoubleToFloat32
1125   result_type: WordSized
1126   operands:
1127     input: WordSized
1129 - name: Int32ToFloat32
1130   result_type: WordSized
1131   operands:
1132     input: WordSized
1134 # Convert a value to a double.
1135 - name: ValueToDouble
1136   result_type: WordSized
1137   operands:
1138     input: BoxedValue
1139   mir_op: ToDouble
1141 # Convert a value to a float32.
1142 - name: ValueToFloat32
1143   result_type: WordSized
1144   operands:
1145     input: BoxedValue
1146   mir_op: ToFloat32
1148 - name: ValueToInt32
1149   gen_boilerplate: false
1151 # Convert a value to a BigInt.
1152 - name: ValueToBigInt
1153   result_type: WordSized
1154   operands:
1155     input: BoxedValue
1156   mir_op: ToBigInt
1158 # Convert a double to an int32.
1159 #   Input: floating-point Register
1160 #   Output: 32-bit integer
1161 #   Bailout: if the double cannot be converted to an integer.
1162 - name: DoubleToInt32
1163   result_type: WordSized
1164   operands:
1165     in: WordSized
1166   mir_op: ToNumberInt32
1168 # Convert a float32 to an int32.
1169 #   Input: floating-point Register
1170 #   Output: 32-bit integer
1171 #   Bailout: if the float32 cannot be converted to an integer.
1172 - name: Float32ToInt32
1173   result_type: WordSized
1174   operands:
1175     in: WordSized
1176   mir_op: ToNumberInt32
1178 # Truncates a double to an int32.
1179 #   Input: floating-point Register
1180 #   Output: 32-bit integer
1181 #   Bailout: if the double when converted to an integer exceeds the int32
1182 #            bounds. No bailout for NaN or negative zero.
1183 - name: DoubleToIntegerInt32
1184   result_type: WordSized
1185   operands:
1186     in: WordSized
1187   mir_op: ToIntegerInt32
1189 # Truncates a float to an int32.
1190 #   Input: floating-point Register
1191 #   Output: 32-bit integer
1192 #   Bailout: if the double when converted to an integer exceeds the int32
1193 #            bounds. No bailout for NaN or negative zero.
1194 - name: Float32ToIntegerInt32
1195   result_type: WordSized
1196   operands:
1197     in: WordSized
1198   mir_op: ToIntegerInt32
1200 # Convert a double to a truncated int32.
1201 #   Input: floating-point Register
1202 #   Output: 32-bit integer
1203 - name: TruncateDToInt32
1204   result_type: WordSized
1205   operands:
1206     in: WordSized
1207   num_temps: 1
1208   mir_op: TruncateToInt32
1210 # Convert a double to a truncated int32 with tls offset because we need it for
1211 # the slow ool path.
1212 - name: WasmBuiltinTruncateDToInt32
1213   result_type: WordSized
1214   operands:
1215     in: WordSized
1216     tls: WordSized
1217   num_temps: 1
1218   mir_op: WasmBuiltinTruncateToInt32
1220 # Convert a float32 to a truncated int32.
1221 #   Input: floating-point Register
1222 #   Output: 32-bit integer
1223 - name: TruncateFToInt32
1224   result_type: WordSized
1225   operands:
1226     in: WordSized
1227   num_temps: 1
1228   mir_op: TruncateToInt32
1230 # Convert a float32 to a truncated int32 with tls offset because we need it for
1231 # the slow ool path.
1232 - name: WasmBuiltinTruncateFToInt32
1233   result_type: WordSized
1234   operands:
1235     in: WordSized
1236     tls: WordSized
1237   num_temps: 1
1238   mir_op: WasmBuiltinTruncateToInt32
1240 - name: WasmTruncateToInt32
1241   result_type: WordSized
1242   operands:
1243     input: WordSized
1244   mir_op: true
1246 - name: WrapInt64ToInt32
1247   result_type: WordSized
1248   operands:
1249     input: Int64
1250   mir_op: true
1252 - name: ExtendInt32ToInt64
1253   result_type: Int64
1254   operands:
1255     input: WordSized
1256   mir_op: true
1258 # Convert a boolean value to a string.
1259 - name: BooleanToString
1260   result_type: WordSized
1261   operands:
1262     input: WordSized
1263   mir_op: ToString
1265 # Convert an integer hosted on one definition to a string with a function call.
1266 - name: IntToString
1267   result_type: WordSized
1268   operands:
1269     input: WordSized
1270   mir_op: ToString
1272 # Convert a double hosted on one definition to a string with a function call.
1273 - name: DoubleToString
1274   result_type: WordSized
1275   operands:
1276     input: WordSized
1277   num_temps: 1
1278   mir_op: ToString
1280 # Convert a primitive to a string with a function call.
1281 - name: ValueToString
1282   result_type: WordSized
1283   operands:
1284     input: BoxedValue
1285   num_temps: 1
1286   mir_op: ToString
1288 - name: PowHalfD
1289   gen_boilerplate: false
1291 - name: NaNToZero
1292   result_type: WordSized
1293   operands:
1294     input: WordSized
1295   num_temps: 1
1296   mir_op: true
1298 - name: OsrEntry
1299   gen_boilerplate: false
1301 # Materialize a Value stored in an interpreter frame for OSR.
1302 - name: OsrValue
1303   result_type: BoxedValue
1304   operands:
1305     entry: WordSized
1306   mir_op: true
1308 # Materialize a JSObject env chain stored in an interpreter frame for OSR.
1309 - name: OsrEnvironmentChain
1310   result_type: WordSized
1311   operands:
1312     entry: WordSized
1313   mir_op: true
1315 # Materialize a JSObject env chain stored in an interpreter frame for OSR.
1316 - name: OsrReturnValue
1317   result_type: BoxedValue
1318   operands:
1319     entry: WordSized
1320   mir_op: true
1322 - name: OsrArgumentsObject
1323   result_type: WordSized
1324   operands:
1325     entry: WordSized
1326   mir_op: true
1328 - name: RegExp
1329   result_type: WordSized
1330   num_temps: 1
1331   mir_op: true
1333 - name: RegExpMatcher
1334   result_type: BoxedValue
1335   operands:
1336     regexp: WordSized
1337     string: WordSized
1338     lastIndex: WordSized
1339   call_instruction: true
1340   mir_op: true
1342 - name: RegExpSearcher
1343   result_type: WordSized
1344   operands:
1345     regexp: WordSized
1346     string: WordSized
1347     lastIndex: WordSized
1348   call_instruction: true
1349   mir_op: true
1351 - name: RegExpTester
1352   result_type: WordSized
1353   operands:
1354     regexp: WordSized
1355     string: WordSized
1356     lastIndex: WordSized
1357   call_instruction: true
1358   mir_op: true
1360 - name: RegExpPrototypeOptimizable
1361   result_type: WordSized
1362   operands:
1363     object: WordSized
1364   num_temps: 1
1365   mir_op: true
1367 - name: RegExpInstanceOptimizable
1368   result_type: WordSized
1369   operands:
1370     object: WordSized
1371     proto: WordSized
1372   num_temps: 1
1373   mir_op: true
1375 - name: GetFirstDollarIndex
1376   result_type: WordSized
1377   operands:
1378     str: WordSized
1379   num_temps: 3
1381 - name: StringReplace
1382   result_type: WordSized
1383   operands:
1384     string: WordSized
1385     pattern: WordSized
1386     replacement: WordSized
1387   call_instruction: true
1388   mir_op: true
1390 - name: BinaryValueCache
1391   result_type: BoxedValue
1392   operands:
1393     lhs: BoxedValue
1394     rhs: BoxedValue
1395   # Takes two temps: these are intended to be FloatReg0 and FloatReg1
1396   # to allow the actual cache code to safely clobber those values without
1397   # save and restore.
1398   num_temps: 2
1399   mir_op: BinaryCache
1401 - name: BinaryBoolCache
1402   result_type: WordSized
1403   operands:
1404     lhs: BoxedValue
1405     rhs: BoxedValue
1406   # Takes two temps: these are intendend to be FloatReg0 and FloatReg1
1407   # To allow the actual cache code to safely clobber those values without
1408   # save and restore.
1409   num_temps: 2
1410   mir_op: BinaryCache
1412 - name: UnaryCache
1413   result_type: BoxedValue
1414   operands:
1415     input: BoxedValue
1416   mir_op_cast: true
1418 - name: ModuleMetadata
1419   result_type: WordSized
1420   call_instruction: true
1421   mir_op: true
1423 - name: DynamicImport
1424   result_type: WordSized
1425   operands:
1426     specifier: BoxedValue
1427     options: BoxedValue
1428   call_instruction: true
1429   mir_op: true
1431 - name: Lambda
1432   result_type: WordSized
1433   operands:
1434     environmentChain: WordSized
1435   num_temps: 1
1436   mir_op: true
1438 - name: LambdaArrow
1439   result_type: WordSized
1440   operands:
1441     environmentChain: WordSized
1442     newTarget: BoxedValue
1443   num_temps: 1
1444   mir_op: true
1446 - name: FunctionWithProto
1447   result_type: WordSized
1448   operands:
1449     envChain: WordSized
1450     prototype: WordSized
1451   call_instruction: true
1452   mir_op: true
1454 - name: SetFunName
1455   result_type: WordSized
1456   operands:
1457     fun: WordSized
1458     name: BoxedValue
1459   call_instruction: true
1460   mir_op: true
1462 - name: KeepAliveObject
1463   operands:
1464     object: WordSized
1466 # Load the "slots" member out of a JSObject.
1467 #   Input: JSObject pointer
1468 #   Output: slots pointer
1469 - name: Slots
1470   result_type: WordSized
1471   operands:
1472     object: WordSized
1474 # Load the "elements" member out of a JSObject.
1475 #   Input: JSObject pointer
1476 #   Output: elements pointer
1477 - name: Elements
1478   result_type: WordSized
1479   operands:
1480     object: WordSized
1481   mir_op: true
1483 # Load the initialized length from an elements header.
1484 - name: InitializedLength
1485   result_type: WordSized
1486   operands:
1487     elements: WordSized
1489 # Store to the initialized length in an elements header. Note the input is an
1490 # *index*, one less than the desired initialized length.
1491 - name: SetInitializedLength
1492   operands:
1493     elements: WordSized
1494     index: WordSized
1496 # Load the length from an elements header.
1497 - name: ArrayLength
1498   result_type: WordSized
1499   operands:
1500     elements: WordSized
1502 # Store to the length in an elements header. Note the input is an *index*,
1503 # one less than the desired length.
1504 - name: SetArrayLength
1505   operands:
1506     elements: WordSized
1507     index: WordSized
1509 # Load the "length" property of a function.
1510 - name: FunctionLength
1511   result_type: WordSized
1512   operands:
1513     function: WordSized
1515 # Load the "name" property of a function.
1516 - name: FunctionName
1517   result_type: WordSized
1518   operands:
1519     function: WordSized
1521 - name: GetNextEntryForIterator
1522   result_type: WordSized
1523   operands:
1524     iter: WordSized
1525     result: WordSized
1526   num_temps: 3
1527   mir_op: true
1529 - name: ArrayBufferByteLength
1530   result_type: WordSized
1531   operands:
1532     object: WordSized
1534 - name: ArrayBufferViewLength
1535   result_type: WordSized
1536   operands:
1537     object: WordSized
1538   mir_op: true
1540 # Read the byteOffset of an array buffer view.
1541 - name: ArrayBufferViewByteOffset
1542   result_type: WordSized
1543   operands:
1544     object: WordSized
1546 # Load an array buffer view's elements vector.
1547 - name: ArrayBufferViewElements
1548   result_type: WordSized
1549   operands:
1550     object: WordSized
1552 # Return the element size of a typed array.
1553 - name: TypedArrayElementSize
1554   result_type: WordSized
1555   operands:
1556     object: WordSized
1558 - name: GuardHasAttachedArrayBuffer
1559   operands:
1560     object: WordSized
1561   num_temps: 1
1563 # Double to IntPtr, eligible for accessing into a TypedArray or DataView. If
1564 # the index isn't exactly representable as an IntPtr, depending on the
1565 # supportOOB flag on the MIR instruction, either bail out or produce an IntPtr
1566 # which is equivalent to an OOB access.
1567 - name: GuardNumberToIntPtrIndex
1568   result_type: WordSized
1569   operands:
1570     object: WordSized
1571   mir_op: true
1573 # Bailout if index >= length.
1574 - name: BoundsCheck
1575   operands:
1576     index: WordSized
1577     length: WordSized
1578   mir_op: true
1580 - name: BoundsCheckRange
1581   gen_boilerplate: false
1583 # Bailout if index < minimum.
1584 - name: BoundsCheckLower
1585   operands:
1586     index: WordSized
1587   mir_op: true
1589 - name: SpectreMaskIndex
1590   result_type: WordSized
1591   operands:
1592     index: WordSized
1593     length: WordSized
1594   mir_op: true
1596 - name: LoadElementV
1597   gen_boilerplate: false
1599 - name: InArray
1600   result_type: WordSized
1601   operands:
1602     elements: WordSized
1603     index: WordSized
1604     initLength: WordSized
1605   mir_op: true
1607 - name: GuardElementNotHole
1608   operands:
1609     elements: WordSized
1610     index: WordSized
1612 - name: LoadElementHole
1613   gen_boilerplate: false
1615 - name: StoreElementV
1616   gen_boilerplate: false
1618 - name: StoreElementT
1619   gen_boilerplate: false
1621 - name: StoreHoleValueElement
1622   operands:
1623     elements: WordSized
1624     index: WordSized
1626 # Like LStoreElementV, but supports indexes >= initialized length.
1627 - name: StoreElementHoleV
1628   operands:
1629     object: WordSized
1630     elements: WordSized
1631     index: WordSized
1632     value: BoxedValue
1633   num_temps: 1
1634   mir_op: StoreElementHole
1636 # Like LStoreElementT, but supports indexes >= initialized length.
1637 - name: StoreElementHoleT
1638   operands:
1639     object: WordSized
1640     elements: WordSized
1641     index: WordSized
1642     value: WordSized
1643   num_temps: 1
1644   mir_op: StoreElementHole
1646 - name: ArrayPopShift
1647   gen_boilerplate: false
1649 - name: ArrayPush
1650   result_type: WordSized
1651   operands:
1652     object: WordSized
1653     value: BoxedValue
1654   num_temps: 2
1655   mir_op: true
1657 - name: ArraySlice
1658   result_type: WordSized
1659   operands:
1660     object: WordSized
1661     begin: WordSized
1662     end: WordSized
1663   num_temps: 2
1664   call_instruction: true
1665   mir_op: true
1667 - name: ArrayJoin
1668   result_type: WordSized
1669   operands:
1670     array: WordSized
1671     separator: WordSized
1672   num_temps: 1
1673   call_instruction: true
1674   mir_op: true
1676 - name: LoadUnboxedScalar
1677   result_type: WordSized
1678   operands:
1679     elements: WordSized
1680     index: WordSized
1681   num_temps: 1
1682   mir_op: true
1684 - name: LoadUnboxedBigInt
1685   gen_boilerplate: false
1687 - name: LoadDataViewElement
1688   gen_boilerplate: false
1690 - name: LoadTypedArrayElementHole
1691   result_type: BoxedValue
1692   operands:
1693     object: WordSized
1694     index: WordSized
1695   num_temps: 1
1696   mir_op: true
1698 - name: LoadTypedArrayElementHoleBigInt
1699   gen_boilerplate: false
1701 - name: StoreUnboxedScalar
1702   operands:
1703     elements: WordSized
1704     index: WordSized
1705     value: WordSized
1706   mir_op: true
1708 - name: StoreUnboxedBigInt
1709   gen_boilerplate: false
1711 - name: StoreDataViewElement
1712   gen_boilerplate: false
1714 - name: StoreTypedArrayElementHole
1715   operands:
1716     elements: WordSized
1717     length: WordSized
1718     index: WordSized
1719     value: WordSized
1720   num_temps: 1
1721   mir_op: true
1723 - name: StoreTypedArrayElementHoleBigInt
1724   gen_boilerplate: false
1726 - name: AtomicIsLockFree
1727   result_type: WordSized
1728   operands:
1729     value: WordSized
1731 - name: CompareExchangeTypedArrayElement
1732   gen_boilerplate: false
1734 - name: AtomicExchangeTypedArrayElement
1735   gen_boilerplate: false
1737 - name: AtomicTypedArrayElementBinop
1738   gen_boilerplate: false
1740 - name: AtomicTypedArrayElementBinopForEffect
1741   gen_boilerplate: false
1743 - name: AtomicLoad64
1744   gen_boilerplate: false
1746 - name: AtomicStore64
1747   gen_boilerplate: false
1749 - name: CompareExchangeTypedArrayElement64
1750   gen_boilerplate: false
1752 - name: AtomicExchangeTypedArrayElement64
1753   gen_boilerplate: false
1755 - name: AtomicTypedArrayElementBinop64
1756   gen_boilerplate: false
1758 - name: AtomicTypedArrayElementBinopForEffect64
1759   gen_boilerplate: false
1761 - name: EffectiveAddress
1762   result_type: WordSized
1763   operands:
1764     base: WordSized
1765     index: WordSized
1766   mir_op: true
1768 - name: ClampIToUint8
1769   result_type: WordSized
1770   operands:
1771     input: WordSized
1773 - name: ClampDToUint8
1774   result_type: WordSized
1775   operands:
1776     in: WordSized
1777   num_temps: 1
1779 - name: ClampVToUint8
1780   result_type: WordSized
1781   operands:
1782     input: BoxedValue
1783   num_temps: 1
1784   mir_op: ClampToUint8
1786 # Load a boxed value from an object's fixed slot.
1787 - name: LoadFixedSlotV
1788   result_type: BoxedValue
1789   operands:
1790     object: WordSized
1791   mir_op: LoadFixedSlot
1793 # Load a typed value from an object's fixed slot.
1794 - name: LoadFixedSlotT
1795   result_type: WordSized
1796   operands:
1797     object: WordSized
1798   mir_op: LoadFixedSlot
1800 - name: LoadFixedSlotAndUnbox
1801   result_type: WordSized
1802   operands:
1803     object: WordSized
1804   mir_op: true
1806 - name: LoadDynamicSlotAndUnbox
1807   result_type: WordSized
1808   operands:
1809     slots: WordSized
1810   mir_op: true
1812 - name: LoadElementAndUnbox
1813   result_type: WordSized
1814   operands:
1815     elements: WordSized
1816     index: WordSized
1817   mir_op: true
1819 - name: AddAndStoreSlot
1820   operands:
1821     object: WordSized
1822     value: BoxedValue
1823   num_temps: 1
1824   mir_op: true
1826 - name: AllocateAndStoreSlot
1827   operands:
1828     object: WordSized
1829     value: BoxedValue
1830   num_temps: 2
1831   call_instruction: true
1832   mir_op: true
1834 - name: AddSlotAndCallAddPropHook
1835   operands:
1836     object: WordSized
1837     value: BoxedValue
1838   call_instruction: true
1839   mir_op: true
1841 # Store a boxed value to an object's fixed slot.
1842 - name: StoreFixedSlotV
1843   operands:
1844     obj: WordSized
1845     value: BoxedValue
1846   mir_op: StoreFixedSlot
1848 # Store a typed value to an object's fixed slot.
1849 - name: StoreFixedSlotT
1850   operands:
1851     obj: WordSized
1852     value: WordSized
1853   mir_op: StoreFixedSlot
1855 # Note, Name ICs always return a Value. There are no V/T variants.
1856 - name: GetNameCache
1857   result_type: BoxedValue
1858   operands:
1859     envObj: WordSized
1860   num_temps: 1
1861   mir_op: true
1863 - name: CallGetIntrinsicValue
1864   result_type: BoxedValue
1865   call_instruction: true
1866   mir_op: true
1868 - name: GetPropSuperCache
1869   result_type: BoxedValue
1870   operands:
1871     obj: WordSized
1872     receiver: BoxedValue
1873     id: BoxedValue
1874   mir_op: true
1876 # Patchable jump to stubs generated for a GetProperty cache, which loads a
1877 # boxed value.
1878 - name: GetPropertyCache
1879   result_type: BoxedValue
1880   operands:
1881     value: BoxedValue
1882     id: BoxedValue
1883   mir_op: true
1885 - name: BindNameCache
1886   result_type: WordSized
1887   operands:
1888     environmentChain: WordSized
1889   num_temps: 1
1890   mir_op: true
1892 - name: CallBindVar
1893   result_type: WordSized
1894   operands:
1895     environmentChain: WordSized
1896   mir_op: true
1898 # Load a value from an object's dslots or a slots vector.
1899 - name: LoadDynamicSlotV
1900   result_type: BoxedValue
1901   operands:
1902     in: WordSized
1903   mir_op: LoadDynamicSlot
1905 # Store a value to an object's dslots or a slots vector.
1906 - name: StoreDynamicSlotV
1907   operands:
1908     slots: WordSized
1909     value: BoxedValue
1910   mir_op: StoreDynamicSlot
1912 # Store a typed value to an object's dslots or a slots vector. This has a
1913 # few advantages over LStoreDynamicSlotV:
1914 # 1) We can bypass storing the type tag if the slot has the same type as
1915 #    the value.
1916 # 2) Better Register allocation: we can store constants and FP regs directly
1917 #    without requiring a second Register for the value.
1918 - name: StoreDynamicSlotT
1919   operands:
1920     slots: WordSized
1921     value: WordSized
1922   mir_op: StoreDynamicSlot
1924 # Read length field of a JSString*.
1925 - name: StringLength
1926   result_type: WordSized
1927   operands:
1928     string: WordSized
1930 # Take the floor of a double precision number and converts it to an int32.
1931 # Implements Math.floor().
1932 - name: Floor
1933   result_type: WordSized
1934   operands:
1935     num: WordSized
1937 # Take the floor of a single precision number and converts it to an int32.
1938 # Implements Math.floor().
1939 - name: FloorF
1940   result_type: WordSized
1941   operands:
1942     num: WordSized
1944 # Take the ceiling of a double precision number and converts it to an int32.
1945 # Implements Math.ceil().
1946 - name: Ceil
1947   result_type: WordSized
1948   operands:
1949     num: WordSized
1951 # Take the ceiling of a single precision number and converts it to an int32.
1952 # Implements Math.ceil().
1953 - name: CeilF
1954   result_type: WordSized
1955   operands:
1956     string: WordSized
1958 # Round a double precision number and converts it to an int32.
1959 # Implements Math.round().
1960 - name: Round
1961   result_type: WordSized
1962   operands:
1963     num: WordSized
1964   num_temps: 1
1965   mir_op: true
1967 # Round a single precision number and converts it to an int32.
1968 # Implements Math.round().
1969 - name: RoundF
1970   result_type: WordSized
1971   operands:
1972     num: WordSized
1973   num_temps: 1
1974   mir_op: Round
1976 # Truncates a double precision number and converts it to an int32.
1977 # Implements Math.trunc().
1978 - name: Trunc
1979   result_type: WordSized
1980   operands:
1981     num: WordSized
1983 # Truncates a single precision number and converts it to an int32.
1984 # Implements Math.trunc().
1985 - name: TruncF
1986   result_type: WordSized
1987   operands:
1988     num: WordSized
1990 # Rounds a double precision number accordingly to mir()->roundingMode(),
1991 # and keeps a double output.
1992 - name: NearbyInt
1993   result_type: WordSized
1994   operands:
1995     num: WordSized
1996   mir_op: true
1998 # Rounds a single precision number accordingly to mir()->roundingMode(),
1999 # and keeps a single output.
2000 - name: NearbyIntF
2001   result_type: WordSized
2002   operands:
2003     num: WordSized
2004   mir_op: NearbyInt
2006 # Load a function's call environment.
2007 - name: FunctionEnvironment
2008   result_type: WordSized
2009   operands:
2010     function: WordSized
2012 - name: HomeObject
2013   result_type: WordSized
2014   operands:
2015     function: WordSized
2017 - name: HomeObjectSuperBase
2018   result_type: BoxedValue
2019   operands:
2020     homeObject: WordSized
2022 - name: NewLexicalEnvironmentObject
2023   result_type: WordSized
2024   operands:
2025     enclosing: WordSized
2026   call_instruction: true
2027   mir_op: true
2029 - name: CopyLexicalEnvironmentObject
2030   result_type: WordSized
2031   operands:
2032     env: WordSized
2033   call_instruction: true
2034   mir_op: true
2036 - name: NewClassBodyEnvironmentObject
2037   result_type: WordSized
2038   operands:
2039     enclosing: WordSized
2040   call_instruction: true
2041   mir_op: true
2043 - name: CallSetElement
2044   operands:
2045     object: WordSized
2046     index: BoxedValue
2047     value: BoxedValue
2048   call_instruction: true
2049   mir_op: true
2051 - name: CallDeleteProperty
2052   result_type: WordSized
2053   operands:
2054     value: BoxedValue
2055   call_instruction: true
2056   mir_op: DeleteProperty
2058 - name: CallDeleteElement
2059   result_type: WordSized
2060   operands:
2061     value: BoxedValue
2062     index: BoxedValue
2063   call_instruction: true
2064   mir_op: DeleteElement
2066 - name: ValueToIterator
2067   result_type: WordSized
2068   operands:
2069     value: BoxedValue
2070   call_instruction: true
2071   mir_op: ValueToIterator
2073 # Patchable jump to stubs generated for a SetProperty cache.
2074 - name: SetPropertyCache
2075   operands:
2076     object: WordSized
2077     id: BoxedValue
2078     value: BoxedValue
2079   # Takes an additional temp: this is intendend to be FloatReg0 to allow the
2080   # actual cache code to safely clobber that value without save and restore.
2081   num_temps: 2
2082   mir_op: true
2084 - name: GetIteratorCache
2085   result_type: WordSized
2086   operands:
2087     value: BoxedValue
2088   num_temps: 2
2089   mir_op: true
2091 - name: OptimizeSpreadCallCache
2092   result_type: BoxedValue
2093   operands:
2094     value: BoxedValue
2095   num_temps: 1
2096   mir_op: true
2098 - name: IteratorMore
2099   result_type: BoxedValue
2100   operands:
2101     iterator: WordSized
2102   num_temps: 1
2103   mir_op: true
2105 - name: IsNoIterAndBranch
2106   gen_boilerplate: false
2108 - name: IteratorEnd
2109   operands:
2110     object: WordSized
2111   num_temps: 3
2112   mir_op: true
2114 # Read the number of actual arguments.
2115 - name: ArgumentsLength
2116   result_type: WordSized
2118 # Load a value from the actual arguments.
2119 - name: GetFrameArgument
2120   result_type: BoxedValue
2121   operands:
2122     index: WordSized
2124 # Load a value from the actual arguments.
2125 # Returns undefined if |index| is larger-or-equals to |length|. Bails out if
2126 # |index| is negative.
2127 - name: GetFrameArgumentHole
2128   result_type: BoxedValue
2129   operands:
2130     index: WordSized
2131     length: WordSized
2132   num_temps: 1
2134 # Create the rest parameter.
2135 - name: Rest
2136   result_type: WordSized
2137   operands:
2138     numActuals: WordSized
2139   num_temps: 3
2140   call_instruction: true
2141   mir_op: true
2143 - name: Int32ToIntPtr
2144   result_type: WordSized
2145   operands:
2146     input: WordSized
2147   mir_op: true
2149 - name: NonNegativeIntPtrToInt32
2150   result_type: WordSized
2151   operands:
2152     input: WordSized
2154 - name: IntPtrToDouble
2155   result_type: WordSized
2156   operands:
2157     input: WordSized
2159 - name: AdjustDataViewLength
2160   result_type: WordSized
2161   operands:
2162     input: WordSized
2163   mir_op: true
2165 # Convert a Boolean to an Int64, following ToBigInt.
2166 - name: BooleanToInt64
2167   result_type: Int64
2168   operands:
2169     input: WordSized
2170   mir_op: ToInt64
2172 # Convert a String to an Int64, following ToBigInt.
2173 - name: StringToInt64
2174   result_type: Int64
2175   operands:
2176     input: WordSized
2177   mir_op: ToInt64
2179 # Simulate ToBigInt on a Value and produce a matching Int64.
2180 - name: ValueToInt64
2181   result_type: Int64
2182   operands:
2183     input: BoxedValue
2184   num_temps: 1
2185   mir_op: ToInt64
2187 # Truncate a BigInt to an unboxed int64.
2188 - name: TruncateBigIntToInt64
2189   result_type: Int64
2190   operands:
2191     input: WordSized
2192   mir_op: true
2194 # Create a new BigInt* from an unboxed int64.
2195 - name: Int64ToBigInt
2196   result_type: WordSized
2197   operands:
2198     input: Int64
2199   num_temps: 1
2200   mir_op: true
2202 # Generational write barrier used when writing an object to another object.
2203 - name: PostWriteBarrierO
2204   operands:
2205     object: WordSized
2206     value: WordSized
2207   num_temps: 1
2208   mir_op: PostWriteBarrier
2210 # Generational write barrier used when writing a string to an object.
2211 - name: PostWriteBarrierS
2212   operands:
2213     object: WordSized
2214     value: WordSized
2215   num_temps: 1
2216   mir_op: PostWriteBarrier
2218 # Generational write barrier used when writing a BigInt to an object.
2219 - name: PostWriteBarrierBI
2220   operands:
2221     object: WordSized
2222     value: WordSized
2223   num_temps: 1
2224   mir_op: PostWriteBarrier
2226 # Generational write barrier used when writing a value to another object.
2227 - name: PostWriteBarrierV
2228   operands:
2229     object: WordSized
2230     value: BoxedValue
2231   num_temps: 1
2232   mir_op: PostWriteBarrier
2234 # Generational write barrier used when writing an object to another object's
2235 # elements.
2236 - name: PostWriteElementBarrierO
2237   operands:
2238     object: WordSized
2239     value: WordSized
2240     index: WordSized
2241   num_temps: 1
2242   mir_op: PostWriteElementBarrier
2244 # Generational write barrier used when writing a string to an object's
2245 # elements.
2246 - name: PostWriteElementBarrierS
2247   operands:
2248     object: WordSized
2249     value: WordSized
2250     index: WordSized
2251   num_temps: 1
2252   mir_op: PostWriteElementBarrier
2254 # Generational write barrier used when writing a BigInt to an object's
2255 # elements.
2256 - name: PostWriteElementBarrierBI
2257   operands:
2258     object: WordSized
2259     value: WordSized
2260     index: WordSized
2261   num_temps: 1
2262   mir_op: PostWriteElementBarrier
2264 # Generational write barrier used when writing a value to another object's
2265 # elements.
2266 - name: PostWriteElementBarrierV
2267   operands:
2268     object: WordSized
2269     index: WordSized
2270     value: BoxedValue
2271   num_temps: 1
2272   mir_op: PostWriteElementBarrier
2274 # Guard against an object's identity.
2275 - name: GuardObjectIdentity
2276   operands:
2277     input: WordSized
2278     expected: WordSized
2279   mir_op: true
2281 # Guard against an function's identity.
2282 - name: GuardSpecificFunction
2283   operands:
2284     input: WordSized
2285     expected: WordSized
2287 - name: GuardSpecificAtom
2288   operands:
2289     str: WordSized
2290   num_temps: 1
2291   mir_op: true
2293 - name: GuardSpecificSymbol
2294   operands:
2295     symbol: WordSized
2296   mir_op: true
2298 - name: GuardStringToIndex
2299   result_type: WordSized
2300   operands:
2301     string: WordSized
2303 - name: GuardStringToInt32
2304   result_type: WordSized
2305   operands:
2306     string: WordSized
2307   num_temps: 1
2309 - name: GuardStringToDouble
2310   result_type: WordSized
2311   operands:
2312     string: WordSized
2313   num_temps: 2
2315 - name: GuardShape
2316   result_type: WordSized
2317   operands:
2318     in: WordSized
2319   num_temps: 1
2320   mir_op: true
2322 - name: GuardProto
2323   operands:
2324     object: WordSized
2325     expected: WordSized
2326   num_temps: 1
2328 - name: GuardNullProto
2329   operands:
2330     object: WordSized
2331   num_temps: 1
2333 - name: GuardIsNativeObject
2334   operands:
2335     object: WordSized
2336   num_temps: 1
2338 - name: GuardIsProxy
2339   operands:
2340     object: WordSized
2341   num_temps: 1
2343 - name: GuardIsNotProxy
2344   operands:
2345     object: WordSized
2346   num_temps: 1
2348 - name: GuardIsNotDOMProxy
2349   operands:
2350     proxy: WordSized
2351   num_temps: 1
2353 - name: ProxyGet
2354   result_type: BoxedValue
2355   operands:
2356     proxy: WordSized
2357   num_temps: 1
2358   call_instruction: true
2359   mir_op: true
2361 - name: ProxyGetByValue
2362   result_type: BoxedValue
2363   operands:
2364     proxy: WordSized
2365     id: BoxedValue
2366   call_instruction: true
2368 - name: ProxyHasProp
2369   result_type: BoxedValue
2370   operands:
2371     proxy: WordSized
2372     id: BoxedValue
2373   call_instruction: true
2374   mir_op: true
2376 - name: ProxySet
2377   operands:
2378     proxy: WordSized
2379     rhs: BoxedValue
2380   num_temps: 1
2381   call_instruction: true
2382   mir_op: true
2384 - name: ProxySetByValue
2385   operands:
2386     proxy: WordSized
2387     id: BoxedValue
2388     rhs: BoxedValue
2389   call_instruction: true
2390   mir_op: true
2392 - name: CallSetArrayLength
2393   operands:
2394     obj: WordSized
2395     rhs: BoxedValue
2396   call_instruction: true
2397   mir_op: true
2399 - name: MegamorphicLoadSlot
2400   result_type: BoxedValue
2401   operands:
2402     object: WordSized
2403   num_temps: 3
2404   call_instruction: true
2405   mir_op: true
2407 - name: MegamorphicLoadSlotByValue
2408   result_type: BoxedValue
2409   operands:
2410     object: WordSized
2411     id: BoxedValue
2412   num_temps: 2
2413   call_instruction: true
2414   mir_op: true
2416 - name: MegamorphicStoreSlot
2417   result_type: BoxedValue
2418   operands:
2419     object: WordSized
2420     rhs: BoxedValue
2421   num_temps: 3
2422   call_instruction: true
2423   mir_op: true
2425 - name: MegamorphicHasProp
2426   result_type: WordSized
2427   operands:
2428     object: WordSized
2429     id: BoxedValue
2430   num_temps: 2
2431   call_instruction: true
2432   mir_op: true
2434 - name: GuardIsNotArrayBufferMaybeShared
2435   operands:
2436     object: WordSized
2437   num_temps: 1
2439 - name: GuardIsTypedArray
2440   operands:
2441     object: WordSized
2442   num_temps: 1
2444 - name: GuardNoDenseElements
2445   operands:
2446     in: WordSized
2447   num_temps: 1
2449 - name: InCache
2450   result_type: WordSized
2451   operands:
2452     lhs: BoxedValue
2453     rhs: WordSized
2454   num_temps: 1
2455   mir_op: true
2457 - name: HasOwnCache
2458   result_type: WordSized
2459   operands:
2460     value: BoxedValue
2461     id: BoxedValue
2462   mir_op: true
2464 - name: CheckPrivateFieldCache
2465   result_type: WordSized
2466   operands:
2467     value: BoxedValue
2468     id: BoxedValue
2469   mir_op: true
2471 - name: NewPrivateName
2472   result_type: WordSized
2473   call_instruction: true
2474   mir_op: true
2476 - name: InstanceOfO
2477   result_type: WordSized
2478   operands:
2479     lhs: WordSized
2480     rhs: WordSized
2481   mir_op: InstanceOf
2483 - name: InstanceOfV
2484   result_type: WordSized
2485   operands:
2486     lhs: BoxedValue
2487     rhs: WordSized
2488   mir_op: InstanceOf
2490 - name: InstanceOfCache
2491   gen_boilerplate: false
2493 - name: IsCallableO
2494   result_type: WordSized
2495   operands:
2496     object: WordSized
2497   mir_op: IsCallable
2499 - name: IsCallableV
2500   result_type: WordSized
2501   operands:
2502     object: BoxedValue
2503   num_temps: 1
2504   mir_op: IsCallable
2506 - name: IsConstructor
2507   result_type: WordSized
2508   operands:
2509     object: WordSized
2510   mir_op: true
2512 - name: IsCrossRealmArrayConstructor
2513   result_type: WordSized
2514   operands:
2515     object: WordSized
2517 - name: IsArrayO
2518   result_type: WordSized
2519   operands:
2520     object: WordSized
2521   mir_op: IsArray
2523 - name: IsArrayV
2524   result_type: WordSized
2525   operands:
2526     value: BoxedValue
2527   num_temps: 1
2528   mir_op: IsArray
2530 - name: IsTypedArray
2531   result_type: WordSized
2532   operands:
2533     object: WordSized
2534   mir_op: true
2536 - name: IsObject
2537   result_type: WordSized
2538   operands:
2539     object: BoxedValue
2540   mir_op: true
2542 - name: IsObjectAndBranch
2543   gen_boilerplate: false
2545 - name: IsNullOrUndefined
2546   result_type: WordSized
2547   operands:
2548     input: BoxedValue
2549   mir_op: true
2551 - name: IsNullOrUndefinedAndBranch
2552   gen_boilerplate: false
2554 - name: HasClass
2555   result_type: WordSized
2556   operands:
2557     lhs: WordSized
2558   mir_op: true
2560 - name: GuardToClass
2561   result_type: WordSized
2562   operands:
2563     lhs: WordSized
2564   num_temps: 1
2565   mir_op: true
2567 - name: GuardToFunction
2568   result_type: WordSized
2569   operands:
2570     lhs: WordSized
2571   num_temps: 1
2572   mir_op: true
2574 - name: ObjectClassToString
2575   result_type: WordSized
2576   operands:
2577     lhs: WordSized
2578   num_temps: 1
2579   call_instruction: true
2580   mir_op: true
2582 - name: WasmSelect
2583   gen_boilerplate: false
2585 - name: WasmSelectI64
2586   gen_boilerplate: false
2588 - name: WasmCompareAndSelect
2589   gen_boilerplate: false
2591 - name: WasmAddOffset
2592   result_type: WordSized
2593   operands:
2594     base: WordSized
2595   mir_op: true
2597 - name: WasmAddOffset64
2598   result_type: Int64
2599   operands:
2600     base: Int64
2601   mir_op: WasmAddOffset
2603 - name: WasmBoundsCheck
2604   result_type: WordSized
2605   operands:
2606     ptr: WordSized
2607     boundsCheckLimit: WordSized
2608   mir_op: true
2610 - name: WasmBoundsCheck64
2611   gen_boilerplate: false
2613 - name: WasmExtendU32Index
2614   result_type: WordSized
2615   operands:
2616     input: WordSized
2617   mir_op: true
2619 - name: WasmWrapU32Index
2620   result_type: WordSized
2621   operands:
2622     input: WordSized
2623   mir_op: true
2625 - name: WasmAlignmentCheck
2626   operands:
2627     ptr: WordSized
2628   mir_op: true
2630 - name: WasmAlignmentCheck64
2631   operands:
2632     ptr: Int64
2633   mir_op: WasmAlignmentCheck
2635 - name: WasmLoadTls
2636   result_type: WordSized
2637   operands:
2638     tlsPtr: WordSized
2639   mir_op: true
2641 - name: WasmLoadTls64
2642   result_type: Int64
2643   operands:
2644     tlsPtr: WordSized
2645   mir_op: WasmLoadTls
2647 - name: WasmHeapBase
2648   result_type: WordSized
2649   operands:
2650     tlsPtr: WordSized
2651   mir_op: true
2653 - name: WasmLoad
2654   gen_boilerplate: false
2656 - name: WasmLoadI64
2657   gen_boilerplate: false
2659 - name: WasmStore
2660   gen_boilerplate: false
2662 - name: WasmStoreI64
2663   gen_boilerplate: false
2665 - name: AsmJSLoadHeap
2666   result_type: WordSized
2667   operands:
2668     ptr: WordSized
2669     boundsCheckLimit: WordSized
2670     memoryBase: WordSized
2671   mir_op: true
2673 - name: AsmJSStoreHeap
2674   result_type: WordSized
2675   operands:
2676     ptr: WordSized
2677     value: WordSized
2678     boundsCheckLimit: WordSized
2679     memoryBase: WordSized
2680   mir_op: true
2682 - name: WasmCompareExchangeHeap
2683   gen_boilerplate: false
2685 - name: WasmFence
2687 - name: WasmAtomicExchangeHeap
2688   gen_boilerplate: false
2690 - name: WasmAtomicBinopHeap
2691   gen_boilerplate: false
2693 - name: WasmAtomicBinopHeapForEffect
2694   gen_boilerplate: false
2696 - name: WasmLoadSlot
2697   result_type: WordSized
2698   operands:
2699     containerRef: WordSized
2700   arguments:
2701     offset: size_t
2702     type: MIRType
2704 - name: WasmLoadSlotI64
2705   result_type: Int64
2706   operands:
2707     containerRef: WordSized
2708   arguments:
2709     offset: size_t
2711 - name: WasmStoreSlot
2712   operands:
2713     value: WordSized
2714     containerRef: WordSized
2715   arguments:
2716     offset: size_t
2717     type: MIRType
2719 - name: WasmStoreSlotI64
2720   operands:
2721     value: Int64
2722     containerRef: WordSized
2723   arguments:
2724     offset: size_t
2726 - name: WasmDerivedPointer
2727   gen_boilerplate: false
2729 - name: WasmStoreRef
2730   operands:
2731     tls: WordSized
2732     valueAddr: WordSized
2733     value: WordSized
2734   num_temps: 1
2735   mir_op: true
2737 - name: WasmParameter
2738   result_type: WordSized
2740 - name: WasmParameterI64
2741   gen_boilerplate: false
2743 - name: WasmReturn
2744   operands:
2745     rval: WordSized
2746     tls: WordSized
2748 - name: WasmReturnI64
2749   operands:
2750     rval: Int64
2751     tls: WordSized
2753 - name: WasmReturnVoid
2754   operands:
2755     rval: WordSized
2757 - name: WasmStackArg
2758   operands:
2759     arg: WordSized
2760   mir_op: true
2762 - name: WasmStackArgI64
2763   operands:
2764     arg: Int64
2765   mir_op: WasmStackArg
2767 - name: WasmNullConstant
2768   result_type: WordSized
2770 - name: WasmCall
2771   gen_boilerplate: false
2773 - name: WasmRegisterResult
2774   gen_boilerplate: false
2776 - name: WasmRegisterPairResult
2777   gen_boilerplate: false
2779 - name: WasmStackResultArea
2780   result_type: WordSized
2781   num_temps: 1
2782   mir_op: true
2784 - name: WasmStackResult
2785   gen_boilerplate: false
2787 - name: WasmStackResult64
2788   gen_boilerplate: false
2790 - name: AssertRangeI
2791   gen_boilerplate: false
2793 - name: AssertRangeD
2794   gen_boilerplate: false
2796 - name: AssertRangeF
2797   gen_boilerplate: false
2799 - name: AssertRangeV
2800   gen_boilerplate: false
2802 - name: AssertClass
2803   operands:
2804     input: WordSized
2805   num_temps: 1
2806   mir_op: true
2808 - name: AssertShape
2809   operands:
2810     input: WordSized
2811   mir_op: true
2813 - name: AssertResultT
2814   operands:
2815     input: WordSized
2817 - name: AssertResultV
2818   operands:
2819     input: BoxedValue
2821 - name: GuardValue
2822   operands:
2823     input: BoxedValue
2824   mir_op: true
2826 - name: GuardNullOrUndefined
2827   operands:
2828     input: BoxedValue
2829   mir_op: true
2831 - name: GuardIsNotObject
2832   operands:
2833     input: BoxedValue
2834   mir_op: true
2836 - name: GuardFunctionFlags
2837   operands:
2838     function: WordSized
2839   mir_op: true
2841 - name: GuardFunctionIsNonBuiltinCtor
2842   operands:
2843     function: WordSized
2844   num_temps: 1
2846 - name: GuardFunctionKind
2847   operands:
2848     function: WordSized
2849   num_temps: 1
2850   mir_op: true
2852 - name: GuardFunctionScript
2853   operands:
2854     function: WordSized
2855   mir_op: true
2857 - name: IncrementWarmUpCounter
2858   num_temps: 1
2859   mir_op: true
2861 - name: LexicalCheck
2862   operands:
2863     input: BoxedValue
2864   mir_op: true
2866 - name: ThrowRuntimeLexicalError
2867   call_instruction: true
2868   mir_op: true
2870 - name: ThrowMsg
2871   call_instruction: true
2872   mir_op: true
2874 - name: GlobalDeclInstantiation
2875   mir_op: true
2877 - name: MemoryBarrier
2878   gen_boilerplate: false
2880 - name: Debugger
2881   num_temps: 2
2882   call_instruction: true
2884 - name: NewTarget
2885   result_type: BoxedValue
2887 - name: ArrowNewTarget
2888   result_type: BoxedValue
2889   operands:
2890     callee: WordSized
2892 - name: Random
2893   gen_boilerplate: false
2895 - name: CheckReturn
2896   result_type: BoxedValue
2897   operands:
2898     returnValue: BoxedValue
2899     thisValue: BoxedValue
2901 - name: CheckIsObj
2902   result_type: WordSized
2903   operands:
2904     value: BoxedValue
2905   mir_op: true
2907 - name: CheckObjCoercible
2908   operands:
2909     value: BoxedValue
2911 - name: CheckClassHeritage
2912   operands:
2913     heritage: BoxedValue
2914   num_temps: 2
2916 - name: CheckThis
2917   operands:
2918     value: BoxedValue
2920 - name: CheckThisReinit
2921   operands:
2922     thisValue: BoxedValue
2924 - name: Generator
2925   result_type: WordSized
2926   operands:
2927     callee: WordSized
2928     environmentChain: WordSized
2929     argsObject: WordSized
2930   call_instruction: true
2931   mir_op: true
2933 - name: AsyncResolve
2934   result_type: WordSized
2935   operands:
2936     generator: WordSized
2937     valueOrReason: BoxedValue
2938   call_instruction: true
2939   mir_op: true
2941 - name: AsyncAwait
2942   result_type: WordSized
2943   operands:
2944     value: BoxedValue
2945     generator: WordSized
2946   call_instruction: true
2947   mir_op: true
2949 - name: CanSkipAwait
2950   result_type: WordSized
2951   operands:
2952     value: BoxedValue
2953   call_instruction: true
2954   mir_op: true
2956 - name: MaybeExtractAwaitValue
2957   result_type: BoxedValue
2958   operands:
2959     value: BoxedValue
2960     canSkip: WordSized
2961   call_instruction: true
2962   mir_op: true
2964 - name: DebugCheckSelfHosted
2965   operands:
2966     value: BoxedValue
2967   call_instruction: true
2969 - name: FinishBoundFunctionInit
2970   operands:
2971     bound: WordSized
2972     target: WordSized
2973     argCount: WordSized
2974   num_temps: 2
2976 - name: IsPackedArray
2977   result_type: WordSized
2978   operands:
2979     object: WordSized
2980   num_temps: 1
2982 - name: GuardArrayIsPacked
2983   operands:
2984     array: WordSized
2985   num_temps: 2
2986   mir_op: true
2988 - name: GetPrototypeOf
2989   result_type: BoxedValue
2990   operands: 
2991     target: WordSized
2993 - name: ObjectWithProto
2994   result_type: WordSized
2995   operands:
2996     prototype: BoxedValue
2997   call_instruction: true
2999 - name: ObjectStaticProto
3000   result_type: WordSized
3001   operands:
3002     object: WordSized
3004 - name: BuiltinObject
3005   result_type: WordSized
3006   call_instruction: true
3007   mir_op: true
3009 - name: SuperFunction
3010   result_type: BoxedValue
3011   operands:
3012     callee: WordSized
3013   num_temps: 1
3015 - name: InitHomeObject
3016   result_type: WordSized
3017   operands:
3018     function: WordSized
3019     homeObject: BoxedValue
3021 - name: IsTypedArrayConstructor
3022   result_type: WordSized
3023   operands:
3024     object: WordSized
3026 - name: LoadValueTag
3027   result_type: WordSized
3028   operands:
3029     value: BoxedValue
3031 - name: GuardTagNotEqual
3032   operands:
3033     lhs: WordSized
3034     rhs: WordSized
3036 - name: LoadWrapperTarget
3037   result_type: WordSized
3038   operands:
3039     object: WordSized
3041 - name: GuardHasGetterSetter
3042   operands:
3043     object: WordSized
3044   num_temps: 3
3045   call_instruction: true
3046   mir_op: true
3048 - name: GuardIsExtensible
3049   operands:
3050     object: WordSized
3051   num_temps: 1
3053 - name: GuardInt32IsNonNegative
3054   operands:
3055     index: WordSized
3057 - name: GuardIndexGreaterThanDenseInitLength
3058   operands:
3059     object: WordSized
3060     index: WordSized
3061   num_temps: 2
3063 - name: GuardIndexIsValidUpdateOrAdd
3064   operands:
3065     object: WordSized
3066     index: WordSized
3067   num_temps: 2
3069 - name: CallAddOrUpdateSparseElement
3070   operands:
3071     object: WordSized
3072     index: WordSized
3073     value: BoxedValue
3074   call_instruction: true
3075   mir_op: true
3077 - name: CallGetSparseElement
3078   result_type: BoxedValue
3079   operands:
3080     object: WordSized
3081     index: WordSized
3082   call_instruction: true
3084 - name: CallNativeGetElement
3085   result_type: BoxedValue
3086   operands:
3087     object: WordSized
3088     index: WordSized
3089   call_instruction: true
3091 - name: CallObjectHasSparseElement
3092   result_type: WordSized
3093   operands:
3094     object: WordSized
3095     index: WordSized
3096   num_temps: 2
3097   call_instruction: true
3099 - name: BigIntAsIntN
3100   result_type: WordSized
3101   operands:
3102     bits: WordSized
3103     input: WordSized
3104   call_instruction: true
3106 - name: BigIntAsIntN64
3107   gen_boilerplate: false
3109 - name: BigIntAsIntN32
3110   gen_boilerplate: false
3112 - name: GuardNonGCThing
3113   operands:
3114     input: BoxedValue
3116 - name: ToHashableNonGCThing
3117   result_type: BoxedValue
3118   operands:
3119     input: BoxedValue
3120   num_temps: 1
3122 - name: ToHashableString
3123   result_type: WordSized
3124   operands:
3125     input: WordSized
3127 - name: ToHashableValue
3128   result_type: BoxedValue
3129   operands:
3130     input: BoxedValue
3131   num_temps: 1
3133 - name: HashNonGCThing
3134   result_type: WordSized
3135   operands:
3136     input: BoxedValue
3137   num_temps: 1
3139 - name: HashString
3140   result_type: WordSized
3141   operands:
3142     input: WordSized
3143   num_temps: 1
3145 - name: HashSymbol
3146   result_type: WordSized
3147   operands:
3148     input: WordSized
3150 - name: HashBigInt
3151   result_type: WordSized
3152   operands:
3153     input: WordSized
3154   num_temps: 3
3156 - name: HashObject
3157   result_type: WordSized
3158   operands:
3159     setObject: WordSized
3160     input: BoxedValue
3161   num_temps: 4
3163 - name: HashValue
3164   result_type: WordSized
3165   operands:
3166     setObject: WordSized
3167     input: BoxedValue
3168   num_temps: 4
3170 - name: SetObjectHasNonBigInt
3171   result_type: WordSized
3172   operands:
3173     setObject: WordSized
3174     input: BoxedValue
3175     hash: WordSized
3176   num_temps: 2
3178 - name: SetObjectHasBigInt
3179   result_type: WordSized
3180   operands:
3181     setObject: WordSized
3182     input: BoxedValue
3183     hash: WordSized
3184   num_temps: 4
3186 - name: SetObjectHasValue
3187   result_type: WordSized
3188   operands:
3189     setObject: WordSized
3190     input: BoxedValue
3191     hash: WordSized
3192   num_temps: 4
3194 - name: SetObjectHasValueVMCall
3195   result_type: WordSized
3196   call_instruction: true
3197   operands:
3198     setObject: WordSized
3199     input: BoxedValue
3201 - name: MapObjectHasNonBigInt
3202   result_type: WordSized
3203   operands:
3204     mapObject: WordSized
3205     input: BoxedValue
3206     hash: WordSized
3207   num_temps: 2
3209 - name: MapObjectHasBigInt
3210   result_type: WordSized
3211   operands:
3212     mapObject: WordSized
3213     input: BoxedValue
3214     hash: WordSized
3215   num_temps: 4
3217 - name: MapObjectHasValue
3218   result_type: WordSized
3219   operands:
3220     mapObject: WordSized
3221     input: BoxedValue
3222     hash: WordSized
3223   num_temps: 4
3225 - name: MapObjectHasValueVMCall
3226   result_type: WordSized
3227   call_instruction: true
3228   operands:
3229     mapObject: WordSized
3230     input: BoxedValue
3232 - name: MapObjectGetNonBigInt
3233   result_type: BoxedValue
3234   operands:
3235     mapObject: WordSized
3236     input: BoxedValue
3237     hash: WordSized
3238   num_temps: 2
3240 - name: MapObjectGetBigInt
3241   result_type: BoxedValue
3242   operands:
3243     mapObject: WordSized
3244     input: BoxedValue
3245     hash: WordSized
3246   num_temps: 4
3248 - name: MapObjectGetValue
3249   result_type: BoxedValue
3250   operands:
3251     mapObject: WordSized
3252     input: BoxedValue
3253     hash: WordSized
3254   num_temps: 4
3256 - name: MapObjectGetValueVMCall
3257   result_type: BoxedValue
3258   call_instruction: true
3259   operands:
3260     mapObject: WordSized
3261     input: BoxedValue
3263 - name: BigIntAsUintN
3264   result_type: WordSized
3265   operands:
3266     bits: WordSized
3267     input: WordSized
3268   call_instruction: true
3270 - name: BigIntAsUintN64
3271   gen_boilerplate: false
3273 - name: BigIntAsUintN32
3274   gen_boilerplate: false
3276 - name: IonToWasmCall
3277   gen_boilerplate: false
3279 - name: IonToWasmCallV
3280   gen_boilerplate: false
3282 - name: IonToWasmCallI64
3283   gen_boilerplate: false
3285 - name: WasmBoxValue
3286   result_type: WordSized
3287   operands:
3288     input: BoxedValue
3290 - name: WasmAnyRefFromJSObject
3291   result_type: WordSized
3292   operands:
3293     input: WordSized
3295 # Constant Simd128
3296 - name: Simd128
3297   result_type: WordSized
3298   arguments:
3299     simd128: SimdConstant
3301 - name: WasmTernarySimd128
3302   gen_boilerplate: false
3304 - name: WasmBinarySimd128
3305   gen_boilerplate: false
3307 - name: WasmBinarySimd128WithConstant
3308   gen_boilerplate: false
3310 - name: WasmVariableShiftSimd128
3311   gen_boilerplate: false
3313 - name: WasmConstantShiftSimd128
3314   gen_boilerplate: false
3316 - name: WasmSignReplicationSimd128
3317   gen_boilerplate: false
3319 - name: WasmShuffleSimd128
3320   gen_boilerplate: false
3322 - name: WasmPermuteSimd128
3323   gen_boilerplate: false
3325 - name: WasmReplaceLaneSimd128
3326   gen_boilerplate: false
3328 - name: WasmReplaceInt64LaneSimd128
3329   gen_boilerplate: false
3331 - name: WasmScalarToSimd128
3332   gen_boilerplate: false
3334 - name: WasmInt64ToSimd128
3335   gen_boilerplate: false
3337 - name: WasmUnarySimd128
3338   gen_boilerplate: false
3340 - name: WasmReduceSimd128
3341   gen_boilerplate: false
3343 - name: WasmReduceAndBranchSimd128
3344   gen_boilerplate: false
3346 - name: WasmReduceSimd128ToInt64
3347   gen_boilerplate: false
3349 - name: WasmLoadLaneSimd128
3350   gen_boilerplate: false
3352 - name: WasmStoreLaneSimd128
3353   gen_boilerplate: false
3355 - name: Unbox
3356   gen_boilerplate: false
3358 - name: UnboxFloatingPoint
3359   gen_boilerplate: false
3361 - name: WasmUint32ToDouble
3362   gen_boilerplate: false
3364 - name: WasmUint32ToFloat32
3365   gen_boilerplate: false
3367 - name: DivI
3368   gen_boilerplate: false
3370 - name: ModI
3371   gen_boilerplate: false
3373 - name: DivPowTwoI
3374   gen_boilerplate: false
3376 - name: ModPowTwoI
3377   gen_boilerplate: false
3379 - name: TableSwitch
3380   gen_boilerplate: false
3382 - name: TableSwitchV
3383   gen_boilerplate: false
3385 - name: MulI
3386   gen_boilerplate: false
3388 - name: WasmExceptionDataPointer
3389   gen_boilerplate: false
3391 - name: WasmExceptionRefsPointer
3392   gen_boilerplate: false
3394 - name: WasmLoadExceptionRefsValue
3395   gen_boilerplate: false
3397 #ifdef JS_CODEGEN_X86
3398 - name: BoxFloatingPoint
3399   gen_boilerplate: false
3401 - name: DivOrModI64
3402   gen_boilerplate: false
3404 - name: UDivOrModI64
3405   gen_boilerplate: false
3407 - name: DivOrModConstantI
3408   gen_boilerplate: false
3410 - name: UDivOrMod
3411   gen_boilerplate: false
3413 - name: UDivOrModConstant
3414   gen_boilerplate: false
3416 - name: WasmTruncateToInt64
3417   gen_boilerplate: false
3419 - name: Int64ToFloatingPoint
3420   gen_boilerplate: false
3422 - name: WasmAtomicLoadI64
3423   gen_boilerplate: false
3425 - name: WasmAtomicStoreI64
3426   gen_boilerplate: false
3428 - name: WasmCompareExchangeI64
3429   gen_boilerplate: false
3431 - name: WasmAtomicBinopI64
3432   gen_boilerplate: false
3434 - name: WasmAtomicExchangeI64
3435   gen_boilerplate: false
3436 #endif
3438 #ifdef JS_CODEGEN_X64
3439 - name: DivOrModI64
3440   gen_boilerplate: false
3442 - name: UDivOrModI64
3443   gen_boilerplate: false
3445 - name: DivOrModConstantI
3446   gen_boilerplate: false
3448 - name: UDivOrMod
3449   gen_boilerplate: false
3451 - name: UDivOrModConstant
3452   gen_boilerplate: false
3454 - name: WasmTruncateToInt64
3455   gen_boilerplate: false
3457 - name: Int64ToFloatingPoint
3458   gen_boilerplate: false
3459 #endif
3461 #ifdef JS_CODEGEN_ARM
3462 - name: BoxFloatingPoint
3463   gen_boilerplate: false
3465 - name: DivOrModI64
3466   gen_boilerplate: false
3468 - name: UDivOrModI64
3469   gen_boilerplate: false
3471 - name: SoftDivI
3472   gen_boilerplate: false
3474 - name: SoftModI
3475   gen_boilerplate: false
3477 - name: ModMaskI
3478   gen_boilerplate: false
3480 - name: UDiv
3481   gen_boilerplate: false
3483 - name: UMod
3484   gen_boilerplate: false
3486 - name: SoftUDivOrMod
3487   gen_boilerplate: false
3489 - name: Int64ToFloatingPointCall
3490   gen_boilerplate: false
3492 - name: WasmTruncateToInt64
3493   gen_boilerplate: false
3495 - name: WasmAtomicLoadI64
3496   gen_boilerplate: false
3498 - name: WasmAtomicStoreI64
3499   gen_boilerplate: false
3501 - name: WasmCompareExchangeI64
3502   gen_boilerplate: false
3504 - name: WasmAtomicBinopI64
3505   gen_boilerplate: false
3507 - name: WasmAtomicExchangeI64
3508   gen_boilerplate: false
3509 #endif
3511 #ifdef JS_CODEGEN_ARM64
3512 - name: DivOrModI64
3513   gen_boilerplate: false
3515 - name: UDivOrModI64
3516   gen_boilerplate: false
3518 - name: DivConstantI
3519   gen_boilerplate: false
3521 - name: UDivConstantI
3522   gen_boilerplate: false
3524 - name: ModMaskI
3525   gen_boilerplate: false
3527 - name: UDiv
3528   gen_boilerplate: false
3530 - name: UMod
3531   gen_boilerplate: false
3533 - name: WasmTruncateToInt64
3534   gen_boilerplate: false
3536 - name: Int64ToFloatingPoint
3537   gen_boilerplate: false
3538 #endif  
3540 #ifdef JS_CODEGEN_MIPS32
3541 - name: BoxFloatingPoint
3542   gen_boilerplate: false
3544 - name: DivOrModI64
3545   gen_boilerplate: false
3547 - name: UDivOrModI64
3548   gen_boilerplate: false
3550 - name: UDivOrMod
3551   gen_boilerplate: false
3553 - name: ModMaskI
3554   gen_boilerplate: false
3556 - name: WasmTruncateToInt64
3557   gen_boilerplate: false
3559 - name: Int64ToFloatingPoint
3560   gen_boilerplate: false
3562 - name: WasmUnalignedLoad
3563   gen_boilerplate: false
3565 - name: WasmUnalignedLoadI64
3566   gen_boilerplate: false
3568 - name: WasmUnalignedStore
3569   gen_boilerplate: false
3571 - name: WasmUnalignedStoreI64
3572   gen_boilerplate: false
3574 - name: WasmAtomicLoadI64
3575   gen_boilerplate: false
3577 - name: WasmAtomicStoreI64
3578   gen_boilerplate: false
3580 - name: WasmCompareExchangeI64
3581   gen_boilerplate: false
3583 - name: WasmAtomicBinopI64
3584   gen_boilerplate: false
3586 - name: WasmAtomicExchangeI64
3587   gen_boilerplate: false
3588 #endif
3590 #ifdef JS_CODEGEN_MIPS64
3591 - name: DivOrModI64
3592   gen_boilerplate: false
3594 - name: UDivOrMod
3595   gen_boilerplate: false
3597 - name: UDivOrModI64
3598   gen_boilerplate: false
3600 - name: ModMaskI
3601   gen_boilerplate: false
3603 - name: WasmTruncateToInt64
3604   gen_boilerplate: false
3606 - name: Int64ToFloatingPoint
3607   gen_boilerplate: false
3609 - name: WasmUnalignedLoad
3610   gen_boilerplate: false
3612 - name: WasmUnalignedLoadI64
3613   gen_boilerplate: false
3615 - name: WasmUnalignedStore
3616   gen_boilerplate: false
3618 - name: WasmUnalignedStoreI64
3619   gen_boilerplate: false
3621 - name: WasmCompareExchangeI64
3622   gen_boilerplate: false
3624 - name: WasmAtomicBinopI64
3625   gen_boilerplate: false
3627 - name: WasmAtomicExchangeI64
3628   gen_boilerplate: false
3629 #endif