[JSC] Introduce LinkTimeConstant mechanism
[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     :WasmBoundLabel,
57     :WatchpointSet,
58
59     :ValueProfile,
60     :ValueProfileAndOperandBuffer,
61     :ArithProfile,
62     :ArrayProfile,
63     :ArrayAllocationProfile,
64     :ObjectAllocationProfile,
65 ]
66
67 templates [
68     :WriteBarrier,
69     :WriteBarrierBase,
70 ]
71
72
73 begin_section :Bytecode,
74     emit_in_h_file: true,
75     emit_in_structs_file: true,
76     emit_in_asm_file: true,
77     emit_opcode_id_string_values_in_h_file: true,
78     macro_name_component: :BYTECODE,
79     asm_prefix: "llint_",
80     op_prefix: "op_"
81
82 op :wide16
83 op :wide32
84
85 op :enter
86
87 op :get_scope,
88     args: {
89         dst: VirtualRegister
90     }
91
92 op :create_direct_arguments,
93     args: {
94         dst: VirtualRegister,
95     }
96
97 op :create_scoped_arguments,
98     args: {
99         dst: VirtualRegister,
100         scope: VirtualRegister,
101     }
102
103 op :create_cloned_arguments,
104     args: {
105         dst: VirtualRegister,
106     }
107
108 op :create_this,
109     args: {
110         dst: VirtualRegister,
111         callee: VirtualRegister,
112         inlineCapacity: unsigned,
113     },
114     metadata: {
115         cachedCallee: WriteBarrier[JSCell]
116     }
117
118 op :create_promise,
119     args: {
120         dst: VirtualRegister,
121         callee: VirtualRegister,
122         isInternalPromise: bool,
123     },
124     metadata: {
125         cachedCallee: WriteBarrier[JSCell]
126     }
127
128 op :new_promise,
129     args: {
130         dst: VirtualRegister,
131         isInternalPromise: bool,
132     }
133
134 op :new_generator,
135     args: {
136         dst: VirtualRegister,
137     }
138
139 op_group :CreateInternalFieldObjectOp,
140     [
141         :create_generator,
142         :create_async_generator,
143     ],
144     args: {
145         dst: VirtualRegister,
146         callee: VirtualRegister,
147     },
148     metadata: {
149         cachedCallee: WriteBarrier[JSCell]
150     }
151
152 op :get_argument,
153     args: {
154         dst: VirtualRegister,
155         index: int,
156     },
157     metadata: {
158         profile: ValueProfile,
159     }
160
161 op :argument_count,
162     args: {
163         dst: VirtualRegister,
164     }
165
166 op :to_this,
167     args: {
168         srcDst: VirtualRegister,
169     },
170     metadata: {
171         cachedStructureID: StructureID,
172         toThisStatus: ToThisStatus,
173         profile: ValueProfile,
174     }
175
176 op :check_tdz,
177     args: {
178         targetVirtualRegister: VirtualRegister,
179     }
180
181 op :new_object,
182     args: {
183         dst: VirtualRegister,
184         inlineCapacity: unsigned,
185     },
186     metadata: {
187         objectAllocationProfile: ObjectAllocationProfile,
188     }
189
190 op :new_array,
191     args: {
192         dst: VirtualRegister,
193         argv: VirtualRegister,
194         argc: unsigned,
195         recommendedIndexingType: IndexingType,
196     },
197     metadata: {
198         arrayAllocationProfile: ArrayAllocationProfile,
199     }
200
201 op :new_array_with_size,
202     args: {
203         dst: VirtualRegister,
204         length: VirtualRegister,
205     },
206     metadata: {
207         arrayAllocationProfile: ArrayAllocationProfile,
208     }
209
210 op :new_array_buffer,
211     args: {
212         dst: VirtualRegister,
213         immutableButterfly: VirtualRegister,
214         recommendedIndexingType: IndexingType
215     },
216     metadata: {
217         arrayAllocationProfile: ArrayAllocationProfile,
218     }
219
220 op :new_array_with_spread,
221     args: {
222         dst: VirtualRegister,
223         argv: VirtualRegister,
224         argc: unsigned,
225         bitVector: unsigned,
226     }
227
228 op :spread,
229     args: {
230         dst: VirtualRegister,
231         argument: VirtualRegister,
232     }
233
234 op :new_regexp,
235     args: {
236         dst: VirtualRegister,
237         regexp: VirtualRegister,
238     }
239
240 op :mov,
241     args: {
242         dst: VirtualRegister,
243         src: VirtualRegister,
244     }
245
246 op_group :BinaryOp,
247     [
248         :eq,
249         :neq,
250         :stricteq,
251         :nstricteq,
252         :less,
253         :lesseq,
254         :greater,
255         :greatereq,
256         :below,
257         :beloweq,
258         :mod,
259         :pow,
260         :urshift,
261     ],
262     args: {
263         dst: VirtualRegister,
264         lhs: VirtualRegister,
265         rhs: VirtualRegister,
266     }
267
268 op_group :ProfiledBinaryOp,
269     [
270         :add,
271         :mul,
272         :div,
273         :sub,
274     ],
275     args: {
276         dst: VirtualRegister,
277         lhs: VirtualRegister,
278         rhs: VirtualRegister,
279         operandTypes: OperandTypes,
280     },
281     metadata: {
282         arithProfile: ArithProfile
283     },
284     metadata_initializers: {
285         arithProfile: :operandTypes
286     }
287
288 op_group :ValueProfiledBinaryOp,
289     [
290         :bitand,
291         :bitor,
292         :bitxor,
293         :lshift,
294         :rshift,
295     ],
296     args: {
297         dst: VirtualRegister,
298         lhs: VirtualRegister,
299         rhs: VirtualRegister,
300     },
301     metadata: {
302         profile: ValueProfile
303     }
304
305 op :bitnot,
306     args: {
307         dst: VirtualRegister,
308         operand: VirtualRegister,
309     },
310     metadata: {
311         profile: ValueProfile
312     }
313
314 op_group :UnaryOp,
315     [
316         :eq_null,
317         :neq_null,
318         :to_string,
319         :unsigned,
320         :is_empty,
321         :is_undefined,
322         :is_undefined_or_null,
323         :is_boolean,
324         :is_number,
325         :is_object,
326         :is_object_or_null,
327         :is_function,
328     ],
329     args: {
330         dst: VirtualRegister,
331         operand: VirtualRegister,
332     }
333
334 op :inc,
335     args: {
336         srcDst: VirtualRegister,
337     }
338
339 op :dec,
340     args: {
341         srcDst: VirtualRegister,
342     }
343
344 op :to_object,
345     args: {
346         dst: VirtualRegister,
347         operand: VirtualRegister,
348         message: unsigned,
349     },
350     metadata: {
351         profile: ValueProfile,
352     }
353
354 op :to_number,
355     args: {
356         dst: VirtualRegister,
357         operand: VirtualRegister,
358     },
359     metadata: {
360         profile: ValueProfile,
361     }
362
363 op :negate,
364     args: {
365         dst: VirtualRegister,
366         operand: VirtualRegister,
367         operandTypes: OperandTypes,
368     },
369     metadata: {
370         arithProfile: ArithProfile,
371     },
372     metadata_initializers: {
373         arithProfile: :operandTypes
374     }
375
376 op :not,
377     args: {
378         dst: VirtualRegister,
379         operand: VirtualRegister,
380     }
381
382
383 op :identity_with_profile,
384     args: {
385         srcDst: VirtualRegister,
386         topProfile: unsigned,
387         bottomProfile: unsigned,
388     }
389
390 op :overrides_has_instance,
391     args: {
392         dst: VirtualRegister,
393         constructor: VirtualRegister,
394         hasInstanceValue: VirtualRegister,
395     }
396
397 op :instanceof,
398     args: {
399         dst: VirtualRegister,
400         value: VirtualRegister,
401         prototype: VirtualRegister,
402     }
403
404 op :instanceof_custom,
405     args: {
406         dst: VirtualRegister,
407         value: VirtualRegister,
408         constructor: VirtualRegister,
409         hasInstanceValue: VirtualRegister,
410     }
411
412 op :typeof,
413     args: {
414         dst: VirtualRegister,
415         value: VirtualRegister,
416     }
417
418 op :is_cell_with_type,
419     args: {
420         dst: VirtualRegister,
421         operand: VirtualRegister,
422         type: JSType,
423     }
424
425 op :in_by_val,
426     args: {
427         dst: VirtualRegister,
428         base: VirtualRegister,
429         property: VirtualRegister,
430     },
431     metadata: {
432         arrayProfile: ArrayProfile,
433     }
434
435 op :in_by_id,
436     args: {
437         dst: VirtualRegister,
438         base: VirtualRegister,
439         property: unsigned,
440     }
441
442 op :get_by_id,
443     args: {
444         dst: VirtualRegister,
445         base: VirtualRegister,
446         property: unsigned,
447     },
448     metadata: {
449         modeMetadata: GetByIdModeMetadata,
450         profile: ValueProfile,
451     }
452
453 op :get_by_id_with_this,
454     args: {
455         dst: VirtualRegister,
456         base: VirtualRegister,
457         thisValue: VirtualRegister,
458         property: unsigned,
459     },
460     metadata: {
461         profile: ValueProfile,
462     }
463
464 op :get_by_val_with_this,
465     args: {
466         dst: VirtualRegister,
467         base: VirtualRegister,
468         thisValue: VirtualRegister,
469         property: VirtualRegister,
470     },
471     metadata: {
472         profile: ValueProfile,
473     }
474
475 op :get_by_id_direct,
476     args: {
477         dst: VirtualRegister,
478         base: VirtualRegister,
479         property: unsigned,
480     },
481     metadata: {
482         profile: ValueProfile, # not used in llint
483         structureID: StructureID,
484         offset: unsigned,
485     }
486
487 op :try_get_by_id,
488     args: {
489         dst: VirtualRegister,
490         base: VirtualRegister,
491         property: unsigned,
492     },
493     metadata: {
494         profile: ValueProfile,
495     }
496
497 op :put_by_id,
498     args: {
499         base: VirtualRegister,
500         property: unsigned,
501         value: VirtualRegister,
502         flags: PutByIdFlags,
503     },
504     metadata: {
505         oldStructureID: StructureID,
506         offset: unsigned,
507         newStructureID: StructureID,
508         structureChain: WriteBarrierBase[StructureChain],
509     }
510
511 op :put_by_id_with_this,
512     args: {
513         base: VirtualRegister,
514         thisValue: VirtualRegister,
515         property: unsigned,
516         value: VirtualRegister,
517     }
518
519 op :del_by_id,
520     args: {
521         dst: VirtualRegister,
522         base: VirtualRegister,
523         property: unsigned,
524     }
525
526 op :get_by_val,
527     args: {
528         dst: VirtualRegister,
529         base: VirtualRegister,
530         property: VirtualRegister,
531     },
532     metadata: {
533         profile: ValueProfile,
534         arrayProfile: ArrayProfile,
535     }
536
537 op :put_by_val,
538     args: {
539         base: VirtualRegister,
540         property: VirtualRegister,
541         value: VirtualRegister,
542     },
543     metadata: {
544         arrayProfile: ArrayProfile,
545     }
546
547 op :put_by_val_with_this,
548     args: {
549         base: VirtualRegister,
550         thisValue: VirtualRegister,
551         property: VirtualRegister,
552         value: VirtualRegister,
553     }
554
555 op :put_by_val_direct,
556     args: {
557         base: VirtualRegister,
558         property: VirtualRegister,
559         value: VirtualRegister,
560     },
561     metadata: {
562         arrayProfile: ArrayProfile,
563     }
564
565 op :del_by_val,
566     args: {
567         dst: VirtualRegister,
568         base: VirtualRegister,
569         property: VirtualRegister,
570     }
571
572 op :put_getter_by_id,
573     args: {
574         base: VirtualRegister,
575         property: unsigned,
576         attributes: unsigned,
577         accessor: VirtualRegister,
578     }
579
580 op :put_setter_by_id,
581     args: {
582         base: VirtualRegister,
583         property: unsigned,
584         attributes: unsigned,
585         accessor: VirtualRegister,
586     }
587
588 op :put_getter_setter_by_id,
589     args: {
590         base: VirtualRegister,
591         property: unsigned,
592         attributes: unsigned,
593         getter: VirtualRegister,
594         setter: VirtualRegister,
595     }
596
597 op :put_getter_by_val,
598     args: {
599         base: VirtualRegister,
600         property: VirtualRegister,
601         attributes: unsigned,
602         accessor: VirtualRegister,
603     }
604
605 op :put_setter_by_val,
606     args: {
607         base: VirtualRegister,
608         property: VirtualRegister,
609         attributes: unsigned,
610         accessor: VirtualRegister,
611     }
612
613 op :define_data_property,
614     args: {
615         base: VirtualRegister,
616         property: VirtualRegister,
617         value: VirtualRegister,
618         attributes: VirtualRegister,
619     }
620
621 op :define_accessor_property,
622     args: {
623         base: VirtualRegister,
624         property: VirtualRegister,
625         getter: VirtualRegister,
626         setter: VirtualRegister,
627         attributes: VirtualRegister,
628     }
629
630 op :jmp,
631     args: {
632         targetLabel: BoundLabel,
633     }
634
635 op :jtrue,
636     args: {
637         condition: VirtualRegister,
638         targetLabel: BoundLabel,
639     }
640
641 op :jfalse,
642     args: {
643         condition: VirtualRegister,
644         targetLabel: BoundLabel,
645     }
646
647 op :jeq_null,
648     args: {
649         value: VirtualRegister,
650         targetLabel: BoundLabel,
651     }
652
653 op :jneq_null,
654     args: {
655         value: VirtualRegister,
656         targetLabel: BoundLabel,
657     }
658
659 op :jundefined_or_null,
660     args: {
661         value: VirtualRegister,
662         targetLabel: BoundLabel,
663     }
664
665 op :jnundefined_or_null,
666     args: {
667         value: VirtualRegister,
668         targetLabel: BoundLabel,
669     }
670
671 op :jneq_ptr,
672     args: {
673         value: VirtualRegister,
674         specialPointer: VirtualRegister,
675         targetLabel: BoundLabel,
676     },
677     metadata: {
678         hasJumped: bool,
679     }
680
681 op_group :BinaryJmp,
682     [
683         :jeq,
684         :jstricteq,
685         :jneq,
686         :jnstricteq,
687         :jless,
688         :jlesseq,
689         :jgreater,
690         :jgreatereq,
691         :jnless,
692         :jnlesseq,
693         :jngreater,
694         :jngreatereq,
695         :jbelow,
696         :jbeloweq,
697     ],
698     args: {
699         lhs: VirtualRegister,
700         rhs: VirtualRegister,
701         targetLabel: BoundLabel,
702     }
703
704 op :loop_hint
705
706 op_group :SwitchValue,
707     [
708         :switch_imm,
709         :switch_char,
710         :switch_string,
711     ],
712     args: {
713         tableIndex: unsigned,
714         defaultOffset: BoundLabel,
715         scrutinee: VirtualRegister,
716     }
717
718 op_group :NewFunction,
719     [
720         :new_func,
721         :new_func_exp,
722         :new_generator_func,
723         :new_generator_func_exp,
724         :new_async_func,
725         :new_async_func_exp,
726         :new_async_generator_func,
727         :new_async_generator_func_exp,
728     ],
729     args: {
730         dst: VirtualRegister,
731         scope: VirtualRegister,
732         functionDecl: unsigned,
733     }
734
735 op :set_function_name,
736     args: {
737         function: VirtualRegister,
738         name: VirtualRegister,
739     }
740
741 # op_call variations
742 op :call,
743     args: {
744         dst: VirtualRegister,
745         callee: VirtualRegister,
746         argc: unsigned,
747         argv: unsigned,
748     },
749     metadata: {
750         callLinkInfo: LLIntCallLinkInfo,
751         profile: ValueProfile,
752     }
753
754 op :tail_call,
755     args: {
756         dst: VirtualRegister,
757         callee: VirtualRegister,
758         argc: unsigned,
759         argv: unsigned,
760     },
761     metadata: {
762         callLinkInfo: LLIntCallLinkInfo,
763         profile: ValueProfile,
764     }
765
766 op :call_eval,
767     args: {
768         dst: VirtualRegister,
769         callee: VirtualRegister,
770         argc: unsigned,
771         argv: unsigned,
772     },
773     metadata: {
774         callLinkInfo: LLIntCallLinkInfo,
775         profile: ValueProfile,
776     }
777
778 op :call_varargs,
779     args: {
780         dst: VirtualRegister,
781         callee: VirtualRegister,
782         thisValue?: VirtualRegister,
783         arguments?: VirtualRegister,
784         firstFree: VirtualRegister,
785         firstVarArg: int,
786     },
787     metadata: {
788         arrayProfile: ArrayProfile,
789         profile: ValueProfile,
790     }
791
792 op :tail_call_varargs,
793     args: {
794         dst: VirtualRegister,
795         callee: VirtualRegister,
796         thisValue?: VirtualRegister,
797         arguments?: VirtualRegister,
798         firstFree: VirtualRegister,
799         firstVarArg: int,
800     },
801     metadata: {
802         arrayProfile: ArrayProfile,
803         profile: ValueProfile,
804     }
805
806 op :tail_call_forward_arguments,
807     args: {
808         dst: VirtualRegister,
809         callee: VirtualRegister,
810         thisValue?: VirtualRegister,
811         arguments?: VirtualRegister,
812         firstFree: VirtualRegister,
813         firstVarArg: int,
814     },
815     metadata: {
816         arrayProfile: ArrayProfile,
817         profile: ValueProfile,
818     }
819
820 op :construct,
821     args: {
822         dst: VirtualRegister,
823         callee: VirtualRegister,
824         argc: unsigned,
825         argv: unsigned,
826     },
827     metadata: {
828         callLinkInfo: LLIntCallLinkInfo,
829         profile: ValueProfile,
830     }
831
832 op :construct_varargs,
833     args: {
834         dst: VirtualRegister,
835         callee: VirtualRegister,
836         thisValue?: VirtualRegister,
837         arguments?: VirtualRegister,
838         firstFree: VirtualRegister,
839         firstVarArg: int,
840     },
841     metadata: {
842         arrayProfile: ArrayProfile,
843         profile: ValueProfile,
844     }
845
846 op :ret,
847     args: {
848         value: VirtualRegister,
849     }
850
851 op :strcat,
852     args: {
853         dst: VirtualRegister,
854         src: VirtualRegister,
855         count: int,
856     }
857
858 op :to_primitive,
859     args: {
860         dst: VirtualRegister,
861         src: VirtualRegister,
862     }
863
864 op :resolve_scope,
865     args: {
866         dst: VirtualRegister, # offset 1
867         scope: VirtualRegister, # offset 2
868         var: unsigned, # offset 3
869         # $begin: :private,
870         resolveType: ResolveType,
871         localScopeDepth: unsigned,
872     },
873     metadata: {
874         resolveType: ResolveType, # offset 4
875         _0: { # offset 5
876             localScopeDepth: unsigned,
877             globalLexicalBindingEpoch: unsigned,
878         },
879         _1: { # offset 6
880              # written during linking
881              lexicalEnvironment: WriteBarrierBase[JSCell], # lexicalEnvironment && type == ModuleVar
882              symbolTable: WriteBarrierBase[SymbolTable], # lexicalEnvironment && type != ModuleVar
883
884              constantScope: WriteBarrierBase[JSScope],
885
886              # written from the slow path
887              globalLexicalEnvironment: WriteBarrierBase[JSGlobalLexicalEnvironment],
888              globalObject: WriteBarrierBase[JSGlobalObject],
889         },
890     }
891
892 op :get_from_scope,
893     args: {
894         dst: VirtualRegister, # offset  1
895         scope: VirtualRegister, # offset 2
896         var: unsigned, # offset 3
897         # $begin: :private,
898         getPutInfo: GetPutInfo,
899         localScopeDepth: unsigned,
900         offset: unsigned,
901     },
902     metadata: {
903         getPutInfo: GetPutInfo, # offset 4
904         _: { #previously offset 5
905             watchpointSet: WatchpointSet.*,
906             structure: WriteBarrierBase[Structure],
907         },
908         operand: uintptr_t, #offset 6
909         profile: ValueProfile, # offset 7
910     },
911     metadata_initializers: {
912         getPutInfo: :getPutInfo,
913         operand: :offset,
914     }
915
916 op :put_to_scope,
917     args: {
918         scope: VirtualRegister, # offset 1
919         var: unsigned, # offset 2
920         value: VirtualRegister, # offset 3
921         # $begin: :private,
922         getPutInfo: GetPutInfo,
923         symbolTableOrScopeDepth: SymbolTableOrScopeDepth,
924         offset: unsigned,
925     },
926     metadata: {
927         getPutInfo: GetPutInfo, # offset 4
928         _: { # offset 5
929             structure: WriteBarrierBase[Structure],
930             watchpointSet: WatchpointSet.*,
931         },
932         operand: uintptr_t, # offset 6
933     },
934     metadata_initializers: {
935         getPutInfo: :getPutInfo,
936         operand: :offset,
937     }
938
939 op :get_from_arguments,
940     args: {
941         dst: VirtualRegister,
942         arguments: VirtualRegister,
943         index: unsigned,
944     },
945     metadata: {
946         profile: ValueProfile,
947     }
948
949 op :put_to_arguments,
950     args: {
951         arguments: VirtualRegister,
952         index: unsigned,
953         value: VirtualRegister,
954     }
955
956 op :push_with_scope,
957     args: {
958         dst: VirtualRegister,
959         currentScope: VirtualRegister,
960         newScope: VirtualRegister,
961     }
962
963 op :create_lexical_environment,
964     args: {
965         dst: VirtualRegister,
966         scope: VirtualRegister,
967         symbolTable: VirtualRegister,
968         initialValue: VirtualRegister,
969     }
970
971 op :create_generator_frame_environment,
972     args: {
973         dst: VirtualRegister,
974         scope: VirtualRegister,
975         symbolTable: VirtualRegister,
976         initialValue: VirtualRegister,
977     }
978
979 op :get_parent_scope,
980     args: {
981         dst: VirtualRegister,
982         scope: VirtualRegister,
983     }
984
985 op :catch,
986     args: {
987         exception: VirtualRegister,
988         thrownValue: VirtualRegister,
989     },
990     metadata: {
991         buffer: ValueProfileAndOperandBuffer.*,
992     }
993
994 op :throw,
995     args: {
996         value: VirtualRegister,
997     }
998
999 op :throw_static_error,
1000     args: {
1001         message: VirtualRegister,
1002         errorType: ErrorType,
1003     }
1004
1005 op :debug,
1006     args: {
1007         debugHookType: DebugHookType,
1008         hasBreakpoint: bool,
1009     }
1010
1011 op :end,
1012     args: {
1013         value: VirtualRegister,
1014     }
1015
1016 op :profile_type,
1017     args: {
1018         targetVirtualRegister: VirtualRegister,
1019         symbolTableOrScopeDepth: SymbolTableOrScopeDepth,
1020         flag: ProfileTypeBytecodeFlag,
1021         identifier?: unsigned,
1022         resolveType: ResolveType,
1023     },
1024     metadata: {
1025         typeLocation: TypeLocation.*,
1026     }
1027
1028 op :profile_control_flow,
1029     args: {
1030         textOffset: int,
1031     },
1032     metadata: {
1033         basicBlockLocation: BasicBlockLocation.*,
1034     }
1035
1036 op :get_enumerable_length,
1037     args: {
1038         dst: VirtualRegister,
1039         base: VirtualRegister,
1040     }
1041
1042 op :has_indexed_property,
1043     args: {
1044         dst: VirtualRegister,
1045         base: VirtualRegister,
1046         property: VirtualRegister,
1047     },
1048     metadata: {
1049         arrayProfile: ArrayProfile,
1050     }
1051
1052 op :has_structure_property,
1053     args: {
1054         dst: VirtualRegister,
1055         base: VirtualRegister,
1056         property: VirtualRegister,
1057         enumerator: VirtualRegister,
1058     }
1059
1060 op :has_generic_property,
1061     args: {
1062         dst: VirtualRegister,
1063         base: VirtualRegister,
1064         property: VirtualRegister,
1065     }
1066
1067 op :get_direct_pname,
1068     args: {
1069         dst: VirtualRegister,
1070         base: VirtualRegister,
1071         property: VirtualRegister,
1072         index: VirtualRegister,
1073         enumerator: VirtualRegister,
1074     },
1075     metadata: {
1076         profile: ValueProfile,
1077     }
1078
1079 op :get_property_enumerator,
1080     args: {
1081         dst: VirtualRegister,
1082         base: VirtualRegister,
1083     }
1084
1085 op :enumerator_structure_pname,
1086     args: {
1087         dst: VirtualRegister,
1088         enumerator: VirtualRegister,
1089         index: VirtualRegister,
1090     }
1091
1092 op :enumerator_generic_pname,
1093     args: {
1094         dst: VirtualRegister,
1095         enumerator: VirtualRegister,
1096         index: VirtualRegister,
1097     }
1098
1099 op :to_index_string,
1100     args: {
1101         dst: VirtualRegister,
1102         index: VirtualRegister,
1103     }
1104
1105 op :unreachable
1106
1107 op :create_rest,
1108     args: {
1109         dst: VirtualRegister,
1110         arraySize: VirtualRegister,
1111         numParametersToSkip: unsigned,
1112     }
1113
1114 op :get_rest_length,
1115     args: {
1116         dst: VirtualRegister,
1117         numParametersToSkip: unsigned,
1118     }
1119
1120 op :yield,
1121     args: {
1122         generator: VirtualRegister,
1123         yieldPoint: unsigned,
1124         argument: VirtualRegister,
1125     }
1126
1127 op :check_traps
1128
1129 op :log_shadow_chicken_prologue,
1130     args: {
1131         scope: VirtualRegister,
1132     }
1133
1134 op :log_shadow_chicken_tail,
1135     args: {
1136         thisValue: VirtualRegister,
1137         scope: VirtualRegister,
1138     }
1139
1140 op :resolve_scope_for_hoisting_func_decl_in_eval,
1141     args: {
1142         dst: VirtualRegister,
1143         scope: VirtualRegister,
1144         property: unsigned,
1145     }
1146
1147 op :get_internal_field,
1148     args: {
1149         dst: VirtualRegister,
1150         base: VirtualRegister,
1151         index: unsigned,
1152     },
1153     metadata: {
1154         profile: ValueProfile,
1155     }
1156
1157 op :put_internal_field,
1158     args: {
1159         base: VirtualRegister,
1160         index: unsigned,
1161         value: VirtualRegister,
1162     }
1163
1164 op :nop
1165
1166 op :super_sampler_begin
1167
1168 op :super_sampler_end
1169
1170 end_section :Bytecode
1171
1172 begin_section :CLoopHelpers,
1173     emit_in_h_file: true,
1174     macro_name_component: :CLOOP_BYTECODE_HELPER
1175
1176 op :llint_entry
1177 op :getHostCallReturnValue
1178 op :llint_return_to_host
1179 op :llint_vm_entry_to_javascript
1180 op :llint_vm_entry_to_native
1181 op :llint_cloop_did_return_from_js_1
1182 op :llint_cloop_did_return_from_js_2
1183 op :llint_cloop_did_return_from_js_3
1184 op :llint_cloop_did_return_from_js_4
1185 op :llint_cloop_did_return_from_js_5
1186 op :llint_cloop_did_return_from_js_6
1187 op :llint_cloop_did_return_from_js_7
1188 op :llint_cloop_did_return_from_js_8
1189 op :llint_cloop_did_return_from_js_9
1190 op :llint_cloop_did_return_from_js_10
1191 op :llint_cloop_did_return_from_js_11
1192 op :llint_cloop_did_return_from_js_12
1193 op :llint_cloop_did_return_from_js_13
1194 op :llint_cloop_did_return_from_js_14
1195 op :llint_cloop_did_return_from_js_15
1196 op :llint_cloop_did_return_from_js_16
1197 op :llint_cloop_did_return_from_js_17
1198 op :llint_cloop_did_return_from_js_18
1199 op :llint_cloop_did_return_from_js_19
1200 op :llint_cloop_did_return_from_js_20
1201 op :llint_cloop_did_return_from_js_21
1202 op :llint_cloop_did_return_from_js_22
1203 op :llint_cloop_did_return_from_js_23
1204 op :llint_cloop_did_return_from_js_24
1205 op :llint_cloop_did_return_from_js_25
1206 op :llint_cloop_did_return_from_js_26
1207 op :llint_cloop_did_return_from_js_27
1208 op :llint_cloop_did_return_from_js_28
1209 op :llint_cloop_did_return_from_js_29
1210 op :llint_cloop_did_return_from_js_30
1211 op :llint_cloop_did_return_from_js_31
1212 op :llint_cloop_did_return_from_js_32
1213 op :llint_cloop_did_return_from_js_33
1214 op :llint_cloop_did_return_from_js_34
1215
1216 end_section :CLoopHelpers
1217
1218 begin_section :NativeHelpers,
1219     emit_in_h_file: true,
1220     emit_in_asm_file: true,
1221     macro_name_component: :BYTECODE_HELPER
1222
1223 op :llint_program_prologue
1224 op :llint_eval_prologue
1225 op :llint_module_program_prologue
1226 op :llint_function_for_call_prologue
1227 op :llint_function_for_construct_prologue
1228 op :llint_function_for_call_arity_check
1229 op :llint_function_for_construct_arity_check
1230 op :llint_generic_return_point
1231 op :llint_throw_from_slow_path_trampoline
1232 op :llint_throw_during_call_trampoline
1233 op :llint_native_call_trampoline
1234 op :llint_native_construct_trampoline
1235 op :llint_internal_function_call_trampoline
1236 op :llint_internal_function_construct_trampoline
1237 op :handleUncaughtException
1238 op :op_call_return_location
1239 op :op_construct_return_location
1240 op :op_call_varargs_slow_return_location
1241 op :op_construct_varargs_slow_return_location
1242 op :op_get_by_id_return_location
1243 op :op_get_by_val_return_location
1244 op :op_put_by_id_return_location
1245 op :op_put_by_val_return_location
1246 op :wasm_function_prologue
1247 op :wasm_function_prologue_no_tls
1248
1249 end_section :NativeHelpers
1250
1251 begin_section :Wasm,
1252     emit_in_h_file: true,
1253     emit_in_structs_file: true,
1254     macro_name_component: :WASM,
1255     op_prefix: "wasm_"
1256
1257 autogenerate_wasm_opcodes
1258
1259 # Helpers
1260
1261 op :throw_from_slow_path_trampoline
1262
1263 # FIXME: Wasm and JS LLInt should share common opcodes
1264 # https://bugs.webkit.org/show_bug.cgi?id=203656
1265
1266 op :wide16
1267 op :wide32
1268
1269 op :enter
1270 op :nop
1271 op :loop_hint
1272
1273 op :mov,
1274     args: {
1275         dst: VirtualRegister,
1276         src: VirtualRegister,
1277     }
1278
1279 op_group :ConditionalJump,
1280     [
1281         :jtrue,
1282         :jfalse,
1283     ],
1284     args: {
1285         condition: VirtualRegister,
1286         targetLabel: WasmBoundLabel,
1287     }
1288
1289 op :jmp,
1290     args: {
1291         targetLabel: WasmBoundLabel,
1292     }
1293
1294 op :ret,
1295     args: {
1296         stackOffset: unsigned,
1297     }
1298
1299 op :switch,
1300     args: {
1301         scrutinee: VirtualRegister,
1302         tableIndex: unsigned,
1303         defaultTarget: WasmBoundLabel,
1304     }
1305
1306 # Wasm specific bytecodes
1307
1308 op :unreachable
1309 op :ret_void
1310
1311 op :ref_is_null,
1312     args: {
1313         dst: VirtualRegister,
1314         ref: VirtualRegister,
1315     }
1316
1317 op :ref_func,
1318     args: {
1319         dst: VirtualRegister,
1320         functionIndex: unsigned,
1321     }
1322
1323 op :get_global,
1324     args: {
1325         dst: VirtualRegister,
1326         globalIndex: unsigned,
1327     }
1328
1329 op :set_global,
1330     args: {
1331         globalIndex: unsigned,
1332         value: VirtualRegister,
1333     }
1334
1335 op :set_global_ref,
1336     args: {
1337         globalIndex: unsigned,
1338         value: VirtualRegister,
1339     }
1340
1341 op :table_get,
1342     args: {
1343         dst: VirtualRegister,
1344         index: VirtualRegister,
1345         tableIndex: unsigned,
1346     }
1347
1348 op :table_set,
1349     args: {
1350         index: VirtualRegister,
1351         value: VirtualRegister,
1352         tableIndex: unsigned,
1353     }
1354
1355 op :table_size,
1356     args: {
1357         dst: VirtualRegister,
1358         tableIndex: unsigned,
1359     }
1360
1361 op :table_grow,
1362     args: {
1363         dst: VirtualRegister,
1364         fill: VirtualRegister,
1365         size: VirtualRegister,
1366         tableIndex: unsigned,
1367     }
1368
1369 op :table_fill,
1370     args: {
1371         offset: VirtualRegister,
1372         fill: VirtualRegister,
1373         size: VirtualRegister,
1374         tableIndex: unsigned,
1375     }
1376
1377 op :call,
1378     args: {
1379         functionIndex: unsigned,
1380         stackOffset: unsigned,
1381         numberOfStackArgs: unsigned,
1382     }
1383
1384 op :call_no_tls,
1385     args: {
1386         functionIndex: unsigned,
1387         stackOffset: unsigned,
1388         numberOfStackArgs: unsigned,
1389     }
1390
1391 op :call_indirect,
1392     args: {
1393         functionIndex: VirtualRegister,
1394         signatureIndex: unsigned,
1395         stackOffset: unsigned,
1396         numberOfStackArgs: unsigned,
1397         tableIndex: unsigned,
1398     }
1399
1400 op :call_indirect_no_tls,
1401     args: {
1402         functionIndex: VirtualRegister,
1403         signatureIndex: unsigned,
1404         stackOffset: unsigned,
1405         numberOfStackArgs: unsigned,
1406         tableIndex: unsigned,
1407     }
1408
1409 op :current_memory,
1410     args: {
1411         dst: VirtualRegister,
1412     }
1413
1414 op :grow_memory,
1415     args: {
1416         dst: VirtualRegister,
1417         delta: VirtualRegister
1418     }
1419
1420 op :select,
1421     args: {
1422         dst: VirtualRegister,
1423         condition: VirtualRegister,
1424         nonZero: VirtualRegister,
1425         zero: VirtualRegister,
1426     }
1427
1428 op_group :Load,
1429     [
1430         :load8_u,
1431         :load16_u,
1432         :load32_u,
1433         :load64_u,
1434         :i32_load8_s,
1435         :i64_load8_s,
1436         :i32_load16_s,
1437         :i64_load16_s,
1438         :i64_load32_s,
1439     ],
1440     args: {
1441         dst: VirtualRegister,
1442         pointer: VirtualRegister,
1443         offset: unsigned,
1444     }
1445
1446 op_group :Store,
1447     [
1448         :store8,
1449         :store16,
1450         :store32,
1451         :store64,
1452     ],
1453     args: {
1454         pointer: VirtualRegister,
1455         value: VirtualRegister,
1456         offset: unsigned,
1457     }
1458
1459 end_section :Wasm