WebCore:
[webkit/qt.git] / WebKitSite / specs / squirrelfish-bytecode.html
blob7a3e6a42788b818fcab51afb68434bc7e57e7e36
1 <style>p code { font-size: 14px; }</style>
2 <h2><code>load</code></h2>
3 <p><b>Format: </b><code>
4 load dst(r) src(k)
5 </code></p>
6 <p>
8 Copies constant src to register dst.
10 </p>
11 <h2><code>new_object</code></h2>
12 <p><b>Format: </b><code>
13 new_object dst(r)
14 </code></p>
15 <p>
17 Constructs a new empty Object instance using the original
18 constructor, and puts the result in register dst.
20 </p>
21 <h2><code>new_array</code></h2>
22 <p><b>Format: </b><code>
23 new_array dst(r) firstArg(r) argCount(n)
24 </code></p>
25 <p>
27 Constructs a new Array instance using the original
28 constructor, and puts the result in register dst.
29 The array will contain argCount elements with values
30 taken from registers starting at register firstArg.
32 </p>
33 <h2><code>new_regexp</code></h2>
34 <p><b>Format: </b><code>
35 new_regexp dst(r) regExp(re)
36 </code></p>
37 <p>
39 Constructs a new RegExp instance using the original
40 constructor from regexp regExp, and puts the result in
41 register dst.
43 </p>
44 <h2><code>mov</code></h2>
45 <p><b>Format: </b><code>
46 mov dst(r) src(r)
47 </code></p>
48 <p>
50 Copies register src to register dst.
52 </p>
53 <h2><code>eq</code></h2>
54 <p><b>Format: </b><code>
55 eq dst(r) src1(r) src2(r)
56 </code></p>
57 <p>
59 Checks whether register src1 and register src2 are equal,
60 as with the ECMAScript '==' operator, and puts the result
61 as a boolean in register dst.
63 </p>
64 <h2><code>neq</code></h2>
65 <p><b>Format: </b><code>
66 neq dst(r) src1(r) src2(r)
67 </code></p>
68 <p>
70 Checks whether register src1 and register src2 are not
71 equal, as with the ECMAScript '!=' operator, and puts the
72 result as a boolean in register dst.
74 </p>
75 <h2><code>stricteq</code></h2>
76 <p><b>Format: </b><code>
77 stricteq dst(r) src1(r) src2(r)
78 </code></p>
79 <p>
81 Checks whether register src1 and register src2 are strictly
82 equal, as with the ECMAScript '===' operator, and puts the
83 result as a boolean in register dst.
85 </p>
86 <h2><code>nstricteq</code></h2>
87 <p><b>Format: </b><code>
88 nstricteq dst(r) src1(r) src2(r)
89 </code></p>
90 <p>
92 Checks whether register src1 and register src2 are not
93 strictly equal, as with the ECMAScript '!==' operator, and
94 puts the result as a boolean in register dst.
96 </p>
97 <h2><code>less</code></h2>
98 <p><b>Format: </b><code>
99 less dst(r) src1(r) src2(r)
100 </code></p>
103 Checks whether register src1 is less than register src2, as
104 with the ECMAScript '<' operator, and puts the result as
105 a boolean in register dst.
107 </p>
108 <h2><code>lesseq</code></h2>
109 <p><b>Format: </b><code>
110 lesseq dst(r) src1(r) src2(r)
111 </code></p>
114 Checks whether register src1 is less than or equal to
115 register src2, as with the ECMAScript '<=' operator, and
116 puts the result as a boolean in register dst.
118 </p>
119 <h2><code>pre_inc</code></h2>
120 <p><b>Format: </b><code>
121 pre_inc srcDst(r)
122 </code></p>
125 Converts register srcDst to number, adds one, and puts the result
126 back in register srcDst.
128 </p>
129 <h2><code>pre_dec</code></h2>
130 <p><b>Format: </b><code>
131 pre_dec srcDst(r)
132 </code></p>
135 Converts register srcDst to number, subtracts one, and puts the result
136 back in register srcDst.
138 </p>
139 <h2><code>post_inc</code></h2>
140 <p><b>Format: </b><code>
141 post_inc dst(r) srcDst(r)
142 </code></p>
145 Converts register srcDst to number. The number itself is
146 written to register dst, and the number plus one is written
147 back to register srcDst.
149 </p>
150 <h2><code>post_dec</code></h2>
151 <p><b>Format: </b><code>
152 post_dec dst(r) srcDst(r)
153 </code></p>
156 Converts register srcDst to number. The number itself is
157 written to register dst, and the number minus one is written
158 back to register srcDst.
160 </p>
161 <h2><code>to_jsnumber</code></h2>
162 <p><b>Format: </b><code>
163 to_jsnumber dst(r) src(r)
164 </code></p>
167 Converts register src to number, and puts the result
168 in register dst.
170 </p>
171 <h2><code>negate</code></h2>
172 <p><b>Format: </b><code>
173 negate dst(r) src(r)
174 </code></p>
177 Converts register src to number, negates it, and puts the
178 result in register dst.
180 </p>
181 <h2><code>add</code></h2>
182 <p><b>Format: </b><code>
183 add dst(r) src1(r) src2(r)
184 </code></p>
187 Adds register src1 and register src2, and puts the result
188 in register dst. (JS add may be string concatenation or
189 numeric add, depending on the types of the operands.)
191 </p>
192 <h2><code>mul</code></h2>
193 <p><b>Format: </b><code>
194 mul dst(r) src1(r) src2(r)
195 </code></p>
198 Multiplies register src1 and register src2 (converted to
199 numbers), and puts the product in register dst.
201 </p>
202 <h2><code>div</code></h2>
203 <p><b>Format: </b><code>
204 div dst(r) dividend(r) divisor(r)
205 </code></p>
208 Divides register dividend (converted to number) by the
209 register divisor (converted to number), and puts the
210 quotient in register dst.
212 </p>
213 <h2><code>mod</code></h2>
214 <p><b>Format: </b><code>
215 mod dst(r) dividend(r) divisor(r)
216 </code></p>
219 Divides register dividend (converted to number) by
220 register divisor (converted to number), and puts the
221 remainder in register dst.
223 </p>
224 <h2><code>sub</code></h2>
225 <p><b>Format: </b><code>
226 sub dst(r) src1(r) src2(r)
227 </code></p>
230 Subtracts register src2 (converted to number) from register
231 src1 (converted to number), and puts the difference in
232 register dst.
234 </p>
235 <h2><code>lshift</code></h2>
236 <p><b>Format: </b><code>
237 lshift dst(r) val(r) shift(r)
238 </code></p>
241 Performs left shift of register val (converted to int32) by
242 register shift (converted to uint32), and puts the result
243 in register dst.
245 </p>
246 <h2><code>rshift</code></h2>
247 <p><b>Format: </b><code>
248 rshift dst(r) val(r) shift(r)
249 </code></p>
252 Performs arithmetic right shift of register val (converted
253 to int32) by register shift (converted to
254 uint32), and puts the result in register dst.
256 </p>
257 <h2><code>urshift</code></h2>
258 <p><b>Format: </b><code>
259 rshift dst(r) val(r) shift(r)
260 </code></p>
263 Performs logical right shift of register val (converted
264 to uint32) by register shift (converted to
265 uint32), and puts the result in register dst.
267 </p>
268 <h2><code>bitand</code></h2>
269 <p><b>Format: </b><code>
270 bitand dst(r) src1(r) src2(r)
271 </code></p>
274 Computes bitwise AND of register src1 (converted to int32)
275 and register src2 (converted to int32), and puts the result
276 in register dst.
278 </p>
279 <h2><code>bitxor</code></h2>
280 <p><b>Format: </b><code>
281 bitxor dst(r) src1(r) src2(r)
282 </code></p>
285 Computes bitwise XOR of register src1 (converted to int32)
286 and register src2 (converted to int32), and puts the result
287 in register dst.
289 </p>
290 <h2><code>bitor</code></h2>
291 <p><b>Format: </b><code>
292 bitor dst(r) src1(r) src2(r)
293 </code></p>
296 Computes bitwise OR of register src1 (converted to int32)
297 and register src2 (converted to int32), and puts the
298 result in register dst.
300 </p>
301 <h2><code>bitnot</code></h2>
302 <p><b>Format: </b><code>
303 bitnot dst(r) src(r)
304 </code></p>
307 Computes bitwise NOT of register src1 (converted to int32),
308 and puts the result in register dst.
310 </p>
311 <h2><code>not</code></h2>
312 <p><b>Format: </b><code>
313 not dst(r) src1(r) src2(r)
314 </code></p>
317 Computes logical NOT of register src1 (converted to
318 boolean), and puts the result in register dst.
320 </p>
321 <h2><code>instanceof</code></h2>
322 <p><b>Format: </b><code>
323 instanceof dst(r) value(r) constructor(r)
324 </code></p>
327 Tests whether register value is an instance of register
328 constructor, and puts the boolean result in register dst.
330 Raises an exception if register constructor is not an
331 object.
333 </p>
334 <h2><code>typeof</code></h2>
335 <p><b>Format: </b><code>
336 typeof dst(r) src(r)
337 </code></p>
340 Determines the type string for src according to ECMAScript
341 rules, and puts the result in register dst.
343 </p>
344 <h2><code>in</code></h2>
345 <p><b>Format: </b><code>
346 in dst(r) property(r) base(r)
347 </code></p>
350 Tests whether register base has a property named register
351 property, and puts the boolean result in register dst.
353 Raises an exception if register constructor is not an
354 object.
356 </p>
357 <h2><code>resolve</code></h2>
358 <p><b>Format: </b><code>
359 resolve dst(r) property(id)
360 </code></p>
363 Looks up the property named by identifier property in the
364 scope chain, and writes the resulting value to register
365 dst. If the property is not found, raises an exception.
367 </p>
368 <h2><code>resolve_skip</code></h2>
369 <p><b>Format: </b><code>
370 resolve_skip dst(r) property(id) skip(n)
371 </code></p>
374 Looks up the property named by identifier property in the
375 scope chain skipping the top 'skip' levels, and writes the resulting
376 value to register dst. If the property is not found, raises an exception.
378 </p>
379 <h2><code>get_scoped_var</code></h2>
380 <p><b>Format: </b><code>
381 get_scoped_var dst(r) index(n) skip(n)
382 </code></p>
385 Loads the contents of the index-th local from the scope skip nodes from
386 the top of the scope chain, and places it in register dst
388 </p>
389 <h2><code>put_scoped_var</code></h2>
390 <p><b>Format: </b><code>
391 put_scoped_var index(n) skip(n) value(r)
392 </code></p>
396 </p>
397 <h2><code>resolve_base</code></h2>
398 <p><b>Format: </b><code>
399 resolve_base dst(r) property(id)
400 </code></p>
403 Searches the scope chain for an object containing
404 identifier property, and if one is found, writes it to
405 register dst. If none is found, the outermost scope (which
406 will be the global object) is stored in register dst.
408 </p>
409 <h2><code>resolve_with_base</code></h2>
410 <p><b>Format: </b><code>
411 resolve_with_base baseDst(r) propDst(r) property(id)
412 </code></p>
415 Searches the scope chain for an object containing
416 identifier property, and if one is found, writes it to
417 register srcDst, and the retrieved property value to register
418 propDst. If the property is not found, raises an exception.
420 This is more efficient than doing resolve_base followed by
421 resolve, or resolve_base followed by get_by_id, as it
422 avoids duplicate hash lookups.
424 </p>
425 <h2><code>resolve_func</code></h2>
426 <p><b>Format: </b><code>
427 resolve_func baseDst(r) funcDst(r) property(id)
428 </code></p>
431 Searches the scope chain for an object containing
432 identifier property, and if one is found, writes the
433 appropriate object to use as "this" when calling its
434 properties to register baseDst; and the retrieved property
435 value to register propDst. If the property is not found,
436 raises an exception.
438 This differs from resolve_with_base, because the
439 global this value will be substituted for activations or
440 the global object, which is the right behavior for function
441 calls but not for other property lookup.
443 </p>
444 <h2><code>get_by_id</code></h2>
445 <p><b>Format: </b><code>
446 get_by_id dst(r) base(r) property(id)
447 </code></p>
450 Converts register base to Object, gets the property
451 named by identifier property from the object, and puts the
452 result in register dst.
454 </p>
455 <h2><code>put_by_id</code></h2>
456 <p><b>Format: </b><code>
457 put_by_id base(r) property(id) value(r)
458 </code></p>
461 Sets register value on register base as the property named
462 by identifier property. Base is converted to object first.
464 Unlike many opcodes, this one does not write any output to
465 the register file.
467 </p>
468 <h2><code>del_by_id</code></h2>
469 <p><b>Format: </b><code>
470 del_by_id dst(r) base(r) property(id)
471 </code></p>
474 Converts register base to Object, deletes the property
475 named by identifier property from the object, and writes a
476 boolean indicating success (if true) or failure (if false)
477 to register dst.
479 </p>
480 <h2><code>get_by_val</code></h2>
481 <p><b>Format: </b><code>
482 get_by_val dst(r) base(r) property(r)
483 </code></p>
486 Converts register base to Object, gets the property named
487 by register property from the object, and puts the result
488 in register dst. property is nominally converted to string
489 but numbers are treated more efficiently.
491 </p>
492 <h2><code>put_by_val</code></h2>
493 <p><b>Format: </b><code>
494 put_by_val base(r) property(r) value(r)
495 </code></p>
498 Sets register value on register base as the property named
499 by register property. Base is converted to object
500 first. register property is nominally converted to string
501 but numbers are treated more efficiently.
503 Unlike many opcodes, this one does not write any output to
504 the register file.
506 </p>
507 <h2><code>del_by_val</code></h2>
508 <p><b>Format: </b><code>
509 del_by_val dst(r) base(r) property(r)
510 </code></p>
513 Converts register base to Object, deletes the property
514 named by register property from the object, and writes a
515 boolean indicating success (if true) or failure (if false)
516 to register dst.
518 </p>
519 <h2><code>put_by_index</code></h2>
520 <p><b>Format: </b><code>
521 put_by_index base(r) property(n) value(r)
522 </code></p>
525 Sets register value on register base as the property named
526 by the immediate number property. Base is converted to
527 object first.
529 Unlike many opcodes, this one does not write any output to
530 the register file.
532 This opcode is mainly used to initialize array literals.
534 </p>
535 <h2><code>loop</code></h2>
536 <p><b>Format: </b><code>
537 loop target(offset)
538 </code></p>
541 Jumps unconditionally to offset target from the current
542 instruction.
544 Additionally this loop instruction may terminate JS execution is
545 the JS timeout is reached.
547 </p>
548 <h2><code>jmp</code></h2>
549 <p><b>Format: </b><code>
550 jmp target(offset)
551 </code></p>
554 Jumps unconditionally to offset target from the current
555 instruction.
557 </p>
558 <h2><code>loop_if_true</code></h2>
559 <p><b>Format: </b><code>
560 loop_if_true cond(r) target(offset)
561 </code></p>
564 Jumps to offset target from the current instruction, if and
565 only if register cond converts to boolean as true.
567 Additionally this loop instruction may terminate JS execution is
568 the JS timeout is reached.
570 </p>
571 <h2><code>jtrue</code></h2>
572 <p><b>Format: </b><code>
573 jtrue cond(r) target(offset)
574 </code></p>
577 Jumps to offset target from the current instruction, if and
578 only if register cond converts to boolean as true.
580 </p>
581 <h2><code>jfalse</code></h2>
582 <p><b>Format: </b><code>
583 jfalse cond(r) target(offset)
584 </code></p>
587 Jumps to offset target from the current instruction, if and
588 only if register cond converts to boolean as false.
590 </p>
591 <h2><code>loop_if_less</code></h2>
592 <p><b>Format: </b><code>
593 loop_if_less src1(r) src2(r) target(offset)
594 </code></p>
597 Checks whether register src1 is less than register src2, as
598 with the ECMAScript '<' operator, and then jumps to offset
599 target from the current instruction, if and only if the
600 result of the comparison is true.
602 Additionally this loop instruction may terminate JS execution is
603 the JS timeout is reached.
605 </p>
606 <h2><code>jless</code></h2>
607 <p><b>Format: </b><code>
608 jless src1(r) src2(r) target(offset)
609 </code></p>
612 Checks whether register src1 is less than register src2, as
613 with the ECMAScript '<' operator, and then jumps to offset
614 target from the current instruction, if and only if the
615 result of the comparison is true.
617 </p>
618 <h2><code>jnless</code></h2>
619 <p><b>Format: </b><code>
620 jnless src1(r) src2(r) target(offset)
621 </code></p>
624 Checks whether register src1 is less than register src2, as
625 with the ECMAScript '<' operator, and then jumps to offset
626 target from the current instruction, if and only if the
627 result of the comparison is false.
629 </p>
630 <h2><code>switch_imm</code></h2>
631 <p><b>Format: </b><code>
632 switch_imm tableIndex(n) defaultOffset(offset) scrutinee(r)
633 </code></p>
636 Performs a range checked switch on the scrutinee value, using
637 the tableIndex-th immediate switch jump table. If the scrutinee value
638 is an immediate number in the range covered by the referenced jump
639 table, and the value at jumpTable[scrutinee value] is non-zero, then
640 that value is used as the jump offset, otherwise defaultOffset is used.
642 </p>
643 <h2><code>switch_char</code></h2>
644 <p><b>Format: </b><code>
645 switch_char tableIndex(n) defaultOffset(offset) scrutinee(r)
646 </code></p>
649 Performs a range checked switch on the scrutinee value, using
650 the tableIndex-th character switch jump table. If the scrutinee value
651 is a single character string in the range covered by the referenced jump
652 table, and the value at jumpTable[scrutinee value] is non-zero, then
653 that value is used as the jump offset, otherwise defaultOffset is used.
655 </p>
656 <h2><code>switch_string</code></h2>
657 <p><b>Format: </b><code>
658 switch_string tableIndex(n) defaultOffset(offset) scrutinee(r)
659 </code></p>
662 Performs a sparse hashmap based switch on the value in the scrutinee
663 register, using the tableIndex-th string switch jump table. If the
664 scrutinee value is a string that exists as a key in the referenced
665 jump table, then the value associated with the string is used as the
666 jump offset, otherwise defaultOffset is used.
668 </p>
669 <h2><code>new_func</code></h2>
670 <p><b>Format: </b><code>
671 new_func dst(r) func(f)
672 </code></p>
675 Constructs a new Function instance from function func and
676 the current scope chain using the original Function
677 constructor, using the rules for function declarations, and
678 puts the result in register dst.
680 </p>
681 <h2><code>new_func_exp</code></h2>
682 <p><b>Format: </b><code>
683 new_func_exp dst(r) func(f)
684 </code></p>
687 Constructs a new Function instance from function func and
688 the current scope chain using the original Function
689 constructor, using the rules for function expressions, and
690 puts the result in register dst.
692 </p>
693 <h2><code>call_eval</code></h2>
694 <p><b>Format: </b><code>
695 call_eval dst(r) func(r) thisVal(r) firstArg(r) argCount(n)
696 </code></p>
699 Call a function named "eval" with no explicit "this" value
700 (which may therefore be the eval operator). If register
701 thisVal is the global object, and register func contains
702 that global object's original global eval function, then
703 perform the eval operator in local scope (interpreting
704 the argument registers as for the "call"
705 opcode). Otherwise, act exactly as the "call" opcode would.
707 </p>
708 <h2><code>call</code></h2>
709 <p><b>Format: </b><code>
710 call dst(r) func(r) thisVal(r) firstArg(r) argCount(n)
711 </code></p>
714 Perform a function call. Specifically, call register func
715 with a "this" value of register thisVal, and put the result
716 in register dst.
718 The arguments start at register firstArg and go up to
719 argCount, but the "this" value is considered an implicit
720 first argument, so the argCount should be one greater than
721 the number of explicit arguments passed, and the register
722 after firstArg should contain the actual first
723 argument. This opcode will copy from the thisVal register
724 to the firstArg register, unless the register index of
725 thisVal is the special missing this object marker, which is
726 2^31-1; in that case, the global object will be used as the
727 "this" value.
729 If func is a native code function, then this opcode calls
730 it and returns the value immediately.
732 But if it is a JS function, then the current scope chain
733 and code block is set to the function's, and we slide the
734 register window so that the arguments would form the first
735 few local registers of the called function's register
736 window. In addition, a call frame header is written
737 immediately before the arguments; see the call frame
738 documentation for an explanation of how many registers a
739 call frame takes and what they contain. That many registers
740 before the firstArg register will be overwritten by the
741 call. In addition, any registers higher than firstArg +
742 argCount may be overwritten. Once this setup is complete,
743 execution continues from the called function's first
744 argument, and does not return until a "ret" opcode is
745 encountered.
747 </p>
748 <h2><code>ret</code></h2>
749 <p><b>Format: </b><code>
750 ret result(r)
751 </code></p>
754 Return register result as the return value of the current
755 function call, writing it into the caller's expected return
756 value register. In addition, unwind one call frame and
757 restore the scope chain, code block instruction pointer and
758 register base to those of the calling function.
760 </p>
761 <h2><code>construct</code></h2>
762 <p><b>Format: </b><code>
763 construct dst(r) constr(r) firstArg(r) argCount(n)
764 </code></p>
767 Invoke register "constr" as a constructor. For JS
768 functions, the calling convention is exactly as for the
769 "call" opcode, except that the "this" value is a newly
770 created Object. For native constructors, a null "this"
771 value is passed. In either case, the firstArg and argCount
772 registers are interpreted as for the "call" opcode.
774 </p>
775 <h2><code>push_scope</code></h2>
776 <p><b>Format: </b><code>
777 push_scope scope(r)
778 </code></p>
781 Converts register scope to object, and pushes it onto the top
782 of the current scope chain.
784 </p>
785 <h2><code>pop_scope</code></h2>
786 <p><b>Format: </b><code>
787 pop_scope
788 </code></p>
791 Removes the top item from the current scope chain.
793 </p>
794 <h2><code>get_pnames</code></h2>
795 <p><b>Format: </b><code>
796 get_pnames dst(r) base(r)
797 </code></p>
800 Creates a property name list for register base and puts it
801 in register dst. This is not a true JavaScript value, just
802 a synthetic value used to keep the iteration state in a
803 register.
805 </p>
806 <h2><code>next_pname</code></h2>
807 <p><b>Format: </b><code>
808 next_pname dst(r) iter(r) target(offset)
809 </code></p>
812 Tries to copies the next name from property name list in
813 register iter. If there are names left, then copies one to
814 register dst, and jumps to offset target. If there are none
815 left, invalidates the iterator and continues to the next
816 instruction.
818 </p>
819 <h2><code>jmp_scopes</code></h2>
820 <p><b>Format: </b><code>
821 jmp_scopes count(n) target(offset)
822 </code></p>
825 Removes the a number of items from the current scope chain
826 specified by immediate number count, then jumps to offset
827 target.
829 </p>
830 <h2><code>catch</code></h2>
831 <p><b>Format: </b><code>
832 catch ex(r)
833 </code></p>
836 Retrieves the VMs current exception and puts it in register
837 ex. This is only valid after an exception has been raised,
838 and usually forms the beginning of an exception handler.
840 </p>
841 <h2><code>throw</code></h2>
842 <p><b>Format: </b><code>
843 throw ex(r)
844 </code></p>
847 Throws register ex as an exception. This involves three
848 steps: first, it is set as the current exception in the
849 VM's internal state, then the stack is unwound until an
850 exception handler or a native code boundary is found, and
851 then control resumes at the exception handler if any or
852 else the script returns control to the nearest native caller.
854 </p>
855 <h2><code>new_error</code></h2>
856 <p><b>Format: </b><code>
857 new_error dst(r) type(n) message(k)
858 </code></p>
861 Constructs a new Error instance using the original
862 constructor, using immediate number n as the type and
863 constant message as the message string. The result is
864 written to register dst.
866 </p>
867 <h2><code>end</code></h2>
868 <p><b>Format: </b><code>
869 end result(r)
870 </code></p>
873 Return register result as the value of a global or eval
874 program. Return control to the calling native code.
876 </p>
877 <h2><code>put_getter</code></h2>
878 <p><b>Format: </b><code>
879 put_getter base(r) property(id) function(r)
880 </code></p>
883 Sets register function on register base as the getter named
884 by identifier property. Base and function are assumed to be
885 objects as this op should only be used for getters defined
886 in object literal form.
888 Unlike many opcodes, this one does not write any output to
889 the register file.
891 </p>
892 <h2><code>put_setter</code></h2>
893 <p><b>Format: </b><code>
894 put_setter base(r) property(id) function(r)
895 </code></p>
898 Sets register function on register base as the setter named
899 by identifier property. Base and function are assumed to be
900 objects as this op should only be used for setters defined
901 in object literal form.
903 Unlike many opcodes, this one does not write any output to
904 the register file.
906 </p>
907 <h2><code>jsr</code></h2>
908 <p><b>Format: </b><code>
909 jsr retAddrDst(r) target(offset)
910 </code></p>
913 Places the address of the next instruction into the retAddrDst
914 register and jumps to offset target from the current instruction.
916 </p>
917 <h2><code>sret</code></h2>
918 <p><b>Format: </b><code>
919 sret retAddrSrc(r)
920 </code></p>
923 Jumps to the address stored in the retAddrSrc register. This
924 differs from op_jmp because the target address is stored in a
925 register, not as an immediate.
927 </p>
928 <h2><code>debug</code></h2>
929 <p><b>Format: </b><code>
930 debug debugHookID(n) firstLine(n) lastLine(n)
931 </code></p>
934 Notifies the debugger of the current state of execution. This opcode
935 is only generated while the debugger is attached.
937 </p>