ea1bbe2d68d91fd4980b297c0c313f1930cf5d3c
[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     :SymbolTableOrScopeDepth,
54     :ToThisStatus,
55     :TypeLocation,
56     :WatchpointSet,
57
58     :ValueProfile,
59     :ValueProfileAndOperandBuffer,
60     :ArithProfile,
61     :ArrayProfile,
62     :ArrayAllocationProfile,
63     :ObjectAllocationProfile,
64 ]
65
66 namespace :Special do
67     types [ :Pointer ]
68 end
69
70 templates [
71     :WriteBarrier,
72     :WriteBarrierBase,
73 ]
74
75
76 begin_section :Bytecodes,
77     emit_in_h_file: true,
78     emit_in_structs_file: true,
79     emit_in_asm_file: true,
80     emit_opcode_id_string_values_in_h_file: true,
81     macro_name_component: :BYTECODE,
82     asm_prefix: "llint_",
83     op_prefix: "op_"
84
85 op :wide16
86 op :wide32
87
88 op :enter
89
90 op :get_scope,
91     args: {
92         dst: VirtualRegister
93     }
94
95 op :create_direct_arguments,
96     args: {
97         dst: VirtualRegister,
98     }
99
100 op :create_scoped_arguments,
101     args: {
102         dst: VirtualRegister,
103         scope: VirtualRegister,
104     }
105
106 op :create_cloned_arguments,
107     args: {
108         dst: VirtualRegister,
109     }
110
111 op :create_this,
112     args: {
113         dst: VirtualRegister,
114         callee: VirtualRegister,
115         inlineCapacity: unsigned,
116     },
117     metadata: {
118         cachedCallee: WriteBarrier[JSCell]
119     }
120
121 op :get_argument,
122     args: {
123         dst: VirtualRegister,
124         index: int,
125     },
126     metadata: {
127         profile: ValueProfile,
128     }
129
130 op :argument_count,
131     args: {
132         dst: VirtualRegister,
133     }
134
135 op :to_this,
136     args: {
137         srcDst: VirtualRegister,
138     },
139     metadata: {
140         cachedStructureID: StructureID,
141         toThisStatus: ToThisStatus,
142         profile: ValueProfile,
143     }
144
145 op :check_tdz,
146     args: {
147         targetVirtualRegister: VirtualRegister,
148     }
149
150 op :new_object,
151     args: {
152         dst: VirtualRegister,
153         inlineCapacity: unsigned,
154     },
155     metadata: {
156         objectAllocationProfile: ObjectAllocationProfile,
157     }
158
159 op :new_array,
160     args: {
161         dst: VirtualRegister,
162         argv: VirtualRegister,
163         argc: unsigned,
164         recommendedIndexingType: IndexingType,
165     },
166     metadata: {
167         arrayAllocationProfile: ArrayAllocationProfile,
168     }
169
170 op :new_array_with_size,
171     args: {
172         dst: VirtualRegister,
173         length: VirtualRegister,
174     },
175     metadata: {
176         arrayAllocationProfile: ArrayAllocationProfile,
177     }
178
179 op :new_array_buffer,
180     args: {
181         dst: VirtualRegister,
182         immutableButterfly: VirtualRegister,
183         recommendedIndexingType: IndexingType
184     },
185     metadata: {
186         arrayAllocationProfile: ArrayAllocationProfile,
187     }
188
189 op :new_array_with_spread,
190     args: {
191         dst: VirtualRegister,
192         argv: VirtualRegister,
193         argc: unsigned,
194         bitVector: unsigned,
195     }
196
197 op :spread,
198     args: {
199         dst: VirtualRegister,
200         argument: VirtualRegister,
201     }
202
203 op :new_regexp,
204     args: {
205         dst: VirtualRegister,
206         regexp: VirtualRegister,
207     }
208
209 op :mov,
210     args: {
211         dst: VirtualRegister,
212         src: VirtualRegister,
213     }
214
215 op_group :BinaryOp,
216     [
217         :eq,
218         :neq,
219         :stricteq,
220         :nstricteq,
221         :less,
222         :lesseq,
223         :greater,
224         :greatereq,
225         :below,
226         :beloweq,
227         :mod,
228         :pow,
229         :lshift,
230         :rshift,
231         :urshift,
232     ],
233     args: {
234         dst: VirtualRegister,
235         lhs: VirtualRegister,
236         rhs: VirtualRegister,
237     }
238
239 op_group :ProfiledBinaryOp,
240     [
241         :add,
242         :mul,
243         :div,
244         :sub,
245     ],
246     args: {
247         dst: VirtualRegister,
248         lhs: VirtualRegister,
249         rhs: VirtualRegister,
250         operandTypes: OperandTypes,
251     },
252     metadata: {
253         arithProfile: ArithProfile
254     },
255     metadata_initializers: {
256         arithProfile: :operandTypes
257     }
258
259 op_group :ValueProfiledBinaryOp,
260     [
261         :bitand,
262         :bitor,
263         :bitxor,
264     ],
265     args: {
266         dst: VirtualRegister,
267         lhs: VirtualRegister,
268         rhs: VirtualRegister,
269     },
270     metadata: {
271         profile: ValueProfile
272     }
273
274 op :bitnot,
275     args: {
276         dst: VirtualRegister,
277         operand: VirtualRegister,
278     },
279     metadata: {
280         profile: ValueProfile
281     }
282
283 op_group :UnaryOp,
284     [
285         :eq_null,
286         :neq_null,
287         :to_string,
288         :unsigned,
289         :is_empty,
290         :is_undefined,
291         :is_undefined_or_null,
292         :is_boolean,
293         :is_number,
294         :is_object,
295         :is_object_or_null,
296         :is_function,
297     ],
298     args: {
299         dst: VirtualRegister,
300         operand: VirtualRegister,
301     }
302
303 op :inc,
304     args: {
305         srcDst: VirtualRegister,
306     }
307
308 op :dec,
309     args: {
310         srcDst: VirtualRegister,
311     }
312
313 op :to_object,
314     args: {
315         dst: VirtualRegister,
316         operand: VirtualRegister,
317         message: unsigned,
318     },
319     metadata: {
320         profile: ValueProfile,
321     }
322
323 op :to_number,
324     args: {
325         dst: VirtualRegister,
326         operand: VirtualRegister,
327     },
328     metadata: {
329         profile: ValueProfile,
330     }
331
332 op :negate,
333     args: {
334         dst: VirtualRegister,
335         operand: VirtualRegister,
336         operandTypes: OperandTypes,
337     },
338     metadata: {
339         arithProfile: ArithProfile,
340     },
341     metadata_initializers: {
342         arithProfile: :operandTypes
343     }
344
345 op :not,
346     args: {
347         dst: VirtualRegister,
348         operand: VirtualRegister,
349     }
350
351
352 op :identity_with_profile,
353     args: {
354         srcDst: VirtualRegister,
355         topProfile: unsigned,
356         bottomProfile: unsigned,
357     }
358
359 op :overrides_has_instance,
360     args: {
361         dst: VirtualRegister,
362         constructor: VirtualRegister,
363         hasInstanceValue: VirtualRegister,
364     }
365
366 op :instanceof,
367     args: {
368         dst: VirtualRegister,
369         value: VirtualRegister,
370         prototype: VirtualRegister,
371     }
372
373 op :instanceof_custom,
374     args: {
375         dst: VirtualRegister,
376         value: VirtualRegister,
377         constructor: VirtualRegister,
378         hasInstanceValue: VirtualRegister,
379     }
380
381 op :typeof,
382     args: {
383         dst: VirtualRegister,
384         value: VirtualRegister,
385     }
386
387 op :is_cell_with_type,
388     args: {
389         dst: VirtualRegister,
390         operand: VirtualRegister,
391         type: JSType,
392     }
393
394 op :in_by_val,
395     args: {
396         dst: VirtualRegister,
397         base: VirtualRegister,
398         property: VirtualRegister,
399     },
400     metadata: {
401         arrayProfile: ArrayProfile,
402     }
403
404 op :in_by_id,
405     args: {
406         dst: VirtualRegister,
407         base: VirtualRegister,
408         property: unsigned,
409     }
410
411 op :get_by_id,
412     args: {
413         dst: VirtualRegister,
414         base: VirtualRegister,
415         property: unsigned,
416     },
417     metadata: {
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         profile: ValueProfile,
709     }
710
711 op :tail_call,
712     args: {
713         dst: VirtualRegister,
714         callee: VirtualRegister,
715         argc: unsigned,
716         argv: unsigned,
717     },
718     metadata: {
719         callLinkInfo: LLIntCallLinkInfo,
720         profile: ValueProfile,
721     }
722
723 op :call_eval,
724     args: {
725         dst: VirtualRegister,
726         callee: VirtualRegister,
727         argc: unsigned,
728         argv: unsigned,
729     },
730     metadata: {
731         callLinkInfo: LLIntCallLinkInfo,
732         profile: ValueProfile,
733     }
734
735 op :call_varargs,
736     args: {
737         dst: VirtualRegister,
738         callee: VirtualRegister,
739         thisValue?: VirtualRegister,
740         arguments?: VirtualRegister,
741         firstFree: VirtualRegister,
742         firstVarArg: int,
743     },
744     metadata: {
745         arrayProfile: ArrayProfile,
746         profile: ValueProfile,
747     }
748
749 op :tail_call_varargs,
750     args: {
751         dst: VirtualRegister,
752         callee: VirtualRegister,
753         thisValue?: VirtualRegister,
754         arguments?: VirtualRegister,
755         firstFree: VirtualRegister,
756         firstVarArg: int,
757     },
758     metadata: {
759         arrayProfile: ArrayProfile,
760         profile: ValueProfile,
761     }
762
763 op :tail_call_forward_arguments,
764     args: {
765         dst: VirtualRegister,
766         callee: VirtualRegister,
767         thisValue?: VirtualRegister,
768         arguments?: VirtualRegister,
769         firstFree: VirtualRegister,
770         firstVarArg: int,
771     },
772     metadata: {
773         arrayProfile: ArrayProfile,
774         profile: ValueProfile,
775     }
776
777 op :construct,
778     args: {
779         dst: VirtualRegister,
780         callee: VirtualRegister,
781         argc: unsigned,
782         argv: unsigned,
783     },
784     metadata: {
785         callLinkInfo: LLIntCallLinkInfo,
786         profile: ValueProfile,
787     }
788
789 op :construct_varargs,
790     args: {
791         dst: VirtualRegister,
792         callee: VirtualRegister,
793         thisValue?: VirtualRegister,
794         arguments?: VirtualRegister,
795         firstFree: VirtualRegister,
796         firstVarArg: int,
797     },
798     metadata: {
799         arrayProfile: ArrayProfile,
800         profile: ValueProfile,
801     }
802
803 op :ret,
804     args: {
805         value: VirtualRegister,
806     }
807
808 op :strcat,
809     args: {
810         dst: VirtualRegister,
811         src: VirtualRegister,
812         count: int,
813     }
814
815 op :to_primitive,
816     args: {
817         dst: VirtualRegister,
818         src: VirtualRegister,
819     }
820
821 op :resolve_scope,
822     args: {
823         dst: VirtualRegister, # offset 1
824         scope: VirtualRegister, # offset 2
825         var: unsigned, # offset 3
826         # $begin: :private,
827         resolveType: ResolveType,
828         localScopeDepth: unsigned,
829     },
830     metadata: {
831         resolveType: ResolveType, # offset 4
832         _0: { # offset 5
833             localScopeDepth: unsigned,
834             globalLexicalBindingEpoch: unsigned,
835         },
836         _1: { # offset 6
837              # written during linking
838              lexicalEnvironment: WriteBarrierBase[JSCell], # lexicalEnvironment && type == ModuleVar
839              symbolTable: WriteBarrierBase[SymbolTable], # lexicalEnvironment && type != ModuleVar
840
841              constantScope: WriteBarrierBase[JSScope],
842
843              # written from the slow path
844              globalLexicalEnvironment: JSGlobalLexicalEnvironment.*,
845              globalObject: JSGlobalObject.*,
846         },
847     }
848
849 op :get_from_scope,
850     args: {
851         dst: VirtualRegister, # offset  1
852         scope: VirtualRegister, # offset 2
853         var: unsigned, # offset 3
854         # $begin: :private,
855         getPutInfo: GetPutInfo,
856         localScopeDepth: unsigned,
857         offset: unsigned,
858     },
859     metadata: {
860         getPutInfo: GetPutInfo, # offset 4
861         _: { #previously offset 5
862             watchpointSet: WatchpointSet.*,
863             structure: WriteBarrierBase[Structure],
864         },
865         operand: uintptr_t, #offset 6
866         profile: ValueProfile, # offset 7
867     },
868     metadata_initializers: {
869         getPutInfo: :getPutInfo,
870         operand: :offset,
871     }
872
873 op :put_to_scope,
874     args: {
875         scope: VirtualRegister, # offset 1
876         var: unsigned, # offset 2
877         value: VirtualRegister, # offset 3
878         # $begin: :private,
879         getPutInfo: GetPutInfo,
880         symbolTableOrScopeDepth: SymbolTableOrScopeDepth,
881         offset: unsigned,
882     },
883     metadata: {
884         getPutInfo: GetPutInfo, # offset 4
885         _: { # offset 5
886             structure: WriteBarrierBase[Structure],
887             watchpointSet: WatchpointSet.*,
888         },
889         operand: uintptr_t, # offset 6
890     },
891     metadata_initializers: {
892         getPutInfo: :getPutInfo,
893         operand: :offset,
894     }
895
896 op :get_from_arguments,
897     args: {
898         dst: VirtualRegister,
899         arguments: VirtualRegister,
900         index: unsigned,
901     },
902     metadata: {
903         profile: ValueProfile,
904     }
905
906 op :put_to_arguments,
907     args: {
908         arguments: VirtualRegister,
909         index: unsigned,
910         value: VirtualRegister,
911     }
912
913 op :push_with_scope,
914     args: {
915         dst: VirtualRegister,
916         currentScope: VirtualRegister,
917         newScope: VirtualRegister,
918     }
919
920 op :create_lexical_environment,
921     args: {
922         dst: VirtualRegister,
923         scope: VirtualRegister,
924         symbolTable: VirtualRegister,
925         initialValue: VirtualRegister,
926     }
927
928 op :create_generator_frame_environment,
929     args: {
930         dst: VirtualRegister,
931         scope: VirtualRegister,
932         symbolTable: VirtualRegister,
933         initialValue: VirtualRegister,
934     }
935
936 op :get_parent_scope,
937     args: {
938         dst: VirtualRegister,
939         scope: VirtualRegister,
940     }
941
942 op :catch,
943     args: {
944         exception: VirtualRegister,
945         thrownValue: VirtualRegister,
946     },
947     metadata: {
948         buffer: ValueProfileAndOperandBuffer.*,
949     }
950
951 op :throw,
952     args: {
953         value: VirtualRegister,
954     }
955
956 op :throw_static_error,
957     args: {
958         message: VirtualRegister,
959         errorType: ErrorType,
960     }
961
962 op :debug,
963     args: {
964         debugHookType: DebugHookType,
965         hasBreakpoint: bool,
966     }
967
968 op :end,
969     args: {
970         value: VirtualRegister,
971     }
972
973 op :profile_type,
974     args: {
975         targetVirtualRegister: VirtualRegister,
976         symbolTableOrScopeDepth: SymbolTableOrScopeDepth,
977         flag: ProfileTypeBytecodeFlag,
978         identifier?: unsigned,
979         resolveType: ResolveType,
980     },
981     metadata: {
982         typeLocation: TypeLocation.*,
983     }
984
985 op :profile_control_flow,
986     args: {
987         textOffset: int,
988     },
989     metadata: {
990         basicBlockLocation: BasicBlockLocation.*,
991     }
992
993 op :get_enumerable_length,
994     args: {
995         dst: VirtualRegister,
996         base: VirtualRegister,
997     }
998
999 op :has_indexed_property,
1000     args: {
1001         dst: VirtualRegister,
1002         base: VirtualRegister,
1003         property: VirtualRegister,
1004     },
1005     metadata: {
1006         arrayProfile: ArrayProfile,
1007     }
1008
1009 op :has_structure_property,
1010     args: {
1011         dst: VirtualRegister,
1012         base: VirtualRegister,
1013         property: VirtualRegister,
1014         enumerator: VirtualRegister,
1015     }
1016
1017 op :has_generic_property,
1018     args: {
1019         dst: VirtualRegister,
1020         base: VirtualRegister,
1021         property: VirtualRegister,
1022     }
1023
1024 op :get_direct_pname,
1025     args: {
1026         dst: VirtualRegister,
1027         base: VirtualRegister,
1028         property: VirtualRegister,
1029         index: VirtualRegister,
1030         enumerator: VirtualRegister,
1031     },
1032     metadata: {
1033         profile: ValueProfile,
1034     }
1035
1036 op :get_property_enumerator,
1037     args: {
1038         dst: VirtualRegister,
1039         base: VirtualRegister,
1040     }
1041
1042 op :enumerator_structure_pname,
1043     args: {
1044         dst: VirtualRegister,
1045         enumerator: VirtualRegister,
1046         index: VirtualRegister,
1047     }
1048
1049 op :enumerator_generic_pname,
1050     args: {
1051         dst: VirtualRegister,
1052         enumerator: VirtualRegister,
1053         index: VirtualRegister,
1054     }
1055
1056 op :to_index_string,
1057     args: {
1058         dst: VirtualRegister,
1059         index: VirtualRegister,
1060     }
1061
1062 op :unreachable
1063
1064 op :create_rest,
1065     args: {
1066         dst: VirtualRegister,
1067         arraySize: VirtualRegister,
1068         numParametersToSkip: unsigned,
1069     }
1070
1071 op :get_rest_length,
1072     args: {
1073         dst: VirtualRegister,
1074         numParametersToSkip: unsigned,
1075     }
1076
1077 op :yield,
1078     args: {
1079         generator: VirtualRegister,
1080         yieldPoint: unsigned,
1081         argument: VirtualRegister,
1082     }
1083
1084 op :check_traps
1085
1086 op :log_shadow_chicken_prologue,
1087     args: {
1088         scope: VirtualRegister,
1089     }
1090
1091 op :log_shadow_chicken_tail,
1092     args: {
1093         thisValue: VirtualRegister,
1094         scope: VirtualRegister,
1095     }
1096
1097 op :resolve_scope_for_hoisting_func_decl_in_eval,
1098     args: {
1099         dst: VirtualRegister,
1100         scope: VirtualRegister,
1101         property: unsigned,
1102     }
1103
1104 op :nop
1105
1106 op :super_sampler_begin
1107
1108 op :super_sampler_end
1109
1110 end_section :Bytecodes
1111
1112 begin_section :CLoopHelpers,
1113     emit_in_h_file: true,
1114     macro_name_component: :CLOOP_BYTECODE_HELPER
1115
1116 op :llint_entry
1117 op :getHostCallReturnValue
1118 op :llint_return_to_host
1119 op :llint_vm_entry_to_javascript
1120 op :llint_vm_entry_to_native
1121 op :llint_cloop_did_return_from_js_1
1122 op :llint_cloop_did_return_from_js_2
1123 op :llint_cloop_did_return_from_js_3
1124 op :llint_cloop_did_return_from_js_4
1125 op :llint_cloop_did_return_from_js_5
1126 op :llint_cloop_did_return_from_js_6
1127 op :llint_cloop_did_return_from_js_7
1128 op :llint_cloop_did_return_from_js_8
1129 op :llint_cloop_did_return_from_js_9
1130 op :llint_cloop_did_return_from_js_10
1131 op :llint_cloop_did_return_from_js_11
1132 op :llint_cloop_did_return_from_js_12
1133 op :llint_cloop_did_return_from_js_13
1134 op :llint_cloop_did_return_from_js_14
1135 op :llint_cloop_did_return_from_js_15
1136 op :llint_cloop_did_return_from_js_16
1137 op :llint_cloop_did_return_from_js_17
1138 op :llint_cloop_did_return_from_js_18
1139 op :llint_cloop_did_return_from_js_19
1140 op :llint_cloop_did_return_from_js_20
1141 op :llint_cloop_did_return_from_js_21
1142 op :llint_cloop_did_return_from_js_22
1143 op :llint_cloop_did_return_from_js_23
1144 op :llint_cloop_did_return_from_js_24
1145 op :llint_cloop_did_return_from_js_25
1146 op :llint_cloop_did_return_from_js_26
1147 op :llint_cloop_did_return_from_js_27
1148 op :llint_cloop_did_return_from_js_28
1149 op :llint_cloop_did_return_from_js_29
1150 op :llint_cloop_did_return_from_js_30
1151 op :llint_cloop_did_return_from_js_31
1152 op :llint_cloop_did_return_from_js_32
1153 op :llint_cloop_did_return_from_js_33
1154 op :llint_cloop_did_return_from_js_34
1155
1156 end_section :CLoopHelpers
1157
1158 begin_section :NativeHelpers,
1159     emit_in_h_file: true,
1160     emit_in_asm_file: true,
1161     macro_name_component: :BYTECODE_HELPER
1162
1163 op :llint_program_prologue
1164 op :llint_eval_prologue
1165 op :llint_module_program_prologue
1166 op :llint_function_for_call_prologue
1167 op :llint_function_for_construct_prologue
1168 op :llint_function_for_call_arity_check
1169 op :llint_function_for_construct_arity_check
1170 op :llint_generic_return_point
1171 op :llint_throw_from_slow_path_trampoline
1172 op :llint_throw_during_call_trampoline
1173 op :llint_native_call_trampoline
1174 op :llint_native_construct_trampoline
1175 op :llint_internal_function_call_trampoline
1176 op :llint_internal_function_construct_trampoline
1177 op :handleUncaughtException
1178
1179 end_section :NativeHelpers