115bd3b065d65031773cc1f3126d33fd5575423c
[WebKit-https.git] / Source / JavaScriptCore / bytecode / BytecodeList.rb
1 # Copyright (C) 2018-2019 Apple Inc. All rights reserved.
2 #
3 # Redistribution and use in source and binary forms, with or without
4 # modification, are permitted provided that the following conditions
5 # are met:
6 # 1. Redistributions of source code must retain the above copyright
7 #    notice, this list of conditions and the following disclaimer.
8 # 2. Redistributions in binary form must reproduce the above copyright
9 #    notice, this list of conditions and the following disclaimer in the
10 #    documentation and/or other materials provided with the distribution.
11 #
12 # THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
13 # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
14 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
15 # PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
16 # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
17 # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
18 # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
19 # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
20 # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
22 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23
24 types [
25     :VirtualRegister,
26
27     :BasicBlockLocation,
28     :BoundLabel,
29     :DebugHookType,
30     :ErrorType,
31     :GetByIdMode,
32     :GetByIdModeMetadata,
33     :GetPutInfo,
34     :IndexingType,
35     :JSCell,
36     :JSGlobalLexicalEnvironment,
37     :JSGlobalObject,
38     :JSModuleEnvironment,
39     :JSObject,
40     :JSScope,
41     :JSType,
42     :JSValue,
43     :LLIntCallLinkInfo,
44     :OperandTypes,
45     :ProfileTypeBytecodeFlag,
46     :PropertyOffset,
47     :PutByIdFlags,
48     :ResolveType,
49     :Structure,
50     :StructureID,
51     :StructureChain,
52     :SymbolTable,
53     :ToThisStatus,
54     :TypeLocation,
55     :WatchpointSet,
56
57     :ValueProfile,
58     :ValueProfileAndOperandBuffer,
59     :ArithProfile,
60     :ArrayProfile,
61     :ArrayAllocationProfile,
62     :ObjectAllocationProfile,
63 ]
64
65 namespace :Special do
66     types [ :Pointer ]
67 end
68
69 templates [
70     :WriteBarrier,
71     :WriteBarrierBase,
72 ]
73
74
75 begin_section :Bytecodes,
76     emit_in_h_file: true,
77     emit_in_structs_file: true,
78     emit_in_asm_file: true,
79     emit_opcode_id_string_values_in_h_file: true,
80     macro_name_component: :BYTECODE,
81     asm_prefix: "llint_",
82     op_prefix: "op_"
83
84 op :wide
85
86 op :enter
87
88 op :get_scope,
89     args: {
90         dst: VirtualRegister
91     }
92
93 op :create_direct_arguments,
94     args: {
95         dst: VirtualRegister,
96     }
97
98 op :create_scoped_arguments,
99     args: {
100         dst: VirtualRegister,
101         scope: VirtualRegister,
102     }
103
104 op :create_cloned_arguments,
105     args: {
106         dst: VirtualRegister,
107     }
108
109 op :create_this,
110     args: {
111         dst: VirtualRegister,
112         callee: VirtualRegister,
113         inlineCapacity: unsigned,
114     },
115     metadata: {
116         cachedCallee: WriteBarrier[JSCell]
117     }
118
119 op :get_argument,
120     args: {
121         dst: VirtualRegister,
122         index: int,
123     },
124     metadata: {
125         profile: ValueProfile,
126     }
127
128 op :argument_count,
129     args: {
130         dst: VirtualRegister,
131     }
132
133 op :to_this,
134     args: {
135         srcDst: VirtualRegister,
136     },
137     metadata: {
138         cachedStructure: WriteBarrierBase[Structure],
139         toThisStatus: ToThisStatus,
140         profile: ValueProfile,
141     }
142
143 op :check_tdz,
144     args: {
145         targetVirtualRegister: VirtualRegister,
146     }
147
148 op :new_object,
149     args: {
150         dst: VirtualRegister,
151         inlineCapacity: unsigned,
152     },
153     metadata: {
154         objectAllocationProfile: ObjectAllocationProfile,
155     }
156
157 op :new_array,
158     args: {
159         dst: VirtualRegister,
160         argv: VirtualRegister,
161         argc: unsigned,
162         recommendedIndexingType: IndexingType,
163     },
164     metadata: {
165         arrayAllocationProfile: ArrayAllocationProfile,
166     }
167
168 op :new_array_with_size,
169     args: {
170         dst: VirtualRegister,
171         length: VirtualRegister,
172     },
173     metadata: {
174         arrayAllocationProfile: ArrayAllocationProfile,
175     }
176
177 op :new_array_buffer,
178     args: {
179         dst: VirtualRegister,
180         immutableButterfly: VirtualRegister,
181         recommendedIndexingType: IndexingType
182     },
183     metadata: {
184         arrayAllocationProfile: ArrayAllocationProfile,
185     }
186
187 op :new_array_with_spread,
188     args: {
189         dst: VirtualRegister,
190         argv: VirtualRegister,
191         argc: unsigned,
192         bitVector: unsigned,
193     }
194
195 op :spread,
196     args: {
197         dst: VirtualRegister,
198         argument: VirtualRegister,
199     }
200
201 op :new_regexp,
202     args: {
203         dst: VirtualRegister,
204         regexp: VirtualRegister,
205     }
206
207 op :mov,
208     args: {
209         dst: VirtualRegister,
210         src: VirtualRegister,
211     }
212
213 op_group :BinaryOp,
214     [
215         :eq,
216         :neq,
217         :stricteq,
218         :nstricteq,
219         :less,
220         :lesseq,
221         :greater,
222         :greatereq,
223         :below,
224         :beloweq,
225         :mod,
226         :pow,
227         :lshift,
228         :rshift,
229         :urshift,
230     ],
231     args: {
232         dst: VirtualRegister,
233         lhs: VirtualRegister,
234         rhs: VirtualRegister,
235     }
236
237 op_group :ProfiledBinaryOp,
238     [
239         :add,
240         :mul,
241         :div,
242         :sub,
243     ],
244     args: {
245         dst: VirtualRegister,
246         lhs: VirtualRegister,
247         rhs: VirtualRegister,
248         operandTypes: OperandTypes,
249     },
250     metadata: {
251         arithProfile: ArithProfile
252     },
253     metadata_initializers: {
254         arithProfile: :operandTypes
255     }
256
257 op_group :ValueProfiledBinaryOp,
258     [
259         :bitand,
260         :bitor,
261         :bitxor,
262     ],
263     args: {
264         dst: VirtualRegister,
265         lhs: VirtualRegister,
266         rhs: VirtualRegister,
267     },
268     metadata: {
269         profile: ValueProfile
270     }
271
272 op :bitnot,
273     args: {
274         dst: VirtualRegister,
275         operand: VirtualRegister,
276     },
277     metadata: {
278         profile: ValueProfile
279     }
280
281 op_group :UnaryOp,
282     [
283         :eq_null,
284         :neq_null,
285         :to_string,
286         :unsigned,
287         :is_empty,
288         :is_undefined,
289         :is_undefined_or_null,
290         :is_boolean,
291         :is_number,
292         :is_object,
293         :is_object_or_null,
294         :is_function,
295     ],
296     args: {
297         dst: VirtualRegister,
298         operand: VirtualRegister,
299     }
300
301 op :inc,
302     args: {
303         srcDst: VirtualRegister,
304     }
305
306 op :dec,
307     args: {
308         srcDst: VirtualRegister,
309     }
310
311 op :to_object,
312     args: {
313         dst: VirtualRegister,
314         operand: VirtualRegister,
315         message: unsigned,
316     },
317     metadata: {
318         profile: ValueProfile,
319     }
320
321 op :to_number,
322     args: {
323         dst: VirtualRegister,
324         operand: VirtualRegister,
325     },
326     metadata: {
327         profile: ValueProfile,
328     }
329
330 op :negate,
331     args: {
332         dst: VirtualRegister,
333         operand: VirtualRegister,
334         operandTypes: OperandTypes,
335     },
336     metadata: {
337         arithProfile: ArithProfile,
338     },
339     metadata_initializers: {
340         arithProfile: :operandTypes
341     }
342
343 op :not,
344     args: {
345         dst: VirtualRegister,
346         operand: VirtualRegister,
347     }
348
349
350 op :identity_with_profile,
351     args: {
352         srcDst: VirtualRegister,
353         topProfile: unsigned,
354         bottomProfile: unsigned,
355     }
356
357 op :overrides_has_instance,
358     args: {
359         dst: VirtualRegister,
360         constructor: VirtualRegister,
361         hasInstanceValue: VirtualRegister,
362     }
363
364 op :instanceof,
365     args: {
366         dst: VirtualRegister,
367         value: VirtualRegister,
368         prototype: VirtualRegister,
369     }
370
371 op :instanceof_custom,
372     args: {
373         dst: VirtualRegister,
374         value: VirtualRegister,
375         constructor: VirtualRegister,
376         hasInstanceValue: VirtualRegister,
377     }
378
379 op :typeof,
380     args: {
381         dst: VirtualRegister,
382         value: VirtualRegister,
383     }
384
385 op :is_cell_with_type,
386     args: {
387         dst: VirtualRegister,
388         operand: VirtualRegister,
389         type: JSType,
390     }
391
392 op :in_by_val,
393     args: {
394         dst: VirtualRegister,
395         base: VirtualRegister,
396         property: VirtualRegister,
397     },
398     metadata: {
399         arrayProfile: ArrayProfile,
400     }
401
402 op :in_by_id,
403     args: {
404         dst: VirtualRegister,
405         base: VirtualRegister,
406         property: unsigned,
407     }
408
409 op :get_by_id,
410     args: {
411         dst: VirtualRegister,
412         base: VirtualRegister,
413         property: unsigned,
414     },
415     metadata: {
416         mode: GetByIdMode,
417         hitCountForLLIntCaching: unsigned,
418         modeMetadata: GetByIdModeMetadata,
419         profile: ValueProfile,
420     }
421
422 op :get_by_id_with_this,
423     args: {
424         dst: VirtualRegister,
425         base: VirtualRegister,
426         thisValue: VirtualRegister,
427         property: unsigned,
428     },
429     metadata: {
430         profile: ValueProfile,
431     }
432
433 op :get_by_val_with_this,
434     args: {
435         dst: VirtualRegister,
436         base: VirtualRegister,
437         thisValue: VirtualRegister,
438         property: VirtualRegister,
439     },
440     metadata: {
441         profile: ValueProfile,
442     }
443
444 op :get_by_id_direct,
445     args: {
446         dst: VirtualRegister,
447         base: VirtualRegister,
448         property: unsigned,
449     },
450     metadata: {
451         profile: ValueProfile, # not used in llint
452         structureID: StructureID,
453         offset: unsigned,
454     }
455
456 op :try_get_by_id,
457     args: {
458         dst: VirtualRegister,
459         base: VirtualRegister,
460         property: unsigned,
461     },
462     metadata: {
463         profile: ValueProfile,
464     }
465
466 op :put_by_id,
467     args: {
468         base: VirtualRegister,
469         property: unsigned,
470         value: VirtualRegister,
471         flags: PutByIdFlags,
472     },
473     metadata: {
474         oldStructureID: StructureID,
475         offset: unsigned,
476         newStructureID: StructureID,
477         structureChain: WriteBarrierBase[StructureChain],
478     }
479
480 op :put_by_id_with_this,
481     args: {
482         base: VirtualRegister,
483         thisValue: VirtualRegister,
484         property: unsigned,
485         value: VirtualRegister,
486     }
487
488 op :del_by_id,
489     args: {
490         dst: VirtualRegister,
491         base: VirtualRegister,
492         property: unsigned,
493     }
494
495 op :get_by_val,
496     args: {
497         dst: VirtualRegister,
498         base: VirtualRegister,
499         property: VirtualRegister,
500     },
501     metadata: {
502         profile: ValueProfile,
503         arrayProfile: ArrayProfile,
504     }
505
506 op :put_by_val,
507     args: {
508         base: VirtualRegister,
509         property: VirtualRegister,
510         value: VirtualRegister,
511     },
512     metadata: {
513         arrayProfile: ArrayProfile,
514     }
515
516 op :put_by_val_with_this,
517     args: {
518         base: VirtualRegister,
519         thisValue: VirtualRegister,
520         property: VirtualRegister,
521         value: VirtualRegister,
522     }
523
524 op :put_by_val_direct,
525     args: {
526         base: VirtualRegister,
527         property: VirtualRegister,
528         value: VirtualRegister,
529     },
530     metadata: {
531         arrayProfile: ArrayProfile,
532     }
533
534 op :del_by_val,
535     args: {
536         dst: VirtualRegister,
537         base: VirtualRegister,
538         property: VirtualRegister,
539     }
540
541 op :put_getter_by_id,
542     args: {
543         base: VirtualRegister,
544         property: unsigned,
545         attributes: unsigned,
546         accessor: VirtualRegister,
547     }
548
549 op :put_setter_by_id,
550     args: {
551         base: VirtualRegister,
552         property: unsigned,
553         attributes: unsigned,
554         accessor: VirtualRegister,
555     }
556
557 op :put_getter_setter_by_id,
558     args: {
559         base: VirtualRegister,
560         property: unsigned,
561         attributes: unsigned,
562         getter: VirtualRegister,
563         setter: VirtualRegister,
564     }
565
566 op :put_getter_by_val,
567     args: {
568         base: VirtualRegister,
569         property: VirtualRegister,
570         attributes: unsigned,
571         accessor: VirtualRegister,
572     }
573
574 op :put_setter_by_val,
575     args: {
576         base: VirtualRegister,
577         property: VirtualRegister,
578         attributes: unsigned,
579         accessor: VirtualRegister,
580     }
581
582 op :define_data_property,
583     args: {
584         base: VirtualRegister,
585         property: VirtualRegister,
586         value: VirtualRegister,
587         attributes: VirtualRegister,
588     }
589
590 op :define_accessor_property,
591     args: {
592         base: VirtualRegister,
593         property: VirtualRegister,
594         getter: VirtualRegister,
595         setter: VirtualRegister,
596         attributes: VirtualRegister,
597     }
598
599 op :jmp,
600     args: {
601         targetLabel: BoundLabel,
602     }
603
604 op :jtrue,
605     args: {
606         condition: VirtualRegister,
607         targetLabel: BoundLabel,
608     }
609
610 op :jfalse,
611     args: {
612         condition: VirtualRegister,
613         targetLabel: BoundLabel,
614     }
615
616 op :jeq_null,
617     args: {
618         value: VirtualRegister,
619         targetLabel: BoundLabel,
620     }
621
622 op :jneq_null,
623     args: {
624         value: VirtualRegister,
625         targetLabel: BoundLabel,
626     }
627
628 op :jneq_ptr,
629     args: {
630         value: VirtualRegister,
631         specialPointer: Special::Pointer,
632         targetLabel: BoundLabel,
633     },
634     metadata: {
635         hasJumped: bool,
636     }
637
638 op_group :BinaryJmp,
639     [
640         :jeq,
641         :jstricteq,
642         :jneq,
643         :jnstricteq,
644         :jless,
645         :jlesseq,
646         :jgreater,
647         :jgreatereq,
648         :jnless,
649         :jnlesseq,
650         :jngreater,
651         :jngreatereq,
652         :jbelow,
653         :jbeloweq,
654     ],
655     args: {
656         lhs: VirtualRegister,
657         rhs: VirtualRegister,
658         targetLabel: BoundLabel,
659     }
660
661 op :loop_hint
662
663 op_group :SwitchValue,
664     [
665         :switch_imm,
666         :switch_char,
667         :switch_string,
668     ],
669     args: {
670         tableIndex: unsigned,
671         defaultOffset: BoundLabel,
672         scrutinee: VirtualRegister,
673     }
674
675 op_group :NewFunction,
676     [
677         :new_func,
678         :new_func_exp,
679         :new_generator_func,
680         :new_generator_func_exp,
681         :new_async_func,
682         :new_async_func_exp,
683         :new_async_generator_func,
684         :new_async_generator_func_exp,
685     ],
686     args: {
687         dst: VirtualRegister,
688         scope: VirtualRegister,
689         functionDecl: unsigned,
690     }
691
692 op :set_function_name,
693     args: {
694         function: VirtualRegister,
695         name: VirtualRegister,
696     }
697
698 # op_call variations
699 op :call,
700     args: {
701         dst: VirtualRegister,
702         callee: VirtualRegister,
703         argc: unsigned,
704         argv: unsigned,
705     },
706     metadata: {
707         callLinkInfo: LLIntCallLinkInfo,
708         arrayProfile: ArrayProfile,
709         profile: ValueProfile,
710     }
711
712 op :tail_call,
713     args: {
714         dst: VirtualRegister,
715         callee: VirtualRegister,
716         argc: unsigned,
717         argv: unsigned,
718     },
719     metadata: {
720         callLinkInfo: LLIntCallLinkInfo,
721         arrayProfile: ArrayProfile,
722         profile: ValueProfile,
723     }
724
725 op :call_eval,
726     args: {
727         dst: VirtualRegister,
728         callee: VirtualRegister,
729         argc: unsigned,
730         argv: unsigned,
731     },
732     metadata: {
733         callLinkInfo: LLIntCallLinkInfo,
734         arrayProfile: ArrayProfile,
735         profile: ValueProfile,
736     }
737
738 op :call_varargs,
739     args: {
740         dst: VirtualRegister,
741         callee: VirtualRegister,
742         thisValue?: VirtualRegister,
743         arguments?: VirtualRegister,
744         firstFree: VirtualRegister,
745         firstVarArg: int,
746     },
747     metadata: {
748         arrayProfile: ArrayProfile,
749         profile: ValueProfile,
750     }
751
752 op :tail_call_varargs,
753     args: {
754         dst: VirtualRegister,
755         callee: VirtualRegister,
756         thisValue?: VirtualRegister,
757         arguments?: VirtualRegister,
758         firstFree: VirtualRegister,
759         firstVarArg: int,
760     },
761     metadata: {
762         arrayProfile: ArrayProfile,
763         profile: ValueProfile,
764     }
765
766 op :tail_call_forward_arguments,
767     args: {
768         dst: VirtualRegister,
769         callee: VirtualRegister,
770         thisValue?: VirtualRegister,
771         arguments?: VirtualRegister,
772         firstFree: VirtualRegister,
773         firstVarArg: int,
774     },
775     metadata: {
776         arrayProfile: ArrayProfile,
777         profile: ValueProfile,
778     }
779
780 op :construct,
781     args: {
782         dst: VirtualRegister,
783         callee: VirtualRegister,
784         argc: unsigned,
785         argv: unsigned,
786     },
787     metadata: {
788         callLinkInfo: LLIntCallLinkInfo,
789         arrayProfile: ArrayProfile,
790         profile: ValueProfile,
791     }
792
793 op :construct_varargs,
794     args: {
795         dst: VirtualRegister,
796         callee: VirtualRegister,
797         thisValue?: VirtualRegister,
798         arguments?: VirtualRegister,
799         firstFree: VirtualRegister,
800         firstVarArg: int,
801     },
802     metadata: {
803         arrayProfile: ArrayProfile,
804         profile: ValueProfile,
805     }
806
807 op :ret,
808     args: {
809         value: VirtualRegister,
810     }
811
812 op :strcat,
813     args: {
814         dst: VirtualRegister,
815         src: VirtualRegister,
816         count: int,
817     }
818
819 op :to_primitive,
820     args: {
821         dst: VirtualRegister,
822         src: VirtualRegister,
823     }
824
825 op :resolve_scope,
826     args: {
827         dst: VirtualRegister, # offset 1
828         scope: VirtualRegister, # offset 2
829         var: unsigned, # offset 3
830         # $begin: :private,
831         resolveType: ResolveType,
832         localScopeDepth: unsigned,
833     },
834     metadata: {
835         resolveType: ResolveType, # offset 4
836         _0: { # offset 5
837             localScopeDepth: unsigned,
838             globalLexicalBindingEpoch: unsigned,
839         },
840         _1: { # offset 6
841              # written during linking
842              lexicalEnvironment: WriteBarrierBase[JSCell], # lexicalEnvironment && type == ModuleVar
843              symbolTable: WriteBarrierBase[SymbolTable], # lexicalEnvironment && type != ModuleVar
844
845              constantScope: WriteBarrierBase[JSScope],
846
847              # written from the slow path
848              globalLexicalEnvironment: JSGlobalLexicalEnvironment.*,
849              globalObject: JSGlobalObject.*,
850         },
851     }
852
853 op :get_from_scope,
854     args: {
855         dst: VirtualRegister, # offset  1
856         scope: VirtualRegister, # offset 2
857         var: unsigned, # offset 3
858         # $begin: :private,
859         getPutInfo: GetPutInfo,
860         localScopeDepth: unsigned,
861         offset: unsigned,
862     },
863     metadata: {
864         getPutInfo: GetPutInfo, # offset 4
865         _: { #previously offset 5
866             watchpointSet: WatchpointSet.*,
867             structure: WriteBarrierBase[Structure],
868         },
869         operand: uintptr_t, #offset 6
870         profile: ValueProfile, # offset 7
871     },
872     metadata_initializers: {
873         getPutInfo: :getPutInfo,
874         operand: :offset,
875     }
876
877 op :put_to_scope,
878     args: {
879         scope: VirtualRegister, # offset 1
880         var: unsigned, # offset 2
881         value: VirtualRegister, # offset 3
882         # $begin: :private,
883         getPutInfo: GetPutInfo,
884         symbolTableOrScopeDepth: int,
885         offset: unsigned,
886     },
887     metadata: {
888         getPutInfo: GetPutInfo, # offset 4
889         _: { # offset 5
890             structure: WriteBarrierBase[Structure],
891             watchpointSet: WatchpointSet.*,
892         },
893         operand: uintptr_t, # offset 6
894     },
895     metadata_initializers: {
896         getPutInfo: :getPutInfo,
897         operand: :offset,
898     }
899
900 op :get_from_arguments,
901     args: {
902         dst: VirtualRegister,
903         arguments: VirtualRegister,
904         index: unsigned,
905     },
906     metadata: {
907         profile: ValueProfile,
908     }
909
910 op :put_to_arguments,
911     args: {
912         arguments: VirtualRegister,
913         index: unsigned,
914         value: VirtualRegister,
915     }
916
917 op :push_with_scope,
918     args: {
919         dst: VirtualRegister,
920         currentScope: VirtualRegister,
921         newScope: VirtualRegister,
922     }
923
924 op :create_lexical_environment,
925     args: {
926         dst: VirtualRegister,
927         scope: VirtualRegister,
928         symbolTable: VirtualRegister,
929         initialValue: VirtualRegister,
930     }
931
932 op :get_parent_scope,
933     args: {
934         dst: VirtualRegister,
935         scope: VirtualRegister,
936     }
937
938 op :catch,
939     args: {
940         exception: VirtualRegister,
941         thrownValue: VirtualRegister,
942     },
943     metadata: {
944         buffer: ValueProfileAndOperandBuffer.*,
945     }
946
947 op :throw,
948     args: {
949         value: VirtualRegister,
950     }
951
952 op :throw_static_error,
953     args: {
954         message: VirtualRegister,
955         errorType: ErrorType,
956     }
957
958 op :debug,
959     args: {
960         debugHookType: DebugHookType,
961         hasBreakpoint: bool,
962     }
963
964 op :end,
965     args: {
966         value: VirtualRegister,
967     }
968
969 op :profile_type,
970     args: {
971         targetVirtualRegister: VirtualRegister,
972         symbolTableOrScopeDepth: int,
973         flag: ProfileTypeBytecodeFlag,
974         identifier?: unsigned,
975         resolveType: ResolveType,
976     },
977     metadata: {
978         typeLocation: TypeLocation.*,
979     }
980
981 op :profile_control_flow,
982     args: {
983         textOffset: int,
984     },
985     metadata: {
986         basicBlockLocation: BasicBlockLocation.*,
987     }
988
989 op :get_enumerable_length,
990     args: {
991         dst: VirtualRegister,
992         base: VirtualRegister,
993     }
994
995 op :has_indexed_property,
996     args: {
997         dst: VirtualRegister,
998         base: VirtualRegister,
999         property: VirtualRegister,
1000     },
1001     metadata: {
1002         arrayProfile: ArrayProfile,
1003     }
1004
1005 op :has_structure_property,
1006     args: {
1007         dst: VirtualRegister,
1008         base: VirtualRegister,
1009         property: VirtualRegister,
1010         enumerator: VirtualRegister,
1011     }
1012
1013 op :has_generic_property,
1014     args: {
1015         dst: VirtualRegister,
1016         base: VirtualRegister,
1017         property: VirtualRegister,
1018     }
1019
1020 op :get_direct_pname,
1021     args: {
1022         dst: VirtualRegister,
1023         base: VirtualRegister,
1024         property: VirtualRegister,
1025         index: VirtualRegister,
1026         enumerator: VirtualRegister,
1027     },
1028     metadata: {
1029         profile: ValueProfile,
1030     }
1031
1032 op :get_property_enumerator,
1033     args: {
1034         dst: VirtualRegister,
1035         base: VirtualRegister,
1036     }
1037
1038 op :enumerator_structure_pname,
1039     args: {
1040         dst: VirtualRegister,
1041         enumerator: VirtualRegister,
1042         index: VirtualRegister,
1043     }
1044
1045 op :enumerator_generic_pname,
1046     args: {
1047         dst: VirtualRegister,
1048         enumerator: VirtualRegister,
1049         index: VirtualRegister,
1050     }
1051
1052 op :to_index_string,
1053     args: {
1054         dst: VirtualRegister,
1055         index: VirtualRegister,
1056     }
1057
1058 op :unreachable
1059
1060 op :create_rest,
1061     args: {
1062         dst: VirtualRegister,
1063         arraySize: VirtualRegister,
1064         numParametersToSkip: unsigned,
1065     }
1066
1067 op :get_rest_length,
1068     args: {
1069         dst: VirtualRegister,
1070         numParametersToSkip: unsigned,
1071     }
1072
1073 op :yield,
1074     args: {
1075         generator: VirtualRegister,
1076         yieldPoint: unsigned,
1077         argument: VirtualRegister,
1078     }
1079
1080 op :check_traps
1081
1082 op :log_shadow_chicken_prologue,
1083     args: {
1084         scope: VirtualRegister,
1085     }
1086
1087 op :log_shadow_chicken_tail,
1088     args: {
1089         thisValue: VirtualRegister,
1090         scope: VirtualRegister,
1091     }
1092
1093 op :resolve_scope_for_hoisting_func_decl_in_eval,
1094     args: {
1095         dst: VirtualRegister,
1096         scope: VirtualRegister,
1097         property: unsigned,
1098     }
1099
1100 op :nop
1101
1102 op :super_sampler_begin
1103
1104 op :super_sampler_end
1105
1106 end_section :Bytecodes
1107
1108 begin_section :CLoopHelpers,
1109     emit_in_h_file: true,
1110     macro_name_component: :CLOOP_BYTECODE_HELPER
1111
1112 op :llint_entry
1113 op :getHostCallReturnValue
1114 op :llint_return_to_host
1115 op :llint_vm_entry_to_javascript
1116 op :llint_vm_entry_to_native
1117 op :llint_cloop_did_return_from_js_1
1118 op :llint_cloop_did_return_from_js_2
1119 op :llint_cloop_did_return_from_js_3
1120 op :llint_cloop_did_return_from_js_4
1121 op :llint_cloop_did_return_from_js_5
1122 op :llint_cloop_did_return_from_js_6
1123 op :llint_cloop_did_return_from_js_7
1124 op :llint_cloop_did_return_from_js_8
1125 op :llint_cloop_did_return_from_js_9
1126 op :llint_cloop_did_return_from_js_10
1127 op :llint_cloop_did_return_from_js_11
1128 op :llint_cloop_did_return_from_js_12
1129 op :llint_cloop_did_return_from_js_13
1130 op :llint_cloop_did_return_from_js_14
1131 op :llint_cloop_did_return_from_js_15
1132 op :llint_cloop_did_return_from_js_16
1133 op :llint_cloop_did_return_from_js_17
1134 op :llint_cloop_did_return_from_js_18
1135 op :llint_cloop_did_return_from_js_19
1136 op :llint_cloop_did_return_from_js_20
1137 op :llint_cloop_did_return_from_js_21
1138 op :llint_cloop_did_return_from_js_22
1139 op :llint_cloop_did_return_from_js_23
1140
1141 end_section :CLoopHelpers
1142
1143 begin_section :NativeHelpers,
1144     emit_in_h_file: true,
1145     emit_in_asm_file: true,
1146     macro_name_component: :BYTECODE_HELPER
1147
1148 op :llint_program_prologue
1149 op :llint_eval_prologue
1150 op :llint_module_program_prologue
1151 op :llint_function_for_call_prologue
1152 op :llint_function_for_construct_prologue
1153 op :llint_function_for_call_arity_check
1154 op :llint_function_for_construct_arity_check
1155 op :llint_generic_return_point
1156 op :llint_throw_from_slow_path_trampoline
1157 op :llint_throw_during_call_trampoline
1158 op :llint_native_call_trampoline
1159 op :llint_native_construct_trampoline
1160 op :llint_internal_function_call_trampoline
1161 op :llint_internal_function_construct_trampoline
1162 op :handleUncaughtException
1163
1164 end_section :NativeHelpers