• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * This file was generated automatically by gen-mterp.py for 'x86_64'.
3 *
4 * --> DO NOT EDIT <--
5 */
6
7/* File: x86_64/header.S */
8/*
9 * Copyright (C) 2016 The Android Open Source Project
10 *
11 * Licensed under the Apache License, Version 2.0 (the "License");
12 * you may not use this file except in compliance with the License.
13 * You may obtain a copy of the License at
14 *
15 *      http://www.apache.org/licenses/LICENSE-2.0
16 *
17 * Unless required by applicable law or agreed to in writing, software
18 * distributed under the License is distributed on an "AS IS" BASIS,
19 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20 * See the License for the specific language governing permissions and
21 * limitations under the License.
22 */
23
24/*
25  Art assembly interpreter notes:
26
27  First validate assembly code by implementing ExecuteXXXImpl() style body (doesn't
28  handle invoke, allows higher-level code to create frame & shadow frame.
29
30  Once that's working, support direct entry code & eliminate shadow frame (and
31  excess locals allocation.
32
33  Some (hopefully) temporary ugliness.  We'll treat rFP as pointing to the
34  base of the vreg array within the shadow frame.  Access the other fields,
35  dex_pc_, method_ and number_of_vregs_ via negative offsets.  For now, we'll continue
36  the shadow frame mechanism of double-storing object references - via rFP &
37  number_of_vregs_.
38
39 */
40
41/*
42x86_64 ABI general notes:
43
44Caller save set:
45   rax, rdx, rcx, rsi, rdi, r8-r11, st(0)-st(7)
46Callee save set:
47   rbx, rbp, r12-r15
48Return regs:
49   32-bit in eax
50   64-bit in rax
51   fp on xmm0
52
53First 8 fp parameters came in xmm0-xmm7.
54First 6 non-fp parameters came in rdi, rsi, rdx, rcx, r8, r9.
55Other parameters passed on stack, pushed right-to-left.  On entry to target, first
56param is at 8(%esp).  Traditional entry code is:
57
58Stack must be 16-byte aligned to support SSE in native code.
59
60If we're not doing variable stack allocation (alloca), the frame pointer can be
61eliminated and all arg references adjusted to be esp relative.
62*/
63
64/*
65Mterp and x86_64 notes:
66
67Some key interpreter variables will be assigned to registers.
68
69  nick     reg   purpose
70  rPROFILE rbp   countdown register for jit profiling
71  rPC      r12   interpreted program counter, used for fetching instructions
72  rFP      r13   interpreted frame pointer, used for accessing locals and args
73  rINSTw   bx    first 16-bit code of current instruction
74  rINSTbl  bl    opcode portion of instruction word
75  rINSTbh  bh    high byte of inst word, usually contains src/tgt reg names
76  rIBASE   r14   base of instruction handler table
77  rREFS    r15   base of object references in shadow frame.
78
79Notes:
80   o High order 16 bits of ebx must be zero on entry to handler
81   o rPC, rFP, rINSTw/rINSTbl valid on handler entry and exit
82   o eax and ecx are scratch, rINSTw/ebx sometimes scratch
83
84Macros are provided for common operations.  Each macro MUST emit only
85one instruction to make instruction-counting easier.  They MUST NOT alter
86unspecified registers or condition codes.
87*/
88
89/*
90 * This is a #include, not a %include, because we want the C pre-processor
91 * to expand the macros into assembler assignment statements.
92 */
93#include "asm_support.h"
94
95/*
96 * Handle mac compiler specific
97 */
98#if defined(__APPLE__)
99    #define MACRO_LITERAL(value) $(value)
100    #define FUNCTION_TYPE(name)
101    #define SIZE(start,end)
102    // Mac OS' symbols have an _ prefix.
103    #define SYMBOL(name) _ ## name
104#else
105    #define MACRO_LITERAL(value) $value
106    #define FUNCTION_TYPE(name) .type name, @function
107    #define SIZE(start,end) .size start, .-end
108    #define SYMBOL(name) name
109#endif
110
111.macro PUSH _reg
112    pushq \_reg
113    .cfi_adjust_cfa_offset 8
114    .cfi_rel_offset \_reg, 0
115.endm
116
117.macro POP _reg
118    popq \_reg
119    .cfi_adjust_cfa_offset -8
120    .cfi_restore \_reg
121.endm
122
123/*
124 * Instead of holding a pointer to the shadow frame, we keep rFP at the base of the vregs.  So,
125 * to access other shadow frame fields, we need to use a backwards offset.  Define those here.
126 */
127#define OFF_FP(a) (a - SHADOWFRAME_VREGS_OFFSET)
128#define OFF_FP_NUMBER_OF_VREGS OFF_FP(SHADOWFRAME_NUMBER_OF_VREGS_OFFSET)
129#define OFF_FP_DEX_PC OFF_FP(SHADOWFRAME_DEX_PC_OFFSET)
130#define OFF_FP_LINK OFF_FP(SHADOWFRAME_LINK_OFFSET)
131#define OFF_FP_METHOD OFF_FP(SHADOWFRAME_METHOD_OFFSET)
132#define OFF_FP_RESULT_REGISTER OFF_FP(SHADOWFRAME_RESULT_REGISTER_OFFSET)
133#define OFF_FP_DEX_PC_PTR OFF_FP(SHADOWFRAME_DEX_PC_PTR_OFFSET)
134#define OFF_FP_CODE_ITEM OFF_FP(SHADOWFRAME_CODE_ITEM_OFFSET)
135#define OFF_FP_COUNTDOWN_OFFSET OFF_FP(SHADOWFRAME_HOTNESS_COUNTDOWN_OFFSET)
136#define OFF_FP_SHADOWFRAME (-SHADOWFRAME_VREGS_OFFSET)
137
138/* Frame size must be 16-byte aligned.
139 * Remember about 8 bytes for return address + 6 * 8 for spills.
140 */
141#define FRAME_SIZE     8
142
143/* Frame diagram while executing ExecuteMterpImpl, high to low addresses */
144#define IN_ARG3        %rcx
145#define IN_ARG2        %rdx
146#define IN_ARG1        %rsi
147#define IN_ARG0        %rdi
148/* Spill offsets relative to %esp */
149#define SELF_SPILL     (FRAME_SIZE -  8)
150/* Out Args  */
151#define OUT_ARG3       %rcx
152#define OUT_ARG2       %rdx
153#define OUT_ARG1       %rsi
154#define OUT_ARG0       %rdi
155#define OUT_32_ARG3    %ecx
156#define OUT_32_ARG2    %edx
157#define OUT_32_ARG1    %esi
158#define OUT_32_ARG0    %edi
159#define OUT_FP_ARG1    %xmm1
160#define OUT_FP_ARG0    %xmm0
161
162/* During bringup, we'll use the shadow frame model instead of rFP */
163/* single-purpose registers, given names for clarity */
164#define rSELF    SELF_SPILL(%rsp)
165#define rPC      %r12
166#define rFP      %r13
167#define rINST    %ebx
168#define rINSTq   %rbx
169#define rINSTw   %bx
170#define rINSTbh  %bh
171#define rINSTbl  %bl
172#define rIBASE   %r14
173#define rREFS    %r15
174#define rPROFILE %ebp
175
176#define MTERP_LOGGING 0
177
178/*
179 * "export" the PC to dex_pc field in the shadow frame, f/b/o future exception objects.  Must
180 * be done *before* something throws.
181 *
182 * It's okay to do this more than once.
183 *
184 * NOTE: the fast interpreter keeps track of dex pc as a direct pointer to the mapped
185 * dex byte codes.  However, the rest of the runtime expects dex pc to be an instruction
186 * offset into the code_items_[] array.  For effiency, we will "export" the
187 * current dex pc as a direct pointer using the EXPORT_PC macro, and rely on GetDexPC
188 * to convert to a dex pc when needed.
189 */
190.macro EXPORT_PC
191    movq    rPC, OFF_FP_DEX_PC_PTR(rFP)
192.endm
193
194/*
195 * Refresh handler table.
196 * IBase handles uses the caller save register so we must restore it after each call.
197 * Also it is used as a result of some 64-bit operations (like imul) and we should
198 * restore it in such cases also.
199 *
200 */
201.macro REFRESH_IBASE
202    movq    rSELF, rIBASE
203    movq    THREAD_CURRENT_IBASE_OFFSET(rIBASE), rIBASE
204.endm
205
206/*
207 * Refresh rINST.
208 * At enter to handler rINST does not contain the opcode number.
209 * However some utilities require the full value, so this macro
210 * restores the opcode number.
211 */
212.macro REFRESH_INST _opnum
213    movb    rINSTbl, rINSTbh
214    movb    $\_opnum, rINSTbl
215.endm
216
217/*
218 * Fetch the next instruction from rPC into rINSTw.  Does not advance rPC.
219 */
220.macro FETCH_INST
221    movzwq  (rPC), rINSTq
222.endm
223
224/*
225 * Remove opcode from rINST, compute the address of handler and jump to it.
226 */
227.macro GOTO_NEXT
228    movzx   rINSTbl,%eax
229    movzbl  rINSTbh,rINST
230    shll    MACRO_LITERAL(7), %eax
231    addq    rIBASE, %rax
232    jmp     *%rax
233.endm
234
235/*
236 * Advance rPC by instruction count.
237 */
238.macro ADVANCE_PC _count
239    leaq    2*\_count(rPC), rPC
240.endm
241
242/*
243 * Advance rPC by instruction count, fetch instruction and jump to handler.
244 */
245.macro ADVANCE_PC_FETCH_AND_GOTO_NEXT _count
246    ADVANCE_PC \_count
247    FETCH_INST
248    GOTO_NEXT
249.endm
250
251/*
252 * Get/set the 32-bit value from a Dalvik register.
253 */
254#define VREG_ADDRESS(_vreg) (rFP,_vreg,4)
255#define VREG_REF_ADDRESS(_vreg) (rREFS,_vreg,4)
256
257.macro GET_VREG _reg _vreg
258    movl    (rFP,\_vreg,4), \_reg
259.endm
260
261/* Read wide value. */
262.macro GET_WIDE_VREG _reg _vreg
263    movq    (rFP,\_vreg,4), \_reg
264.endm
265
266.macro SET_VREG _reg _vreg
267    movl    \_reg, (rFP,\_vreg,4)
268    movl    MACRO_LITERAL(0), (rREFS,\_vreg,4)
269.endm
270
271/* Write wide value. reg is clobbered. */
272.macro SET_WIDE_VREG _reg _vreg
273    movq    \_reg, (rFP,\_vreg,4)
274    xorq    \_reg, \_reg
275    movq    \_reg, (rREFS,\_vreg,4)
276.endm
277
278.macro SET_VREG_OBJECT _reg _vreg
279    movl    \_reg, (rFP,\_vreg,4)
280    movl    \_reg, (rREFS,\_vreg,4)
281.endm
282
283.macro GET_VREG_HIGH _reg _vreg
284    movl    4(rFP,\_vreg,4), \_reg
285.endm
286
287.macro SET_VREG_HIGH _reg _vreg
288    movl    \_reg, 4(rFP,\_vreg,4)
289    movl    MACRO_LITERAL(0), 4(rREFS,\_vreg,4)
290.endm
291
292.macro CLEAR_REF _vreg
293    movl    MACRO_LITERAL(0),  (rREFS,\_vreg,4)
294.endm
295
296.macro CLEAR_WIDE_REF _vreg
297    movl    MACRO_LITERAL(0),  (rREFS,\_vreg,4)
298    movl    MACRO_LITERAL(0), 4(rREFS,\_vreg,4)
299.endm
300
301/* File: x86_64/entry.S */
302/*
303 * Copyright (C) 2016 The Android Open Source Project
304 *
305 * Licensed under the Apache License, Version 2.0 (the "License");
306 * you may not use this file except in compliance with the License.
307 * You may obtain a copy of the License at
308 *
309 *      http://www.apache.org/licenses/LICENSE-2.0
310 *
311 * Unless required by applicable law or agreed to in writing, software
312 * distributed under the License is distributed on an "AS IS" BASIS,
313 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
314 * See the License for the specific language governing permissions and
315 * limitations under the License.
316 */
317/*
318 * Interpreter entry point.
319 */
320
321    .text
322    .global SYMBOL(ExecuteMterpImpl)
323    FUNCTION_TYPE(ExecuteMterpImpl)
324
325/*
326 * On entry:
327 *  0  Thread* self
328 *  1  code_item
329 *  2  ShadowFrame
330 *  3  JValue* result_register
331 *
332 */
333
334SYMBOL(ExecuteMterpImpl):
335    .cfi_startproc
336    .cfi_def_cfa rsp, 8
337
338    /* Spill callee save regs */
339    PUSH %rbx
340    PUSH %rbp
341    PUSH %r12
342    PUSH %r13
343    PUSH %r14
344    PUSH %r15
345
346    /* Allocate frame */
347    subq    $FRAME_SIZE, %rsp
348    .cfi_adjust_cfa_offset FRAME_SIZE
349
350    /* Remember the return register */
351    movq    IN_ARG3, SHADOWFRAME_RESULT_REGISTER_OFFSET(IN_ARG2)
352
353    /* Remember the code_item */
354    movq    IN_ARG1, SHADOWFRAME_CODE_ITEM_OFFSET(IN_ARG2)
355
356    /* set up "named" registers */
357    movl    SHADOWFRAME_NUMBER_OF_VREGS_OFFSET(IN_ARG2), %eax
358    leaq    SHADOWFRAME_VREGS_OFFSET(IN_ARG2), rFP
359    leaq    (rFP, %rax, 4), rREFS
360    movl    SHADOWFRAME_DEX_PC_OFFSET(IN_ARG2), %eax
361    leaq    CODEITEM_INSNS_OFFSET(IN_ARG1), rPC
362    leaq    (rPC, %rax, 2), rPC
363    EXPORT_PC
364
365    /* Starting ibase */
366    movq    IN_ARG0, rSELF
367    REFRESH_IBASE
368
369    /* Set up for backwards branches & osr profiling */
370    movq    OFF_FP_METHOD(rFP), OUT_ARG0
371    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
372    call    SYMBOL(MterpSetUpHotnessCountdown)
373    movswl  %ax, rPROFILE
374
375    /* start executing the instruction at rPC */
376    FETCH_INST
377    GOTO_NEXT
378    /* NOTE: no fallthrough */
379
380
381    .global SYMBOL(artMterpAsmInstructionStart)
382    FUNCTION_TYPE(SYMBOL(artMterpAsmInstructionStart))
383SYMBOL(artMterpAsmInstructionStart) = .L_op_nop
384    .text
385
386/* ------------------------------ */
387    .balign 128
388.L_op_nop: /* 0x00 */
389/* File: x86_64/op_nop.S */
390    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
391
392/* ------------------------------ */
393    .balign 128
394.L_op_move: /* 0x01 */
395/* File: x86_64/op_move.S */
396    /* for move, move-object, long-to-int */
397    /* op vA, vB */
398    movl    rINST, %eax                     # eax <- BA
399    andb    $0xf, %al                      # eax <- A
400    shrl    $4, rINST                      # rINST <- B
401    GET_VREG %edx, rINSTq
402    .if 0
403    SET_VREG_OBJECT %edx, %rax              # fp[A] <- fp[B]
404    .else
405    SET_VREG %edx, %rax                     # fp[A] <- fp[B]
406    .endif
407    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
408
409/* ------------------------------ */
410    .balign 128
411.L_op_move_from16: /* 0x02 */
412/* File: x86_64/op_move_from16.S */
413    /* for: move/from16, move-object/from16 */
414    /* op vAA, vBBBB */
415    movzwq  2(rPC), %rax                    # eax <- BBBB
416    GET_VREG %edx, %rax                     # edx <- fp[BBBB]
417    .if 0
418    SET_VREG_OBJECT %edx, rINSTq            # fp[A] <- fp[B]
419    .else
420    SET_VREG %edx, rINSTq                   # fp[A] <- fp[B]
421    .endif
422    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
423
424/* ------------------------------ */
425    .balign 128
426.L_op_move_16: /* 0x03 */
427/* File: x86_64/op_move_16.S */
428    /* for: move/16, move-object/16 */
429    /* op vAAAA, vBBBB */
430    movzwq  4(rPC), %rcx                    # ecx <- BBBB
431    movzwq  2(rPC), %rax                    # eax <- AAAA
432    GET_VREG %edx, %rcx
433    .if 0
434    SET_VREG_OBJECT %edx, %rax              # fp[A] <- fp[B]
435    .else
436    SET_VREG %edx, %rax                     # fp[A] <- fp[B]
437    .endif
438    ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
439
440/* ------------------------------ */
441    .balign 128
442.L_op_move_wide: /* 0x04 */
443/* File: x86_64/op_move_wide.S */
444    /* move-wide vA, vB */
445    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
446    movl    rINST, %ecx                     # ecx <- BA
447    sarl    $4, rINST                      # rINST <- B
448    andb    $0xf, %cl                      # ecx <- A
449    GET_WIDE_VREG %rdx, rINSTq              # rdx <- v[B]
450    SET_WIDE_VREG %rdx, %rcx                # v[A] <- rdx
451    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
452
453/* ------------------------------ */
454    .balign 128
455.L_op_move_wide_from16: /* 0x05 */
456/* File: x86_64/op_move_wide_from16.S */
457    /* move-wide/from16 vAA, vBBBB */
458    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
459    movzwl  2(rPC), %ecx                    # ecx <- BBBB
460    GET_WIDE_VREG %rdx, %rcx                # rdx <- v[B]
461    SET_WIDE_VREG %rdx, rINSTq              # v[A] <- rdx
462    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
463
464/* ------------------------------ */
465    .balign 128
466.L_op_move_wide_16: /* 0x06 */
467/* File: x86_64/op_move_wide_16.S */
468    /* move-wide/16 vAAAA, vBBBB */
469    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
470    movzwq  4(rPC), %rcx                    # ecx<- BBBB
471    movzwq  2(rPC), %rax                    # eax<- AAAA
472    GET_WIDE_VREG %rdx, %rcx                # rdx <- v[B]
473    SET_WIDE_VREG %rdx, %rax                # v[A] <- rdx
474    ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
475
476/* ------------------------------ */
477    .balign 128
478.L_op_move_object: /* 0x07 */
479/* File: x86_64/op_move_object.S */
480/* File: x86_64/op_move.S */
481    /* for move, move-object, long-to-int */
482    /* op vA, vB */
483    movl    rINST, %eax                     # eax <- BA
484    andb    $0xf, %al                      # eax <- A
485    shrl    $4, rINST                      # rINST <- B
486    GET_VREG %edx, rINSTq
487    .if 1
488    SET_VREG_OBJECT %edx, %rax              # fp[A] <- fp[B]
489    .else
490    SET_VREG %edx, %rax                     # fp[A] <- fp[B]
491    .endif
492    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
493
494
495/* ------------------------------ */
496    .balign 128
497.L_op_move_object_from16: /* 0x08 */
498/* File: x86_64/op_move_object_from16.S */
499/* File: x86_64/op_move_from16.S */
500    /* for: move/from16, move-object/from16 */
501    /* op vAA, vBBBB */
502    movzwq  2(rPC), %rax                    # eax <- BBBB
503    GET_VREG %edx, %rax                     # edx <- fp[BBBB]
504    .if 1
505    SET_VREG_OBJECT %edx, rINSTq            # fp[A] <- fp[B]
506    .else
507    SET_VREG %edx, rINSTq                   # fp[A] <- fp[B]
508    .endif
509    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
510
511
512/* ------------------------------ */
513    .balign 128
514.L_op_move_object_16: /* 0x09 */
515/* File: x86_64/op_move_object_16.S */
516/* File: x86_64/op_move_16.S */
517    /* for: move/16, move-object/16 */
518    /* op vAAAA, vBBBB */
519    movzwq  4(rPC), %rcx                    # ecx <- BBBB
520    movzwq  2(rPC), %rax                    # eax <- AAAA
521    GET_VREG %edx, %rcx
522    .if 1
523    SET_VREG_OBJECT %edx, %rax              # fp[A] <- fp[B]
524    .else
525    SET_VREG %edx, %rax                     # fp[A] <- fp[B]
526    .endif
527    ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
528
529
530/* ------------------------------ */
531    .balign 128
532.L_op_move_result: /* 0x0a */
533/* File: x86_64/op_move_result.S */
534    /* for: move-result, move-result-object */
535    /* op vAA */
536    movq    OFF_FP_RESULT_REGISTER(rFP), %rax    # get pointer to result JType.
537    movl    (%rax), %eax                    # r0 <- result.i.
538    .if 0
539    SET_VREG_OBJECT %eax, rINSTq            # fp[A] <- fp[B]
540    .else
541    SET_VREG %eax, rINSTq                   # fp[A] <- fp[B]
542    .endif
543    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
544
545/* ------------------------------ */
546    .balign 128
547.L_op_move_result_wide: /* 0x0b */
548/* File: x86_64/op_move_result_wide.S */
549    /* move-result-wide vAA */
550    movq    OFF_FP_RESULT_REGISTER(rFP), %rax    # get pointer to result JType.
551    movq    (%rax), %rdx                         # Get wide
552    SET_WIDE_VREG %rdx, rINSTq                   # v[AA] <- rdx
553    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
554
555/* ------------------------------ */
556    .balign 128
557.L_op_move_result_object: /* 0x0c */
558/* File: x86_64/op_move_result_object.S */
559/* File: x86_64/op_move_result.S */
560    /* for: move-result, move-result-object */
561    /* op vAA */
562    movq    OFF_FP_RESULT_REGISTER(rFP), %rax    # get pointer to result JType.
563    movl    (%rax), %eax                    # r0 <- result.i.
564    .if 1
565    SET_VREG_OBJECT %eax, rINSTq            # fp[A] <- fp[B]
566    .else
567    SET_VREG %eax, rINSTq                   # fp[A] <- fp[B]
568    .endif
569    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
570
571
572/* ------------------------------ */
573    .balign 128
574.L_op_move_exception: /* 0x0d */
575/* File: x86_64/op_move_exception.S */
576    /* move-exception vAA */
577    movq    rSELF, %rcx
578    movl    THREAD_EXCEPTION_OFFSET(%rcx), %eax
579    SET_VREG_OBJECT %eax, rINSTq            # fp[AA] <- exception object
580    movl    $0, THREAD_EXCEPTION_OFFSET(%rcx)
581    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
582
583/* ------------------------------ */
584    .balign 128
585.L_op_return_void: /* 0x0e */
586/* File: x86_64/op_return_void.S */
587    .extern MterpThreadFenceForConstructor
588    call    SYMBOL(MterpThreadFenceForConstructor)
589    movq    rSELF, OUT_ARG0
590    testl   $(THREAD_SUSPEND_OR_CHECKPOINT_REQUEST), THREAD_FLAGS_OFFSET(OUT_ARG0)
591    jz      1f
592    call    SYMBOL(MterpSuspendCheck)
5931:
594    xorq    %rax, %rax
595    jmp     MterpReturn
596
597/* ------------------------------ */
598    .balign 128
599.L_op_return: /* 0x0f */
600/* File: x86_64/op_return.S */
601/*
602 * Return a 32-bit value.
603 *
604 * for: return, return-object
605 */
606    /* op vAA */
607    .extern MterpThreadFenceForConstructor
608    call    SYMBOL(MterpThreadFenceForConstructor)
609    movq    rSELF, OUT_ARG0
610    testl   $(THREAD_SUSPEND_OR_CHECKPOINT_REQUEST), THREAD_FLAGS_OFFSET(OUT_ARG0)
611    jz      1f
612    call    SYMBOL(MterpSuspendCheck)
6131:
614    GET_VREG %eax, rINSTq                   # eax <- vAA
615    jmp     MterpReturn
616
617/* ------------------------------ */
618    .balign 128
619.L_op_return_wide: /* 0x10 */
620/* File: x86_64/op_return_wide.S */
621/*
622 * Return a 64-bit value.
623 */
624    /* return-wide vAA */
625    .extern MterpThreadFenceForConstructor
626    call    SYMBOL(MterpThreadFenceForConstructor)
627    movq    rSELF, OUT_ARG0
628    testl   $(THREAD_SUSPEND_OR_CHECKPOINT_REQUEST), THREAD_FLAGS_OFFSET(OUT_ARG0)
629    jz      1f
630    call    SYMBOL(MterpSuspendCheck)
6311:
632    GET_WIDE_VREG %rax, rINSTq              # eax <- v[AA]
633    jmp     MterpReturn
634
635/* ------------------------------ */
636    .balign 128
637.L_op_return_object: /* 0x11 */
638/* File: x86_64/op_return_object.S */
639/* File: x86_64/op_return.S */
640/*
641 * Return a 32-bit value.
642 *
643 * for: return, return-object
644 */
645    /* op vAA */
646    .extern MterpThreadFenceForConstructor
647    call    SYMBOL(MterpThreadFenceForConstructor)
648    movq    rSELF, OUT_ARG0
649    testl   $(THREAD_SUSPEND_OR_CHECKPOINT_REQUEST), THREAD_FLAGS_OFFSET(OUT_ARG0)
650    jz      1f
651    call    SYMBOL(MterpSuspendCheck)
6521:
653    GET_VREG %eax, rINSTq                   # eax <- vAA
654    jmp     MterpReturn
655
656
657/* ------------------------------ */
658    .balign 128
659.L_op_const_4: /* 0x12 */
660/* File: x86_64/op_const_4.S */
661    /* const/4 vA, #+B */
662    movsbl  rINSTbl, %eax                   # eax <-ssssssBx
663    movl    $0xf, rINST
664    andl    %eax, rINST                     # rINST <- A
665    sarl    $4, %eax
666    SET_VREG %eax, rINSTq
667    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
668
669/* ------------------------------ */
670    .balign 128
671.L_op_const_16: /* 0x13 */
672/* File: x86_64/op_const_16.S */
673    /* const/16 vAA, #+BBBB */
674    movswl  2(rPC), %ecx                    # ecx <- ssssBBBB
675    SET_VREG %ecx, rINSTq                   # vAA <- ssssBBBB
676    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
677
678/* ------------------------------ */
679    .balign 128
680.L_op_const: /* 0x14 */
681/* File: x86_64/op_const.S */
682    /* const vAA, #+BBBBbbbb */
683    movl    2(rPC), %eax                    # grab all 32 bits at once
684    SET_VREG %eax, rINSTq                   # vAA<- eax
685    ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
686
687/* ------------------------------ */
688    .balign 128
689.L_op_const_high16: /* 0x15 */
690/* File: x86_64/op_const_high16.S */
691    /* const/high16 vAA, #+BBBB0000 */
692    movzwl  2(rPC), %eax                    # eax <- 0000BBBB
693    sall    $16, %eax                      # eax <- BBBB0000
694    SET_VREG %eax, rINSTq                   # vAA <- eax
695    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
696
697/* ------------------------------ */
698    .balign 128
699.L_op_const_wide_16: /* 0x16 */
700/* File: x86_64/op_const_wide_16.S */
701    /* const-wide/16 vAA, #+BBBB */
702    movswq  2(rPC), %rax                    # rax <- ssssBBBB
703    SET_WIDE_VREG %rax, rINSTq              # store
704    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
705
706/* ------------------------------ */
707    .balign 128
708.L_op_const_wide_32: /* 0x17 */
709/* File: x86_64/op_const_wide_32.S */
710    /* const-wide/32 vAA, #+BBBBbbbb */
711    movslq   2(rPC), %rax                   # eax <- ssssssssBBBBbbbb
712    SET_WIDE_VREG %rax, rINSTq              # store
713    ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
714
715/* ------------------------------ */
716    .balign 128
717.L_op_const_wide: /* 0x18 */
718/* File: x86_64/op_const_wide.S */
719    /* const-wide vAA, #+HHHHhhhhBBBBbbbb */
720    movq    2(rPC), %rax                    # rax <- HHHHhhhhBBBBbbbb
721    SET_WIDE_VREG %rax, rINSTq
722    ADVANCE_PC_FETCH_AND_GOTO_NEXT 5
723
724/* ------------------------------ */
725    .balign 128
726.L_op_const_wide_high16: /* 0x19 */
727/* File: x86_64/op_const_wide_high16.S */
728    /* const-wide/high16 vAA, #+BBBB000000000000 */
729    movzwq  2(rPC), %rax                    # eax <- 0000BBBB
730    salq    $48, %rax                      # eax <- BBBB0000
731    SET_WIDE_VREG %rax, rINSTq              # v[AA+0] <- eax
732    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
733
734/* ------------------------------ */
735    .balign 128
736.L_op_const_string: /* 0x1a */
737/* File: x86_64/op_const_string.S */
738    /* const/string vAA, String@BBBB */
739    EXPORT_PC
740    movzwq  2(rPC), OUT_ARG0                # OUT_ARG0 <- BBBB
741    movq    rINSTq, OUT_ARG1
742    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG2
743    movq    rSELF, OUT_ARG3
744    call    SYMBOL(MterpConstString)        # (index, tgt_reg, shadow_frame, self)
745    testb   %al, %al
746    jnz     MterpPossibleException
747    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
748
749/* ------------------------------ */
750    .balign 128
751.L_op_const_string_jumbo: /* 0x1b */
752/* File: x86_64/op_const_string_jumbo.S */
753    /* const/string vAA, String@BBBBBBBB */
754    EXPORT_PC
755    movl    2(rPC), OUT_32_ARG0             # OUT_32_ARG0 <- BBBB
756    movq    rINSTq, OUT_ARG1
757    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG2
758    movq    rSELF, OUT_ARG3
759    call    SYMBOL(MterpConstString)        # (index, tgt_reg, shadow_frame, self)
760    testb   %al, %al
761    jnz     MterpPossibleException
762    ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
763
764/* ------------------------------ */
765    .balign 128
766.L_op_const_class: /* 0x1c */
767/* File: x86_64/op_const_class.S */
768    /* const/class vAA, Class@BBBB */
769    EXPORT_PC
770    movzwq  2(rPC), OUT_ARG0                # eax <- OUT_ARG0
771    movq    rINSTq, OUT_ARG1
772    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG2
773    movq    rSELF, OUT_ARG3
774    call    SYMBOL(MterpConstClass)         # (index, tgt_reg, shadow_frame, self)
775    testb   %al, %al
776    jnz     MterpPossibleException
777    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
778
779/* ------------------------------ */
780    .balign 128
781.L_op_monitor_enter: /* 0x1d */
782/* File: x86_64/op_monitor_enter.S */
783/*
784 * Synchronize on an object.
785 */
786    /* monitor-enter vAA */
787    EXPORT_PC
788    GET_VREG OUT_32_ARG0, rINSTq
789    movq    rSELF, OUT_ARG1
790    call    SYMBOL(artLockObjectFromCode)   # (object, self)
791    testq   %rax, %rax
792    jnz     MterpException
793    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
794
795/* ------------------------------ */
796    .balign 128
797.L_op_monitor_exit: /* 0x1e */
798/* File: x86_64/op_monitor_exit.S */
799/*
800 * Unlock an object.
801 *
802 * Exceptions that occur when unlocking a monitor need to appear as
803 * if they happened at the following instruction.  See the Dalvik
804 * instruction spec.
805 */
806    /* monitor-exit vAA */
807    EXPORT_PC
808    GET_VREG OUT_32_ARG0, rINSTq
809    movq    rSELF, OUT_ARG1
810    call    SYMBOL(artUnlockObjectFromCode) # (object, self)
811    testq   %rax, %rax
812    jnz     MterpException
813    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
814
815/* ------------------------------ */
816    .balign 128
817.L_op_check_cast: /* 0x1f */
818/* File: x86_64/op_check_cast.S */
819/*
820 * Check to see if a cast from one class to another is allowed.
821 */
822    /* check-cast vAA, class@BBBB */
823    EXPORT_PC
824    movzwq  2(rPC), OUT_ARG0                # OUT_ARG0 <- BBBB
825    leaq    VREG_ADDRESS(rINSTq), OUT_ARG1
826    movq    OFF_FP_METHOD(rFP), OUT_ARG2
827    movq    rSELF, OUT_ARG3
828    call    SYMBOL(MterpCheckCast)          # (index, &obj, method, self)
829    testb   %al, %al
830    jnz     MterpPossibleException
831    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
832
833/* ------------------------------ */
834    .balign 128
835.L_op_instance_of: /* 0x20 */
836/* File: x86_64/op_instance_of.S */
837/*
838 * Check to see if an object reference is an instance of a class.
839 *
840 * Most common situation is a non-null object, being compared against
841 * an already-resolved class.
842 */
843    /* instance-of vA, vB, class@CCCC */
844    EXPORT_PC
845    movzwl  2(rPC), OUT_32_ARG0             # OUT_32_ARG0 <- CCCC
846    movl    rINST, %eax                     # eax <- BA
847    sarl    $4, %eax                       # eax <- B
848    leaq    VREG_ADDRESS(%rax), OUT_ARG1    # Get object address
849    movq    OFF_FP_METHOD(rFP), OUT_ARG2
850    movq    rSELF, OUT_ARG3
851    call    SYMBOL(MterpInstanceOf)         # (index, &obj, method, self)
852    movsbl  %al, %eax
853    movq    rSELF, %rcx
854    cmpq    $0, THREAD_EXCEPTION_OFFSET(%rcx)
855    jnz     MterpException
856    andb    $0xf, rINSTbl                  # rINSTbl <- A
857    SET_VREG %eax, rINSTq
858    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
859
860/* ------------------------------ */
861    .balign 128
862.L_op_array_length: /* 0x21 */
863/* File: x86_64/op_array_length.S */
864/*
865 * Return the length of an array.
866 */
867    movl    rINST, %eax                     # eax <- BA
868    sarl    $4, rINST                      # rINST <- B
869    GET_VREG %ecx, rINSTq                   # ecx <- vB (object ref)
870    testl   %ecx, %ecx                      # is null?
871    je      common_errNullObject
872    andb    $0xf, %al                      # eax <- A
873    movl    MIRROR_ARRAY_LENGTH_OFFSET(%rcx), rINST
874    SET_VREG rINST, %rax
875    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
876
877/* ------------------------------ */
878    .balign 128
879.L_op_new_instance: /* 0x22 */
880/* File: x86_64/op_new_instance.S */
881/*
882 * Create a new instance of a class.
883 */
884    /* new-instance vAA, class@BBBB */
885    EXPORT_PC
886    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG0
887    movq    rSELF, OUT_ARG1
888    REFRESH_INST 34
889    movq    rINSTq, OUT_ARG2
890    call    SYMBOL(MterpNewInstance)
891    testb   %al, %al                        # 0 means an exception is thrown
892    jz      MterpPossibleException
893    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
894
895/* ------------------------------ */
896    .balign 128
897.L_op_new_array: /* 0x23 */
898/* File: x86_64/op_new_array.S */
899/*
900 * Allocate an array of objects, specified with the array class
901 * and a count.
902 *
903 * The verifier guarantees that this is an array class, so we don't
904 * check for it here.
905 */
906    /* new-array vA, vB, class@CCCC */
907    EXPORT_PC
908    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG0
909    movq    rPC, OUT_ARG1
910    REFRESH_INST 35
911    movq    rINSTq, OUT_ARG2
912    movq    rSELF, OUT_ARG3
913    call    SYMBOL(MterpNewArray)
914    testb   %al, %al                        # 0 means an exception is thrown
915    jz      MterpPossibleException
916    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
917
918/* ------------------------------ */
919    .balign 128
920.L_op_filled_new_array: /* 0x24 */
921/* File: x86_64/op_filled_new_array.S */
922/*
923 * Create a new array with elements filled from registers.
924 *
925 * for: filled-new-array, filled-new-array/range
926 */
927    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
928    /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
929    .extern MterpFilledNewArray
930    EXPORT_PC
931    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG0
932    movq    rPC, OUT_ARG1
933    movq    rSELF, OUT_ARG2
934    call    SYMBOL(MterpFilledNewArray)
935    testb   %al, %al                        # 0 means an exception is thrown
936    jz      MterpPossibleException
937    ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
938
939/* ------------------------------ */
940    .balign 128
941.L_op_filled_new_array_range: /* 0x25 */
942/* File: x86_64/op_filled_new_array_range.S */
943/* File: x86_64/op_filled_new_array.S */
944/*
945 * Create a new array with elements filled from registers.
946 *
947 * for: filled-new-array, filled-new-array/range
948 */
949    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
950    /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
951    .extern MterpFilledNewArrayRange
952    EXPORT_PC
953    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG0
954    movq    rPC, OUT_ARG1
955    movq    rSELF, OUT_ARG2
956    call    SYMBOL(MterpFilledNewArrayRange)
957    testb   %al, %al                        # 0 means an exception is thrown
958    jz      MterpPossibleException
959    ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
960
961
962/* ------------------------------ */
963    .balign 128
964.L_op_fill_array_data: /* 0x26 */
965/* File: x86_64/op_fill_array_data.S */
966    /* fill-array-data vAA, +BBBBBBBB */
967    EXPORT_PC
968    movslq  2(rPC), %rcx                    # rcx <- ssssssssBBBBbbbb
969    leaq    (rPC,%rcx,2), OUT_ARG1          # OUT_ARG1 <- PC + ssssssssBBBBbbbb*2
970    GET_VREG OUT_32_ARG0, rINSTq            # OUT_ARG0 <- vAA (array object)
971    call    SYMBOL(MterpFillArrayData)      # (obj, payload)
972    testb   %al, %al                        # 0 means an exception is thrown
973    jz      MterpPossibleException
974    ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
975
976/* ------------------------------ */
977    .balign 128
978.L_op_throw: /* 0x27 */
979/* File: x86_64/op_throw.S */
980/*
981 * Throw an exception object in the current thread.
982 */
983    /* throw vAA */
984    EXPORT_PC
985    GET_VREG %eax, rINSTq                   # eax<- vAA (exception object)
986    testb   %al, %al
987    jz      common_errNullObject
988    movq    rSELF, %rcx
989    movq    %rax, THREAD_EXCEPTION_OFFSET(%rcx)
990    jmp     MterpException
991
992/* ------------------------------ */
993    .balign 128
994.L_op_goto: /* 0x28 */
995/* File: x86_64/op_goto.S */
996/*
997 * Unconditional branch, 8-bit offset.
998 *
999 * The branch distance is a signed code-unit offset, which we need to
1000 * double to get a byte offset.
1001 */
1002    /* goto +AA */
1003    movsbq  rINSTbl, rINSTq                 # rINSTq <- ssssssAA
1004    testq   rINSTq, rINSTq
1005    jmp     MterpCommonTakenBranch
1006
1007/* ------------------------------ */
1008    .balign 128
1009.L_op_goto_16: /* 0x29 */
1010/* File: x86_64/op_goto_16.S */
1011/*
1012 * Unconditional branch, 16-bit offset.
1013 *
1014 * The branch distance is a signed code-unit offset, which we need to
1015 * double to get a byte offset.
1016 */
1017    /* goto/16 +AAAA */
1018    movswq  2(rPC), rINSTq                  # rINSTq <- ssssAAAA
1019    testq   rINSTq, rINSTq
1020    jmp     MterpCommonTakenBranch
1021
1022/* ------------------------------ */
1023    .balign 128
1024.L_op_goto_32: /* 0x2a */
1025/* File: x86_64/op_goto_32.S */
1026/*
1027 * Unconditional branch, 32-bit offset.
1028 *
1029 * The branch distance is a signed code-unit offset, which we need to
1030 * double to get a byte offset.
1031 *
1032 *  Because we need the SF bit set, we'll use an adds
1033 * to convert from Dalvik offset to byte offset.
1034 */
1035    /* goto/32 +AAAAAAAA */
1036    movslq  2(rPC), rINSTq                  # rINSTq <- AAAAAAAA
1037    testq   rINSTq, rINSTq
1038    jmp     MterpCommonTakenBranch
1039
1040/* ------------------------------ */
1041    .balign 128
1042.L_op_packed_switch: /* 0x2b */
1043/* File: x86_64/op_packed_switch.S */
1044/*
1045 * Handle a packed-switch or sparse-switch instruction.  In both cases
1046 * we decode it and hand it off to a helper function.
1047 *
1048 * We don't really expect backward branches in a switch statement, but
1049 * they're perfectly legal, so we check for them here.
1050 *
1051 * for: packed-switch, sparse-switch
1052 */
1053    /* op vAA, +BBBB */
1054    movslq  2(rPC), OUT_ARG0                # rcx <- ssssssssBBBBbbbb
1055    leaq    (rPC,OUT_ARG0,2), OUT_ARG0      # rcx <- PC + ssssssssBBBBbbbb*2
1056    GET_VREG OUT_32_ARG1, rINSTq            # eax <- vAA
1057    call    SYMBOL(MterpDoPackedSwitch)
1058    testl   %eax, %eax
1059    movslq  %eax, rINSTq
1060    jmp     MterpCommonTakenBranch
1061
1062/* ------------------------------ */
1063    .balign 128
1064.L_op_sparse_switch: /* 0x2c */
1065/* File: x86_64/op_sparse_switch.S */
1066/* File: x86_64/op_packed_switch.S */
1067/*
1068 * Handle a packed-switch or sparse-switch instruction.  In both cases
1069 * we decode it and hand it off to a helper function.
1070 *
1071 * We don't really expect backward branches in a switch statement, but
1072 * they're perfectly legal, so we check for them here.
1073 *
1074 * for: packed-switch, sparse-switch
1075 */
1076    /* op vAA, +BBBB */
1077    movslq  2(rPC), OUT_ARG0                # rcx <- ssssssssBBBBbbbb
1078    leaq    (rPC,OUT_ARG0,2), OUT_ARG0      # rcx <- PC + ssssssssBBBBbbbb*2
1079    GET_VREG OUT_32_ARG1, rINSTq            # eax <- vAA
1080    call    SYMBOL(MterpDoSparseSwitch)
1081    testl   %eax, %eax
1082    movslq  %eax, rINSTq
1083    jmp     MterpCommonTakenBranch
1084
1085
1086/* ------------------------------ */
1087    .balign 128
1088.L_op_cmpl_float: /* 0x2d */
1089/* File: x86_64/op_cmpl_float.S */
1090/* File: x86_64/fpcmp.S */
1091/*
1092 * Compare two floating-point values.  Puts 0, 1, or -1 into the
1093 * destination register based on the results of the comparison.
1094 *
1095 * int compare(x, y) {
1096 *     if (x == y) {
1097 *         return 0;
1098 *     } else if (x < y) {
1099 *         return -1;
1100 *     } else if (x > y) {
1101 *         return 1;
1102 *     } else {
1103 *         return nanval ? 1 : -1;
1104 *     }
1105 * }
1106 */
1107    /* op vAA, vBB, vCC */
1108    movzbq  3(rPC), %rcx                    # ecx<- CC
1109    movzbq  2(rPC), %rax                    # eax<- BB
1110    movss VREG_ADDRESS(%rax), %xmm0
1111    xor     %eax, %eax
1112    ucomiss VREG_ADDRESS(%rcx), %xmm0
1113    jp      .Lop_cmpl_float_nan_is_neg
1114    je      .Lop_cmpl_float_finish
1115    jb      .Lop_cmpl_float_less
1116.Lop_cmpl_float_nan_is_pos:
1117    addb    $1, %al
1118    jmp     .Lop_cmpl_float_finish
1119.Lop_cmpl_float_nan_is_neg:
1120.Lop_cmpl_float_less:
1121    movl    $-1, %eax
1122.Lop_cmpl_float_finish:
1123    SET_VREG %eax, rINSTq
1124    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1125
1126
1127/* ------------------------------ */
1128    .balign 128
1129.L_op_cmpg_float: /* 0x2e */
1130/* File: x86_64/op_cmpg_float.S */
1131/* File: x86_64/fpcmp.S */
1132/*
1133 * Compare two floating-point values.  Puts 0, 1, or -1 into the
1134 * destination register based on the results of the comparison.
1135 *
1136 * int compare(x, y) {
1137 *     if (x == y) {
1138 *         return 0;
1139 *     } else if (x < y) {
1140 *         return -1;
1141 *     } else if (x > y) {
1142 *         return 1;
1143 *     } else {
1144 *         return nanval ? 1 : -1;
1145 *     }
1146 * }
1147 */
1148    /* op vAA, vBB, vCC */
1149    movzbq  3(rPC), %rcx                    # ecx<- CC
1150    movzbq  2(rPC), %rax                    # eax<- BB
1151    movss VREG_ADDRESS(%rax), %xmm0
1152    xor     %eax, %eax
1153    ucomiss VREG_ADDRESS(%rcx), %xmm0
1154    jp      .Lop_cmpg_float_nan_is_pos
1155    je      .Lop_cmpg_float_finish
1156    jb      .Lop_cmpg_float_less
1157.Lop_cmpg_float_nan_is_pos:
1158    addb    $1, %al
1159    jmp     .Lop_cmpg_float_finish
1160.Lop_cmpg_float_nan_is_neg:
1161.Lop_cmpg_float_less:
1162    movl    $-1, %eax
1163.Lop_cmpg_float_finish:
1164    SET_VREG %eax, rINSTq
1165    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1166
1167
1168/* ------------------------------ */
1169    .balign 128
1170.L_op_cmpl_double: /* 0x2f */
1171/* File: x86_64/op_cmpl_double.S */
1172/* File: x86_64/fpcmp.S */
1173/*
1174 * Compare two floating-point values.  Puts 0, 1, or -1 into the
1175 * destination register based on the results of the comparison.
1176 *
1177 * int compare(x, y) {
1178 *     if (x == y) {
1179 *         return 0;
1180 *     } else if (x < y) {
1181 *         return -1;
1182 *     } else if (x > y) {
1183 *         return 1;
1184 *     } else {
1185 *         return nanval ? 1 : -1;
1186 *     }
1187 * }
1188 */
1189    /* op vAA, vBB, vCC */
1190    movzbq  3(rPC), %rcx                    # ecx<- CC
1191    movzbq  2(rPC), %rax                    # eax<- BB
1192    movsd VREG_ADDRESS(%rax), %xmm0
1193    xor     %eax, %eax
1194    ucomisd VREG_ADDRESS(%rcx), %xmm0
1195    jp      .Lop_cmpl_double_nan_is_neg
1196    je      .Lop_cmpl_double_finish
1197    jb      .Lop_cmpl_double_less
1198.Lop_cmpl_double_nan_is_pos:
1199    addb    $1, %al
1200    jmp     .Lop_cmpl_double_finish
1201.Lop_cmpl_double_nan_is_neg:
1202.Lop_cmpl_double_less:
1203    movl    $-1, %eax
1204.Lop_cmpl_double_finish:
1205    SET_VREG %eax, rINSTq
1206    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1207
1208
1209/* ------------------------------ */
1210    .balign 128
1211.L_op_cmpg_double: /* 0x30 */
1212/* File: x86_64/op_cmpg_double.S */
1213/* File: x86_64/fpcmp.S */
1214/*
1215 * Compare two floating-point values.  Puts 0, 1, or -1 into the
1216 * destination register based on the results of the comparison.
1217 *
1218 * int compare(x, y) {
1219 *     if (x == y) {
1220 *         return 0;
1221 *     } else if (x < y) {
1222 *         return -1;
1223 *     } else if (x > y) {
1224 *         return 1;
1225 *     } else {
1226 *         return nanval ? 1 : -1;
1227 *     }
1228 * }
1229 */
1230    /* op vAA, vBB, vCC */
1231    movzbq  3(rPC), %rcx                    # ecx<- CC
1232    movzbq  2(rPC), %rax                    # eax<- BB
1233    movsd VREG_ADDRESS(%rax), %xmm0
1234    xor     %eax, %eax
1235    ucomisd VREG_ADDRESS(%rcx), %xmm0
1236    jp      .Lop_cmpg_double_nan_is_pos
1237    je      .Lop_cmpg_double_finish
1238    jb      .Lop_cmpg_double_less
1239.Lop_cmpg_double_nan_is_pos:
1240    addb    $1, %al
1241    jmp     .Lop_cmpg_double_finish
1242.Lop_cmpg_double_nan_is_neg:
1243.Lop_cmpg_double_less:
1244    movl    $-1, %eax
1245.Lop_cmpg_double_finish:
1246    SET_VREG %eax, rINSTq
1247    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1248
1249
1250/* ------------------------------ */
1251    .balign 128
1252.L_op_cmp_long: /* 0x31 */
1253/* File: x86_64/op_cmp_long.S */
1254/*
1255 * Compare two 64-bit values.  Puts 0, 1, or -1 into the destination
1256 * register based on the results of the comparison.
1257 */
1258    /* cmp-long vAA, vBB, vCC */
1259    movzbq  2(rPC), %rdx                    # edx <- BB
1260    movzbq  3(rPC), %rcx                    # ecx <- CC
1261    GET_WIDE_VREG %rdx, %rdx                # rdx <- v[BB]
1262    xorl    %eax, %eax
1263    xorl    %edi, %edi
1264    addb    $1, %al
1265    movl    $-1, %esi
1266    cmpq    VREG_ADDRESS(%rcx), %rdx
1267    cmovl   %esi, %edi
1268    cmovg   %eax, %edi
1269    SET_VREG %edi, rINSTq
1270    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1271
1272/* ------------------------------ */
1273    .balign 128
1274.L_op_if_eq: /* 0x32 */
1275/* File: x86_64/op_if_eq.S */
1276/* File: x86_64/bincmp.S */
1277/*
1278 * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1279 * fragment that specifies the *reverse* comparison to perform, e.g.
1280 * for "if-le" you would use "gt".
1281 *
1282 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1283 */
1284    /* if-cmp vA, vB, +CCCC */
1285    movl    rINST, %ecx                     # rcx <- A+
1286    sarl    $4, rINST                      # rINST <- B
1287    andb    $0xf, %cl                      # rcx <- A
1288    GET_VREG %eax, %rcx                     # eax <- vA
1289    cmpl    VREG_ADDRESS(rINSTq), %eax      # compare (vA, vB)
1290    jne   1f
1291    movswq  2(rPC), rINSTq                  # Get signed branch offset
1292    testq   rINSTq, rINSTq
1293    jmp     MterpCommonTakenBranch
12941:
1295    cmpl    $JIT_CHECK_OSR, rPROFILE
1296    je      .L_check_not_taken_osr
1297    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1298
1299
1300/* ------------------------------ */
1301    .balign 128
1302.L_op_if_ne: /* 0x33 */
1303/* File: x86_64/op_if_ne.S */
1304/* File: x86_64/bincmp.S */
1305/*
1306 * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1307 * fragment that specifies the *reverse* comparison to perform, e.g.
1308 * for "if-le" you would use "gt".
1309 *
1310 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1311 */
1312    /* if-cmp vA, vB, +CCCC */
1313    movl    rINST, %ecx                     # rcx <- A+
1314    sarl    $4, rINST                      # rINST <- B
1315    andb    $0xf, %cl                      # rcx <- A
1316    GET_VREG %eax, %rcx                     # eax <- vA
1317    cmpl    VREG_ADDRESS(rINSTq), %eax      # compare (vA, vB)
1318    je   1f
1319    movswq  2(rPC), rINSTq                  # Get signed branch offset
1320    testq   rINSTq, rINSTq
1321    jmp     MterpCommonTakenBranch
13221:
1323    cmpl    $JIT_CHECK_OSR, rPROFILE
1324    je      .L_check_not_taken_osr
1325    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1326
1327
1328/* ------------------------------ */
1329    .balign 128
1330.L_op_if_lt: /* 0x34 */
1331/* File: x86_64/op_if_lt.S */
1332/* File: x86_64/bincmp.S */
1333/*
1334 * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1335 * fragment that specifies the *reverse* comparison to perform, e.g.
1336 * for "if-le" you would use "gt".
1337 *
1338 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1339 */
1340    /* if-cmp vA, vB, +CCCC */
1341    movl    rINST, %ecx                     # rcx <- A+
1342    sarl    $4, rINST                      # rINST <- B
1343    andb    $0xf, %cl                      # rcx <- A
1344    GET_VREG %eax, %rcx                     # eax <- vA
1345    cmpl    VREG_ADDRESS(rINSTq), %eax      # compare (vA, vB)
1346    jge   1f
1347    movswq  2(rPC), rINSTq                  # Get signed branch offset
1348    testq   rINSTq, rINSTq
1349    jmp     MterpCommonTakenBranch
13501:
1351    cmpl    $JIT_CHECK_OSR, rPROFILE
1352    je      .L_check_not_taken_osr
1353    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1354
1355
1356/* ------------------------------ */
1357    .balign 128
1358.L_op_if_ge: /* 0x35 */
1359/* File: x86_64/op_if_ge.S */
1360/* File: x86_64/bincmp.S */
1361/*
1362 * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1363 * fragment that specifies the *reverse* comparison to perform, e.g.
1364 * for "if-le" you would use "gt".
1365 *
1366 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1367 */
1368    /* if-cmp vA, vB, +CCCC */
1369    movl    rINST, %ecx                     # rcx <- A+
1370    sarl    $4, rINST                      # rINST <- B
1371    andb    $0xf, %cl                      # rcx <- A
1372    GET_VREG %eax, %rcx                     # eax <- vA
1373    cmpl    VREG_ADDRESS(rINSTq), %eax      # compare (vA, vB)
1374    jl   1f
1375    movswq  2(rPC), rINSTq                  # Get signed branch offset
1376    testq   rINSTq, rINSTq
1377    jmp     MterpCommonTakenBranch
13781:
1379    cmpl    $JIT_CHECK_OSR, rPROFILE
1380    je      .L_check_not_taken_osr
1381    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1382
1383
1384/* ------------------------------ */
1385    .balign 128
1386.L_op_if_gt: /* 0x36 */
1387/* File: x86_64/op_if_gt.S */
1388/* File: x86_64/bincmp.S */
1389/*
1390 * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1391 * fragment that specifies the *reverse* comparison to perform, e.g.
1392 * for "if-le" you would use "gt".
1393 *
1394 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1395 */
1396    /* if-cmp vA, vB, +CCCC */
1397    movl    rINST, %ecx                     # rcx <- A+
1398    sarl    $4, rINST                      # rINST <- B
1399    andb    $0xf, %cl                      # rcx <- A
1400    GET_VREG %eax, %rcx                     # eax <- vA
1401    cmpl    VREG_ADDRESS(rINSTq), %eax      # compare (vA, vB)
1402    jle   1f
1403    movswq  2(rPC), rINSTq                  # Get signed branch offset
1404    testq   rINSTq, rINSTq
1405    jmp     MterpCommonTakenBranch
14061:
1407    cmpl    $JIT_CHECK_OSR, rPROFILE
1408    je      .L_check_not_taken_osr
1409    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1410
1411
1412/* ------------------------------ */
1413    .balign 128
1414.L_op_if_le: /* 0x37 */
1415/* File: x86_64/op_if_le.S */
1416/* File: x86_64/bincmp.S */
1417/*
1418 * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1419 * fragment that specifies the *reverse* comparison to perform, e.g.
1420 * for "if-le" you would use "gt".
1421 *
1422 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1423 */
1424    /* if-cmp vA, vB, +CCCC */
1425    movl    rINST, %ecx                     # rcx <- A+
1426    sarl    $4, rINST                      # rINST <- B
1427    andb    $0xf, %cl                      # rcx <- A
1428    GET_VREG %eax, %rcx                     # eax <- vA
1429    cmpl    VREG_ADDRESS(rINSTq), %eax      # compare (vA, vB)
1430    jg   1f
1431    movswq  2(rPC), rINSTq                  # Get signed branch offset
1432    testq   rINSTq, rINSTq
1433    jmp     MterpCommonTakenBranch
14341:
1435    cmpl    $JIT_CHECK_OSR, rPROFILE
1436    je      .L_check_not_taken_osr
1437    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1438
1439
1440/* ------------------------------ */
1441    .balign 128
1442.L_op_if_eqz: /* 0x38 */
1443/* File: x86_64/op_if_eqz.S */
1444/* File: x86_64/zcmp.S */
1445/*
1446 * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1447 * fragment that specifies the *reverse* comparison to perform, e.g.
1448 * for "if-le" you would use "gt".
1449 *
1450 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1451 */
1452    /* if-cmp vAA, +BBBB */
1453    cmpl    $0, VREG_ADDRESS(rINSTq)       # compare (vA, 0)
1454    jne   1f
1455    movswq  2(rPC), rINSTq                  # fetch signed displacement
1456    testq   rINSTq, rINSTq
1457    jmp     MterpCommonTakenBranch
14581:
1459    cmpl    $JIT_CHECK_OSR, rPROFILE
1460    je      .L_check_not_taken_osr
1461    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1462
1463
1464/* ------------------------------ */
1465    .balign 128
1466.L_op_if_nez: /* 0x39 */
1467/* File: x86_64/op_if_nez.S */
1468/* File: x86_64/zcmp.S */
1469/*
1470 * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1471 * fragment that specifies the *reverse* comparison to perform, e.g.
1472 * for "if-le" you would use "gt".
1473 *
1474 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1475 */
1476    /* if-cmp vAA, +BBBB */
1477    cmpl    $0, VREG_ADDRESS(rINSTq)       # compare (vA, 0)
1478    je   1f
1479    movswq  2(rPC), rINSTq                  # fetch signed displacement
1480    testq   rINSTq, rINSTq
1481    jmp     MterpCommonTakenBranch
14821:
1483    cmpl    $JIT_CHECK_OSR, rPROFILE
1484    je      .L_check_not_taken_osr
1485    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1486
1487
1488/* ------------------------------ */
1489    .balign 128
1490.L_op_if_ltz: /* 0x3a */
1491/* File: x86_64/op_if_ltz.S */
1492/* File: x86_64/zcmp.S */
1493/*
1494 * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1495 * fragment that specifies the *reverse* comparison to perform, e.g.
1496 * for "if-le" you would use "gt".
1497 *
1498 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1499 */
1500    /* if-cmp vAA, +BBBB */
1501    cmpl    $0, VREG_ADDRESS(rINSTq)       # compare (vA, 0)
1502    jge   1f
1503    movswq  2(rPC), rINSTq                  # fetch signed displacement
1504    testq   rINSTq, rINSTq
1505    jmp     MterpCommonTakenBranch
15061:
1507    cmpl    $JIT_CHECK_OSR, rPROFILE
1508    je      .L_check_not_taken_osr
1509    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1510
1511
1512/* ------------------------------ */
1513    .balign 128
1514.L_op_if_gez: /* 0x3b */
1515/* File: x86_64/op_if_gez.S */
1516/* File: x86_64/zcmp.S */
1517/*
1518 * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1519 * fragment that specifies the *reverse* comparison to perform, e.g.
1520 * for "if-le" you would use "gt".
1521 *
1522 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1523 */
1524    /* if-cmp vAA, +BBBB */
1525    cmpl    $0, VREG_ADDRESS(rINSTq)       # compare (vA, 0)
1526    jl   1f
1527    movswq  2(rPC), rINSTq                  # fetch signed displacement
1528    testq   rINSTq, rINSTq
1529    jmp     MterpCommonTakenBranch
15301:
1531    cmpl    $JIT_CHECK_OSR, rPROFILE
1532    je      .L_check_not_taken_osr
1533    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1534
1535
1536/* ------------------------------ */
1537    .balign 128
1538.L_op_if_gtz: /* 0x3c */
1539/* File: x86_64/op_if_gtz.S */
1540/* File: x86_64/zcmp.S */
1541/*
1542 * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1543 * fragment that specifies the *reverse* comparison to perform, e.g.
1544 * for "if-le" you would use "gt".
1545 *
1546 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1547 */
1548    /* if-cmp vAA, +BBBB */
1549    cmpl    $0, VREG_ADDRESS(rINSTq)       # compare (vA, 0)
1550    jle   1f
1551    movswq  2(rPC), rINSTq                  # fetch signed displacement
1552    testq   rINSTq, rINSTq
1553    jmp     MterpCommonTakenBranch
15541:
1555    cmpl    $JIT_CHECK_OSR, rPROFILE
1556    je      .L_check_not_taken_osr
1557    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1558
1559
1560/* ------------------------------ */
1561    .balign 128
1562.L_op_if_lez: /* 0x3d */
1563/* File: x86_64/op_if_lez.S */
1564/* File: x86_64/zcmp.S */
1565/*
1566 * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1567 * fragment that specifies the *reverse* comparison to perform, e.g.
1568 * for "if-le" you would use "gt".
1569 *
1570 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1571 */
1572    /* if-cmp vAA, +BBBB */
1573    cmpl    $0, VREG_ADDRESS(rINSTq)       # compare (vA, 0)
1574    jg   1f
1575    movswq  2(rPC), rINSTq                  # fetch signed displacement
1576    testq   rINSTq, rINSTq
1577    jmp     MterpCommonTakenBranch
15781:
1579    cmpl    $JIT_CHECK_OSR, rPROFILE
1580    je      .L_check_not_taken_osr
1581    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1582
1583
1584/* ------------------------------ */
1585    .balign 128
1586.L_op_unused_3e: /* 0x3e */
1587/* File: x86_64/op_unused_3e.S */
1588/* File: x86_64/unused.S */
1589/*
1590 * Bail to reference interpreter to throw.
1591 */
1592    jmp     MterpFallback
1593
1594
1595/* ------------------------------ */
1596    .balign 128
1597.L_op_unused_3f: /* 0x3f */
1598/* File: x86_64/op_unused_3f.S */
1599/* File: x86_64/unused.S */
1600/*
1601 * Bail to reference interpreter to throw.
1602 */
1603    jmp     MterpFallback
1604
1605
1606/* ------------------------------ */
1607    .balign 128
1608.L_op_unused_40: /* 0x40 */
1609/* File: x86_64/op_unused_40.S */
1610/* File: x86_64/unused.S */
1611/*
1612 * Bail to reference interpreter to throw.
1613 */
1614    jmp     MterpFallback
1615
1616
1617/* ------------------------------ */
1618    .balign 128
1619.L_op_unused_41: /* 0x41 */
1620/* File: x86_64/op_unused_41.S */
1621/* File: x86_64/unused.S */
1622/*
1623 * Bail to reference interpreter to throw.
1624 */
1625    jmp     MterpFallback
1626
1627
1628/* ------------------------------ */
1629    .balign 128
1630.L_op_unused_42: /* 0x42 */
1631/* File: x86_64/op_unused_42.S */
1632/* File: x86_64/unused.S */
1633/*
1634 * Bail to reference interpreter to throw.
1635 */
1636    jmp     MterpFallback
1637
1638
1639/* ------------------------------ */
1640    .balign 128
1641.L_op_unused_43: /* 0x43 */
1642/* File: x86_64/op_unused_43.S */
1643/* File: x86_64/unused.S */
1644/*
1645 * Bail to reference interpreter to throw.
1646 */
1647    jmp     MterpFallback
1648
1649
1650/* ------------------------------ */
1651    .balign 128
1652.L_op_aget: /* 0x44 */
1653/* File: x86_64/op_aget.S */
1654/*
1655 * Array get, 32 bits or less.  vAA <- vBB[vCC].
1656 *
1657 * for: aget, aget-boolean, aget-byte, aget-char, aget-short, aget-wide
1658 *
1659 */
1660    /* op vAA, vBB, vCC */
1661    movzbq  2(rPC), %rax                    # eax <- BB
1662    movzbq  3(rPC), %rcx                    # ecx <- CC
1663    GET_VREG %eax, %rax                     # eax <- vBB (array object)
1664    GET_VREG %ecx, %rcx                     # ecx <- vCC (requested index)
1665    testl   %eax, %eax                      # null array object?
1666    je      common_errNullObject            # bail if so
1667    cmpl    MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx
1668    jae     common_errArrayIndex            # index >= length, bail.
1669    .if 0
1670    movq    MIRROR_INT_ARRAY_DATA_OFFSET(%rax,%rcx,8), %rax
1671    SET_WIDE_VREG %rax, rINSTq
1672    .else
1673    movl   MIRROR_INT_ARRAY_DATA_OFFSET(%rax,%rcx,4), %eax
1674    SET_VREG %eax, rINSTq
1675    .endif
1676    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1677
1678/* ------------------------------ */
1679    .balign 128
1680.L_op_aget_wide: /* 0x45 */
1681/* File: x86_64/op_aget_wide.S */
1682/* File: x86_64/op_aget.S */
1683/*
1684 * Array get, 32 bits or less.  vAA <- vBB[vCC].
1685 *
1686 * for: aget, aget-boolean, aget-byte, aget-char, aget-short, aget-wide
1687 *
1688 */
1689    /* op vAA, vBB, vCC */
1690    movzbq  2(rPC), %rax                    # eax <- BB
1691    movzbq  3(rPC), %rcx                    # ecx <- CC
1692    GET_VREG %eax, %rax                     # eax <- vBB (array object)
1693    GET_VREG %ecx, %rcx                     # ecx <- vCC (requested index)
1694    testl   %eax, %eax                      # null array object?
1695    je      common_errNullObject            # bail if so
1696    cmpl    MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx
1697    jae     common_errArrayIndex            # index >= length, bail.
1698    .if 1
1699    movq    MIRROR_WIDE_ARRAY_DATA_OFFSET(%rax,%rcx,8), %rax
1700    SET_WIDE_VREG %rax, rINSTq
1701    .else
1702    movq   MIRROR_WIDE_ARRAY_DATA_OFFSET(%rax,%rcx,8), %eax
1703    SET_VREG %eax, rINSTq
1704    .endif
1705    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1706
1707
1708/* ------------------------------ */
1709    .balign 128
1710.L_op_aget_object: /* 0x46 */
1711/* File: x86_64/op_aget_object.S */
1712/*
1713 * Array object get.  vAA <- vBB[vCC].
1714 *
1715 * for: aget-object
1716 */
1717    /* op vAA, vBB, vCC */
1718    movzbq  2(rPC), %rax                    # rax <- BB
1719    movzbq  3(rPC), %rcx                    # rcx <- CC
1720    GET_VREG OUT_32_ARG0, %rax              # eax <- vBB (array object)
1721    GET_VREG OUT_32_ARG1, %rcx              # ecx <- vCC (requested index)
1722    EXPORT_PC
1723    call    SYMBOL(artAGetObjectFromMterp)  # (array, index)
1724    movq    rSELF, %rcx
1725    cmpq    $0, THREAD_EXCEPTION_OFFSET(%rcx)
1726    jnz     MterpException
1727    SET_VREG_OBJECT %eax, rINSTq
1728    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1729
1730/* ------------------------------ */
1731    .balign 128
1732.L_op_aget_boolean: /* 0x47 */
1733/* File: x86_64/op_aget_boolean.S */
1734/* File: x86_64/op_aget.S */
1735/*
1736 * Array get, 32 bits or less.  vAA <- vBB[vCC].
1737 *
1738 * for: aget, aget-boolean, aget-byte, aget-char, aget-short, aget-wide
1739 *
1740 */
1741    /* op vAA, vBB, vCC */
1742    movzbq  2(rPC), %rax                    # eax <- BB
1743    movzbq  3(rPC), %rcx                    # ecx <- CC
1744    GET_VREG %eax, %rax                     # eax <- vBB (array object)
1745    GET_VREG %ecx, %rcx                     # ecx <- vCC (requested index)
1746    testl   %eax, %eax                      # null array object?
1747    je      common_errNullObject            # bail if so
1748    cmpl    MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx
1749    jae     common_errArrayIndex            # index >= length, bail.
1750    .if 0
1751    movq    MIRROR_BOOLEAN_ARRAY_DATA_OFFSET(%rax,%rcx,8), %rax
1752    SET_WIDE_VREG %rax, rINSTq
1753    .else
1754    movzbl   MIRROR_BOOLEAN_ARRAY_DATA_OFFSET(%rax,%rcx,1), %eax
1755    SET_VREG %eax, rINSTq
1756    .endif
1757    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1758
1759
1760/* ------------------------------ */
1761    .balign 128
1762.L_op_aget_byte: /* 0x48 */
1763/* File: x86_64/op_aget_byte.S */
1764/* File: x86_64/op_aget.S */
1765/*
1766 * Array get, 32 bits or less.  vAA <- vBB[vCC].
1767 *
1768 * for: aget, aget-boolean, aget-byte, aget-char, aget-short, aget-wide
1769 *
1770 */
1771    /* op vAA, vBB, vCC */
1772    movzbq  2(rPC), %rax                    # eax <- BB
1773    movzbq  3(rPC), %rcx                    # ecx <- CC
1774    GET_VREG %eax, %rax                     # eax <- vBB (array object)
1775    GET_VREG %ecx, %rcx                     # ecx <- vCC (requested index)
1776    testl   %eax, %eax                      # null array object?
1777    je      common_errNullObject            # bail if so
1778    cmpl    MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx
1779    jae     common_errArrayIndex            # index >= length, bail.
1780    .if 0
1781    movq    MIRROR_BYTE_ARRAY_DATA_OFFSET(%rax,%rcx,8), %rax
1782    SET_WIDE_VREG %rax, rINSTq
1783    .else
1784    movsbl   MIRROR_BYTE_ARRAY_DATA_OFFSET(%rax,%rcx,1), %eax
1785    SET_VREG %eax, rINSTq
1786    .endif
1787    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1788
1789
1790/* ------------------------------ */
1791    .balign 128
1792.L_op_aget_char: /* 0x49 */
1793/* File: x86_64/op_aget_char.S */
1794/* File: x86_64/op_aget.S */
1795/*
1796 * Array get, 32 bits or less.  vAA <- vBB[vCC].
1797 *
1798 * for: aget, aget-boolean, aget-byte, aget-char, aget-short, aget-wide
1799 *
1800 */
1801    /* op vAA, vBB, vCC */
1802    movzbq  2(rPC), %rax                    # eax <- BB
1803    movzbq  3(rPC), %rcx                    # ecx <- CC
1804    GET_VREG %eax, %rax                     # eax <- vBB (array object)
1805    GET_VREG %ecx, %rcx                     # ecx <- vCC (requested index)
1806    testl   %eax, %eax                      # null array object?
1807    je      common_errNullObject            # bail if so
1808    cmpl    MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx
1809    jae     common_errArrayIndex            # index >= length, bail.
1810    .if 0
1811    movq    MIRROR_CHAR_ARRAY_DATA_OFFSET(%rax,%rcx,8), %rax
1812    SET_WIDE_VREG %rax, rINSTq
1813    .else
1814    movzwl   MIRROR_CHAR_ARRAY_DATA_OFFSET(%rax,%rcx,2), %eax
1815    SET_VREG %eax, rINSTq
1816    .endif
1817    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1818
1819
1820/* ------------------------------ */
1821    .balign 128
1822.L_op_aget_short: /* 0x4a */
1823/* File: x86_64/op_aget_short.S */
1824/* File: x86_64/op_aget.S */
1825/*
1826 * Array get, 32 bits or less.  vAA <- vBB[vCC].
1827 *
1828 * for: aget, aget-boolean, aget-byte, aget-char, aget-short, aget-wide
1829 *
1830 */
1831    /* op vAA, vBB, vCC */
1832    movzbq  2(rPC), %rax                    # eax <- BB
1833    movzbq  3(rPC), %rcx                    # ecx <- CC
1834    GET_VREG %eax, %rax                     # eax <- vBB (array object)
1835    GET_VREG %ecx, %rcx                     # ecx <- vCC (requested index)
1836    testl   %eax, %eax                      # null array object?
1837    je      common_errNullObject            # bail if so
1838    cmpl    MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx
1839    jae     common_errArrayIndex            # index >= length, bail.
1840    .if 0
1841    movq    MIRROR_SHORT_ARRAY_DATA_OFFSET(%rax,%rcx,8), %rax
1842    SET_WIDE_VREG %rax, rINSTq
1843    .else
1844    movswl   MIRROR_SHORT_ARRAY_DATA_OFFSET(%rax,%rcx,2), %eax
1845    SET_VREG %eax, rINSTq
1846    .endif
1847    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1848
1849
1850/* ------------------------------ */
1851    .balign 128
1852.L_op_aput: /* 0x4b */
1853/* File: x86_64/op_aput.S */
1854/*
1855 * Array put, 32 bits or less.  vBB[vCC] <- vAA.
1856 *
1857 * for: aput, aput-boolean, aput-byte, aput-char, aput-short, aput-wide
1858 *
1859 */
1860    /* op vAA, vBB, vCC */
1861    movzbq  2(rPC), %rax                    # rax <- BB
1862    movzbq  3(rPC), %rcx                    # rcx <- CC
1863    GET_VREG %eax, %rax                     # eax <- vBB (array object)
1864    GET_VREG %ecx, %rcx                     # ecx <- vCC (requested index)
1865    testl   %eax, %eax                      # null array object?
1866    je      common_errNullObject            # bail if so
1867    cmpl    MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx
1868    jae     common_errArrayIndex            # index >= length, bail.
1869    .if 0
1870    GET_WIDE_VREG rINSTq, rINSTq
1871    .else
1872    GET_VREG rINST, rINSTq
1873    .endif
1874    movl    rINST, MIRROR_INT_ARRAY_DATA_OFFSET(%rax,%rcx,4)
1875    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1876
1877/* ------------------------------ */
1878    .balign 128
1879.L_op_aput_wide: /* 0x4c */
1880/* File: x86_64/op_aput_wide.S */
1881/* File: x86_64/op_aput.S */
1882/*
1883 * Array put, 32 bits or less.  vBB[vCC] <- vAA.
1884 *
1885 * for: aput, aput-boolean, aput-byte, aput-char, aput-short, aput-wide
1886 *
1887 */
1888    /* op vAA, vBB, vCC */
1889    movzbq  2(rPC), %rax                    # rax <- BB
1890    movzbq  3(rPC), %rcx                    # rcx <- CC
1891    GET_VREG %eax, %rax                     # eax <- vBB (array object)
1892    GET_VREG %ecx, %rcx                     # ecx <- vCC (requested index)
1893    testl   %eax, %eax                      # null array object?
1894    je      common_errNullObject            # bail if so
1895    cmpl    MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx
1896    jae     common_errArrayIndex            # index >= length, bail.
1897    .if 1
1898    GET_WIDE_VREG rINSTq, rINSTq
1899    .else
1900    GET_VREG rINST, rINSTq
1901    .endif
1902    movq    rINSTq, MIRROR_WIDE_ARRAY_DATA_OFFSET(%rax,%rcx,8)
1903    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1904
1905
1906/* ------------------------------ */
1907    .balign 128
1908.L_op_aput_object: /* 0x4d */
1909/* File: x86_64/op_aput_object.S */
1910/*
1911 * Store an object into an array.  vBB[vCC] <- vAA.
1912 */
1913    /* op vAA, vBB, vCC */
1914    EXPORT_PC
1915    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG0
1916    movq    rPC, OUT_ARG1
1917    REFRESH_INST 77
1918    movq    rINSTq, OUT_ARG2
1919    call    SYMBOL(MterpAputObject)         # (array, index)
1920    testb   %al, %al
1921    jz      MterpPossibleException
1922    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1923
1924/* ------------------------------ */
1925    .balign 128
1926.L_op_aput_boolean: /* 0x4e */
1927/* File: x86_64/op_aput_boolean.S */
1928/* File: x86_64/op_aput.S */
1929/*
1930 * Array put, 32 bits or less.  vBB[vCC] <- vAA.
1931 *
1932 * for: aput, aput-boolean, aput-byte, aput-char, aput-short, aput-wide
1933 *
1934 */
1935    /* op vAA, vBB, vCC */
1936    movzbq  2(rPC), %rax                    # rax <- BB
1937    movzbq  3(rPC), %rcx                    # rcx <- CC
1938    GET_VREG %eax, %rax                     # eax <- vBB (array object)
1939    GET_VREG %ecx, %rcx                     # ecx <- vCC (requested index)
1940    testl   %eax, %eax                      # null array object?
1941    je      common_errNullObject            # bail if so
1942    cmpl    MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx
1943    jae     common_errArrayIndex            # index >= length, bail.
1944    .if 0
1945    GET_WIDE_VREG rINSTq, rINSTq
1946    .else
1947    GET_VREG rINST, rINSTq
1948    .endif
1949    movb    rINSTbl, MIRROR_BOOLEAN_ARRAY_DATA_OFFSET(%rax,%rcx,1)
1950    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1951
1952
1953/* ------------------------------ */
1954    .balign 128
1955.L_op_aput_byte: /* 0x4f */
1956/* File: x86_64/op_aput_byte.S */
1957/* File: x86_64/op_aput.S */
1958/*
1959 * Array put, 32 bits or less.  vBB[vCC] <- vAA.
1960 *
1961 * for: aput, aput-boolean, aput-byte, aput-char, aput-short, aput-wide
1962 *
1963 */
1964    /* op vAA, vBB, vCC */
1965    movzbq  2(rPC), %rax                    # rax <- BB
1966    movzbq  3(rPC), %rcx                    # rcx <- CC
1967    GET_VREG %eax, %rax                     # eax <- vBB (array object)
1968    GET_VREG %ecx, %rcx                     # ecx <- vCC (requested index)
1969    testl   %eax, %eax                      # null array object?
1970    je      common_errNullObject            # bail if so
1971    cmpl    MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx
1972    jae     common_errArrayIndex            # index >= length, bail.
1973    .if 0
1974    GET_WIDE_VREG rINSTq, rINSTq
1975    .else
1976    GET_VREG rINST, rINSTq
1977    .endif
1978    movb    rINSTbl, MIRROR_BYTE_ARRAY_DATA_OFFSET(%rax,%rcx,1)
1979    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1980
1981
1982/* ------------------------------ */
1983    .balign 128
1984.L_op_aput_char: /* 0x50 */
1985/* File: x86_64/op_aput_char.S */
1986/* File: x86_64/op_aput.S */
1987/*
1988 * Array put, 32 bits or less.  vBB[vCC] <- vAA.
1989 *
1990 * for: aput, aput-boolean, aput-byte, aput-char, aput-short, aput-wide
1991 *
1992 */
1993    /* op vAA, vBB, vCC */
1994    movzbq  2(rPC), %rax                    # rax <- BB
1995    movzbq  3(rPC), %rcx                    # rcx <- CC
1996    GET_VREG %eax, %rax                     # eax <- vBB (array object)
1997    GET_VREG %ecx, %rcx                     # ecx <- vCC (requested index)
1998    testl   %eax, %eax                      # null array object?
1999    je      common_errNullObject            # bail if so
2000    cmpl    MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx
2001    jae     common_errArrayIndex            # index >= length, bail.
2002    .if 0
2003    GET_WIDE_VREG rINSTq, rINSTq
2004    .else
2005    GET_VREG rINST, rINSTq
2006    .endif
2007    movw    rINSTw, MIRROR_CHAR_ARRAY_DATA_OFFSET(%rax,%rcx,2)
2008    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2009
2010
2011/* ------------------------------ */
2012    .balign 128
2013.L_op_aput_short: /* 0x51 */
2014/* File: x86_64/op_aput_short.S */
2015/* File: x86_64/op_aput.S */
2016/*
2017 * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2018 *
2019 * for: aput, aput-boolean, aput-byte, aput-char, aput-short, aput-wide
2020 *
2021 */
2022    /* op vAA, vBB, vCC */
2023    movzbq  2(rPC), %rax                    # rax <- BB
2024    movzbq  3(rPC), %rcx                    # rcx <- CC
2025    GET_VREG %eax, %rax                     # eax <- vBB (array object)
2026    GET_VREG %ecx, %rcx                     # ecx <- vCC (requested index)
2027    testl   %eax, %eax                      # null array object?
2028    je      common_errNullObject            # bail if so
2029    cmpl    MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx
2030    jae     common_errArrayIndex            # index >= length, bail.
2031    .if 0
2032    GET_WIDE_VREG rINSTq, rINSTq
2033    .else
2034    GET_VREG rINST, rINSTq
2035    .endif
2036    movw    rINSTw, MIRROR_SHORT_ARRAY_DATA_OFFSET(%rax,%rcx,2)
2037    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2038
2039
2040/* ------------------------------ */
2041    .balign 128
2042.L_op_iget: /* 0x52 */
2043/* File: x86_64/op_iget.S */
2044/*
2045 * General instance field get.
2046 *
2047 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short, iget-wide
2048 */
2049    EXPORT_PC
2050    movzbq  rINSTbl, %rcx                   # rcx <- BA
2051    movzwl  2(rPC), OUT_32_ARG0             # eax <- field ref CCCC
2052    sarl    $4, %ecx                       # ecx <- B
2053    GET_VREG OUT_32_ARG1, %rcx              # the object pointer
2054    movq    OFF_FP_METHOD(rFP), OUT_ARG2    # referrer
2055    movq    rSELF, OUT_ARG3
2056    call    SYMBOL(artGet32InstanceFromCode)
2057    movq    rSELF, %rcx
2058    cmpq    $0, THREAD_EXCEPTION_OFFSET(%rcx)
2059    jnz     MterpException                  # bail out
2060    andb    $0xf, rINSTbl                  # rINST <- A
2061    .if 0
2062    SET_VREG_OBJECT %eax, rINSTq            # fp[A] <-value
2063    .else
2064    .if 0
2065    SET_WIDE_VREG %rax, rINSTq              # fp[A] <-value
2066    .else
2067    SET_VREG %eax, rINSTq                   # fp[A] <-value
2068    .endif
2069    .endif
2070    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2071
2072/* ------------------------------ */
2073    .balign 128
2074.L_op_iget_wide: /* 0x53 */
2075/* File: x86_64/op_iget_wide.S */
2076/* File: x86_64/op_iget.S */
2077/*
2078 * General instance field get.
2079 *
2080 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short, iget-wide
2081 */
2082    EXPORT_PC
2083    movzbq  rINSTbl, %rcx                   # rcx <- BA
2084    movzwl  2(rPC), OUT_32_ARG0             # eax <- field ref CCCC
2085    sarl    $4, %ecx                       # ecx <- B
2086    GET_VREG OUT_32_ARG1, %rcx              # the object pointer
2087    movq    OFF_FP_METHOD(rFP), OUT_ARG2    # referrer
2088    movq    rSELF, OUT_ARG3
2089    call    SYMBOL(artGet64InstanceFromCode)
2090    movq    rSELF, %rcx
2091    cmpq    $0, THREAD_EXCEPTION_OFFSET(%rcx)
2092    jnz     MterpException                  # bail out
2093    andb    $0xf, rINSTbl                  # rINST <- A
2094    .if 0
2095    SET_VREG_OBJECT %eax, rINSTq            # fp[A] <-value
2096    .else
2097    .if 1
2098    SET_WIDE_VREG %rax, rINSTq              # fp[A] <-value
2099    .else
2100    SET_VREG %eax, rINSTq                   # fp[A] <-value
2101    .endif
2102    .endif
2103    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2104
2105
2106/* ------------------------------ */
2107    .balign 128
2108.L_op_iget_object: /* 0x54 */
2109/* File: x86_64/op_iget_object.S */
2110/* File: x86_64/op_iget.S */
2111/*
2112 * General instance field get.
2113 *
2114 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short, iget-wide
2115 */
2116    EXPORT_PC
2117    movzbq  rINSTbl, %rcx                   # rcx <- BA
2118    movzwl  2(rPC), OUT_32_ARG0             # eax <- field ref CCCC
2119    sarl    $4, %ecx                       # ecx <- B
2120    GET_VREG OUT_32_ARG1, %rcx              # the object pointer
2121    movq    OFF_FP_METHOD(rFP), OUT_ARG2    # referrer
2122    movq    rSELF, OUT_ARG3
2123    call    SYMBOL(artGetObjInstanceFromCode)
2124    movq    rSELF, %rcx
2125    cmpq    $0, THREAD_EXCEPTION_OFFSET(%rcx)
2126    jnz     MterpException                  # bail out
2127    andb    $0xf, rINSTbl                  # rINST <- A
2128    .if 1
2129    SET_VREG_OBJECT %eax, rINSTq            # fp[A] <-value
2130    .else
2131    .if 0
2132    SET_WIDE_VREG %rax, rINSTq              # fp[A] <-value
2133    .else
2134    SET_VREG %eax, rINSTq                   # fp[A] <-value
2135    .endif
2136    .endif
2137    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2138
2139
2140/* ------------------------------ */
2141    .balign 128
2142.L_op_iget_boolean: /* 0x55 */
2143/* File: x86_64/op_iget_boolean.S */
2144/* File: x86_64/op_iget.S */
2145/*
2146 * General instance field get.
2147 *
2148 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short, iget-wide
2149 */
2150    EXPORT_PC
2151    movzbq  rINSTbl, %rcx                   # rcx <- BA
2152    movzwl  2(rPC), OUT_32_ARG0             # eax <- field ref CCCC
2153    sarl    $4, %ecx                       # ecx <- B
2154    GET_VREG OUT_32_ARG1, %rcx              # the object pointer
2155    movq    OFF_FP_METHOD(rFP), OUT_ARG2    # referrer
2156    movq    rSELF, OUT_ARG3
2157    call    SYMBOL(artGetBooleanInstanceFromCode)
2158    movq    rSELF, %rcx
2159    cmpq    $0, THREAD_EXCEPTION_OFFSET(%rcx)
2160    jnz     MterpException                  # bail out
2161    andb    $0xf, rINSTbl                  # rINST <- A
2162    .if 0
2163    SET_VREG_OBJECT %eax, rINSTq            # fp[A] <-value
2164    .else
2165    .if 0
2166    SET_WIDE_VREG %rax, rINSTq              # fp[A] <-value
2167    .else
2168    SET_VREG %eax, rINSTq                   # fp[A] <-value
2169    .endif
2170    .endif
2171    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2172
2173
2174/* ------------------------------ */
2175    .balign 128
2176.L_op_iget_byte: /* 0x56 */
2177/* File: x86_64/op_iget_byte.S */
2178/* File: x86_64/op_iget.S */
2179/*
2180 * General instance field get.
2181 *
2182 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short, iget-wide
2183 */
2184    EXPORT_PC
2185    movzbq  rINSTbl, %rcx                   # rcx <- BA
2186    movzwl  2(rPC), OUT_32_ARG0             # eax <- field ref CCCC
2187    sarl    $4, %ecx                       # ecx <- B
2188    GET_VREG OUT_32_ARG1, %rcx              # the object pointer
2189    movq    OFF_FP_METHOD(rFP), OUT_ARG2    # referrer
2190    movq    rSELF, OUT_ARG3
2191    call    SYMBOL(artGetByteInstanceFromCode)
2192    movq    rSELF, %rcx
2193    cmpq    $0, THREAD_EXCEPTION_OFFSET(%rcx)
2194    jnz     MterpException                  # bail out
2195    andb    $0xf, rINSTbl                  # rINST <- A
2196    .if 0
2197    SET_VREG_OBJECT %eax, rINSTq            # fp[A] <-value
2198    .else
2199    .if 0
2200    SET_WIDE_VREG %rax, rINSTq              # fp[A] <-value
2201    .else
2202    SET_VREG %eax, rINSTq                   # fp[A] <-value
2203    .endif
2204    .endif
2205    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2206
2207
2208/* ------------------------------ */
2209    .balign 128
2210.L_op_iget_char: /* 0x57 */
2211/* File: x86_64/op_iget_char.S */
2212/* File: x86_64/op_iget.S */
2213/*
2214 * General instance field get.
2215 *
2216 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short, iget-wide
2217 */
2218    EXPORT_PC
2219    movzbq  rINSTbl, %rcx                   # rcx <- BA
2220    movzwl  2(rPC), OUT_32_ARG0             # eax <- field ref CCCC
2221    sarl    $4, %ecx                       # ecx <- B
2222    GET_VREG OUT_32_ARG1, %rcx              # the object pointer
2223    movq    OFF_FP_METHOD(rFP), OUT_ARG2    # referrer
2224    movq    rSELF, OUT_ARG3
2225    call    SYMBOL(artGetCharInstanceFromCode)
2226    movq    rSELF, %rcx
2227    cmpq    $0, THREAD_EXCEPTION_OFFSET(%rcx)
2228    jnz     MterpException                  # bail out
2229    andb    $0xf, rINSTbl                  # rINST <- A
2230    .if 0
2231    SET_VREG_OBJECT %eax, rINSTq            # fp[A] <-value
2232    .else
2233    .if 0
2234    SET_WIDE_VREG %rax, rINSTq              # fp[A] <-value
2235    .else
2236    SET_VREG %eax, rINSTq                   # fp[A] <-value
2237    .endif
2238    .endif
2239    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2240
2241
2242/* ------------------------------ */
2243    .balign 128
2244.L_op_iget_short: /* 0x58 */
2245/* File: x86_64/op_iget_short.S */
2246/* File: x86_64/op_iget.S */
2247/*
2248 * General instance field get.
2249 *
2250 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short, iget-wide
2251 */
2252    EXPORT_PC
2253    movzbq  rINSTbl, %rcx                   # rcx <- BA
2254    movzwl  2(rPC), OUT_32_ARG0             # eax <- field ref CCCC
2255    sarl    $4, %ecx                       # ecx <- B
2256    GET_VREG OUT_32_ARG1, %rcx              # the object pointer
2257    movq    OFF_FP_METHOD(rFP), OUT_ARG2    # referrer
2258    movq    rSELF, OUT_ARG3
2259    call    SYMBOL(artGetShortInstanceFromCode)
2260    movq    rSELF, %rcx
2261    cmpq    $0, THREAD_EXCEPTION_OFFSET(%rcx)
2262    jnz     MterpException                  # bail out
2263    andb    $0xf, rINSTbl                  # rINST <- A
2264    .if 0
2265    SET_VREG_OBJECT %eax, rINSTq            # fp[A] <-value
2266    .else
2267    .if 0
2268    SET_WIDE_VREG %rax, rINSTq              # fp[A] <-value
2269    .else
2270    SET_VREG %eax, rINSTq                   # fp[A] <-value
2271    .endif
2272    .endif
2273    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2274
2275
2276/* ------------------------------ */
2277    .balign 128
2278.L_op_iput: /* 0x59 */
2279/* File: x86_64/op_iput.S */
2280/*
2281 * General 32-bit instance field put.
2282 *
2283 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2284 */
2285    /* op vA, vB, field@CCCC */
2286    .extern artSet32InstanceFromMterp
2287    EXPORT_PC
2288    movzwl  2(rPC), OUT_32_ARG0             # field ref <- 0000CCCC
2289    movzbq  rINSTbl, %rcx                   # rcx<- BA
2290    sarl    $4, %ecx                       # ecx<- B
2291    GET_VREG OUT_32_ARG1, %rcx              # the object pointer
2292    andb    $0xf, rINSTbl                  # rINST<- A
2293    GET_VREG OUT_32_ARG2, rINSTq            # fp[A]
2294    movq    OFF_FP_METHOD(rFP), OUT_ARG3    # referrer
2295    call    SYMBOL(artSet32InstanceFromMterp)
2296    testb   %al, %al
2297    jnz     MterpPossibleException
2298    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2299
2300/* ------------------------------ */
2301    .balign 128
2302.L_op_iput_wide: /* 0x5a */
2303/* File: x86_64/op_iput_wide.S */
2304    /* iput-wide vA, vB, field@CCCC */
2305    .extern artSet64InstanceFromMterp
2306    EXPORT_PC
2307    movzwq  2(rPC), OUT_ARG0                # field ref CCCC
2308    movzbq  rINSTbl, %rcx                   # rcx <- BA
2309    sarl    $4, %ecx                       # ecx <- B
2310    GET_VREG OUT_32_ARG1, %rcx              # the object pointer
2311    andb    $0xf, rINSTbl                  # rINST <- A
2312    leaq    VREG_ADDRESS(rINSTq), OUT_ARG2  # &fp[A]
2313    movq    OFF_FP_METHOD(rFP), OUT_ARG3    # referrer
2314    call    SYMBOL(artSet64InstanceFromMterp)
2315    testb   %al, %al
2316    jnz     MterpPossibleException
2317    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2318
2319/* ------------------------------ */
2320    .balign 128
2321.L_op_iput_object: /* 0x5b */
2322/* File: x86_64/op_iput_object.S */
2323    EXPORT_PC
2324    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG0
2325    movq    rPC, OUT_ARG1
2326    REFRESH_INST 91
2327    movl    rINST, OUT_32_ARG2
2328    movq    rSELF, OUT_ARG3
2329    call    SYMBOL(MterpIputObject)
2330    testb   %al, %al
2331    jz      MterpException
2332    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2333
2334/* ------------------------------ */
2335    .balign 128
2336.L_op_iput_boolean: /* 0x5c */
2337/* File: x86_64/op_iput_boolean.S */
2338/* File: x86_64/op_iput.S */
2339/*
2340 * General 32-bit instance field put.
2341 *
2342 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2343 */
2344    /* op vA, vB, field@CCCC */
2345    .extern artSet8InstanceFromMterp
2346    EXPORT_PC
2347    movzwl  2(rPC), OUT_32_ARG0             # field ref <- 0000CCCC
2348    movzbq  rINSTbl, %rcx                   # rcx<- BA
2349    sarl    $4, %ecx                       # ecx<- B
2350    GET_VREG OUT_32_ARG1, %rcx              # the object pointer
2351    andb    $0xf, rINSTbl                  # rINST<- A
2352    GET_VREG OUT_32_ARG2, rINSTq            # fp[A]
2353    movq    OFF_FP_METHOD(rFP), OUT_ARG3    # referrer
2354    call    SYMBOL(artSet8InstanceFromMterp)
2355    testb   %al, %al
2356    jnz     MterpPossibleException
2357    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2358
2359
2360/* ------------------------------ */
2361    .balign 128
2362.L_op_iput_byte: /* 0x5d */
2363/* File: x86_64/op_iput_byte.S */
2364/* File: x86_64/op_iput.S */
2365/*
2366 * General 32-bit instance field put.
2367 *
2368 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2369 */
2370    /* op vA, vB, field@CCCC */
2371    .extern artSet8InstanceFromMterp
2372    EXPORT_PC
2373    movzwl  2(rPC), OUT_32_ARG0             # field ref <- 0000CCCC
2374    movzbq  rINSTbl, %rcx                   # rcx<- BA
2375    sarl    $4, %ecx                       # ecx<- B
2376    GET_VREG OUT_32_ARG1, %rcx              # the object pointer
2377    andb    $0xf, rINSTbl                  # rINST<- A
2378    GET_VREG OUT_32_ARG2, rINSTq            # fp[A]
2379    movq    OFF_FP_METHOD(rFP), OUT_ARG3    # referrer
2380    call    SYMBOL(artSet8InstanceFromMterp)
2381    testb   %al, %al
2382    jnz     MterpPossibleException
2383    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2384
2385
2386/* ------------------------------ */
2387    .balign 128
2388.L_op_iput_char: /* 0x5e */
2389/* File: x86_64/op_iput_char.S */
2390/* File: x86_64/op_iput.S */
2391/*
2392 * General 32-bit instance field put.
2393 *
2394 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2395 */
2396    /* op vA, vB, field@CCCC */
2397    .extern artSet16InstanceFromMterp
2398    EXPORT_PC
2399    movzwl  2(rPC), OUT_32_ARG0             # field ref <- 0000CCCC
2400    movzbq  rINSTbl, %rcx                   # rcx<- BA
2401    sarl    $4, %ecx                       # ecx<- B
2402    GET_VREG OUT_32_ARG1, %rcx              # the object pointer
2403    andb    $0xf, rINSTbl                  # rINST<- A
2404    GET_VREG OUT_32_ARG2, rINSTq            # fp[A]
2405    movq    OFF_FP_METHOD(rFP), OUT_ARG3    # referrer
2406    call    SYMBOL(artSet16InstanceFromMterp)
2407    testb   %al, %al
2408    jnz     MterpPossibleException
2409    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2410
2411
2412/* ------------------------------ */
2413    .balign 128
2414.L_op_iput_short: /* 0x5f */
2415/* File: x86_64/op_iput_short.S */
2416/* File: x86_64/op_iput.S */
2417/*
2418 * General 32-bit instance field put.
2419 *
2420 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2421 */
2422    /* op vA, vB, field@CCCC */
2423    .extern artSet16InstanceFromMterp
2424    EXPORT_PC
2425    movzwl  2(rPC), OUT_32_ARG0             # field ref <- 0000CCCC
2426    movzbq  rINSTbl, %rcx                   # rcx<- BA
2427    sarl    $4, %ecx                       # ecx<- B
2428    GET_VREG OUT_32_ARG1, %rcx              # the object pointer
2429    andb    $0xf, rINSTbl                  # rINST<- A
2430    GET_VREG OUT_32_ARG2, rINSTq            # fp[A]
2431    movq    OFF_FP_METHOD(rFP), OUT_ARG3    # referrer
2432    call    SYMBOL(artSet16InstanceFromMterp)
2433    testb   %al, %al
2434    jnz     MterpPossibleException
2435    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2436
2437
2438/* ------------------------------ */
2439    .balign 128
2440.L_op_sget: /* 0x60 */
2441/* File: x86_64/op_sget.S */
2442/*
2443 * General SGET handler wrapper.
2444 *
2445 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short, sget-wide
2446 */
2447    /* op vAA, field@BBBB */
2448    .extern MterpGet32Static
2449    EXPORT_PC
2450    movzwq  2(rPC), OUT_ARG0                # field ref CCCC
2451    movq    OFF_FP_METHOD(rFP), OUT_ARG1    # referrer
2452    movq    rSELF, OUT_ARG2                 # self
2453    call    SYMBOL(MterpGet32Static)
2454    movq    rSELF, %rcx
2455    cmpl    $0, THREAD_EXCEPTION_OFFSET(%rcx)
2456    jnz     MterpException
2457    .if 0
2458    SET_VREG_OBJECT %eax, rINSTq            # fp[A] <- value
2459    .else
2460    .if 0
2461    SET_WIDE_VREG %rax, rINSTq              # fp[A] <- value
2462    .else
2463    SET_VREG %eax, rINSTq                   # fp[A] <- value
2464    .endif
2465    .endif
2466    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2467
2468/* ------------------------------ */
2469    .balign 128
2470.L_op_sget_wide: /* 0x61 */
2471/* File: x86_64/op_sget_wide.S */
2472/* File: x86_64/op_sget.S */
2473/*
2474 * General SGET handler wrapper.
2475 *
2476 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short, sget-wide
2477 */
2478    /* op vAA, field@BBBB */
2479    .extern MterpGet64Static
2480    EXPORT_PC
2481    movzwq  2(rPC), OUT_ARG0                # field ref CCCC
2482    movq    OFF_FP_METHOD(rFP), OUT_ARG1    # referrer
2483    movq    rSELF, OUT_ARG2                 # self
2484    call    SYMBOL(MterpGet64Static)
2485    movq    rSELF, %rcx
2486    cmpl    $0, THREAD_EXCEPTION_OFFSET(%rcx)
2487    jnz     MterpException
2488    .if 0
2489    SET_VREG_OBJECT %eax, rINSTq            # fp[A] <- value
2490    .else
2491    .if 1
2492    SET_WIDE_VREG %rax, rINSTq              # fp[A] <- value
2493    .else
2494    SET_VREG %eax, rINSTq                   # fp[A] <- value
2495    .endif
2496    .endif
2497    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2498
2499
2500/* ------------------------------ */
2501    .balign 128
2502.L_op_sget_object: /* 0x62 */
2503/* File: x86_64/op_sget_object.S */
2504/* File: x86_64/op_sget.S */
2505/*
2506 * General SGET handler wrapper.
2507 *
2508 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short, sget-wide
2509 */
2510    /* op vAA, field@BBBB */
2511    .extern MterpGetObjStatic
2512    EXPORT_PC
2513    movzwq  2(rPC), OUT_ARG0                # field ref CCCC
2514    movq    OFF_FP_METHOD(rFP), OUT_ARG1    # referrer
2515    movq    rSELF, OUT_ARG2                 # self
2516    call    SYMBOL(MterpGetObjStatic)
2517    movq    rSELF, %rcx
2518    cmpl    $0, THREAD_EXCEPTION_OFFSET(%rcx)
2519    jnz     MterpException
2520    .if 1
2521    SET_VREG_OBJECT %eax, rINSTq            # fp[A] <- value
2522    .else
2523    .if 0
2524    SET_WIDE_VREG %rax, rINSTq              # fp[A] <- value
2525    .else
2526    SET_VREG %eax, rINSTq                   # fp[A] <- value
2527    .endif
2528    .endif
2529    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2530
2531
2532/* ------------------------------ */
2533    .balign 128
2534.L_op_sget_boolean: /* 0x63 */
2535/* File: x86_64/op_sget_boolean.S */
2536/* File: x86_64/op_sget.S */
2537/*
2538 * General SGET handler wrapper.
2539 *
2540 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short, sget-wide
2541 */
2542    /* op vAA, field@BBBB */
2543    .extern MterpGetBooleanStatic
2544    EXPORT_PC
2545    movzwq  2(rPC), OUT_ARG0                # field ref CCCC
2546    movq    OFF_FP_METHOD(rFP), OUT_ARG1    # referrer
2547    movq    rSELF, OUT_ARG2                 # self
2548    call    SYMBOL(MterpGetBooleanStatic)
2549    movq    rSELF, %rcx
2550    cmpl    $0, THREAD_EXCEPTION_OFFSET(%rcx)
2551    jnz     MterpException
2552    .if 0
2553    SET_VREG_OBJECT %eax, rINSTq            # fp[A] <- value
2554    .else
2555    .if 0
2556    SET_WIDE_VREG %rax, rINSTq              # fp[A] <- value
2557    .else
2558    SET_VREG %eax, rINSTq                   # fp[A] <- value
2559    .endif
2560    .endif
2561    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2562
2563
2564/* ------------------------------ */
2565    .balign 128
2566.L_op_sget_byte: /* 0x64 */
2567/* File: x86_64/op_sget_byte.S */
2568/* File: x86_64/op_sget.S */
2569/*
2570 * General SGET handler wrapper.
2571 *
2572 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short, sget-wide
2573 */
2574    /* op vAA, field@BBBB */
2575    .extern MterpGetByteStatic
2576    EXPORT_PC
2577    movzwq  2(rPC), OUT_ARG0                # field ref CCCC
2578    movq    OFF_FP_METHOD(rFP), OUT_ARG1    # referrer
2579    movq    rSELF, OUT_ARG2                 # self
2580    call    SYMBOL(MterpGetByteStatic)
2581    movq    rSELF, %rcx
2582    cmpl    $0, THREAD_EXCEPTION_OFFSET(%rcx)
2583    jnz     MterpException
2584    .if 0
2585    SET_VREG_OBJECT %eax, rINSTq            # fp[A] <- value
2586    .else
2587    .if 0
2588    SET_WIDE_VREG %rax, rINSTq              # fp[A] <- value
2589    .else
2590    SET_VREG %eax, rINSTq                   # fp[A] <- value
2591    .endif
2592    .endif
2593    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2594
2595
2596/* ------------------------------ */
2597    .balign 128
2598.L_op_sget_char: /* 0x65 */
2599/* File: x86_64/op_sget_char.S */
2600/* File: x86_64/op_sget.S */
2601/*
2602 * General SGET handler wrapper.
2603 *
2604 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short, sget-wide
2605 */
2606    /* op vAA, field@BBBB */
2607    .extern MterpGetCharStatic
2608    EXPORT_PC
2609    movzwq  2(rPC), OUT_ARG0                # field ref CCCC
2610    movq    OFF_FP_METHOD(rFP), OUT_ARG1    # referrer
2611    movq    rSELF, OUT_ARG2                 # self
2612    call    SYMBOL(MterpGetCharStatic)
2613    movq    rSELF, %rcx
2614    cmpl    $0, THREAD_EXCEPTION_OFFSET(%rcx)
2615    jnz     MterpException
2616    .if 0
2617    SET_VREG_OBJECT %eax, rINSTq            # fp[A] <- value
2618    .else
2619    .if 0
2620    SET_WIDE_VREG %rax, rINSTq              # fp[A] <- value
2621    .else
2622    SET_VREG %eax, rINSTq                   # fp[A] <- value
2623    .endif
2624    .endif
2625    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2626
2627
2628/* ------------------------------ */
2629    .balign 128
2630.L_op_sget_short: /* 0x66 */
2631/* File: x86_64/op_sget_short.S */
2632/* File: x86_64/op_sget.S */
2633/*
2634 * General SGET handler wrapper.
2635 *
2636 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short, sget-wide
2637 */
2638    /* op vAA, field@BBBB */
2639    .extern MterpGetShortStatic
2640    EXPORT_PC
2641    movzwq  2(rPC), OUT_ARG0                # field ref CCCC
2642    movq    OFF_FP_METHOD(rFP), OUT_ARG1    # referrer
2643    movq    rSELF, OUT_ARG2                 # self
2644    call    SYMBOL(MterpGetShortStatic)
2645    movq    rSELF, %rcx
2646    cmpl    $0, THREAD_EXCEPTION_OFFSET(%rcx)
2647    jnz     MterpException
2648    .if 0
2649    SET_VREG_OBJECT %eax, rINSTq            # fp[A] <- value
2650    .else
2651    .if 0
2652    SET_WIDE_VREG %rax, rINSTq              # fp[A] <- value
2653    .else
2654    SET_VREG %eax, rINSTq                   # fp[A] <- value
2655    .endif
2656    .endif
2657    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2658
2659
2660/* ------------------------------ */
2661    .balign 128
2662.L_op_sput: /* 0x67 */
2663/* File: x86_64/op_sput.S */
2664/*
2665 * General SPUT handler wrapper.
2666 *
2667 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2668 */
2669    /* op vAA, field@BBBB */
2670    .extern MterpSet32Static
2671    EXPORT_PC
2672    movzwq  2(rPC), OUT_ARG0                # field ref BBBB
2673    GET_VREG OUT_32_ARG1, rINSTq            # fp[AA]
2674    movq    OFF_FP_METHOD(rFP), OUT_ARG2    # referrer
2675    movq    rSELF, OUT_ARG3                 # self
2676    call    SYMBOL(MterpSet32Static)
2677    testb   %al, %al
2678    jnz     MterpException
2679    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2680
2681/* ------------------------------ */
2682    .balign 128
2683.L_op_sput_wide: /* 0x68 */
2684/* File: x86_64/op_sput_wide.S */
2685/*
2686 * SPUT_WIDE handler wrapper.
2687 *
2688 */
2689    /* sput-wide vAA, field@BBBB */
2690    .extern MterpSet64Static
2691    EXPORT_PC
2692    movzwq  2(rPC), OUT_ARG0                # field ref BBBB
2693    leaq    VREG_ADDRESS(rINSTq), OUT_ARG1  # &fp[AA]
2694    movq    OFF_FP_METHOD(rFP), OUT_ARG2    # referrer
2695    movq    rSELF, OUT_ARG3                 # self
2696    call    SYMBOL(MterpSet64Static)
2697    testb   %al, %al
2698    jnz     MterpException
2699    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2700
2701/* ------------------------------ */
2702    .balign 128
2703.L_op_sput_object: /* 0x69 */
2704/* File: x86_64/op_sput_object.S */
2705    EXPORT_PC
2706    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG0
2707    movq    rPC, OUT_ARG1
2708    REFRESH_INST 105
2709    movq    rINSTq, OUT_ARG2
2710    movq    rSELF, OUT_ARG3
2711    call    SYMBOL(MterpSputObject)
2712    testb   %al, %al
2713    jz      MterpException
2714    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2715
2716/* ------------------------------ */
2717    .balign 128
2718.L_op_sput_boolean: /* 0x6a */
2719/* File: x86_64/op_sput_boolean.S */
2720/* File: x86_64/op_sput.S */
2721/*
2722 * General SPUT handler wrapper.
2723 *
2724 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2725 */
2726    /* op vAA, field@BBBB */
2727    .extern MterpSetBooleanStatic
2728    EXPORT_PC
2729    movzwq  2(rPC), OUT_ARG0                # field ref BBBB
2730    GET_VREG OUT_32_ARG1, rINSTq            # fp[AA]
2731    movq    OFF_FP_METHOD(rFP), OUT_ARG2    # referrer
2732    movq    rSELF, OUT_ARG3                 # self
2733    call    SYMBOL(MterpSetBooleanStatic)
2734    testb   %al, %al
2735    jnz     MterpException
2736    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2737
2738
2739/* ------------------------------ */
2740    .balign 128
2741.L_op_sput_byte: /* 0x6b */
2742/* File: x86_64/op_sput_byte.S */
2743/* File: x86_64/op_sput.S */
2744/*
2745 * General SPUT handler wrapper.
2746 *
2747 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2748 */
2749    /* op vAA, field@BBBB */
2750    .extern MterpSetByteStatic
2751    EXPORT_PC
2752    movzwq  2(rPC), OUT_ARG0                # field ref BBBB
2753    GET_VREG OUT_32_ARG1, rINSTq            # fp[AA]
2754    movq    OFF_FP_METHOD(rFP), OUT_ARG2    # referrer
2755    movq    rSELF, OUT_ARG3                 # self
2756    call    SYMBOL(MterpSetByteStatic)
2757    testb   %al, %al
2758    jnz     MterpException
2759    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2760
2761
2762/* ------------------------------ */
2763    .balign 128
2764.L_op_sput_char: /* 0x6c */
2765/* File: x86_64/op_sput_char.S */
2766/* File: x86_64/op_sput.S */
2767/*
2768 * General SPUT handler wrapper.
2769 *
2770 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2771 */
2772    /* op vAA, field@BBBB */
2773    .extern MterpSetCharStatic
2774    EXPORT_PC
2775    movzwq  2(rPC), OUT_ARG0                # field ref BBBB
2776    GET_VREG OUT_32_ARG1, rINSTq            # fp[AA]
2777    movq    OFF_FP_METHOD(rFP), OUT_ARG2    # referrer
2778    movq    rSELF, OUT_ARG3                 # self
2779    call    SYMBOL(MterpSetCharStatic)
2780    testb   %al, %al
2781    jnz     MterpException
2782    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2783
2784
2785/* ------------------------------ */
2786    .balign 128
2787.L_op_sput_short: /* 0x6d */
2788/* File: x86_64/op_sput_short.S */
2789/* File: x86_64/op_sput.S */
2790/*
2791 * General SPUT handler wrapper.
2792 *
2793 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2794 */
2795    /* op vAA, field@BBBB */
2796    .extern MterpSetShortStatic
2797    EXPORT_PC
2798    movzwq  2(rPC), OUT_ARG0                # field ref BBBB
2799    GET_VREG OUT_32_ARG1, rINSTq            # fp[AA]
2800    movq    OFF_FP_METHOD(rFP), OUT_ARG2    # referrer
2801    movq    rSELF, OUT_ARG3                 # self
2802    call    SYMBOL(MterpSetShortStatic)
2803    testb   %al, %al
2804    jnz     MterpException
2805    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2806
2807
2808/* ------------------------------ */
2809    .balign 128
2810.L_op_invoke_virtual: /* 0x6e */
2811/* File: x86_64/op_invoke_virtual.S */
2812/* File: x86_64/invoke.S */
2813/*
2814 * Generic invoke handler wrapper.
2815 */
2816    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2817    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2818    .extern MterpInvokeVirtual
2819    EXPORT_PC
2820    movq    rSELF, OUT_ARG0
2821    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
2822    movq    rPC, OUT_ARG2
2823    REFRESH_INST 110
2824    movl    rINST, OUT_32_ARG3
2825    call    SYMBOL(MterpInvokeVirtual)
2826    testb   %al, %al
2827    jz      MterpException
2828    ADVANCE_PC 3
2829    call    SYMBOL(MterpShouldSwitchInterpreters)
2830    testb   %al, %al
2831    jnz     MterpFallback
2832    FETCH_INST
2833    GOTO_NEXT
2834
2835/*
2836 * Handle a virtual method call.
2837 *
2838 * for: invoke-virtual, invoke-virtual/range
2839 */
2840    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2841    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2842
2843/* ------------------------------ */
2844    .balign 128
2845.L_op_invoke_super: /* 0x6f */
2846/* File: x86_64/op_invoke_super.S */
2847/* File: x86_64/invoke.S */
2848/*
2849 * Generic invoke handler wrapper.
2850 */
2851    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2852    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2853    .extern MterpInvokeSuper
2854    EXPORT_PC
2855    movq    rSELF, OUT_ARG0
2856    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
2857    movq    rPC, OUT_ARG2
2858    REFRESH_INST 111
2859    movl    rINST, OUT_32_ARG3
2860    call    SYMBOL(MterpInvokeSuper)
2861    testb   %al, %al
2862    jz      MterpException
2863    ADVANCE_PC 3
2864    call    SYMBOL(MterpShouldSwitchInterpreters)
2865    testb   %al, %al
2866    jnz     MterpFallback
2867    FETCH_INST
2868    GOTO_NEXT
2869
2870/*
2871 * Handle a "super" method call.
2872 *
2873 * for: invoke-super, invoke-super/range
2874 */
2875    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2876    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2877
2878/* ------------------------------ */
2879    .balign 128
2880.L_op_invoke_direct: /* 0x70 */
2881/* File: x86_64/op_invoke_direct.S */
2882/* File: x86_64/invoke.S */
2883/*
2884 * Generic invoke handler wrapper.
2885 */
2886    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2887    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2888    .extern MterpInvokeDirect
2889    EXPORT_PC
2890    movq    rSELF, OUT_ARG0
2891    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
2892    movq    rPC, OUT_ARG2
2893    REFRESH_INST 112
2894    movl    rINST, OUT_32_ARG3
2895    call    SYMBOL(MterpInvokeDirect)
2896    testb   %al, %al
2897    jz      MterpException
2898    ADVANCE_PC 3
2899    call    SYMBOL(MterpShouldSwitchInterpreters)
2900    testb   %al, %al
2901    jnz     MterpFallback
2902    FETCH_INST
2903    GOTO_NEXT
2904
2905
2906/* ------------------------------ */
2907    .balign 128
2908.L_op_invoke_static: /* 0x71 */
2909/* File: x86_64/op_invoke_static.S */
2910/* File: x86_64/invoke.S */
2911/*
2912 * Generic invoke handler wrapper.
2913 */
2914    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2915    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2916    .extern MterpInvokeStatic
2917    EXPORT_PC
2918    movq    rSELF, OUT_ARG0
2919    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
2920    movq    rPC, OUT_ARG2
2921    REFRESH_INST 113
2922    movl    rINST, OUT_32_ARG3
2923    call    SYMBOL(MterpInvokeStatic)
2924    testb   %al, %al
2925    jz      MterpException
2926    ADVANCE_PC 3
2927    call    SYMBOL(MterpShouldSwitchInterpreters)
2928    testb   %al, %al
2929    jnz     MterpFallback
2930    FETCH_INST
2931    GOTO_NEXT
2932
2933
2934
2935/* ------------------------------ */
2936    .balign 128
2937.L_op_invoke_interface: /* 0x72 */
2938/* File: x86_64/op_invoke_interface.S */
2939/* File: x86_64/invoke.S */
2940/*
2941 * Generic invoke handler wrapper.
2942 */
2943    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2944    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2945    .extern MterpInvokeInterface
2946    EXPORT_PC
2947    movq    rSELF, OUT_ARG0
2948    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
2949    movq    rPC, OUT_ARG2
2950    REFRESH_INST 114
2951    movl    rINST, OUT_32_ARG3
2952    call    SYMBOL(MterpInvokeInterface)
2953    testb   %al, %al
2954    jz      MterpException
2955    ADVANCE_PC 3
2956    call    SYMBOL(MterpShouldSwitchInterpreters)
2957    testb   %al, %al
2958    jnz     MterpFallback
2959    FETCH_INST
2960    GOTO_NEXT
2961
2962/*
2963 * Handle an interface method call.
2964 *
2965 * for: invoke-interface, invoke-interface/range
2966 */
2967    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2968    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2969
2970/* ------------------------------ */
2971    .balign 128
2972.L_op_return_void_no_barrier: /* 0x73 */
2973/* File: x86_64/op_return_void_no_barrier.S */
2974    movq    rSELF, OUT_ARG0
2975    testl   $(THREAD_SUSPEND_OR_CHECKPOINT_REQUEST), THREAD_FLAGS_OFFSET(OUT_ARG0)
2976    jz      1f
2977    call    SYMBOL(MterpSuspendCheck)
29781:
2979    xorq    %rax, %rax
2980    jmp     MterpReturn
2981
2982/* ------------------------------ */
2983    .balign 128
2984.L_op_invoke_virtual_range: /* 0x74 */
2985/* File: x86_64/op_invoke_virtual_range.S */
2986/* File: x86_64/invoke.S */
2987/*
2988 * Generic invoke handler wrapper.
2989 */
2990    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2991    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2992    .extern MterpInvokeVirtualRange
2993    EXPORT_PC
2994    movq    rSELF, OUT_ARG0
2995    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
2996    movq    rPC, OUT_ARG2
2997    REFRESH_INST 116
2998    movl    rINST, OUT_32_ARG3
2999    call    SYMBOL(MterpInvokeVirtualRange)
3000    testb   %al, %al
3001    jz      MterpException
3002    ADVANCE_PC 3
3003    call    SYMBOL(MterpShouldSwitchInterpreters)
3004    testb   %al, %al
3005    jnz     MterpFallback
3006    FETCH_INST
3007    GOTO_NEXT
3008
3009
3010/* ------------------------------ */
3011    .balign 128
3012.L_op_invoke_super_range: /* 0x75 */
3013/* File: x86_64/op_invoke_super_range.S */
3014/* File: x86_64/invoke.S */
3015/*
3016 * Generic invoke handler wrapper.
3017 */
3018    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3019    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3020    .extern MterpInvokeSuperRange
3021    EXPORT_PC
3022    movq    rSELF, OUT_ARG0
3023    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
3024    movq    rPC, OUT_ARG2
3025    REFRESH_INST 117
3026    movl    rINST, OUT_32_ARG3
3027    call    SYMBOL(MterpInvokeSuperRange)
3028    testb   %al, %al
3029    jz      MterpException
3030    ADVANCE_PC 3
3031    call    SYMBOL(MterpShouldSwitchInterpreters)
3032    testb   %al, %al
3033    jnz     MterpFallback
3034    FETCH_INST
3035    GOTO_NEXT
3036
3037
3038/* ------------------------------ */
3039    .balign 128
3040.L_op_invoke_direct_range: /* 0x76 */
3041/* File: x86_64/op_invoke_direct_range.S */
3042/* File: x86_64/invoke.S */
3043/*
3044 * Generic invoke handler wrapper.
3045 */
3046    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3047    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3048    .extern MterpInvokeDirectRange
3049    EXPORT_PC
3050    movq    rSELF, OUT_ARG0
3051    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
3052    movq    rPC, OUT_ARG2
3053    REFRESH_INST 118
3054    movl    rINST, OUT_32_ARG3
3055    call    SYMBOL(MterpInvokeDirectRange)
3056    testb   %al, %al
3057    jz      MterpException
3058    ADVANCE_PC 3
3059    call    SYMBOL(MterpShouldSwitchInterpreters)
3060    testb   %al, %al
3061    jnz     MterpFallback
3062    FETCH_INST
3063    GOTO_NEXT
3064
3065
3066/* ------------------------------ */
3067    .balign 128
3068.L_op_invoke_static_range: /* 0x77 */
3069/* File: x86_64/op_invoke_static_range.S */
3070/* File: x86_64/invoke.S */
3071/*
3072 * Generic invoke handler wrapper.
3073 */
3074    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3075    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3076    .extern MterpInvokeStaticRange
3077    EXPORT_PC
3078    movq    rSELF, OUT_ARG0
3079    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
3080    movq    rPC, OUT_ARG2
3081    REFRESH_INST 119
3082    movl    rINST, OUT_32_ARG3
3083    call    SYMBOL(MterpInvokeStaticRange)
3084    testb   %al, %al
3085    jz      MterpException
3086    ADVANCE_PC 3
3087    call    SYMBOL(MterpShouldSwitchInterpreters)
3088    testb   %al, %al
3089    jnz     MterpFallback
3090    FETCH_INST
3091    GOTO_NEXT
3092
3093
3094/* ------------------------------ */
3095    .balign 128
3096.L_op_invoke_interface_range: /* 0x78 */
3097/* File: x86_64/op_invoke_interface_range.S */
3098/* File: x86_64/invoke.S */
3099/*
3100 * Generic invoke handler wrapper.
3101 */
3102    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3103    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3104    .extern MterpInvokeInterfaceRange
3105    EXPORT_PC
3106    movq    rSELF, OUT_ARG0
3107    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
3108    movq    rPC, OUT_ARG2
3109    REFRESH_INST 120
3110    movl    rINST, OUT_32_ARG3
3111    call    SYMBOL(MterpInvokeInterfaceRange)
3112    testb   %al, %al
3113    jz      MterpException
3114    ADVANCE_PC 3
3115    call    SYMBOL(MterpShouldSwitchInterpreters)
3116    testb   %al, %al
3117    jnz     MterpFallback
3118    FETCH_INST
3119    GOTO_NEXT
3120
3121
3122/* ------------------------------ */
3123    .balign 128
3124.L_op_unused_79: /* 0x79 */
3125/* File: x86_64/op_unused_79.S */
3126/* File: x86_64/unused.S */
3127/*
3128 * Bail to reference interpreter to throw.
3129 */
3130    jmp     MterpFallback
3131
3132
3133/* ------------------------------ */
3134    .balign 128
3135.L_op_unused_7a: /* 0x7a */
3136/* File: x86_64/op_unused_7a.S */
3137/* File: x86_64/unused.S */
3138/*
3139 * Bail to reference interpreter to throw.
3140 */
3141    jmp     MterpFallback
3142
3143
3144/* ------------------------------ */
3145    .balign 128
3146.L_op_neg_int: /* 0x7b */
3147/* File: x86_64/op_neg_int.S */
3148/* File: x86_64/unop.S */
3149/*
3150 * Generic 32/64-bit unary operation.  Provide an "instr" line that
3151 * specifies an instruction that performs "result = op eax".
3152 */
3153    /* unop vA, vB */
3154    movl    rINST, %ecx                     # rcx <- A+
3155    sarl    $4,rINST                       # rINST <- B
3156    .if 0
3157    GET_WIDE_VREG %rax, rINSTq              # rax <- vB
3158    .else
3159    GET_VREG %eax, rINSTq                   # eax <- vB
3160    .endif
3161    andb    $0xf,%cl                       # ecx <- A
3162
3163    negl    %eax
3164    .if 0
3165    SET_WIDE_VREG %rax, %rcx
3166    .else
3167    SET_VREG %eax, %rcx
3168    .endif
3169    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3170
3171
3172/* ------------------------------ */
3173    .balign 128
3174.L_op_not_int: /* 0x7c */
3175/* File: x86_64/op_not_int.S */
3176/* File: x86_64/unop.S */
3177/*
3178 * Generic 32/64-bit unary operation.  Provide an "instr" line that
3179 * specifies an instruction that performs "result = op eax".
3180 */
3181    /* unop vA, vB */
3182    movl    rINST, %ecx                     # rcx <- A+
3183    sarl    $4,rINST                       # rINST <- B
3184    .if 0
3185    GET_WIDE_VREG %rax, rINSTq              # rax <- vB
3186    .else
3187    GET_VREG %eax, rINSTq                   # eax <- vB
3188    .endif
3189    andb    $0xf,%cl                       # ecx <- A
3190
3191    notl    %eax
3192    .if 0
3193    SET_WIDE_VREG %rax, %rcx
3194    .else
3195    SET_VREG %eax, %rcx
3196    .endif
3197    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3198
3199
3200/* ------------------------------ */
3201    .balign 128
3202.L_op_neg_long: /* 0x7d */
3203/* File: x86_64/op_neg_long.S */
3204/* File: x86_64/unop.S */
3205/*
3206 * Generic 32/64-bit unary operation.  Provide an "instr" line that
3207 * specifies an instruction that performs "result = op eax".
3208 */
3209    /* unop vA, vB */
3210    movl    rINST, %ecx                     # rcx <- A+
3211    sarl    $4,rINST                       # rINST <- B
3212    .if 1
3213    GET_WIDE_VREG %rax, rINSTq              # rax <- vB
3214    .else
3215    GET_VREG %eax, rINSTq                   # eax <- vB
3216    .endif
3217    andb    $0xf,%cl                       # ecx <- A
3218
3219    negq    %rax
3220    .if 1
3221    SET_WIDE_VREG %rax, %rcx
3222    .else
3223    SET_VREG %eax, %rcx
3224    .endif
3225    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3226
3227
3228/* ------------------------------ */
3229    .balign 128
3230.L_op_not_long: /* 0x7e */
3231/* File: x86_64/op_not_long.S */
3232/* File: x86_64/unop.S */
3233/*
3234 * Generic 32/64-bit unary operation.  Provide an "instr" line that
3235 * specifies an instruction that performs "result = op eax".
3236 */
3237    /* unop vA, vB */
3238    movl    rINST, %ecx                     # rcx <- A+
3239    sarl    $4,rINST                       # rINST <- B
3240    .if 1
3241    GET_WIDE_VREG %rax, rINSTq              # rax <- vB
3242    .else
3243    GET_VREG %eax, rINSTq                   # eax <- vB
3244    .endif
3245    andb    $0xf,%cl                       # ecx <- A
3246
3247    notq    %rax
3248    .if 1
3249    SET_WIDE_VREG %rax, %rcx
3250    .else
3251    SET_VREG %eax, %rcx
3252    .endif
3253    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3254
3255
3256/* ------------------------------ */
3257    .balign 128
3258.L_op_neg_float: /* 0x7f */
3259/* File: x86_64/op_neg_float.S */
3260/* File: x86_64/unop.S */
3261/*
3262 * Generic 32/64-bit unary operation.  Provide an "instr" line that
3263 * specifies an instruction that performs "result = op eax".
3264 */
3265    /* unop vA, vB */
3266    movl    rINST, %ecx                     # rcx <- A+
3267    sarl    $4,rINST                       # rINST <- B
3268    .if 0
3269    GET_WIDE_VREG %rax, rINSTq              # rax <- vB
3270    .else
3271    GET_VREG %eax, rINSTq                   # eax <- vB
3272    .endif
3273    andb    $0xf,%cl                       # ecx <- A
3274
3275    xorl    $0x80000000, %eax
3276    .if 0
3277    SET_WIDE_VREG %rax, %rcx
3278    .else
3279    SET_VREG %eax, %rcx
3280    .endif
3281    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3282
3283
3284/* ------------------------------ */
3285    .balign 128
3286.L_op_neg_double: /* 0x80 */
3287/* File: x86_64/op_neg_double.S */
3288/* File: x86_64/unop.S */
3289/*
3290 * Generic 32/64-bit unary operation.  Provide an "instr" line that
3291 * specifies an instruction that performs "result = op eax".
3292 */
3293    /* unop vA, vB */
3294    movl    rINST, %ecx                     # rcx <- A+
3295    sarl    $4,rINST                       # rINST <- B
3296    .if 1
3297    GET_WIDE_VREG %rax, rINSTq              # rax <- vB
3298    .else
3299    GET_VREG %eax, rINSTq                   # eax <- vB
3300    .endif
3301    andb    $0xf,%cl                       # ecx <- A
3302    movq    $0x8000000000000000, %rsi
3303    xorq    %rsi, %rax
3304    .if 1
3305    SET_WIDE_VREG %rax, %rcx
3306    .else
3307    SET_VREG %eax, %rcx
3308    .endif
3309    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3310
3311
3312/* ------------------------------ */
3313    .balign 128
3314.L_op_int_to_long: /* 0x81 */
3315/* File: x86_64/op_int_to_long.S */
3316    /* int to long vA, vB */
3317    movzbq  rINSTbl, %rax                   # rax <- +A
3318    sarl    $4, %eax                       # eax <- B
3319    andb    $0xf, rINSTbl                  # rINST <- A
3320    movslq  VREG_ADDRESS(%rax), %rax
3321    SET_WIDE_VREG %rax, rINSTq              # v[A] <- %rax
3322    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3323
3324
3325/* ------------------------------ */
3326    .balign 128
3327.L_op_int_to_float: /* 0x82 */
3328/* File: x86_64/op_int_to_float.S */
3329/* File: x86_64/fpcvt.S */
3330/*
3331 * Generic 32-bit FP conversion operation.
3332 */
3333    /* unop vA, vB */
3334    movl    rINST, %ecx                     # rcx <- A+
3335    sarl    $4, rINST                      # rINST <- B
3336    andb    $0xf, %cl                      # ecx <- A
3337    cvtsi2ssl    VREG_ADDRESS(rINSTq), %xmm0
3338    .if 0
3339    movsd   %xmm0, VREG_ADDRESS(%rcx)
3340    CLEAR_WIDE_REF %rcx
3341    .else
3342    movss   %xmm0, VREG_ADDRESS(%rcx)
3343    CLEAR_REF %rcx
3344    .endif
3345    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3346
3347
3348/* ------------------------------ */
3349    .balign 128
3350.L_op_int_to_double: /* 0x83 */
3351/* File: x86_64/op_int_to_double.S */
3352/* File: x86_64/fpcvt.S */
3353/*
3354 * Generic 32-bit FP conversion operation.
3355 */
3356    /* unop vA, vB */
3357    movl    rINST, %ecx                     # rcx <- A+
3358    sarl    $4, rINST                      # rINST <- B
3359    andb    $0xf, %cl                      # ecx <- A
3360    cvtsi2sdl    VREG_ADDRESS(rINSTq), %xmm0
3361    .if 1
3362    movsd   %xmm0, VREG_ADDRESS(%rcx)
3363    CLEAR_WIDE_REF %rcx
3364    .else
3365    movss   %xmm0, VREG_ADDRESS(%rcx)
3366    CLEAR_REF %rcx
3367    .endif
3368    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3369
3370
3371/* ------------------------------ */
3372    .balign 128
3373.L_op_long_to_int: /* 0x84 */
3374/* File: x86_64/op_long_to_int.S */
3375/* we ignore the high word, making this equivalent to a 32-bit reg move */
3376/* File: x86_64/op_move.S */
3377    /* for move, move-object, long-to-int */
3378    /* op vA, vB */
3379    movl    rINST, %eax                     # eax <- BA
3380    andb    $0xf, %al                      # eax <- A
3381    shrl    $4, rINST                      # rINST <- B
3382    GET_VREG %edx, rINSTq
3383    .if 0
3384    SET_VREG_OBJECT %edx, %rax              # fp[A] <- fp[B]
3385    .else
3386    SET_VREG %edx, %rax                     # fp[A] <- fp[B]
3387    .endif
3388    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3389
3390
3391/* ------------------------------ */
3392    .balign 128
3393.L_op_long_to_float: /* 0x85 */
3394/* File: x86_64/op_long_to_float.S */
3395/* File: x86_64/fpcvt.S */
3396/*
3397 * Generic 32-bit FP conversion operation.
3398 */
3399    /* unop vA, vB */
3400    movl    rINST, %ecx                     # rcx <- A+
3401    sarl    $4, rINST                      # rINST <- B
3402    andb    $0xf, %cl                      # ecx <- A
3403    cvtsi2ssq    VREG_ADDRESS(rINSTq), %xmm0
3404    .if 0
3405    movsd   %xmm0, VREG_ADDRESS(%rcx)
3406    CLEAR_WIDE_REF %rcx
3407    .else
3408    movss   %xmm0, VREG_ADDRESS(%rcx)
3409    CLEAR_REF %rcx
3410    .endif
3411    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3412
3413
3414/* ------------------------------ */
3415    .balign 128
3416.L_op_long_to_double: /* 0x86 */
3417/* File: x86_64/op_long_to_double.S */
3418/* File: x86_64/fpcvt.S */
3419/*
3420 * Generic 32-bit FP conversion operation.
3421 */
3422    /* unop vA, vB */
3423    movl    rINST, %ecx                     # rcx <- A+
3424    sarl    $4, rINST                      # rINST <- B
3425    andb    $0xf, %cl                      # ecx <- A
3426    cvtsi2sdq    VREG_ADDRESS(rINSTq), %xmm0
3427    .if 1
3428    movsd   %xmm0, VREG_ADDRESS(%rcx)
3429    CLEAR_WIDE_REF %rcx
3430    .else
3431    movss   %xmm0, VREG_ADDRESS(%rcx)
3432    CLEAR_REF %rcx
3433    .endif
3434    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3435
3436
3437/* ------------------------------ */
3438    .balign 128
3439.L_op_float_to_int: /* 0x87 */
3440/* File: x86_64/op_float_to_int.S */
3441/* File: x86_64/cvtfp_int.S */
3442/* On fp to int conversions, Java requires that
3443 * if the result > maxint, it should be clamped to maxint.  If it is less
3444 * than minint, it should be clamped to minint.  If it is a nan, the result
3445 * should be zero.  Further, the rounding mode is to truncate.
3446 */
3447    /* float/double to int/long vA, vB */
3448    movl    rINST, %ecx                     # rcx <- A+
3449    sarl    $4, rINST                      # rINST <- B
3450    andb    $0xf, %cl                      # ecx <- A
3451    movss   VREG_ADDRESS(rINSTq), %xmm0
3452    movl  $0x7fffffff, %eax
3453    cvtsi2ssl %eax, %xmm1
3454    comiss    %xmm1, %xmm0
3455    jae     1f
3456    jp      2f
3457    cvttss2sil  %xmm0, %eax
3458    jmp     1f
34592:
3460    xorl    %eax, %eax
34611:
3462    .if 0
3463    SET_WIDE_VREG %eax, %rcx
3464    .else
3465    SET_VREG %eax, %rcx
3466    .endif
3467    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3468
3469
3470/* ------------------------------ */
3471    .balign 128
3472.L_op_float_to_long: /* 0x88 */
3473/* File: x86_64/op_float_to_long.S */
3474/* File: x86_64/cvtfp_int.S */
3475/* On fp to int conversions, Java requires that
3476 * if the result > maxint, it should be clamped to maxint.  If it is less
3477 * than minint, it should be clamped to minint.  If it is a nan, the result
3478 * should be zero.  Further, the rounding mode is to truncate.
3479 */
3480    /* float/double to int/long vA, vB */
3481    movl    rINST, %ecx                     # rcx <- A+
3482    sarl    $4, rINST                      # rINST <- B
3483    andb    $0xf, %cl                      # ecx <- A
3484    movss   VREG_ADDRESS(rINSTq), %xmm0
3485    movq  $0x7fffffffffffffff, %rax
3486    cvtsi2ssq %rax, %xmm1
3487    comiss    %xmm1, %xmm0
3488    jae     1f
3489    jp      2f
3490    cvttss2siq  %xmm0, %rax
3491    jmp     1f
34922:
3493    xorq    %rax, %rax
34941:
3495    .if 1
3496    SET_WIDE_VREG %rax, %rcx
3497    .else
3498    SET_VREG %rax, %rcx
3499    .endif
3500    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3501
3502
3503/* ------------------------------ */
3504    .balign 128
3505.L_op_float_to_double: /* 0x89 */
3506/* File: x86_64/op_float_to_double.S */
3507/* File: x86_64/fpcvt.S */
3508/*
3509 * Generic 32-bit FP conversion operation.
3510 */
3511    /* unop vA, vB */
3512    movl    rINST, %ecx                     # rcx <- A+
3513    sarl    $4, rINST                      # rINST <- B
3514    andb    $0xf, %cl                      # ecx <- A
3515    cvtss2sd    VREG_ADDRESS(rINSTq), %xmm0
3516    .if 1
3517    movsd   %xmm0, VREG_ADDRESS(%rcx)
3518    CLEAR_WIDE_REF %rcx
3519    .else
3520    movss   %xmm0, VREG_ADDRESS(%rcx)
3521    CLEAR_REF %rcx
3522    .endif
3523    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3524
3525
3526/* ------------------------------ */
3527    .balign 128
3528.L_op_double_to_int: /* 0x8a */
3529/* File: x86_64/op_double_to_int.S */
3530/* File: x86_64/cvtfp_int.S */
3531/* On fp to int conversions, Java requires that
3532 * if the result > maxint, it should be clamped to maxint.  If it is less
3533 * than minint, it should be clamped to minint.  If it is a nan, the result
3534 * should be zero.  Further, the rounding mode is to truncate.
3535 */
3536    /* float/double to int/long vA, vB */
3537    movl    rINST, %ecx                     # rcx <- A+
3538    sarl    $4, rINST                      # rINST <- B
3539    andb    $0xf, %cl                      # ecx <- A
3540    movsd   VREG_ADDRESS(rINSTq), %xmm0
3541    movl  $0x7fffffff, %eax
3542    cvtsi2sdl %eax, %xmm1
3543    comisd    %xmm1, %xmm0
3544    jae     1f
3545    jp      2f
3546    cvttsd2sil  %xmm0, %eax
3547    jmp     1f
35482:
3549    xorl    %eax, %eax
35501:
3551    .if 0
3552    SET_WIDE_VREG %eax, %rcx
3553    .else
3554    SET_VREG %eax, %rcx
3555    .endif
3556    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3557
3558
3559/* ------------------------------ */
3560    .balign 128
3561.L_op_double_to_long: /* 0x8b */
3562/* File: x86_64/op_double_to_long.S */
3563/* File: x86_64/cvtfp_int.S */
3564/* On fp to int conversions, Java requires that
3565 * if the result > maxint, it should be clamped to maxint.  If it is less
3566 * than minint, it should be clamped to minint.  If it is a nan, the result
3567 * should be zero.  Further, the rounding mode is to truncate.
3568 */
3569    /* float/double to int/long vA, vB */
3570    movl    rINST, %ecx                     # rcx <- A+
3571    sarl    $4, rINST                      # rINST <- B
3572    andb    $0xf, %cl                      # ecx <- A
3573    movsd   VREG_ADDRESS(rINSTq), %xmm0
3574    movq  $0x7fffffffffffffff, %rax
3575    cvtsi2sdq %rax, %xmm1
3576    comisd    %xmm1, %xmm0
3577    jae     1f
3578    jp      2f
3579    cvttsd2siq  %xmm0, %rax
3580    jmp     1f
35812:
3582    xorq    %rax, %rax
35831:
3584    .if 1
3585    SET_WIDE_VREG %rax, %rcx
3586    .else
3587    SET_VREG %rax, %rcx
3588    .endif
3589    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3590
3591
3592/* ------------------------------ */
3593    .balign 128
3594.L_op_double_to_float: /* 0x8c */
3595/* File: x86_64/op_double_to_float.S */
3596/* File: x86_64/fpcvt.S */
3597/*
3598 * Generic 32-bit FP conversion operation.
3599 */
3600    /* unop vA, vB */
3601    movl    rINST, %ecx                     # rcx <- A+
3602    sarl    $4, rINST                      # rINST <- B
3603    andb    $0xf, %cl                      # ecx <- A
3604    cvtsd2ss    VREG_ADDRESS(rINSTq), %xmm0
3605    .if 0
3606    movsd   %xmm0, VREG_ADDRESS(%rcx)
3607    CLEAR_WIDE_REF %rcx
3608    .else
3609    movss   %xmm0, VREG_ADDRESS(%rcx)
3610    CLEAR_REF %rcx
3611    .endif
3612    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3613
3614
3615/* ------------------------------ */
3616    .balign 128
3617.L_op_int_to_byte: /* 0x8d */
3618/* File: x86_64/op_int_to_byte.S */
3619/* File: x86_64/unop.S */
3620/*
3621 * Generic 32/64-bit unary operation.  Provide an "instr" line that
3622 * specifies an instruction that performs "result = op eax".
3623 */
3624    /* unop vA, vB */
3625    movl    rINST, %ecx                     # rcx <- A+
3626    sarl    $4,rINST                       # rINST <- B
3627    .if 0
3628    GET_WIDE_VREG %rax, rINSTq              # rax <- vB
3629    .else
3630    GET_VREG %eax, rINSTq                   # eax <- vB
3631    .endif
3632    andb    $0xf,%cl                       # ecx <- A
3633
3634movsbl  %al, %eax
3635    .if 0
3636    SET_WIDE_VREG %rax, %rcx
3637    .else
3638    SET_VREG %eax, %rcx
3639    .endif
3640    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3641
3642
3643/* ------------------------------ */
3644    .balign 128
3645.L_op_int_to_char: /* 0x8e */
3646/* File: x86_64/op_int_to_char.S */
3647/* File: x86_64/unop.S */
3648/*
3649 * Generic 32/64-bit unary operation.  Provide an "instr" line that
3650 * specifies an instruction that performs "result = op eax".
3651 */
3652    /* unop vA, vB */
3653    movl    rINST, %ecx                     # rcx <- A+
3654    sarl    $4,rINST                       # rINST <- B
3655    .if 0
3656    GET_WIDE_VREG %rax, rINSTq              # rax <- vB
3657    .else
3658    GET_VREG %eax, rINSTq                   # eax <- vB
3659    .endif
3660    andb    $0xf,%cl                       # ecx <- A
3661
3662movzwl  %ax,%eax
3663    .if 0
3664    SET_WIDE_VREG %rax, %rcx
3665    .else
3666    SET_VREG %eax, %rcx
3667    .endif
3668    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3669
3670
3671/* ------------------------------ */
3672    .balign 128
3673.L_op_int_to_short: /* 0x8f */
3674/* File: x86_64/op_int_to_short.S */
3675/* File: x86_64/unop.S */
3676/*
3677 * Generic 32/64-bit unary operation.  Provide an "instr" line that
3678 * specifies an instruction that performs "result = op eax".
3679 */
3680    /* unop vA, vB */
3681    movl    rINST, %ecx                     # rcx <- A+
3682    sarl    $4,rINST                       # rINST <- B
3683    .if 0
3684    GET_WIDE_VREG %rax, rINSTq              # rax <- vB
3685    .else
3686    GET_VREG %eax, rINSTq                   # eax <- vB
3687    .endif
3688    andb    $0xf,%cl                       # ecx <- A
3689
3690movswl %ax, %eax
3691    .if 0
3692    SET_WIDE_VREG %rax, %rcx
3693    .else
3694    SET_VREG %eax, %rcx
3695    .endif
3696    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3697
3698
3699/* ------------------------------ */
3700    .balign 128
3701.L_op_add_int: /* 0x90 */
3702/* File: x86_64/op_add_int.S */
3703/* File: x86_64/binop.S */
3704/*
3705 * Generic 32-bit binary operation.  Provide an "instr" line that
3706 * specifies an instruction that performs "result = eax op (rFP,%ecx,4)".
3707 * This could be an x86 instruction or a function call.  (If the result
3708 * comes back in a register other than eax, you can override "result".)
3709 *
3710 * For: add-int, sub-int, and-int, or-int,
3711 *      xor-int, shl-int, shr-int, ushr-int
3712 */
3713    /* binop vAA, vBB, vCC */
3714    movzbq  2(rPC), %rax                    # rax <- BB
3715    movzbq  3(rPC), %rcx                    # rcx <- CC
3716    GET_VREG %eax, %rax                     # eax <- vBB
3717    addl    (rFP,%rcx,4), %eax                                  # ex: addl    (rFP,%rcx,4),%eax
3718    SET_VREG %eax, rINSTq
3719    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
3720
3721
3722/* ------------------------------ */
3723    .balign 128
3724.L_op_sub_int: /* 0x91 */
3725/* File: x86_64/op_sub_int.S */
3726/* File: x86_64/binop.S */
3727/*
3728 * Generic 32-bit binary operation.  Provide an "instr" line that
3729 * specifies an instruction that performs "result = eax op (rFP,%ecx,4)".
3730 * This could be an x86 instruction or a function call.  (If the result
3731 * comes back in a register other than eax, you can override "result".)
3732 *
3733 * For: add-int, sub-int, and-int, or-int,
3734 *      xor-int, shl-int, shr-int, ushr-int
3735 */
3736    /* binop vAA, vBB, vCC */
3737    movzbq  2(rPC), %rax                    # rax <- BB
3738    movzbq  3(rPC), %rcx                    # rcx <- CC
3739    GET_VREG %eax, %rax                     # eax <- vBB
3740    subl    (rFP,%rcx,4), %eax                                  # ex: addl    (rFP,%rcx,4),%eax
3741    SET_VREG %eax, rINSTq
3742    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
3743
3744
3745/* ------------------------------ */
3746    .balign 128
3747.L_op_mul_int: /* 0x92 */
3748/* File: x86_64/op_mul_int.S */
3749/* File: x86_64/binop.S */
3750/*
3751 * Generic 32-bit binary operation.  Provide an "instr" line that
3752 * specifies an instruction that performs "result = eax op (rFP,%ecx,4)".
3753 * This could be an x86 instruction or a function call.  (If the result
3754 * comes back in a register other than eax, you can override "result".)
3755 *
3756 * For: add-int, sub-int, and-int, or-int,
3757 *      xor-int, shl-int, shr-int, ushr-int
3758 */
3759    /* binop vAA, vBB, vCC */
3760    movzbq  2(rPC), %rax                    # rax <- BB
3761    movzbq  3(rPC), %rcx                    # rcx <- CC
3762    GET_VREG %eax, %rax                     # eax <- vBB
3763    imull   (rFP,%rcx,4), %eax                                  # ex: addl    (rFP,%rcx,4),%eax
3764    SET_VREG %eax, rINSTq
3765    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
3766
3767
3768/* ------------------------------ */
3769    .balign 128
3770.L_op_div_int: /* 0x93 */
3771/* File: x86_64/op_div_int.S */
3772/* File: x86_64/bindiv.S */
3773/*
3774 * 32-bit binary div/rem operation.  Handles special case of op1=-1.
3775 */
3776    /* div/rem vAA, vBB, vCC */
3777    movzbq  2(rPC), %rax                    # rax <- BB
3778    movzbq  3(rPC), %rcx                    # rcx <- CC
3779    .if 0
3780    GET_WIDE_VREG %rax, %rax                # eax <- vBB
3781    GET_WIDE_VREG %ecx, %rcx             # ecx <- vCC
3782    .else
3783    GET_VREG %eax, %rax                     # eax <- vBB
3784    GET_VREG %ecx, %rcx                  # ecx <- vCC
3785    .endif
3786    testl   %ecx, %ecx
3787    jz      common_errDivideByZero
3788    cmpl  $-1, %ecx
3789    je      2f
3790    cdq                                    # rdx:rax <- sign-extended of rax
3791    idivl   %ecx
37921:
3793    .if 0
3794    SET_WIDE_VREG %eax, rINSTq           # eax <- vBB
3795    .else
3796    SET_VREG %eax, rINSTq                # eax <- vBB
3797    .endif
3798    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
37992:
3800    .if 0
3801    xorl %eax, %eax
3802    .else
3803    negl %eax
3804    .endif
3805    jmp     1b
3806
3807
3808/* ------------------------------ */
3809    .balign 128
3810.L_op_rem_int: /* 0x94 */
3811/* File: x86_64/op_rem_int.S */
3812/* File: x86_64/bindiv.S */
3813/*
3814 * 32-bit binary div/rem operation.  Handles special case of op1=-1.
3815 */
3816    /* div/rem vAA, vBB, vCC */
3817    movzbq  2(rPC), %rax                    # rax <- BB
3818    movzbq  3(rPC), %rcx                    # rcx <- CC
3819    .if 0
3820    GET_WIDE_VREG %rax, %rax                # eax <- vBB
3821    GET_WIDE_VREG %ecx, %rcx             # ecx <- vCC
3822    .else
3823    GET_VREG %eax, %rax                     # eax <- vBB
3824    GET_VREG %ecx, %rcx                  # ecx <- vCC
3825    .endif
3826    testl   %ecx, %ecx
3827    jz      common_errDivideByZero
3828    cmpl  $-1, %ecx
3829    je      2f
3830    cdq                                    # rdx:rax <- sign-extended of rax
3831    idivl   %ecx
38321:
3833    .if 0
3834    SET_WIDE_VREG %edx, rINSTq           # eax <- vBB
3835    .else
3836    SET_VREG %edx, rINSTq                # eax <- vBB
3837    .endif
3838    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
38392:
3840    .if 1
3841    xorl %edx, %edx
3842    .else
3843    negl %edx
3844    .endif
3845    jmp     1b
3846
3847
3848/* ------------------------------ */
3849    .balign 128
3850.L_op_and_int: /* 0x95 */
3851/* File: x86_64/op_and_int.S */
3852/* File: x86_64/binop.S */
3853/*
3854 * Generic 32-bit binary operation.  Provide an "instr" line that
3855 * specifies an instruction that performs "result = eax op (rFP,%ecx,4)".
3856 * This could be an x86 instruction or a function call.  (If the result
3857 * comes back in a register other than eax, you can override "result".)
3858 *
3859 * For: add-int, sub-int, and-int, or-int,
3860 *      xor-int, shl-int, shr-int, ushr-int
3861 */
3862    /* binop vAA, vBB, vCC */
3863    movzbq  2(rPC), %rax                    # rax <- BB
3864    movzbq  3(rPC), %rcx                    # rcx <- CC
3865    GET_VREG %eax, %rax                     # eax <- vBB
3866    andl    (rFP,%rcx,4), %eax                                  # ex: addl    (rFP,%rcx,4),%eax
3867    SET_VREG %eax, rINSTq
3868    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
3869
3870
3871/* ------------------------------ */
3872    .balign 128
3873.L_op_or_int: /* 0x96 */
3874/* File: x86_64/op_or_int.S */
3875/* File: x86_64/binop.S */
3876/*
3877 * Generic 32-bit binary operation.  Provide an "instr" line that
3878 * specifies an instruction that performs "result = eax op (rFP,%ecx,4)".
3879 * This could be an x86 instruction or a function call.  (If the result
3880 * comes back in a register other than eax, you can override "result".)
3881 *
3882 * For: add-int, sub-int, and-int, or-int,
3883 *      xor-int, shl-int, shr-int, ushr-int
3884 */
3885    /* binop vAA, vBB, vCC */
3886    movzbq  2(rPC), %rax                    # rax <- BB
3887    movzbq  3(rPC), %rcx                    # rcx <- CC
3888    GET_VREG %eax, %rax                     # eax <- vBB
3889    orl     (rFP,%rcx,4), %eax                                  # ex: addl    (rFP,%rcx,4),%eax
3890    SET_VREG %eax, rINSTq
3891    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
3892
3893
3894/* ------------------------------ */
3895    .balign 128
3896.L_op_xor_int: /* 0x97 */
3897/* File: x86_64/op_xor_int.S */
3898/* File: x86_64/binop.S */
3899/*
3900 * Generic 32-bit binary operation.  Provide an "instr" line that
3901 * specifies an instruction that performs "result = eax op (rFP,%ecx,4)".
3902 * This could be an x86 instruction or a function call.  (If the result
3903 * comes back in a register other than eax, you can override "result".)
3904 *
3905 * For: add-int, sub-int, and-int, or-int,
3906 *      xor-int, shl-int, shr-int, ushr-int
3907 */
3908    /* binop vAA, vBB, vCC */
3909    movzbq  2(rPC), %rax                    # rax <- BB
3910    movzbq  3(rPC), %rcx                    # rcx <- CC
3911    GET_VREG %eax, %rax                     # eax <- vBB
3912    xorl    (rFP,%rcx,4), %eax                                  # ex: addl    (rFP,%rcx,4),%eax
3913    SET_VREG %eax, rINSTq
3914    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
3915
3916
3917/* ------------------------------ */
3918    .balign 128
3919.L_op_shl_int: /* 0x98 */
3920/* File: x86_64/op_shl_int.S */
3921/* File: x86_64/binop1.S */
3922/*
3923 * Generic 32-bit binary operation in which both operands loaded to
3924 * registers (op0 in eax, op1 in ecx).
3925 */
3926    /* binop vAA, vBB, vCC */
3927    movzbq  2(rPC), %rax                    # eax <- BB
3928    movzbq  3(rPC), %rcx                    # ecx <- CC
3929    GET_VREG %ecx, %rcx                     # eax <- vCC
3930    .if 0
3931    GET_WIDE_VREG %rax, %rax                # rax <- vBB
3932    sall    %cl, %eax                                  # ex: addl    %ecx,%eax
3933    SET_WIDE_VREG %rax, rINSTq
3934    .else
3935    GET_VREG %eax, %rax                     # eax <- vBB
3936    sall    %cl, %eax                                  # ex: addl    %ecx,%eax
3937    SET_VREG %eax, rINSTq
3938    .endif
3939    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
3940
3941
3942/* ------------------------------ */
3943    .balign 128
3944.L_op_shr_int: /* 0x99 */
3945/* File: x86_64/op_shr_int.S */
3946/* File: x86_64/binop1.S */
3947/*
3948 * Generic 32-bit binary operation in which both operands loaded to
3949 * registers (op0 in eax, op1 in ecx).
3950 */
3951    /* binop vAA, vBB, vCC */
3952    movzbq  2(rPC), %rax                    # eax <- BB
3953    movzbq  3(rPC), %rcx                    # ecx <- CC
3954    GET_VREG %ecx, %rcx                     # eax <- vCC
3955    .if 0
3956    GET_WIDE_VREG %rax, %rax                # rax <- vBB
3957    sarl    %cl, %eax                                  # ex: addl    %ecx,%eax
3958    SET_WIDE_VREG %rax, rINSTq
3959    .else
3960    GET_VREG %eax, %rax                     # eax <- vBB
3961    sarl    %cl, %eax                                  # ex: addl    %ecx,%eax
3962    SET_VREG %eax, rINSTq
3963    .endif
3964    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
3965
3966
3967/* ------------------------------ */
3968    .balign 128
3969.L_op_ushr_int: /* 0x9a */
3970/* File: x86_64/op_ushr_int.S */
3971/* File: x86_64/binop1.S */
3972/*
3973 * Generic 32-bit binary operation in which both operands loaded to
3974 * registers (op0 in eax, op1 in ecx).
3975 */
3976    /* binop vAA, vBB, vCC */
3977    movzbq  2(rPC), %rax                    # eax <- BB
3978    movzbq  3(rPC), %rcx                    # ecx <- CC
3979    GET_VREG %ecx, %rcx                     # eax <- vCC
3980    .if 0
3981    GET_WIDE_VREG %rax, %rax                # rax <- vBB
3982    shrl    %cl, %eax                                  # ex: addl    %ecx,%eax
3983    SET_WIDE_VREG %rax, rINSTq
3984    .else
3985    GET_VREG %eax, %rax                     # eax <- vBB
3986    shrl    %cl, %eax                                  # ex: addl    %ecx,%eax
3987    SET_VREG %eax, rINSTq
3988    .endif
3989    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
3990
3991
3992/* ------------------------------ */
3993    .balign 128
3994.L_op_add_long: /* 0x9b */
3995/* File: x86_64/op_add_long.S */
3996/* File: x86_64/binopWide.S */
3997/*
3998 * Generic 64-bit binary operation.
3999 */
4000    /* binop vAA, vBB, vCC */
4001    movzbq  2(rPC), %rax                    # eax <- BB
4002    movzbq  3(rPC), %rcx                    # ecx <- CC
4003    GET_WIDE_VREG %rax, %rax                # rax <- v[BB]
4004    addq    (rFP,%rcx,4), %rax                                  # ex: addq   (rFP,%rcx,4),%rax
4005    SET_WIDE_VREG %rax, rINSTq              # v[AA] <- rax
4006    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4007
4008
4009/* ------------------------------ */
4010    .balign 128
4011.L_op_sub_long: /* 0x9c */
4012/* File: x86_64/op_sub_long.S */
4013/* File: x86_64/binopWide.S */
4014/*
4015 * Generic 64-bit binary operation.
4016 */
4017    /* binop vAA, vBB, vCC */
4018    movzbq  2(rPC), %rax                    # eax <- BB
4019    movzbq  3(rPC), %rcx                    # ecx <- CC
4020    GET_WIDE_VREG %rax, %rax                # rax <- v[BB]
4021    subq    (rFP,%rcx,4), %rax                                  # ex: addq   (rFP,%rcx,4),%rax
4022    SET_WIDE_VREG %rax, rINSTq              # v[AA] <- rax
4023    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4024
4025
4026/* ------------------------------ */
4027    .balign 128
4028.L_op_mul_long: /* 0x9d */
4029/* File: x86_64/op_mul_long.S */
4030/* File: x86_64/binopWide.S */
4031/*
4032 * Generic 64-bit binary operation.
4033 */
4034    /* binop vAA, vBB, vCC */
4035    movzbq  2(rPC), %rax                    # eax <- BB
4036    movzbq  3(rPC), %rcx                    # ecx <- CC
4037    GET_WIDE_VREG %rax, %rax                # rax <- v[BB]
4038    imulq   (rFP,%rcx,4), %rax                                  # ex: addq   (rFP,%rcx,4),%rax
4039    SET_WIDE_VREG %rax, rINSTq              # v[AA] <- rax
4040    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4041
4042
4043/* ------------------------------ */
4044    .balign 128
4045.L_op_div_long: /* 0x9e */
4046/* File: x86_64/op_div_long.S */
4047/* File: x86_64/bindiv.S */
4048/*
4049 * 32-bit binary div/rem operation.  Handles special case of op1=-1.
4050 */
4051    /* div/rem vAA, vBB, vCC */
4052    movzbq  2(rPC), %rax                    # rax <- BB
4053    movzbq  3(rPC), %rcx                    # rcx <- CC
4054    .if 1
4055    GET_WIDE_VREG %rax, %rax                # eax <- vBB
4056    GET_WIDE_VREG %rcx, %rcx             # ecx <- vCC
4057    .else
4058    GET_VREG %eax, %rax                     # eax <- vBB
4059    GET_VREG %rcx, %rcx                  # ecx <- vCC
4060    .endif
4061    testq   %rcx, %rcx
4062    jz      common_errDivideByZero
4063    cmpq  $-1, %rcx
4064    je      2f
4065    cqo                                    # rdx:rax <- sign-extended of rax
4066    idivq   %rcx
40671:
4068    .if 1
4069    SET_WIDE_VREG %rax, rINSTq           # eax <- vBB
4070    .else
4071    SET_VREG %rax, rINSTq                # eax <- vBB
4072    .endif
4073    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
40742:
4075    .if 0
4076    xorq %rax, %rax
4077    .else
4078    negq %rax
4079    .endif
4080    jmp     1b
4081
4082
4083/* ------------------------------ */
4084    .balign 128
4085.L_op_rem_long: /* 0x9f */
4086/* File: x86_64/op_rem_long.S */
4087/* File: x86_64/bindiv.S */
4088/*
4089 * 32-bit binary div/rem operation.  Handles special case of op1=-1.
4090 */
4091    /* div/rem vAA, vBB, vCC */
4092    movzbq  2(rPC), %rax                    # rax <- BB
4093    movzbq  3(rPC), %rcx                    # rcx <- CC
4094    .if 1
4095    GET_WIDE_VREG %rax, %rax                # eax <- vBB
4096    GET_WIDE_VREG %rcx, %rcx             # ecx <- vCC
4097    .else
4098    GET_VREG %eax, %rax                     # eax <- vBB
4099    GET_VREG %rcx, %rcx                  # ecx <- vCC
4100    .endif
4101    testq   %rcx, %rcx
4102    jz      common_errDivideByZero
4103    cmpq  $-1, %rcx
4104    je      2f
4105    cqo                                    # rdx:rax <- sign-extended of rax
4106    idivq   %rcx
41071:
4108    .if 1
4109    SET_WIDE_VREG %rdx, rINSTq           # eax <- vBB
4110    .else
4111    SET_VREG %rdx, rINSTq                # eax <- vBB
4112    .endif
4113    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
41142:
4115    .if 1
4116    xorq %rdx, %rdx
4117    .else
4118    negq %rdx
4119    .endif
4120    jmp     1b
4121
4122
4123/* ------------------------------ */
4124    .balign 128
4125.L_op_and_long: /* 0xa0 */
4126/* File: x86_64/op_and_long.S */
4127/* File: x86_64/binopWide.S */
4128/*
4129 * Generic 64-bit binary operation.
4130 */
4131    /* binop vAA, vBB, vCC */
4132    movzbq  2(rPC), %rax                    # eax <- BB
4133    movzbq  3(rPC), %rcx                    # ecx <- CC
4134    GET_WIDE_VREG %rax, %rax                # rax <- v[BB]
4135    andq    (rFP,%rcx,4), %rax                                  # ex: addq   (rFP,%rcx,4),%rax
4136    SET_WIDE_VREG %rax, rINSTq              # v[AA] <- rax
4137    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4138
4139
4140/* ------------------------------ */
4141    .balign 128
4142.L_op_or_long: /* 0xa1 */
4143/* File: x86_64/op_or_long.S */
4144/* File: x86_64/binopWide.S */
4145/*
4146 * Generic 64-bit binary operation.
4147 */
4148    /* binop vAA, vBB, vCC */
4149    movzbq  2(rPC), %rax                    # eax <- BB
4150    movzbq  3(rPC), %rcx                    # ecx <- CC
4151    GET_WIDE_VREG %rax, %rax                # rax <- v[BB]
4152    orq     (rFP,%rcx,4), %rax                                  # ex: addq   (rFP,%rcx,4),%rax
4153    SET_WIDE_VREG %rax, rINSTq              # v[AA] <- rax
4154    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4155
4156
4157/* ------------------------------ */
4158    .balign 128
4159.L_op_xor_long: /* 0xa2 */
4160/* File: x86_64/op_xor_long.S */
4161/* File: x86_64/binopWide.S */
4162/*
4163 * Generic 64-bit binary operation.
4164 */
4165    /* binop vAA, vBB, vCC */
4166    movzbq  2(rPC), %rax                    # eax <- BB
4167    movzbq  3(rPC), %rcx                    # ecx <- CC
4168    GET_WIDE_VREG %rax, %rax                # rax <- v[BB]
4169    xorq    (rFP,%rcx,4), %rax                                  # ex: addq   (rFP,%rcx,4),%rax
4170    SET_WIDE_VREG %rax, rINSTq              # v[AA] <- rax
4171    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4172
4173
4174/* ------------------------------ */
4175    .balign 128
4176.L_op_shl_long: /* 0xa3 */
4177/* File: x86_64/op_shl_long.S */
4178/* File: x86_64/binop1.S */
4179/*
4180 * Generic 32-bit binary operation in which both operands loaded to
4181 * registers (op0 in eax, op1 in ecx).
4182 */
4183    /* binop vAA, vBB, vCC */
4184    movzbq  2(rPC), %rax                    # eax <- BB
4185    movzbq  3(rPC), %rcx                    # ecx <- CC
4186    GET_VREG %ecx, %rcx                     # eax <- vCC
4187    .if 1
4188    GET_WIDE_VREG %rax, %rax                # rax <- vBB
4189    salq    %cl, %rax                                  # ex: addl    %ecx,%eax
4190    SET_WIDE_VREG %rax, rINSTq
4191    .else
4192    GET_VREG %eax, %rax                     # eax <- vBB
4193    salq    %cl, %rax                                  # ex: addl    %ecx,%eax
4194    SET_VREG %eax, rINSTq
4195    .endif
4196    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4197
4198
4199/* ------------------------------ */
4200    .balign 128
4201.L_op_shr_long: /* 0xa4 */
4202/* File: x86_64/op_shr_long.S */
4203/* File: x86_64/binop1.S */
4204/*
4205 * Generic 32-bit binary operation in which both operands loaded to
4206 * registers (op0 in eax, op1 in ecx).
4207 */
4208    /* binop vAA, vBB, vCC */
4209    movzbq  2(rPC), %rax                    # eax <- BB
4210    movzbq  3(rPC), %rcx                    # ecx <- CC
4211    GET_VREG %ecx, %rcx                     # eax <- vCC
4212    .if 1
4213    GET_WIDE_VREG %rax, %rax                # rax <- vBB
4214    sarq    %cl, %rax                                  # ex: addl    %ecx,%eax
4215    SET_WIDE_VREG %rax, rINSTq
4216    .else
4217    GET_VREG %eax, %rax                     # eax <- vBB
4218    sarq    %cl, %rax                                  # ex: addl    %ecx,%eax
4219    SET_VREG %eax, rINSTq
4220    .endif
4221    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4222
4223
4224/* ------------------------------ */
4225    .balign 128
4226.L_op_ushr_long: /* 0xa5 */
4227/* File: x86_64/op_ushr_long.S */
4228/* File: x86_64/binop1.S */
4229/*
4230 * Generic 32-bit binary operation in which both operands loaded to
4231 * registers (op0 in eax, op1 in ecx).
4232 */
4233    /* binop vAA, vBB, vCC */
4234    movzbq  2(rPC), %rax                    # eax <- BB
4235    movzbq  3(rPC), %rcx                    # ecx <- CC
4236    GET_VREG %ecx, %rcx                     # eax <- vCC
4237    .if 1
4238    GET_WIDE_VREG %rax, %rax                # rax <- vBB
4239    shrq    %cl, %rax                                  # ex: addl    %ecx,%eax
4240    SET_WIDE_VREG %rax, rINSTq
4241    .else
4242    GET_VREG %eax, %rax                     # eax <- vBB
4243    shrq    %cl, %rax                                  # ex: addl    %ecx,%eax
4244    SET_VREG %eax, rINSTq
4245    .endif
4246    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4247
4248
4249/* ------------------------------ */
4250    .balign 128
4251.L_op_add_float: /* 0xa6 */
4252/* File: x86_64/op_add_float.S */
4253/* File: x86_64/sseBinop.S */
4254    movzbq  2(rPC), %rcx                    # ecx <- BB
4255    movzbq  3(rPC), %rax                    # eax <- CC
4256    movss   VREG_ADDRESS(%rcx), %xmm0       # %xmm0 <- 1st src
4257    addss VREG_ADDRESS(%rax), %xmm0
4258    movss   %xmm0, VREG_ADDRESS(rINSTq)     # vAA <- %xmm0
4259    pxor    %xmm0, %xmm0
4260    movss   %xmm0, VREG_REF_ADDRESS(rINSTq) # clear ref
4261    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4262
4263
4264/* ------------------------------ */
4265    .balign 128
4266.L_op_sub_float: /* 0xa7 */
4267/* File: x86_64/op_sub_float.S */
4268/* File: x86_64/sseBinop.S */
4269    movzbq  2(rPC), %rcx                    # ecx <- BB
4270    movzbq  3(rPC), %rax                    # eax <- CC
4271    movss   VREG_ADDRESS(%rcx), %xmm0       # %xmm0 <- 1st src
4272    subss VREG_ADDRESS(%rax), %xmm0
4273    movss   %xmm0, VREG_ADDRESS(rINSTq)     # vAA <- %xmm0
4274    pxor    %xmm0, %xmm0
4275    movss   %xmm0, VREG_REF_ADDRESS(rINSTq) # clear ref
4276    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4277
4278
4279/* ------------------------------ */
4280    .balign 128
4281.L_op_mul_float: /* 0xa8 */
4282/* File: x86_64/op_mul_float.S */
4283/* File: x86_64/sseBinop.S */
4284    movzbq  2(rPC), %rcx                    # ecx <- BB
4285    movzbq  3(rPC), %rax                    # eax <- CC
4286    movss   VREG_ADDRESS(%rcx), %xmm0       # %xmm0 <- 1st src
4287    mulss VREG_ADDRESS(%rax), %xmm0
4288    movss   %xmm0, VREG_ADDRESS(rINSTq)     # vAA <- %xmm0
4289    pxor    %xmm0, %xmm0
4290    movss   %xmm0, VREG_REF_ADDRESS(rINSTq) # clear ref
4291    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4292
4293
4294/* ------------------------------ */
4295    .balign 128
4296.L_op_div_float: /* 0xa9 */
4297/* File: x86_64/op_div_float.S */
4298/* File: x86_64/sseBinop.S */
4299    movzbq  2(rPC), %rcx                    # ecx <- BB
4300    movzbq  3(rPC), %rax                    # eax <- CC
4301    movss   VREG_ADDRESS(%rcx), %xmm0       # %xmm0 <- 1st src
4302    divss VREG_ADDRESS(%rax), %xmm0
4303    movss   %xmm0, VREG_ADDRESS(rINSTq)     # vAA <- %xmm0
4304    pxor    %xmm0, %xmm0
4305    movss   %xmm0, VREG_REF_ADDRESS(rINSTq) # clear ref
4306    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4307
4308
4309/* ------------------------------ */
4310    .balign 128
4311.L_op_rem_float: /* 0xaa */
4312/* File: x86_64/op_rem_float.S */
4313    /* rem_float vAA, vBB, vCC */
4314    movzbq  3(rPC), %rcx                    # ecx <- BB
4315    movzbq  2(rPC), %rax                    # eax <- CC
4316    flds    VREG_ADDRESS(%rcx)              # vBB to fp stack
4317    flds    VREG_ADDRESS(%rax)              # vCC to fp stack
43181:
4319    fprem
4320    fstsw   %ax
4321    sahf
4322    jp      1b
4323    fstp    %st(1)
4324    fstps   VREG_ADDRESS(rINSTq)            # %st to vAA
4325    CLEAR_REF rINSTq
4326    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4327
4328/* ------------------------------ */
4329    .balign 128
4330.L_op_add_double: /* 0xab */
4331/* File: x86_64/op_add_double.S */
4332/* File: x86_64/sseBinop.S */
4333    movzbq  2(rPC), %rcx                    # ecx <- BB
4334    movzbq  3(rPC), %rax                    # eax <- CC
4335    movsd   VREG_ADDRESS(%rcx), %xmm0       # %xmm0 <- 1st src
4336    addsd VREG_ADDRESS(%rax), %xmm0
4337    movsd   %xmm0, VREG_ADDRESS(rINSTq)     # vAA <- %xmm0
4338    pxor    %xmm0, %xmm0
4339    movsd   %xmm0, VREG_REF_ADDRESS(rINSTq) # clear ref
4340    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4341
4342
4343/* ------------------------------ */
4344    .balign 128
4345.L_op_sub_double: /* 0xac */
4346/* File: x86_64/op_sub_double.S */
4347/* File: x86_64/sseBinop.S */
4348    movzbq  2(rPC), %rcx                    # ecx <- BB
4349    movzbq  3(rPC), %rax                    # eax <- CC
4350    movsd   VREG_ADDRESS(%rcx), %xmm0       # %xmm0 <- 1st src
4351    subsd VREG_ADDRESS(%rax), %xmm0
4352    movsd   %xmm0, VREG_ADDRESS(rINSTq)     # vAA <- %xmm0
4353    pxor    %xmm0, %xmm0
4354    movsd   %xmm0, VREG_REF_ADDRESS(rINSTq) # clear ref
4355    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4356
4357
4358/* ------------------------------ */
4359    .balign 128
4360.L_op_mul_double: /* 0xad */
4361/* File: x86_64/op_mul_double.S */
4362/* File: x86_64/sseBinop.S */
4363    movzbq  2(rPC), %rcx                    # ecx <- BB
4364    movzbq  3(rPC), %rax                    # eax <- CC
4365    movsd   VREG_ADDRESS(%rcx), %xmm0       # %xmm0 <- 1st src
4366    mulsd VREG_ADDRESS(%rax), %xmm0
4367    movsd   %xmm0, VREG_ADDRESS(rINSTq)     # vAA <- %xmm0
4368    pxor    %xmm0, %xmm0
4369    movsd   %xmm0, VREG_REF_ADDRESS(rINSTq) # clear ref
4370    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4371
4372
4373/* ------------------------------ */
4374    .balign 128
4375.L_op_div_double: /* 0xae */
4376/* File: x86_64/op_div_double.S */
4377/* File: x86_64/sseBinop.S */
4378    movzbq  2(rPC), %rcx                    # ecx <- BB
4379    movzbq  3(rPC), %rax                    # eax <- CC
4380    movsd   VREG_ADDRESS(%rcx), %xmm0       # %xmm0 <- 1st src
4381    divsd VREG_ADDRESS(%rax), %xmm0
4382    movsd   %xmm0, VREG_ADDRESS(rINSTq)     # vAA <- %xmm0
4383    pxor    %xmm0, %xmm0
4384    movsd   %xmm0, VREG_REF_ADDRESS(rINSTq) # clear ref
4385    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4386
4387
4388/* ------------------------------ */
4389    .balign 128
4390.L_op_rem_double: /* 0xaf */
4391/* File: x86_64/op_rem_double.S */
4392    /* rem_double vAA, vBB, vCC */
4393    movzbq  3(rPC), %rcx                    # ecx <- BB
4394    movzbq  2(rPC), %rax                    # eax <- CC
4395    fldl    VREG_ADDRESS(%rcx)              # %st1 <- fp[vBB]
4396    fldl    VREG_ADDRESS(%rax)              # %st0 <- fp[vCC]
43971:
4398    fprem
4399    fstsw   %ax
4400    sahf
4401    jp      1b
4402    fstp    %st(1)
4403    fstpl   VREG_ADDRESS(rINSTq)            # fp[vAA] <- %st
4404    CLEAR_WIDE_REF rINSTq
4405    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4406
4407/* ------------------------------ */
4408    .balign 128
4409.L_op_add_int_2addr: /* 0xb0 */
4410/* File: x86_64/op_add_int_2addr.S */
4411/* File: x86_64/binop2addr.S */
4412/*
4413 * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
4414 * that specifies an instruction that performs "result = r0 op r1".
4415 * This could be an instruction or a function call.
4416 *
4417 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4418 *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4419 *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4420 *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4421 */
4422    /* binop/2addr vA, vB */
4423    movl    rINST, %ecx                     # rcx <- A+
4424    sarl    $4, rINST                      # rINST <- B
4425    andb    $0xf, %cl                      # ecx <- A
4426    GET_VREG %eax, rINSTq                   # eax <- vB
4427    addl    %eax, (rFP,%rcx,4)                                  # for ex: addl   %eax,(rFP,%ecx,4)
4428    CLEAR_REF %rcx
4429    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4430
4431
4432/* ------------------------------ */
4433    .balign 128
4434.L_op_sub_int_2addr: /* 0xb1 */
4435/* File: x86_64/op_sub_int_2addr.S */
4436/* File: x86_64/binop2addr.S */
4437/*
4438 * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
4439 * that specifies an instruction that performs "result = r0 op r1".
4440 * This could be an instruction or a function call.
4441 *
4442 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4443 *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4444 *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4445 *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4446 */
4447    /* binop/2addr vA, vB */
4448    movl    rINST, %ecx                     # rcx <- A+
4449    sarl    $4, rINST                      # rINST <- B
4450    andb    $0xf, %cl                      # ecx <- A
4451    GET_VREG %eax, rINSTq                   # eax <- vB
4452    subl    %eax, (rFP,%rcx,4)                                  # for ex: addl   %eax,(rFP,%ecx,4)
4453    CLEAR_REF %rcx
4454    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4455
4456
4457/* ------------------------------ */
4458    .balign 128
4459.L_op_mul_int_2addr: /* 0xb2 */
4460/* File: x86_64/op_mul_int_2addr.S */
4461    /* mul vA, vB */
4462    movl    rINST, %ecx                     # rcx <- A+
4463    sarl    $4, rINST                      # rINST <- B
4464    andb    $0xf, %cl                      # ecx <- A
4465    GET_VREG %eax, %rcx                     # eax <- vA
4466    imull   (rFP,rINSTq,4), %eax
4467    SET_VREG %eax, %rcx
4468    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4469
4470/* ------------------------------ */
4471    .balign 128
4472.L_op_div_int_2addr: /* 0xb3 */
4473/* File: x86_64/op_div_int_2addr.S */
4474/* File: x86_64/bindiv2addr.S */
4475/*
4476 * 32-bit binary div/rem operation.  Handles special case of op1=-1.
4477 */
4478    /* div/rem/2addr vA, vB */
4479    movl    rINST, %ecx                     # rcx <- BA
4480    sarl    $4, %ecx                       # rcx <- B
4481    andb    $0xf, rINSTbl                  # rINST <- A
4482    .if 0
4483    GET_WIDE_VREG %rax, rINSTq              # eax <- vA
4484    GET_WIDE_VREG %ecx, %rcx             # ecx <- vB
4485    .else
4486    GET_VREG %eax, rINSTq                   # eax <- vA
4487    GET_VREG %ecx, %rcx                  # ecx <- vB
4488    .endif
4489    testl   %ecx, %ecx
4490    jz      common_errDivideByZero
4491    cmpl  $-1, %ecx
4492    je      2f
4493    cdq                                    # rdx:rax <- sign-extended of rax
4494    idivl   %ecx
44951:
4496    .if 0
4497    SET_WIDE_VREG %eax, rINSTq           # vA <- result
4498    .else
4499    SET_VREG %eax, rINSTq                # vA <- result
4500    .endif
4501    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
45022:
4503    .if 0
4504    xorl %eax, %eax
4505    .else
4506    negl %eax
4507    .endif
4508    jmp     1b
4509
4510
4511/* ------------------------------ */
4512    .balign 128
4513.L_op_rem_int_2addr: /* 0xb4 */
4514/* File: x86_64/op_rem_int_2addr.S */
4515/* File: x86_64/bindiv2addr.S */
4516/*
4517 * 32-bit binary div/rem operation.  Handles special case of op1=-1.
4518 */
4519    /* div/rem/2addr vA, vB */
4520    movl    rINST, %ecx                     # rcx <- BA
4521    sarl    $4, %ecx                       # rcx <- B
4522    andb    $0xf, rINSTbl                  # rINST <- A
4523    .if 0
4524    GET_WIDE_VREG %rax, rINSTq              # eax <- vA
4525    GET_WIDE_VREG %ecx, %rcx             # ecx <- vB
4526    .else
4527    GET_VREG %eax, rINSTq                   # eax <- vA
4528    GET_VREG %ecx, %rcx                  # ecx <- vB
4529    .endif
4530    testl   %ecx, %ecx
4531    jz      common_errDivideByZero
4532    cmpl  $-1, %ecx
4533    je      2f
4534    cdq                                    # rdx:rax <- sign-extended of rax
4535    idivl   %ecx
45361:
4537    .if 0
4538    SET_WIDE_VREG %edx, rINSTq           # vA <- result
4539    .else
4540    SET_VREG %edx, rINSTq                # vA <- result
4541    .endif
4542    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
45432:
4544    .if 1
4545    xorl %edx, %edx
4546    .else
4547    negl %edx
4548    .endif
4549    jmp     1b
4550
4551
4552/* ------------------------------ */
4553    .balign 128
4554.L_op_and_int_2addr: /* 0xb5 */
4555/* File: x86_64/op_and_int_2addr.S */
4556/* File: x86_64/binop2addr.S */
4557/*
4558 * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
4559 * that specifies an instruction that performs "result = r0 op r1".
4560 * This could be an instruction or a function call.
4561 *
4562 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4563 *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4564 *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4565 *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4566 */
4567    /* binop/2addr vA, vB */
4568    movl    rINST, %ecx                     # rcx <- A+
4569    sarl    $4, rINST                      # rINST <- B
4570    andb    $0xf, %cl                      # ecx <- A
4571    GET_VREG %eax, rINSTq                   # eax <- vB
4572    andl    %eax, (rFP,%rcx,4)                                  # for ex: addl   %eax,(rFP,%ecx,4)
4573    CLEAR_REF %rcx
4574    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4575
4576
4577/* ------------------------------ */
4578    .balign 128
4579.L_op_or_int_2addr: /* 0xb6 */
4580/* File: x86_64/op_or_int_2addr.S */
4581/* File: x86_64/binop2addr.S */
4582/*
4583 * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
4584 * that specifies an instruction that performs "result = r0 op r1".
4585 * This could be an instruction or a function call.
4586 *
4587 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4588 *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4589 *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4590 *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4591 */
4592    /* binop/2addr vA, vB */
4593    movl    rINST, %ecx                     # rcx <- A+
4594    sarl    $4, rINST                      # rINST <- B
4595    andb    $0xf, %cl                      # ecx <- A
4596    GET_VREG %eax, rINSTq                   # eax <- vB
4597    orl     %eax, (rFP,%rcx,4)                                  # for ex: addl   %eax,(rFP,%ecx,4)
4598    CLEAR_REF %rcx
4599    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4600
4601
4602/* ------------------------------ */
4603    .balign 128
4604.L_op_xor_int_2addr: /* 0xb7 */
4605/* File: x86_64/op_xor_int_2addr.S */
4606/* File: x86_64/binop2addr.S */
4607/*
4608 * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
4609 * that specifies an instruction that performs "result = r0 op r1".
4610 * This could be an instruction or a function call.
4611 *
4612 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4613 *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4614 *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4615 *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4616 */
4617    /* binop/2addr vA, vB */
4618    movl    rINST, %ecx                     # rcx <- A+
4619    sarl    $4, rINST                      # rINST <- B
4620    andb    $0xf, %cl                      # ecx <- A
4621    GET_VREG %eax, rINSTq                   # eax <- vB
4622    xorl    %eax, (rFP,%rcx,4)                                  # for ex: addl   %eax,(rFP,%ecx,4)
4623    CLEAR_REF %rcx
4624    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4625
4626
4627/* ------------------------------ */
4628    .balign 128
4629.L_op_shl_int_2addr: /* 0xb8 */
4630/* File: x86_64/op_shl_int_2addr.S */
4631/* File: x86_64/shop2addr.S */
4632/*
4633 * Generic 32-bit "shift/2addr" operation.
4634 */
4635    /* shift/2addr vA, vB */
4636    movl    rINST, %ecx                     # ecx <- BA
4637    sarl    $4, %ecx                       # ecx <- B
4638    GET_VREG %ecx, %rcx                     # ecx <- vBB
4639    andb    $0xf, rINSTbl                  # rINST <- A
4640    .if 0
4641    GET_WIDE_VREG %rax, rINSTq              # rax <- vAA
4642    sall    %cl, %eax                                  # ex: sarl %cl, %eax
4643    SET_WIDE_VREG %rax, rINSTq
4644    .else
4645    GET_VREG %eax, rINSTq                   # eax <- vAA
4646    sall    %cl, %eax                                  # ex: sarl %cl, %eax
4647    SET_VREG %eax, rINSTq
4648    .endif
4649    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4650
4651
4652/* ------------------------------ */
4653    .balign 128
4654.L_op_shr_int_2addr: /* 0xb9 */
4655/* File: x86_64/op_shr_int_2addr.S */
4656/* File: x86_64/shop2addr.S */
4657/*
4658 * Generic 32-bit "shift/2addr" operation.
4659 */
4660    /* shift/2addr vA, vB */
4661    movl    rINST, %ecx                     # ecx <- BA
4662    sarl    $4, %ecx                       # ecx <- B
4663    GET_VREG %ecx, %rcx                     # ecx <- vBB
4664    andb    $0xf, rINSTbl                  # rINST <- A
4665    .if 0
4666    GET_WIDE_VREG %rax, rINSTq              # rax <- vAA
4667    sarl    %cl, %eax                                  # ex: sarl %cl, %eax
4668    SET_WIDE_VREG %rax, rINSTq
4669    .else
4670    GET_VREG %eax, rINSTq                   # eax <- vAA
4671    sarl    %cl, %eax                                  # ex: sarl %cl, %eax
4672    SET_VREG %eax, rINSTq
4673    .endif
4674    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4675
4676
4677/* ------------------------------ */
4678    .balign 128
4679.L_op_ushr_int_2addr: /* 0xba */
4680/* File: x86_64/op_ushr_int_2addr.S */
4681/* File: x86_64/shop2addr.S */
4682/*
4683 * Generic 32-bit "shift/2addr" operation.
4684 */
4685    /* shift/2addr vA, vB */
4686    movl    rINST, %ecx                     # ecx <- BA
4687    sarl    $4, %ecx                       # ecx <- B
4688    GET_VREG %ecx, %rcx                     # ecx <- vBB
4689    andb    $0xf, rINSTbl                  # rINST <- A
4690    .if 0
4691    GET_WIDE_VREG %rax, rINSTq              # rax <- vAA
4692    shrl    %cl, %eax                                  # ex: sarl %cl, %eax
4693    SET_WIDE_VREG %rax, rINSTq
4694    .else
4695    GET_VREG %eax, rINSTq                   # eax <- vAA
4696    shrl    %cl, %eax                                  # ex: sarl %cl, %eax
4697    SET_VREG %eax, rINSTq
4698    .endif
4699    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4700
4701
4702/* ------------------------------ */
4703    .balign 128
4704.L_op_add_long_2addr: /* 0xbb */
4705/* File: x86_64/op_add_long_2addr.S */
4706/* File: x86_64/binopWide2addr.S */
4707/*
4708 * Generic 64-bit binary operation.
4709 */
4710    /* binop/2addr vA, vB */
4711    movl    rINST, %ecx                     # rcx <- A+
4712    sarl    $4, rINST                      # rINST <- B
4713    andb    $0xf, %cl                      # ecx <- A
4714    GET_WIDE_VREG %rax, rINSTq              # rax <- vB
4715    addq    %rax, (rFP,%rcx,4)                                  # for ex: addq   %rax,(rFP,%rcx,4)
4716    CLEAR_WIDE_REF %rcx
4717    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4718
4719
4720/* ------------------------------ */
4721    .balign 128
4722.L_op_sub_long_2addr: /* 0xbc */
4723/* File: x86_64/op_sub_long_2addr.S */
4724/* File: x86_64/binopWide2addr.S */
4725/*
4726 * Generic 64-bit binary operation.
4727 */
4728    /* binop/2addr vA, vB */
4729    movl    rINST, %ecx                     # rcx <- A+
4730    sarl    $4, rINST                      # rINST <- B
4731    andb    $0xf, %cl                      # ecx <- A
4732    GET_WIDE_VREG %rax, rINSTq              # rax <- vB
4733    subq    %rax, (rFP,%rcx,4)                                  # for ex: addq   %rax,(rFP,%rcx,4)
4734    CLEAR_WIDE_REF %rcx
4735    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4736
4737
4738/* ------------------------------ */
4739    .balign 128
4740.L_op_mul_long_2addr: /* 0xbd */
4741/* File: x86_64/op_mul_long_2addr.S */
4742    /* mul vA, vB */
4743    movl    rINST, %ecx                     # rcx <- A+
4744    sarl    $4, rINST                      # rINST <- B
4745    andb    $0xf, %cl                      # ecx <- A
4746    GET_WIDE_VREG %rax, %rcx                # rax <- vA
4747    imulq   (rFP,rINSTq,4), %rax
4748    SET_WIDE_VREG %rax, %rcx
4749    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4750
4751/* ------------------------------ */
4752    .balign 128
4753.L_op_div_long_2addr: /* 0xbe */
4754/* File: x86_64/op_div_long_2addr.S */
4755/* File: x86_64/bindiv2addr.S */
4756/*
4757 * 32-bit binary div/rem operation.  Handles special case of op1=-1.
4758 */
4759    /* div/rem/2addr vA, vB */
4760    movl    rINST, %ecx                     # rcx <- BA
4761    sarl    $4, %ecx                       # rcx <- B
4762    andb    $0xf, rINSTbl                  # rINST <- A
4763    .if 1
4764    GET_WIDE_VREG %rax, rINSTq              # eax <- vA
4765    GET_WIDE_VREG %rcx, %rcx             # ecx <- vB
4766    .else
4767    GET_VREG %eax, rINSTq                   # eax <- vA
4768    GET_VREG %rcx, %rcx                  # ecx <- vB
4769    .endif
4770    testq   %rcx, %rcx
4771    jz      common_errDivideByZero
4772    cmpq  $-1, %rcx
4773    je      2f
4774    cqo                                    # rdx:rax <- sign-extended of rax
4775    idivq   %rcx
47761:
4777    .if 1
4778    SET_WIDE_VREG %rax, rINSTq           # vA <- result
4779    .else
4780    SET_VREG %rax, rINSTq                # vA <- result
4781    .endif
4782    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
47832:
4784    .if 0
4785    xorq %rax, %rax
4786    .else
4787    negq %rax
4788    .endif
4789    jmp     1b
4790
4791
4792/* ------------------------------ */
4793    .balign 128
4794.L_op_rem_long_2addr: /* 0xbf */
4795/* File: x86_64/op_rem_long_2addr.S */
4796/* File: x86_64/bindiv2addr.S */
4797/*
4798 * 32-bit binary div/rem operation.  Handles special case of op1=-1.
4799 */
4800    /* div/rem/2addr vA, vB */
4801    movl    rINST, %ecx                     # rcx <- BA
4802    sarl    $4, %ecx                       # rcx <- B
4803    andb    $0xf, rINSTbl                  # rINST <- A
4804    .if 1
4805    GET_WIDE_VREG %rax, rINSTq              # eax <- vA
4806    GET_WIDE_VREG %rcx, %rcx             # ecx <- vB
4807    .else
4808    GET_VREG %eax, rINSTq                   # eax <- vA
4809    GET_VREG %rcx, %rcx                  # ecx <- vB
4810    .endif
4811    testq   %rcx, %rcx
4812    jz      common_errDivideByZero
4813    cmpq  $-1, %rcx
4814    je      2f
4815    cqo                                    # rdx:rax <- sign-extended of rax
4816    idivq   %rcx
48171:
4818    .if 1
4819    SET_WIDE_VREG %rdx, rINSTq           # vA <- result
4820    .else
4821    SET_VREG %rdx, rINSTq                # vA <- result
4822    .endif
4823    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
48242:
4825    .if 1
4826    xorq %rdx, %rdx
4827    .else
4828    negq %rdx
4829    .endif
4830    jmp     1b
4831
4832
4833/* ------------------------------ */
4834    .balign 128
4835.L_op_and_long_2addr: /* 0xc0 */
4836/* File: x86_64/op_and_long_2addr.S */
4837/* File: x86_64/binopWide2addr.S */
4838/*
4839 * Generic 64-bit binary operation.
4840 */
4841    /* binop/2addr vA, vB */
4842    movl    rINST, %ecx                     # rcx <- A+
4843    sarl    $4, rINST                      # rINST <- B
4844    andb    $0xf, %cl                      # ecx <- A
4845    GET_WIDE_VREG %rax, rINSTq              # rax <- vB
4846    andq    %rax, (rFP,%rcx,4)                                  # for ex: addq   %rax,(rFP,%rcx,4)
4847    CLEAR_WIDE_REF %rcx
4848    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4849
4850
4851/* ------------------------------ */
4852    .balign 128
4853.L_op_or_long_2addr: /* 0xc1 */
4854/* File: x86_64/op_or_long_2addr.S */
4855/* File: x86_64/binopWide2addr.S */
4856/*
4857 * Generic 64-bit binary operation.
4858 */
4859    /* binop/2addr vA, vB */
4860    movl    rINST, %ecx                     # rcx <- A+
4861    sarl    $4, rINST                      # rINST <- B
4862    andb    $0xf, %cl                      # ecx <- A
4863    GET_WIDE_VREG %rax, rINSTq              # rax <- vB
4864    orq     %rax, (rFP,%rcx,4)                                  # for ex: addq   %rax,(rFP,%rcx,4)
4865    CLEAR_WIDE_REF %rcx
4866    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4867
4868
4869/* ------------------------------ */
4870    .balign 128
4871.L_op_xor_long_2addr: /* 0xc2 */
4872/* File: x86_64/op_xor_long_2addr.S */
4873/* File: x86_64/binopWide2addr.S */
4874/*
4875 * Generic 64-bit binary operation.
4876 */
4877    /* binop/2addr vA, vB */
4878    movl    rINST, %ecx                     # rcx <- A+
4879    sarl    $4, rINST                      # rINST <- B
4880    andb    $0xf, %cl                      # ecx <- A
4881    GET_WIDE_VREG %rax, rINSTq              # rax <- vB
4882    xorq    %rax, (rFP,%rcx,4)                                  # for ex: addq   %rax,(rFP,%rcx,4)
4883    CLEAR_WIDE_REF %rcx
4884    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4885
4886
4887/* ------------------------------ */
4888    .balign 128
4889.L_op_shl_long_2addr: /* 0xc3 */
4890/* File: x86_64/op_shl_long_2addr.S */
4891/* File: x86_64/shop2addr.S */
4892/*
4893 * Generic 32-bit "shift/2addr" operation.
4894 */
4895    /* shift/2addr vA, vB */
4896    movl    rINST, %ecx                     # ecx <- BA
4897    sarl    $4, %ecx                       # ecx <- B
4898    GET_VREG %ecx, %rcx                     # ecx <- vBB
4899    andb    $0xf, rINSTbl                  # rINST <- A
4900    .if 1
4901    GET_WIDE_VREG %rax, rINSTq              # rax <- vAA
4902    salq    %cl, %rax                                  # ex: sarl %cl, %eax
4903    SET_WIDE_VREG %rax, rINSTq
4904    .else
4905    GET_VREG %eax, rINSTq                   # eax <- vAA
4906    salq    %cl, %rax                                  # ex: sarl %cl, %eax
4907    SET_VREG %eax, rINSTq
4908    .endif
4909    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4910
4911
4912/* ------------------------------ */
4913    .balign 128
4914.L_op_shr_long_2addr: /* 0xc4 */
4915/* File: x86_64/op_shr_long_2addr.S */
4916/* File: x86_64/shop2addr.S */
4917/*
4918 * Generic 32-bit "shift/2addr" operation.
4919 */
4920    /* shift/2addr vA, vB */
4921    movl    rINST, %ecx                     # ecx <- BA
4922    sarl    $4, %ecx                       # ecx <- B
4923    GET_VREG %ecx, %rcx                     # ecx <- vBB
4924    andb    $0xf, rINSTbl                  # rINST <- A
4925    .if 1
4926    GET_WIDE_VREG %rax, rINSTq              # rax <- vAA
4927    sarq    %cl, %rax                                  # ex: sarl %cl, %eax
4928    SET_WIDE_VREG %rax, rINSTq
4929    .else
4930    GET_VREG %eax, rINSTq                   # eax <- vAA
4931    sarq    %cl, %rax                                  # ex: sarl %cl, %eax
4932    SET_VREG %eax, rINSTq
4933    .endif
4934    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4935
4936
4937/* ------------------------------ */
4938    .balign 128
4939.L_op_ushr_long_2addr: /* 0xc5 */
4940/* File: x86_64/op_ushr_long_2addr.S */
4941/* File: x86_64/shop2addr.S */
4942/*
4943 * Generic 32-bit "shift/2addr" operation.
4944 */
4945    /* shift/2addr vA, vB */
4946    movl    rINST, %ecx                     # ecx <- BA
4947    sarl    $4, %ecx                       # ecx <- B
4948    GET_VREG %ecx, %rcx                     # ecx <- vBB
4949    andb    $0xf, rINSTbl                  # rINST <- A
4950    .if 1
4951    GET_WIDE_VREG %rax, rINSTq              # rax <- vAA
4952    shrq    %cl, %rax                                  # ex: sarl %cl, %eax
4953    SET_WIDE_VREG %rax, rINSTq
4954    .else
4955    GET_VREG %eax, rINSTq                   # eax <- vAA
4956    shrq    %cl, %rax                                  # ex: sarl %cl, %eax
4957    SET_VREG %eax, rINSTq
4958    .endif
4959    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4960
4961
4962/* ------------------------------ */
4963    .balign 128
4964.L_op_add_float_2addr: /* 0xc6 */
4965/* File: x86_64/op_add_float_2addr.S */
4966/* File: x86_64/sseBinop2Addr.S */
4967    movl    rINST, %ecx                     # ecx <- A+
4968    andl    $0xf, %ecx                     # ecx <- A
4969    movss VREG_ADDRESS(%rcx), %xmm0        # %xmm0 <- 1st src
4970    sarl    $4, rINST                      # rINST<- B
4971    addss VREG_ADDRESS(rINSTq), %xmm0
4972    movss %xmm0, VREG_ADDRESS(%rcx)   # vAA<- %xmm0
4973    pxor    %xmm0, %xmm0
4974    movss %xmm0, VREG_REF_ADDRESS(rINSTq)  # clear ref
4975    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4976
4977
4978/* ------------------------------ */
4979    .balign 128
4980.L_op_sub_float_2addr: /* 0xc7 */
4981/* File: x86_64/op_sub_float_2addr.S */
4982/* File: x86_64/sseBinop2Addr.S */
4983    movl    rINST, %ecx                     # ecx <- A+
4984    andl    $0xf, %ecx                     # ecx <- A
4985    movss VREG_ADDRESS(%rcx), %xmm0        # %xmm0 <- 1st src
4986    sarl    $4, rINST                      # rINST<- B
4987    subss VREG_ADDRESS(rINSTq), %xmm0
4988    movss %xmm0, VREG_ADDRESS(%rcx)   # vAA<- %xmm0
4989    pxor    %xmm0, %xmm0
4990    movss %xmm0, VREG_REF_ADDRESS(rINSTq)  # clear ref
4991    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4992
4993
4994/* ------------------------------ */
4995    .balign 128
4996.L_op_mul_float_2addr: /* 0xc8 */
4997/* File: x86_64/op_mul_float_2addr.S */
4998/* File: x86_64/sseBinop2Addr.S */
4999    movl    rINST, %ecx                     # ecx <- A+
5000    andl    $0xf, %ecx                     # ecx <- A
5001    movss VREG_ADDRESS(%rcx), %xmm0        # %xmm0 <- 1st src
5002    sarl    $4, rINST                      # rINST<- B
5003    mulss VREG_ADDRESS(rINSTq), %xmm0
5004    movss %xmm0, VREG_ADDRESS(%rcx)   # vAA<- %xmm0
5005    pxor    %xmm0, %xmm0
5006    movss %xmm0, VREG_REF_ADDRESS(rINSTq)  # clear ref
5007    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
5008
5009
5010/* ------------------------------ */
5011    .balign 128
5012.L_op_div_float_2addr: /* 0xc9 */
5013/* File: x86_64/op_div_float_2addr.S */
5014/* File: x86_64/sseBinop2Addr.S */
5015    movl    rINST, %ecx                     # ecx <- A+
5016    andl    $0xf, %ecx                     # ecx <- A
5017    movss VREG_ADDRESS(%rcx), %xmm0        # %xmm0 <- 1st src
5018    sarl    $4, rINST                      # rINST<- B
5019    divss VREG_ADDRESS(rINSTq), %xmm0
5020    movss %xmm0, VREG_ADDRESS(%rcx)   # vAA<- %xmm0
5021    pxor    %xmm0, %xmm0
5022    movss %xmm0, VREG_REF_ADDRESS(rINSTq)  # clear ref
5023    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
5024
5025
5026/* ------------------------------ */
5027    .balign 128
5028.L_op_rem_float_2addr: /* 0xca */
5029/* File: x86_64/op_rem_float_2addr.S */
5030    /* rem_float/2addr vA, vB */
5031    movzbq  rINSTbl, %rcx                   # ecx <- A+
5032    sarl    $4, rINST                      # rINST <- B
5033    flds    VREG_ADDRESS(rINSTq)            # vB to fp stack
5034    andb    $0xf, %cl                      # ecx <- A
5035    flds    VREG_ADDRESS(%rcx)              # vA to fp stack
50361:
5037    fprem
5038    fstsw   %ax
5039    sahf
5040    jp      1b
5041    fstp    %st(1)
5042    fstps   VREG_ADDRESS(%rcx)              # %st to vA
5043    CLEAR_REF %rcx
5044    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
5045
5046/* ------------------------------ */
5047    .balign 128
5048.L_op_add_double_2addr: /* 0xcb */
5049/* File: x86_64/op_add_double_2addr.S */
5050/* File: x86_64/sseBinop2Addr.S */
5051    movl    rINST, %ecx                     # ecx <- A+
5052    andl    $0xf, %ecx                     # ecx <- A
5053    movsd VREG_ADDRESS(%rcx), %xmm0        # %xmm0 <- 1st src
5054    sarl    $4, rINST                      # rINST<- B
5055    addsd VREG_ADDRESS(rINSTq), %xmm0
5056    movsd %xmm0, VREG_ADDRESS(%rcx)   # vAA<- %xmm0
5057    pxor    %xmm0, %xmm0
5058    movsd %xmm0, VREG_REF_ADDRESS(rINSTq)  # clear ref
5059    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
5060
5061
5062/* ------------------------------ */
5063    .balign 128
5064.L_op_sub_double_2addr: /* 0xcc */
5065/* File: x86_64/op_sub_double_2addr.S */
5066/* File: x86_64/sseBinop2Addr.S */
5067    movl    rINST, %ecx                     # ecx <- A+
5068    andl    $0xf, %ecx                     # ecx <- A
5069    movsd VREG_ADDRESS(%rcx), %xmm0        # %xmm0 <- 1st src
5070    sarl    $4, rINST                      # rINST<- B
5071    subsd VREG_ADDRESS(rINSTq), %xmm0
5072    movsd %xmm0, VREG_ADDRESS(%rcx)   # vAA<- %xmm0
5073    pxor    %xmm0, %xmm0
5074    movsd %xmm0, VREG_REF_ADDRESS(rINSTq)  # clear ref
5075    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
5076
5077
5078/* ------------------------------ */
5079    .balign 128
5080.L_op_mul_double_2addr: /* 0xcd */
5081/* File: x86_64/op_mul_double_2addr.S */
5082/* File: x86_64/sseBinop2Addr.S */
5083    movl    rINST, %ecx                     # ecx <- A+
5084    andl    $0xf, %ecx                     # ecx <- A
5085    movsd VREG_ADDRESS(%rcx), %xmm0        # %xmm0 <- 1st src
5086    sarl    $4, rINST                      # rINST<- B
5087    mulsd VREG_ADDRESS(rINSTq), %xmm0
5088    movsd %xmm0, VREG_ADDRESS(%rcx)   # vAA<- %xmm0
5089    pxor    %xmm0, %xmm0
5090    movsd %xmm0, VREG_REF_ADDRESS(rINSTq)  # clear ref
5091    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
5092
5093
5094/* ------------------------------ */
5095    .balign 128
5096.L_op_div_double_2addr: /* 0xce */
5097/* File: x86_64/op_div_double_2addr.S */
5098/* File: x86_64/sseBinop2Addr.S */
5099    movl    rINST, %ecx                     # ecx <- A+
5100    andl    $0xf, %ecx                     # ecx <- A
5101    movsd VREG_ADDRESS(%rcx), %xmm0        # %xmm0 <- 1st src
5102    sarl    $4, rINST                      # rINST<- B
5103    divsd VREG_ADDRESS(rINSTq), %xmm0
5104    movsd %xmm0, VREG_ADDRESS(%rcx)   # vAA<- %xmm0
5105    pxor    %xmm0, %xmm0
5106    movsd %xmm0, VREG_REF_ADDRESS(rINSTq)  # clear ref
5107    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
5108
5109
5110/* ------------------------------ */
5111    .balign 128
5112.L_op_rem_double_2addr: /* 0xcf */
5113/* File: x86_64/op_rem_double_2addr.S */
5114    /* rem_double/2addr vA, vB */
5115    movzbq  rINSTbl, %rcx                   # ecx <- A+
5116    sarl    $4, rINST                      # rINST <- B
5117    fldl    VREG_ADDRESS(rINSTq)            # vB to fp stack
5118    andb    $0xf, %cl                      # ecx <- A
5119    fldl    VREG_ADDRESS(%rcx)              # vA to fp stack
51201:
5121    fprem
5122    fstsw   %ax
5123    sahf
5124    jp      1b
5125    fstp    %st(1)
5126    fstpl   VREG_ADDRESS(%rcx)              # %st to vA
5127    CLEAR_WIDE_REF %rcx
5128    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
5129
5130/* ------------------------------ */
5131    .balign 128
5132.L_op_add_int_lit16: /* 0xd0 */
5133/* File: x86_64/op_add_int_lit16.S */
5134/* File: x86_64/binopLit16.S */
5135/*
5136 * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
5137 * that specifies an instruction that performs "result = eax op ecx".
5138 * This could be an x86 instruction or a function call.  (If the result
5139 * comes back in a register other than eax, you can override "result".)
5140 *
5141 * For: add-int/lit16, rsub-int,
5142 *      and-int/lit16, or-int/lit16, xor-int/lit16
5143 */
5144    /* binop/lit16 vA, vB, #+CCCC */
5145    movl    rINST, %eax                     # rax <- 000000BA
5146    sarl    $4, %eax                       # eax <- B
5147    GET_VREG %eax, %rax                     # eax <- vB
5148    andb    $0xf, rINSTbl                  # rINST <- A
5149    movswl  2(rPC), %ecx                    # ecx <- ssssCCCC
5150    addl    %ecx, %eax                                  # for example: addl %ecx, %eax
5151    SET_VREG %eax, rINSTq
5152    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5153
5154
5155/* ------------------------------ */
5156    .balign 128
5157.L_op_rsub_int: /* 0xd1 */
5158/* File: x86_64/op_rsub_int.S */
5159/* this op is "rsub-int", but can be thought of as "rsub-int/lit16" */
5160/* File: x86_64/binopLit16.S */
5161/*
5162 * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
5163 * that specifies an instruction that performs "result = eax op ecx".
5164 * This could be an x86 instruction or a function call.  (If the result
5165 * comes back in a register other than eax, you can override "result".)
5166 *
5167 * For: add-int/lit16, rsub-int,
5168 *      and-int/lit16, or-int/lit16, xor-int/lit16
5169 */
5170    /* binop/lit16 vA, vB, #+CCCC */
5171    movl    rINST, %eax                     # rax <- 000000BA
5172    sarl    $4, %eax                       # eax <- B
5173    GET_VREG %eax, %rax                     # eax <- vB
5174    andb    $0xf, rINSTbl                  # rINST <- A
5175    movswl  2(rPC), %ecx                    # ecx <- ssssCCCC
5176    subl    %eax, %ecx                                  # for example: addl %ecx, %eax
5177    SET_VREG %ecx, rINSTq
5178    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5179
5180
5181/* ------------------------------ */
5182    .balign 128
5183.L_op_mul_int_lit16: /* 0xd2 */
5184/* File: x86_64/op_mul_int_lit16.S */
5185/* File: x86_64/binopLit16.S */
5186/*
5187 * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
5188 * that specifies an instruction that performs "result = eax op ecx".
5189 * This could be an x86 instruction or a function call.  (If the result
5190 * comes back in a register other than eax, you can override "result".)
5191 *
5192 * For: add-int/lit16, rsub-int,
5193 *      and-int/lit16, or-int/lit16, xor-int/lit16
5194 */
5195    /* binop/lit16 vA, vB, #+CCCC */
5196    movl    rINST, %eax                     # rax <- 000000BA
5197    sarl    $4, %eax                       # eax <- B
5198    GET_VREG %eax, %rax                     # eax <- vB
5199    andb    $0xf, rINSTbl                  # rINST <- A
5200    movswl  2(rPC), %ecx                    # ecx <- ssssCCCC
5201    imull   %ecx, %eax                                  # for example: addl %ecx, %eax
5202    SET_VREG %eax, rINSTq
5203    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5204
5205
5206/* ------------------------------ */
5207    .balign 128
5208.L_op_div_int_lit16: /* 0xd3 */
5209/* File: x86_64/op_div_int_lit16.S */
5210/* File: x86_64/bindivLit16.S */
5211/*
5212 * 32-bit binary div/rem operation.  Handles special case of op1=-1.
5213 */
5214    /* div/rem/lit16 vA, vB, #+CCCC */
5215    /* Need A in rINST, ssssCCCC in ecx, vB in eax */
5216    movl    rINST, %eax                     # rax <- 000000BA
5217    sarl    $4, %eax                       # eax <- B
5218    GET_VREG %eax, %rax                     # eax <- vB
5219    movswl  2(rPC), %ecx                    # ecx <- ssssCCCC
5220    andb    $0xf, rINSTbl                  # rINST <- A
5221    testl   %ecx, %ecx
5222    jz      common_errDivideByZero
5223    cmpl    $-1, %ecx
5224    je      2f
5225    cdq                                     # rax <- sign-extended of eax
5226    idivl   %ecx
52271:
5228    SET_VREG %eax, rINSTq                # vA <- result
5229    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
52302:
5231    .if 0
5232    xorl    %eax, %eax
5233    .else
5234    negl    %eax
5235    .endif
5236    jmp     1b
5237
5238
5239/* ------------------------------ */
5240    .balign 128
5241.L_op_rem_int_lit16: /* 0xd4 */
5242/* File: x86_64/op_rem_int_lit16.S */
5243/* File: x86_64/bindivLit16.S */
5244/*
5245 * 32-bit binary div/rem operation.  Handles special case of op1=-1.
5246 */
5247    /* div/rem/lit16 vA, vB, #+CCCC */
5248    /* Need A in rINST, ssssCCCC in ecx, vB in eax */
5249    movl    rINST, %eax                     # rax <- 000000BA
5250    sarl    $4, %eax                       # eax <- B
5251    GET_VREG %eax, %rax                     # eax <- vB
5252    movswl  2(rPC), %ecx                    # ecx <- ssssCCCC
5253    andb    $0xf, rINSTbl                  # rINST <- A
5254    testl   %ecx, %ecx
5255    jz      common_errDivideByZero
5256    cmpl    $-1, %ecx
5257    je      2f
5258    cdq                                     # rax <- sign-extended of eax
5259    idivl   %ecx
52601:
5261    SET_VREG %edx, rINSTq                # vA <- result
5262    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
52632:
5264    .if 1
5265    xorl    %edx, %edx
5266    .else
5267    negl    %edx
5268    .endif
5269    jmp     1b
5270
5271
5272/* ------------------------------ */
5273    .balign 128
5274.L_op_and_int_lit16: /* 0xd5 */
5275/* File: x86_64/op_and_int_lit16.S */
5276/* File: x86_64/binopLit16.S */
5277/*
5278 * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
5279 * that specifies an instruction that performs "result = eax op ecx".
5280 * This could be an x86 instruction or a function call.  (If the result
5281 * comes back in a register other than eax, you can override "result".)
5282 *
5283 * For: add-int/lit16, rsub-int,
5284 *      and-int/lit16, or-int/lit16, xor-int/lit16
5285 */
5286    /* binop/lit16 vA, vB, #+CCCC */
5287    movl    rINST, %eax                     # rax <- 000000BA
5288    sarl    $4, %eax                       # eax <- B
5289    GET_VREG %eax, %rax                     # eax <- vB
5290    andb    $0xf, rINSTbl                  # rINST <- A
5291    movswl  2(rPC), %ecx                    # ecx <- ssssCCCC
5292    andl    %ecx, %eax                                  # for example: addl %ecx, %eax
5293    SET_VREG %eax, rINSTq
5294    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5295
5296
5297/* ------------------------------ */
5298    .balign 128
5299.L_op_or_int_lit16: /* 0xd6 */
5300/* File: x86_64/op_or_int_lit16.S */
5301/* File: x86_64/binopLit16.S */
5302/*
5303 * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
5304 * that specifies an instruction that performs "result = eax op ecx".
5305 * This could be an x86 instruction or a function call.  (If the result
5306 * comes back in a register other than eax, you can override "result".)
5307 *
5308 * For: add-int/lit16, rsub-int,
5309 *      and-int/lit16, or-int/lit16, xor-int/lit16
5310 */
5311    /* binop/lit16 vA, vB, #+CCCC */
5312    movl    rINST, %eax                     # rax <- 000000BA
5313    sarl    $4, %eax                       # eax <- B
5314    GET_VREG %eax, %rax                     # eax <- vB
5315    andb    $0xf, rINSTbl                  # rINST <- A
5316    movswl  2(rPC), %ecx                    # ecx <- ssssCCCC
5317    orl     %ecx, %eax                                  # for example: addl %ecx, %eax
5318    SET_VREG %eax, rINSTq
5319    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5320
5321
5322/* ------------------------------ */
5323    .balign 128
5324.L_op_xor_int_lit16: /* 0xd7 */
5325/* File: x86_64/op_xor_int_lit16.S */
5326/* File: x86_64/binopLit16.S */
5327/*
5328 * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
5329 * that specifies an instruction that performs "result = eax op ecx".
5330 * This could be an x86 instruction or a function call.  (If the result
5331 * comes back in a register other than eax, you can override "result".)
5332 *
5333 * For: add-int/lit16, rsub-int,
5334 *      and-int/lit16, or-int/lit16, xor-int/lit16
5335 */
5336    /* binop/lit16 vA, vB, #+CCCC */
5337    movl    rINST, %eax                     # rax <- 000000BA
5338    sarl    $4, %eax                       # eax <- B
5339    GET_VREG %eax, %rax                     # eax <- vB
5340    andb    $0xf, rINSTbl                  # rINST <- A
5341    movswl  2(rPC), %ecx                    # ecx <- ssssCCCC
5342    xorl    %ecx, %eax                                  # for example: addl %ecx, %eax
5343    SET_VREG %eax, rINSTq
5344    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5345
5346
5347/* ------------------------------ */
5348    .balign 128
5349.L_op_add_int_lit8: /* 0xd8 */
5350/* File: x86_64/op_add_int_lit8.S */
5351/* File: x86_64/binopLit8.S */
5352/*
5353 * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
5354 * that specifies an instruction that performs "result = eax op ecx".
5355 * This could be an x86 instruction or a function call.  (If the result
5356 * comes back in a register other than r0, you can override "result".)
5357 *
5358 * For: add-int/lit8, rsub-int/lit8
5359 *      and-int/lit8, or-int/lit8, xor-int/lit8,
5360 *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
5361 */
5362    /* binop/lit8 vAA, vBB, #+CC */
5363    movzbq  2(rPC), %rax                    # rax <- BB
5364    movsbl  3(rPC), %ecx                    # rcx <- ssssssCC
5365    GET_VREG %eax, %rax                     # eax <- rBB
5366    addl    %ecx, %eax                                  # ex: addl %ecx,%eax
5367    SET_VREG %eax, rINSTq
5368    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5369
5370
5371/* ------------------------------ */
5372    .balign 128
5373.L_op_rsub_int_lit8: /* 0xd9 */
5374/* File: x86_64/op_rsub_int_lit8.S */
5375/* File: x86_64/binopLit8.S */
5376/*
5377 * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
5378 * that specifies an instruction that performs "result = eax op ecx".
5379 * This could be an x86 instruction or a function call.  (If the result
5380 * comes back in a register other than r0, you can override "result".)
5381 *
5382 * For: add-int/lit8, rsub-int/lit8
5383 *      and-int/lit8, or-int/lit8, xor-int/lit8,
5384 *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
5385 */
5386    /* binop/lit8 vAA, vBB, #+CC */
5387    movzbq  2(rPC), %rax                    # rax <- BB
5388    movsbl  3(rPC), %ecx                    # rcx <- ssssssCC
5389    GET_VREG %eax, %rax                     # eax <- rBB
5390    subl    %eax, %ecx                                  # ex: addl %ecx,%eax
5391    SET_VREG %ecx, rINSTq
5392    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5393
5394
5395/* ------------------------------ */
5396    .balign 128
5397.L_op_mul_int_lit8: /* 0xda */
5398/* File: x86_64/op_mul_int_lit8.S */
5399/* File: x86_64/binopLit8.S */
5400/*
5401 * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
5402 * that specifies an instruction that performs "result = eax op ecx".
5403 * This could be an x86 instruction or a function call.  (If the result
5404 * comes back in a register other than r0, you can override "result".)
5405 *
5406 * For: add-int/lit8, rsub-int/lit8
5407 *      and-int/lit8, or-int/lit8, xor-int/lit8,
5408 *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
5409 */
5410    /* binop/lit8 vAA, vBB, #+CC */
5411    movzbq  2(rPC), %rax                    # rax <- BB
5412    movsbl  3(rPC), %ecx                    # rcx <- ssssssCC
5413    GET_VREG %eax, %rax                     # eax <- rBB
5414    imull   %ecx, %eax                                  # ex: addl %ecx,%eax
5415    SET_VREG %eax, rINSTq
5416    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5417
5418
5419/* ------------------------------ */
5420    .balign 128
5421.L_op_div_int_lit8: /* 0xdb */
5422/* File: x86_64/op_div_int_lit8.S */
5423/* File: x86_64/bindivLit8.S */
5424/*
5425 * 32-bit div/rem "lit8" binary operation.  Handles special case of
5426 * op0=minint & op1=-1
5427 */
5428    /* div/rem/lit8 vAA, vBB, #+CC */
5429    movzbq  2(rPC), %rax                    # eax <- BB
5430    movsbl  3(rPC), %ecx                    # ecx <- ssssssCC
5431    GET_VREG  %eax, %rax                    # eax <- rBB
5432    testl   %ecx, %ecx
5433    je      common_errDivideByZero
5434    cmpl    $-1, %ecx
5435    je      2f
5436    cdq                                     # rax <- sign-extended of eax
5437    idivl   %ecx
54381:
5439    SET_VREG %eax, rINSTq                # vA <- result
5440    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
54412:
5442    .if 0
5443    xorl    %eax, %eax
5444    .else
5445    negl    %eax
5446    .endif
5447    jmp     1b
5448
5449
5450/* ------------------------------ */
5451    .balign 128
5452.L_op_rem_int_lit8: /* 0xdc */
5453/* File: x86_64/op_rem_int_lit8.S */
5454/* File: x86_64/bindivLit8.S */
5455/*
5456 * 32-bit div/rem "lit8" binary operation.  Handles special case of
5457 * op0=minint & op1=-1
5458 */
5459    /* div/rem/lit8 vAA, vBB, #+CC */
5460    movzbq  2(rPC), %rax                    # eax <- BB
5461    movsbl  3(rPC), %ecx                    # ecx <- ssssssCC
5462    GET_VREG  %eax, %rax                    # eax <- rBB
5463    testl   %ecx, %ecx
5464    je      common_errDivideByZero
5465    cmpl    $-1, %ecx
5466    je      2f
5467    cdq                                     # rax <- sign-extended of eax
5468    idivl   %ecx
54691:
5470    SET_VREG %edx, rINSTq                # vA <- result
5471    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
54722:
5473    .if 1
5474    xorl    %edx, %edx
5475    .else
5476    negl    %edx
5477    .endif
5478    jmp     1b
5479
5480
5481/* ------------------------------ */
5482    .balign 128
5483.L_op_and_int_lit8: /* 0xdd */
5484/* File: x86_64/op_and_int_lit8.S */
5485/* File: x86_64/binopLit8.S */
5486/*
5487 * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
5488 * that specifies an instruction that performs "result = eax op ecx".
5489 * This could be an x86 instruction or a function call.  (If the result
5490 * comes back in a register other than r0, you can override "result".)
5491 *
5492 * For: add-int/lit8, rsub-int/lit8
5493 *      and-int/lit8, or-int/lit8, xor-int/lit8,
5494 *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
5495 */
5496    /* binop/lit8 vAA, vBB, #+CC */
5497    movzbq  2(rPC), %rax                    # rax <- BB
5498    movsbl  3(rPC), %ecx                    # rcx <- ssssssCC
5499    GET_VREG %eax, %rax                     # eax <- rBB
5500    andl    %ecx, %eax                                  # ex: addl %ecx,%eax
5501    SET_VREG %eax, rINSTq
5502    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5503
5504
5505/* ------------------------------ */
5506    .balign 128
5507.L_op_or_int_lit8: /* 0xde */
5508/* File: x86_64/op_or_int_lit8.S */
5509/* File: x86_64/binopLit8.S */
5510/*
5511 * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
5512 * that specifies an instruction that performs "result = eax op ecx".
5513 * This could be an x86 instruction or a function call.  (If the result
5514 * comes back in a register other than r0, you can override "result".)
5515 *
5516 * For: add-int/lit8, rsub-int/lit8
5517 *      and-int/lit8, or-int/lit8, xor-int/lit8,
5518 *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
5519 */
5520    /* binop/lit8 vAA, vBB, #+CC */
5521    movzbq  2(rPC), %rax                    # rax <- BB
5522    movsbl  3(rPC), %ecx                    # rcx <- ssssssCC
5523    GET_VREG %eax, %rax                     # eax <- rBB
5524    orl     %ecx, %eax                                  # ex: addl %ecx,%eax
5525    SET_VREG %eax, rINSTq
5526    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5527
5528
5529/* ------------------------------ */
5530    .balign 128
5531.L_op_xor_int_lit8: /* 0xdf */
5532/* File: x86_64/op_xor_int_lit8.S */
5533/* File: x86_64/binopLit8.S */
5534/*
5535 * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
5536 * that specifies an instruction that performs "result = eax op ecx".
5537 * This could be an x86 instruction or a function call.  (If the result
5538 * comes back in a register other than r0, you can override "result".)
5539 *
5540 * For: add-int/lit8, rsub-int/lit8
5541 *      and-int/lit8, or-int/lit8, xor-int/lit8,
5542 *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
5543 */
5544    /* binop/lit8 vAA, vBB, #+CC */
5545    movzbq  2(rPC), %rax                    # rax <- BB
5546    movsbl  3(rPC), %ecx                    # rcx <- ssssssCC
5547    GET_VREG %eax, %rax                     # eax <- rBB
5548    xorl    %ecx, %eax                                  # ex: addl %ecx,%eax
5549    SET_VREG %eax, rINSTq
5550    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5551
5552
5553/* ------------------------------ */
5554    .balign 128
5555.L_op_shl_int_lit8: /* 0xe0 */
5556/* File: x86_64/op_shl_int_lit8.S */
5557/* File: x86_64/binopLit8.S */
5558/*
5559 * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
5560 * that specifies an instruction that performs "result = eax op ecx".
5561 * This could be an x86 instruction or a function call.  (If the result
5562 * comes back in a register other than r0, you can override "result".)
5563 *
5564 * For: add-int/lit8, rsub-int/lit8
5565 *      and-int/lit8, or-int/lit8, xor-int/lit8,
5566 *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
5567 */
5568    /* binop/lit8 vAA, vBB, #+CC */
5569    movzbq  2(rPC), %rax                    # rax <- BB
5570    movsbl  3(rPC), %ecx                    # rcx <- ssssssCC
5571    GET_VREG %eax, %rax                     # eax <- rBB
5572    sall    %cl, %eax                                  # ex: addl %ecx,%eax
5573    SET_VREG %eax, rINSTq
5574    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5575
5576
5577/* ------------------------------ */
5578    .balign 128
5579.L_op_shr_int_lit8: /* 0xe1 */
5580/* File: x86_64/op_shr_int_lit8.S */
5581/* File: x86_64/binopLit8.S */
5582/*
5583 * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
5584 * that specifies an instruction that performs "result = eax op ecx".
5585 * This could be an x86 instruction or a function call.  (If the result
5586 * comes back in a register other than r0, you can override "result".)
5587 *
5588 * For: add-int/lit8, rsub-int/lit8
5589 *      and-int/lit8, or-int/lit8, xor-int/lit8,
5590 *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
5591 */
5592    /* binop/lit8 vAA, vBB, #+CC */
5593    movzbq  2(rPC), %rax                    # rax <- BB
5594    movsbl  3(rPC), %ecx                    # rcx <- ssssssCC
5595    GET_VREG %eax, %rax                     # eax <- rBB
5596    sarl    %cl, %eax                                  # ex: addl %ecx,%eax
5597    SET_VREG %eax, rINSTq
5598    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5599
5600
5601/* ------------------------------ */
5602    .balign 128
5603.L_op_ushr_int_lit8: /* 0xe2 */
5604/* File: x86_64/op_ushr_int_lit8.S */
5605/* File: x86_64/binopLit8.S */
5606/*
5607 * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
5608 * that specifies an instruction that performs "result = eax op ecx".
5609 * This could be an x86 instruction or a function call.  (If the result
5610 * comes back in a register other than r0, you can override "result".)
5611 *
5612 * For: add-int/lit8, rsub-int/lit8
5613 *      and-int/lit8, or-int/lit8, xor-int/lit8,
5614 *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
5615 */
5616    /* binop/lit8 vAA, vBB, #+CC */
5617    movzbq  2(rPC), %rax                    # rax <- BB
5618    movsbl  3(rPC), %ecx                    # rcx <- ssssssCC
5619    GET_VREG %eax, %rax                     # eax <- rBB
5620    shrl    %cl, %eax                                  # ex: addl %ecx,%eax
5621    SET_VREG %eax, rINSTq
5622    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5623
5624
5625/* ------------------------------ */
5626    .balign 128
5627.L_op_iget_quick: /* 0xe3 */
5628/* File: x86_64/op_iget_quick.S */
5629    /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick, iget-wide-quick */
5630    /* op vA, vB, offset@CCCC */
5631    movl    rINST, %ecx                     # rcx <- BA
5632    sarl    $4, %ecx                       # ecx <- B
5633    GET_VREG %ecx, %rcx                     # vB (object we're operating on)
5634    movzwq  2(rPC), %rax                    # eax <- field byte offset
5635    testl   %ecx, %ecx                      # is object null?
5636    je      common_errNullObject
5637    andb    $0xf,rINSTbl                   # rINST <- A
5638    .if 0
5639    movq (%rcx,%rax,1), %rax
5640    SET_WIDE_VREG %rax, rINSTq              # fp[A] <- value
5641    .else
5642    movl (%rcx,%rax,1), %eax
5643    SET_VREG %eax, rINSTq                   # fp[A] <- value
5644    .endif
5645    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5646
5647/* ------------------------------ */
5648    .balign 128
5649.L_op_iget_wide_quick: /* 0xe4 */
5650/* File: x86_64/op_iget_wide_quick.S */
5651/* File: x86_64/op_iget_quick.S */
5652    /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick, iget-wide-quick */
5653    /* op vA, vB, offset@CCCC */
5654    movl    rINST, %ecx                     # rcx <- BA
5655    sarl    $4, %ecx                       # ecx <- B
5656    GET_VREG %ecx, %rcx                     # vB (object we're operating on)
5657    movzwq  2(rPC), %rax                    # eax <- field byte offset
5658    testl   %ecx, %ecx                      # is object null?
5659    je      common_errNullObject
5660    andb    $0xf,rINSTbl                   # rINST <- A
5661    .if 1
5662    movq (%rcx,%rax,1), %rax
5663    SET_WIDE_VREG %rax, rINSTq              # fp[A] <- value
5664    .else
5665    movswl (%rcx,%rax,1), %eax
5666    SET_VREG %eax, rINSTq                   # fp[A] <- value
5667    .endif
5668    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5669
5670
5671/* ------------------------------ */
5672    .balign 128
5673.L_op_iget_object_quick: /* 0xe5 */
5674/* File: x86_64/op_iget_object_quick.S */
5675    /* For: iget-object-quick */
5676    /* op vA, vB, offset@CCCC */
5677    .extern artIGetObjectFromMterp
5678    movzbq  rINSTbl, %rcx                   # rcx <- BA
5679    sarl    $4, %ecx                       # ecx <- B
5680    GET_VREG OUT_32_ARG0, %rcx              # vB (object we're operating on)
5681    movzwl  2(rPC), OUT_32_ARG1             # eax <- field byte offset
5682    EXPORT_PC
5683    callq   SYMBOL(artIGetObjectFromMterp)  # (obj, offset)
5684    movq    rSELF, %rcx
5685    cmpq    $0, THREAD_EXCEPTION_OFFSET(%rcx)
5686    jnz     MterpException                  # bail out
5687    andb    $0xf, rINSTbl                  # rINST <- A
5688    SET_VREG_OBJECT %eax, rINSTq            # fp[A] <- value
5689    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5690
5691/* ------------------------------ */
5692    .balign 128
5693.L_op_iput_quick: /* 0xe6 */
5694/* File: x86_64/op_iput_quick.S */
5695    /* For: iput-quick, iput-object-quick */
5696    /* op vA, vB, offset@CCCC */
5697    movzbq  rINSTbl, %rcx                   # rcx <- BA
5698    sarl    $4, %ecx                       # ecx <- B
5699    GET_VREG %ecx, %rcx                     # vB (object we're operating on)
5700    testl   %ecx, %ecx                      # is object null?
5701    je      common_errNullObject
5702    andb    $0xf, rINSTbl                  # rINST <- A
5703    GET_VREG rINST, rINSTq                  # rINST <- v[A]
5704    movzwq  2(rPC), %rax                    # rax <- field byte offset
5705    movl    rINST, (%rcx,%rax,1)
5706    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5707
5708/* ------------------------------ */
5709    .balign 128
5710.L_op_iput_wide_quick: /* 0xe7 */
5711/* File: x86_64/op_iput_wide_quick.S */
5712    /* iput-wide-quick vA, vB, offset@CCCC */
5713    movzbq    rINSTbl, %rcx                 # rcx<- BA
5714    sarl      $4, %ecx                     # ecx<- B
5715    GET_VREG  %ecx, %rcx                    # vB (object we're operating on)
5716    testl     %ecx, %ecx                    # is object null?
5717    je        common_errNullObject
5718    movzwq    2(rPC), %rax                  # rax<- field byte offset
5719    leaq      (%rcx,%rax,1), %rcx           # ecx<- Address of 64-bit target
5720    andb      $0xf, rINSTbl                # rINST<- A
5721    GET_WIDE_VREG %rax, rINSTq              # rax<- fp[A]/fp[A+1]
5722    movq      %rax, (%rcx)                  # obj.field<- r0/r1
5723    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5724
5725/* ------------------------------ */
5726    .balign 128
5727.L_op_iput_object_quick: /* 0xe8 */
5728/* File: x86_64/op_iput_object_quick.S */
5729    EXPORT_PC
5730    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG0
5731    movq    rPC, OUT_ARG1
5732    REFRESH_INST 232
5733    movl    rINST, OUT_32_ARG2
5734    call    SYMBOL(MterpIputObjectQuick)
5735    testb   %al, %al
5736    jz      MterpException
5737    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5738
5739/* ------------------------------ */
5740    .balign 128
5741.L_op_invoke_virtual_quick: /* 0xe9 */
5742/* File: x86_64/op_invoke_virtual_quick.S */
5743/* File: x86_64/invoke.S */
5744/*
5745 * Generic invoke handler wrapper.
5746 */
5747    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
5748    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
5749    .extern MterpInvokeVirtualQuick
5750    EXPORT_PC
5751    movq    rSELF, OUT_ARG0
5752    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
5753    movq    rPC, OUT_ARG2
5754    REFRESH_INST 233
5755    movl    rINST, OUT_32_ARG3
5756    call    SYMBOL(MterpInvokeVirtualQuick)
5757    testb   %al, %al
5758    jz      MterpException
5759    ADVANCE_PC 3
5760    call    SYMBOL(MterpShouldSwitchInterpreters)
5761    testb   %al, %al
5762    jnz     MterpFallback
5763    FETCH_INST
5764    GOTO_NEXT
5765
5766
5767/* ------------------------------ */
5768    .balign 128
5769.L_op_invoke_virtual_range_quick: /* 0xea */
5770/* File: x86_64/op_invoke_virtual_range_quick.S */
5771/* File: x86_64/invoke.S */
5772/*
5773 * Generic invoke handler wrapper.
5774 */
5775    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
5776    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
5777    .extern MterpInvokeVirtualQuickRange
5778    EXPORT_PC
5779    movq    rSELF, OUT_ARG0
5780    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
5781    movq    rPC, OUT_ARG2
5782    REFRESH_INST 234
5783    movl    rINST, OUT_32_ARG3
5784    call    SYMBOL(MterpInvokeVirtualQuickRange)
5785    testb   %al, %al
5786    jz      MterpException
5787    ADVANCE_PC 3
5788    call    SYMBOL(MterpShouldSwitchInterpreters)
5789    testb   %al, %al
5790    jnz     MterpFallback
5791    FETCH_INST
5792    GOTO_NEXT
5793
5794
5795/* ------------------------------ */
5796    .balign 128
5797.L_op_iput_boolean_quick: /* 0xeb */
5798/* File: x86_64/op_iput_boolean_quick.S */
5799/* File: x86_64/op_iput_quick.S */
5800    /* For: iput-quick, iput-object-quick */
5801    /* op vA, vB, offset@CCCC */
5802    movzbq  rINSTbl, %rcx                   # rcx <- BA
5803    sarl    $4, %ecx                       # ecx <- B
5804    GET_VREG %ecx, %rcx                     # vB (object we're operating on)
5805    testl   %ecx, %ecx                      # is object null?
5806    je      common_errNullObject
5807    andb    $0xf, rINSTbl                  # rINST <- A
5808    GET_VREG rINST, rINSTq                  # rINST <- v[A]
5809    movzwq  2(rPC), %rax                    # rax <- field byte offset
5810    movb    rINSTbl, (%rcx,%rax,1)
5811    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5812
5813
5814/* ------------------------------ */
5815    .balign 128
5816.L_op_iput_byte_quick: /* 0xec */
5817/* File: x86_64/op_iput_byte_quick.S */
5818/* File: x86_64/op_iput_quick.S */
5819    /* For: iput-quick, iput-object-quick */
5820    /* op vA, vB, offset@CCCC */
5821    movzbq  rINSTbl, %rcx                   # rcx <- BA
5822    sarl    $4, %ecx                       # ecx <- B
5823    GET_VREG %ecx, %rcx                     # vB (object we're operating on)
5824    testl   %ecx, %ecx                      # is object null?
5825    je      common_errNullObject
5826    andb    $0xf, rINSTbl                  # rINST <- A
5827    GET_VREG rINST, rINSTq                  # rINST <- v[A]
5828    movzwq  2(rPC), %rax                    # rax <- field byte offset
5829    movb    rINSTbl, (%rcx,%rax,1)
5830    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5831
5832
5833/* ------------------------------ */
5834    .balign 128
5835.L_op_iput_char_quick: /* 0xed */
5836/* File: x86_64/op_iput_char_quick.S */
5837/* File: x86_64/op_iput_quick.S */
5838    /* For: iput-quick, iput-object-quick */
5839    /* op vA, vB, offset@CCCC */
5840    movzbq  rINSTbl, %rcx                   # rcx <- BA
5841    sarl    $4, %ecx                       # ecx <- B
5842    GET_VREG %ecx, %rcx                     # vB (object we're operating on)
5843    testl   %ecx, %ecx                      # is object null?
5844    je      common_errNullObject
5845    andb    $0xf, rINSTbl                  # rINST <- A
5846    GET_VREG rINST, rINSTq                  # rINST <- v[A]
5847    movzwq  2(rPC), %rax                    # rax <- field byte offset
5848    movw    rINSTw, (%rcx,%rax,1)
5849    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5850
5851
5852/* ------------------------------ */
5853    .balign 128
5854.L_op_iput_short_quick: /* 0xee */
5855/* File: x86_64/op_iput_short_quick.S */
5856/* File: x86_64/op_iput_quick.S */
5857    /* For: iput-quick, iput-object-quick */
5858    /* op vA, vB, offset@CCCC */
5859    movzbq  rINSTbl, %rcx                   # rcx <- BA
5860    sarl    $4, %ecx                       # ecx <- B
5861    GET_VREG %ecx, %rcx                     # vB (object we're operating on)
5862    testl   %ecx, %ecx                      # is object null?
5863    je      common_errNullObject
5864    andb    $0xf, rINSTbl                  # rINST <- A
5865    GET_VREG rINST, rINSTq                  # rINST <- v[A]
5866    movzwq  2(rPC), %rax                    # rax <- field byte offset
5867    movw    rINSTw, (%rcx,%rax,1)
5868    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5869
5870
5871/* ------------------------------ */
5872    .balign 128
5873.L_op_iget_boolean_quick: /* 0xef */
5874/* File: x86_64/op_iget_boolean_quick.S */
5875/* File: x86_64/op_iget_quick.S */
5876    /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick, iget-wide-quick */
5877    /* op vA, vB, offset@CCCC */
5878    movl    rINST, %ecx                     # rcx <- BA
5879    sarl    $4, %ecx                       # ecx <- B
5880    GET_VREG %ecx, %rcx                     # vB (object we're operating on)
5881    movzwq  2(rPC), %rax                    # eax <- field byte offset
5882    testl   %ecx, %ecx                      # is object null?
5883    je      common_errNullObject
5884    andb    $0xf,rINSTbl                   # rINST <- A
5885    .if 0
5886    movq (%rcx,%rax,1), %rax
5887    SET_WIDE_VREG %rax, rINSTq              # fp[A] <- value
5888    .else
5889    movsbl (%rcx,%rax,1), %eax
5890    SET_VREG %eax, rINSTq                   # fp[A] <- value
5891    .endif
5892    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5893
5894
5895/* ------------------------------ */
5896    .balign 128
5897.L_op_iget_byte_quick: /* 0xf0 */
5898/* File: x86_64/op_iget_byte_quick.S */
5899/* File: x86_64/op_iget_quick.S */
5900    /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick, iget-wide-quick */
5901    /* op vA, vB, offset@CCCC */
5902    movl    rINST, %ecx                     # rcx <- BA
5903    sarl    $4, %ecx                       # ecx <- B
5904    GET_VREG %ecx, %rcx                     # vB (object we're operating on)
5905    movzwq  2(rPC), %rax                    # eax <- field byte offset
5906    testl   %ecx, %ecx                      # is object null?
5907    je      common_errNullObject
5908    andb    $0xf,rINSTbl                   # rINST <- A
5909    .if 0
5910    movq (%rcx,%rax,1), %rax
5911    SET_WIDE_VREG %rax, rINSTq              # fp[A] <- value
5912    .else
5913    movsbl (%rcx,%rax,1), %eax
5914    SET_VREG %eax, rINSTq                   # fp[A] <- value
5915    .endif
5916    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5917
5918
5919/* ------------------------------ */
5920    .balign 128
5921.L_op_iget_char_quick: /* 0xf1 */
5922/* File: x86_64/op_iget_char_quick.S */
5923/* File: x86_64/op_iget_quick.S */
5924    /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick, iget-wide-quick */
5925    /* op vA, vB, offset@CCCC */
5926    movl    rINST, %ecx                     # rcx <- BA
5927    sarl    $4, %ecx                       # ecx <- B
5928    GET_VREG %ecx, %rcx                     # vB (object we're operating on)
5929    movzwq  2(rPC), %rax                    # eax <- field byte offset
5930    testl   %ecx, %ecx                      # is object null?
5931    je      common_errNullObject
5932    andb    $0xf,rINSTbl                   # rINST <- A
5933    .if 0
5934    movq (%rcx,%rax,1), %rax
5935    SET_WIDE_VREG %rax, rINSTq              # fp[A] <- value
5936    .else
5937    movzwl (%rcx,%rax,1), %eax
5938    SET_VREG %eax, rINSTq                   # fp[A] <- value
5939    .endif
5940    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5941
5942
5943/* ------------------------------ */
5944    .balign 128
5945.L_op_iget_short_quick: /* 0xf2 */
5946/* File: x86_64/op_iget_short_quick.S */
5947/* File: x86_64/op_iget_quick.S */
5948    /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick, iget-wide-quick */
5949    /* op vA, vB, offset@CCCC */
5950    movl    rINST, %ecx                     # rcx <- BA
5951    sarl    $4, %ecx                       # ecx <- B
5952    GET_VREG %ecx, %rcx                     # vB (object we're operating on)
5953    movzwq  2(rPC), %rax                    # eax <- field byte offset
5954    testl   %ecx, %ecx                      # is object null?
5955    je      common_errNullObject
5956    andb    $0xf,rINSTbl                   # rINST <- A
5957    .if 0
5958    movq (%rcx,%rax,1), %rax
5959    SET_WIDE_VREG %rax, rINSTq              # fp[A] <- value
5960    .else
5961    movswl (%rcx,%rax,1), %eax
5962    SET_VREG %eax, rINSTq                   # fp[A] <- value
5963    .endif
5964    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5965
5966
5967/* ------------------------------ */
5968    .balign 128
5969.L_op_unused_f3: /* 0xf3 */
5970/* File: x86_64/op_unused_f3.S */
5971/* File: x86_64/unused.S */
5972/*
5973 * Bail to reference interpreter to throw.
5974 */
5975    jmp     MterpFallback
5976
5977
5978/* ------------------------------ */
5979    .balign 128
5980.L_op_unused_f4: /* 0xf4 */
5981/* File: x86_64/op_unused_f4.S */
5982/* File: x86_64/unused.S */
5983/*
5984 * Bail to reference interpreter to throw.
5985 */
5986    jmp     MterpFallback
5987
5988
5989/* ------------------------------ */
5990    .balign 128
5991.L_op_unused_f5: /* 0xf5 */
5992/* File: x86_64/op_unused_f5.S */
5993/* File: x86_64/unused.S */
5994/*
5995 * Bail to reference interpreter to throw.
5996 */
5997    jmp     MterpFallback
5998
5999
6000/* ------------------------------ */
6001    .balign 128
6002.L_op_unused_f6: /* 0xf6 */
6003/* File: x86_64/op_unused_f6.S */
6004/* File: x86_64/unused.S */
6005/*
6006 * Bail to reference interpreter to throw.
6007 */
6008    jmp     MterpFallback
6009
6010
6011/* ------------------------------ */
6012    .balign 128
6013.L_op_unused_f7: /* 0xf7 */
6014/* File: x86_64/op_unused_f7.S */
6015/* File: x86_64/unused.S */
6016/*
6017 * Bail to reference interpreter to throw.
6018 */
6019    jmp     MterpFallback
6020
6021
6022/* ------------------------------ */
6023    .balign 128
6024.L_op_unused_f8: /* 0xf8 */
6025/* File: x86_64/op_unused_f8.S */
6026/* File: x86_64/unused.S */
6027/*
6028 * Bail to reference interpreter to throw.
6029 */
6030    jmp     MterpFallback
6031
6032
6033/* ------------------------------ */
6034    .balign 128
6035.L_op_unused_f9: /* 0xf9 */
6036/* File: x86_64/op_unused_f9.S */
6037/* File: x86_64/unused.S */
6038/*
6039 * Bail to reference interpreter to throw.
6040 */
6041    jmp     MterpFallback
6042
6043
6044/* ------------------------------ */
6045    .balign 128
6046.L_op_invoke_polymorphic: /* 0xfa */
6047/* Transfer stub to alternate interpreter */
6048    jmp     MterpFallback
6049
6050
6051/* ------------------------------ */
6052    .balign 128
6053.L_op_invoke_polymorphic_range: /* 0xfb */
6054/* Transfer stub to alternate interpreter */
6055    jmp     MterpFallback
6056
6057
6058/* ------------------------------ */
6059    .balign 128
6060.L_op_invoke_custom: /* 0xfc */
6061/* Transfer stub to alternate interpreter */
6062    jmp     MterpFallback
6063
6064
6065/* ------------------------------ */
6066    .balign 128
6067.L_op_invoke_custom_range: /* 0xfd */
6068/* Transfer stub to alternate interpreter */
6069    jmp     MterpFallback
6070
6071
6072/* ------------------------------ */
6073    .balign 128
6074.L_op_unused_fe: /* 0xfe */
6075/* File: x86_64/op_unused_fe.S */
6076/* File: x86_64/unused.S */
6077/*
6078 * Bail to reference interpreter to throw.
6079 */
6080    jmp     MterpFallback
6081
6082
6083/* ------------------------------ */
6084    .balign 128
6085.L_op_unused_ff: /* 0xff */
6086/* File: x86_64/op_unused_ff.S */
6087/* File: x86_64/unused.S */
6088/*
6089 * Bail to reference interpreter to throw.
6090 */
6091    jmp     MterpFallback
6092
6093
6094    .balign 128
6095    SIZE(SYMBOL(artMterpAsmInstructionStart),SYMBOL(artMterpAsmInstructionStart))
6096    .global SYMBOL(artMterpAsmInstructionEnd)
6097SYMBOL(artMterpAsmInstructionEnd):
6098
6099/*
6100 * ===========================================================================
6101 *  Sister implementations
6102 * ===========================================================================
6103 */
6104    .global SYMBOL(artMterpAsmSisterStart)
6105    FUNCTION_TYPE(SYMBOL(artMterpAsmSisterStart))
6106    .text
6107    .balign 4
6108SYMBOL(artMterpAsmSisterStart):
6109
6110    SIZE(SYMBOL(artMterpAsmSisterStart),SYMBOL(artMterpAsmSisterStart))
6111    .global SYMBOL(artMterpAsmSisterEnd)
6112SYMBOL(artMterpAsmSisterEnd):
6113
6114
6115    .global SYMBOL(artMterpAsmAltInstructionStart)
6116    FUNCTION_TYPE(SYMBOL(artMterpAsmAltInstructionStart))
6117    .text
6118
6119SYMBOL(artMterpAsmAltInstructionStart) = .L_ALT_op_nop
6120/* ------------------------------ */
6121    .balign 128
6122.L_ALT_op_nop: /* 0x00 */
6123/* File: x86_64/alt_stub.S */
6124/*
6125 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
6126 * any interesting requests and then jump to the real instruction
6127 * handler.  Unlike the Arm handler, we can't do this as a tail call
6128 * because rIBASE is caller save and we need to reload it.
6129 *
6130 * Note that unlike in the Arm implementation, we should never arrive
6131 * here with a zero breakFlag because we always refresh rIBASE on
6132 * return.
6133 */
6134    .extern MterpCheckBefore
6135    REFRESH_IBASE
6136    movq    rSELF, OUT_ARG0
6137    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
6138    movq    rPC, OUT_ARG2
6139    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
6140    jmp     .L_op_nop+(0*128)
6141
6142/* ------------------------------ */
6143    .balign 128
6144.L_ALT_op_move: /* 0x01 */
6145/* File: x86_64/alt_stub.S */
6146/*
6147 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
6148 * any interesting requests and then jump to the real instruction
6149 * handler.  Unlike the Arm handler, we can't do this as a tail call
6150 * because rIBASE is caller save and we need to reload it.
6151 *
6152 * Note that unlike in the Arm implementation, we should never arrive
6153 * here with a zero breakFlag because we always refresh rIBASE on
6154 * return.
6155 */
6156    .extern MterpCheckBefore
6157    REFRESH_IBASE
6158    movq    rSELF, OUT_ARG0
6159    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
6160    movq    rPC, OUT_ARG2
6161    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
6162    jmp     .L_op_nop+(1*128)
6163
6164/* ------------------------------ */
6165    .balign 128
6166.L_ALT_op_move_from16: /* 0x02 */
6167/* File: x86_64/alt_stub.S */
6168/*
6169 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
6170 * any interesting requests and then jump to the real instruction
6171 * handler.  Unlike the Arm handler, we can't do this as a tail call
6172 * because rIBASE is caller save and we need to reload it.
6173 *
6174 * Note that unlike in the Arm implementation, we should never arrive
6175 * here with a zero breakFlag because we always refresh rIBASE on
6176 * return.
6177 */
6178    .extern MterpCheckBefore
6179    REFRESH_IBASE
6180    movq    rSELF, OUT_ARG0
6181    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
6182    movq    rPC, OUT_ARG2
6183    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
6184    jmp     .L_op_nop+(2*128)
6185
6186/* ------------------------------ */
6187    .balign 128
6188.L_ALT_op_move_16: /* 0x03 */
6189/* File: x86_64/alt_stub.S */
6190/*
6191 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
6192 * any interesting requests and then jump to the real instruction
6193 * handler.  Unlike the Arm handler, we can't do this as a tail call
6194 * because rIBASE is caller save and we need to reload it.
6195 *
6196 * Note that unlike in the Arm implementation, we should never arrive
6197 * here with a zero breakFlag because we always refresh rIBASE on
6198 * return.
6199 */
6200    .extern MterpCheckBefore
6201    REFRESH_IBASE
6202    movq    rSELF, OUT_ARG0
6203    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
6204    movq    rPC, OUT_ARG2
6205    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
6206    jmp     .L_op_nop+(3*128)
6207
6208/* ------------------------------ */
6209    .balign 128
6210.L_ALT_op_move_wide: /* 0x04 */
6211/* File: x86_64/alt_stub.S */
6212/*
6213 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
6214 * any interesting requests and then jump to the real instruction
6215 * handler.  Unlike the Arm handler, we can't do this as a tail call
6216 * because rIBASE is caller save and we need to reload it.
6217 *
6218 * Note that unlike in the Arm implementation, we should never arrive
6219 * here with a zero breakFlag because we always refresh rIBASE on
6220 * return.
6221 */
6222    .extern MterpCheckBefore
6223    REFRESH_IBASE
6224    movq    rSELF, OUT_ARG0
6225    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
6226    movq    rPC, OUT_ARG2
6227    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
6228    jmp     .L_op_nop+(4*128)
6229
6230/* ------------------------------ */
6231    .balign 128
6232.L_ALT_op_move_wide_from16: /* 0x05 */
6233/* File: x86_64/alt_stub.S */
6234/*
6235 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
6236 * any interesting requests and then jump to the real instruction
6237 * handler.  Unlike the Arm handler, we can't do this as a tail call
6238 * because rIBASE is caller save and we need to reload it.
6239 *
6240 * Note that unlike in the Arm implementation, we should never arrive
6241 * here with a zero breakFlag because we always refresh rIBASE on
6242 * return.
6243 */
6244    .extern MterpCheckBefore
6245    REFRESH_IBASE
6246    movq    rSELF, OUT_ARG0
6247    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
6248    movq    rPC, OUT_ARG2
6249    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
6250    jmp     .L_op_nop+(5*128)
6251
6252/* ------------------------------ */
6253    .balign 128
6254.L_ALT_op_move_wide_16: /* 0x06 */
6255/* File: x86_64/alt_stub.S */
6256/*
6257 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
6258 * any interesting requests and then jump to the real instruction
6259 * handler.  Unlike the Arm handler, we can't do this as a tail call
6260 * because rIBASE is caller save and we need to reload it.
6261 *
6262 * Note that unlike in the Arm implementation, we should never arrive
6263 * here with a zero breakFlag because we always refresh rIBASE on
6264 * return.
6265 */
6266    .extern MterpCheckBefore
6267    REFRESH_IBASE
6268    movq    rSELF, OUT_ARG0
6269    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
6270    movq    rPC, OUT_ARG2
6271    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
6272    jmp     .L_op_nop+(6*128)
6273
6274/* ------------------------------ */
6275    .balign 128
6276.L_ALT_op_move_object: /* 0x07 */
6277/* File: x86_64/alt_stub.S */
6278/*
6279 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
6280 * any interesting requests and then jump to the real instruction
6281 * handler.  Unlike the Arm handler, we can't do this as a tail call
6282 * because rIBASE is caller save and we need to reload it.
6283 *
6284 * Note that unlike in the Arm implementation, we should never arrive
6285 * here with a zero breakFlag because we always refresh rIBASE on
6286 * return.
6287 */
6288    .extern MterpCheckBefore
6289    REFRESH_IBASE
6290    movq    rSELF, OUT_ARG0
6291    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
6292    movq    rPC, OUT_ARG2
6293    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
6294    jmp     .L_op_nop+(7*128)
6295
6296/* ------------------------------ */
6297    .balign 128
6298.L_ALT_op_move_object_from16: /* 0x08 */
6299/* File: x86_64/alt_stub.S */
6300/*
6301 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
6302 * any interesting requests and then jump to the real instruction
6303 * handler.  Unlike the Arm handler, we can't do this as a tail call
6304 * because rIBASE is caller save and we need to reload it.
6305 *
6306 * Note that unlike in the Arm implementation, we should never arrive
6307 * here with a zero breakFlag because we always refresh rIBASE on
6308 * return.
6309 */
6310    .extern MterpCheckBefore
6311    REFRESH_IBASE
6312    movq    rSELF, OUT_ARG0
6313    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
6314    movq    rPC, OUT_ARG2
6315    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
6316    jmp     .L_op_nop+(8*128)
6317
6318/* ------------------------------ */
6319    .balign 128
6320.L_ALT_op_move_object_16: /* 0x09 */
6321/* File: x86_64/alt_stub.S */
6322/*
6323 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
6324 * any interesting requests and then jump to the real instruction
6325 * handler.  Unlike the Arm handler, we can't do this as a tail call
6326 * because rIBASE is caller save and we need to reload it.
6327 *
6328 * Note that unlike in the Arm implementation, we should never arrive
6329 * here with a zero breakFlag because we always refresh rIBASE on
6330 * return.
6331 */
6332    .extern MterpCheckBefore
6333    REFRESH_IBASE
6334    movq    rSELF, OUT_ARG0
6335    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
6336    movq    rPC, OUT_ARG2
6337    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
6338    jmp     .L_op_nop+(9*128)
6339
6340/* ------------------------------ */
6341    .balign 128
6342.L_ALT_op_move_result: /* 0x0a */
6343/* File: x86_64/alt_stub.S */
6344/*
6345 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
6346 * any interesting requests and then jump to the real instruction
6347 * handler.  Unlike the Arm handler, we can't do this as a tail call
6348 * because rIBASE is caller save and we need to reload it.
6349 *
6350 * Note that unlike in the Arm implementation, we should never arrive
6351 * here with a zero breakFlag because we always refresh rIBASE on
6352 * return.
6353 */
6354    .extern MterpCheckBefore
6355    REFRESH_IBASE
6356    movq    rSELF, OUT_ARG0
6357    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
6358    movq    rPC, OUT_ARG2
6359    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
6360    jmp     .L_op_nop+(10*128)
6361
6362/* ------------------------------ */
6363    .balign 128
6364.L_ALT_op_move_result_wide: /* 0x0b */
6365/* File: x86_64/alt_stub.S */
6366/*
6367 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
6368 * any interesting requests and then jump to the real instruction
6369 * handler.  Unlike the Arm handler, we can't do this as a tail call
6370 * because rIBASE is caller save and we need to reload it.
6371 *
6372 * Note that unlike in the Arm implementation, we should never arrive
6373 * here with a zero breakFlag because we always refresh rIBASE on
6374 * return.
6375 */
6376    .extern MterpCheckBefore
6377    REFRESH_IBASE
6378    movq    rSELF, OUT_ARG0
6379    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
6380    movq    rPC, OUT_ARG2
6381    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
6382    jmp     .L_op_nop+(11*128)
6383
6384/* ------------------------------ */
6385    .balign 128
6386.L_ALT_op_move_result_object: /* 0x0c */
6387/* File: x86_64/alt_stub.S */
6388/*
6389 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
6390 * any interesting requests and then jump to the real instruction
6391 * handler.  Unlike the Arm handler, we can't do this as a tail call
6392 * because rIBASE is caller save and we need to reload it.
6393 *
6394 * Note that unlike in the Arm implementation, we should never arrive
6395 * here with a zero breakFlag because we always refresh rIBASE on
6396 * return.
6397 */
6398    .extern MterpCheckBefore
6399    REFRESH_IBASE
6400    movq    rSELF, OUT_ARG0
6401    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
6402    movq    rPC, OUT_ARG2
6403    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
6404    jmp     .L_op_nop+(12*128)
6405
6406/* ------------------------------ */
6407    .balign 128
6408.L_ALT_op_move_exception: /* 0x0d */
6409/* File: x86_64/alt_stub.S */
6410/*
6411 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
6412 * any interesting requests and then jump to the real instruction
6413 * handler.  Unlike the Arm handler, we can't do this as a tail call
6414 * because rIBASE is caller save and we need to reload it.
6415 *
6416 * Note that unlike in the Arm implementation, we should never arrive
6417 * here with a zero breakFlag because we always refresh rIBASE on
6418 * return.
6419 */
6420    .extern MterpCheckBefore
6421    REFRESH_IBASE
6422    movq    rSELF, OUT_ARG0
6423    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
6424    movq    rPC, OUT_ARG2
6425    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
6426    jmp     .L_op_nop+(13*128)
6427
6428/* ------------------------------ */
6429    .balign 128
6430.L_ALT_op_return_void: /* 0x0e */
6431/* File: x86_64/alt_stub.S */
6432/*
6433 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
6434 * any interesting requests and then jump to the real instruction
6435 * handler.  Unlike the Arm handler, we can't do this as a tail call
6436 * because rIBASE is caller save and we need to reload it.
6437 *
6438 * Note that unlike in the Arm implementation, we should never arrive
6439 * here with a zero breakFlag because we always refresh rIBASE on
6440 * return.
6441 */
6442    .extern MterpCheckBefore
6443    REFRESH_IBASE
6444    movq    rSELF, OUT_ARG0
6445    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
6446    movq    rPC, OUT_ARG2
6447    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
6448    jmp     .L_op_nop+(14*128)
6449
6450/* ------------------------------ */
6451    .balign 128
6452.L_ALT_op_return: /* 0x0f */
6453/* File: x86_64/alt_stub.S */
6454/*
6455 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
6456 * any interesting requests and then jump to the real instruction
6457 * handler.  Unlike the Arm handler, we can't do this as a tail call
6458 * because rIBASE is caller save and we need to reload it.
6459 *
6460 * Note that unlike in the Arm implementation, we should never arrive
6461 * here with a zero breakFlag because we always refresh rIBASE on
6462 * return.
6463 */
6464    .extern MterpCheckBefore
6465    REFRESH_IBASE
6466    movq    rSELF, OUT_ARG0
6467    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
6468    movq    rPC, OUT_ARG2
6469    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
6470    jmp     .L_op_nop+(15*128)
6471
6472/* ------------------------------ */
6473    .balign 128
6474.L_ALT_op_return_wide: /* 0x10 */
6475/* File: x86_64/alt_stub.S */
6476/*
6477 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
6478 * any interesting requests and then jump to the real instruction
6479 * handler.  Unlike the Arm handler, we can't do this as a tail call
6480 * because rIBASE is caller save and we need to reload it.
6481 *
6482 * Note that unlike in the Arm implementation, we should never arrive
6483 * here with a zero breakFlag because we always refresh rIBASE on
6484 * return.
6485 */
6486    .extern MterpCheckBefore
6487    REFRESH_IBASE
6488    movq    rSELF, OUT_ARG0
6489    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
6490    movq    rPC, OUT_ARG2
6491    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
6492    jmp     .L_op_nop+(16*128)
6493
6494/* ------------------------------ */
6495    .balign 128
6496.L_ALT_op_return_object: /* 0x11 */
6497/* File: x86_64/alt_stub.S */
6498/*
6499 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
6500 * any interesting requests and then jump to the real instruction
6501 * handler.  Unlike the Arm handler, we can't do this as a tail call
6502 * because rIBASE is caller save and we need to reload it.
6503 *
6504 * Note that unlike in the Arm implementation, we should never arrive
6505 * here with a zero breakFlag because we always refresh rIBASE on
6506 * return.
6507 */
6508    .extern MterpCheckBefore
6509    REFRESH_IBASE
6510    movq    rSELF, OUT_ARG0
6511    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
6512    movq    rPC, OUT_ARG2
6513    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
6514    jmp     .L_op_nop+(17*128)
6515
6516/* ------------------------------ */
6517    .balign 128
6518.L_ALT_op_const_4: /* 0x12 */
6519/* File: x86_64/alt_stub.S */
6520/*
6521 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
6522 * any interesting requests and then jump to the real instruction
6523 * handler.  Unlike the Arm handler, we can't do this as a tail call
6524 * because rIBASE is caller save and we need to reload it.
6525 *
6526 * Note that unlike in the Arm implementation, we should never arrive
6527 * here with a zero breakFlag because we always refresh rIBASE on
6528 * return.
6529 */
6530    .extern MterpCheckBefore
6531    REFRESH_IBASE
6532    movq    rSELF, OUT_ARG0
6533    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
6534    movq    rPC, OUT_ARG2
6535    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
6536    jmp     .L_op_nop+(18*128)
6537
6538/* ------------------------------ */
6539    .balign 128
6540.L_ALT_op_const_16: /* 0x13 */
6541/* File: x86_64/alt_stub.S */
6542/*
6543 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
6544 * any interesting requests and then jump to the real instruction
6545 * handler.  Unlike the Arm handler, we can't do this as a tail call
6546 * because rIBASE is caller save and we need to reload it.
6547 *
6548 * Note that unlike in the Arm implementation, we should never arrive
6549 * here with a zero breakFlag because we always refresh rIBASE on
6550 * return.
6551 */
6552    .extern MterpCheckBefore
6553    REFRESH_IBASE
6554    movq    rSELF, OUT_ARG0
6555    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
6556    movq    rPC, OUT_ARG2
6557    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
6558    jmp     .L_op_nop+(19*128)
6559
6560/* ------------------------------ */
6561    .balign 128
6562.L_ALT_op_const: /* 0x14 */
6563/* File: x86_64/alt_stub.S */
6564/*
6565 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
6566 * any interesting requests and then jump to the real instruction
6567 * handler.  Unlike the Arm handler, we can't do this as a tail call
6568 * because rIBASE is caller save and we need to reload it.
6569 *
6570 * Note that unlike in the Arm implementation, we should never arrive
6571 * here with a zero breakFlag because we always refresh rIBASE on
6572 * return.
6573 */
6574    .extern MterpCheckBefore
6575    REFRESH_IBASE
6576    movq    rSELF, OUT_ARG0
6577    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
6578    movq    rPC, OUT_ARG2
6579    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
6580    jmp     .L_op_nop+(20*128)
6581
6582/* ------------------------------ */
6583    .balign 128
6584.L_ALT_op_const_high16: /* 0x15 */
6585/* File: x86_64/alt_stub.S */
6586/*
6587 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
6588 * any interesting requests and then jump to the real instruction
6589 * handler.  Unlike the Arm handler, we can't do this as a tail call
6590 * because rIBASE is caller save and we need to reload it.
6591 *
6592 * Note that unlike in the Arm implementation, we should never arrive
6593 * here with a zero breakFlag because we always refresh rIBASE on
6594 * return.
6595 */
6596    .extern MterpCheckBefore
6597    REFRESH_IBASE
6598    movq    rSELF, OUT_ARG0
6599    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
6600    movq    rPC, OUT_ARG2
6601    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
6602    jmp     .L_op_nop+(21*128)
6603
6604/* ------------------------------ */
6605    .balign 128
6606.L_ALT_op_const_wide_16: /* 0x16 */
6607/* File: x86_64/alt_stub.S */
6608/*
6609 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
6610 * any interesting requests and then jump to the real instruction
6611 * handler.  Unlike the Arm handler, we can't do this as a tail call
6612 * because rIBASE is caller save and we need to reload it.
6613 *
6614 * Note that unlike in the Arm implementation, we should never arrive
6615 * here with a zero breakFlag because we always refresh rIBASE on
6616 * return.
6617 */
6618    .extern MterpCheckBefore
6619    REFRESH_IBASE
6620    movq    rSELF, OUT_ARG0
6621    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
6622    movq    rPC, OUT_ARG2
6623    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
6624    jmp     .L_op_nop+(22*128)
6625
6626/* ------------------------------ */
6627    .balign 128
6628.L_ALT_op_const_wide_32: /* 0x17 */
6629/* File: x86_64/alt_stub.S */
6630/*
6631 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
6632 * any interesting requests and then jump to the real instruction
6633 * handler.  Unlike the Arm handler, we can't do this as a tail call
6634 * because rIBASE is caller save and we need to reload it.
6635 *
6636 * Note that unlike in the Arm implementation, we should never arrive
6637 * here with a zero breakFlag because we always refresh rIBASE on
6638 * return.
6639 */
6640    .extern MterpCheckBefore
6641    REFRESH_IBASE
6642    movq    rSELF, OUT_ARG0
6643    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
6644    movq    rPC, OUT_ARG2
6645    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
6646    jmp     .L_op_nop+(23*128)
6647
6648/* ------------------------------ */
6649    .balign 128
6650.L_ALT_op_const_wide: /* 0x18 */
6651/* File: x86_64/alt_stub.S */
6652/*
6653 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
6654 * any interesting requests and then jump to the real instruction
6655 * handler.  Unlike the Arm handler, we can't do this as a tail call
6656 * because rIBASE is caller save and we need to reload it.
6657 *
6658 * Note that unlike in the Arm implementation, we should never arrive
6659 * here with a zero breakFlag because we always refresh rIBASE on
6660 * return.
6661 */
6662    .extern MterpCheckBefore
6663    REFRESH_IBASE
6664    movq    rSELF, OUT_ARG0
6665    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
6666    movq    rPC, OUT_ARG2
6667    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
6668    jmp     .L_op_nop+(24*128)
6669
6670/* ------------------------------ */
6671    .balign 128
6672.L_ALT_op_const_wide_high16: /* 0x19 */
6673/* File: x86_64/alt_stub.S */
6674/*
6675 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
6676 * any interesting requests and then jump to the real instruction
6677 * handler.  Unlike the Arm handler, we can't do this as a tail call
6678 * because rIBASE is caller save and we need to reload it.
6679 *
6680 * Note that unlike in the Arm implementation, we should never arrive
6681 * here with a zero breakFlag because we always refresh rIBASE on
6682 * return.
6683 */
6684    .extern MterpCheckBefore
6685    REFRESH_IBASE
6686    movq    rSELF, OUT_ARG0
6687    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
6688    movq    rPC, OUT_ARG2
6689    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
6690    jmp     .L_op_nop+(25*128)
6691
6692/* ------------------------------ */
6693    .balign 128
6694.L_ALT_op_const_string: /* 0x1a */
6695/* File: x86_64/alt_stub.S */
6696/*
6697 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
6698 * any interesting requests and then jump to the real instruction
6699 * handler.  Unlike the Arm handler, we can't do this as a tail call
6700 * because rIBASE is caller save and we need to reload it.
6701 *
6702 * Note that unlike in the Arm implementation, we should never arrive
6703 * here with a zero breakFlag because we always refresh rIBASE on
6704 * return.
6705 */
6706    .extern MterpCheckBefore
6707    REFRESH_IBASE
6708    movq    rSELF, OUT_ARG0
6709    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
6710    movq    rPC, OUT_ARG2
6711    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
6712    jmp     .L_op_nop+(26*128)
6713
6714/* ------------------------------ */
6715    .balign 128
6716.L_ALT_op_const_string_jumbo: /* 0x1b */
6717/* File: x86_64/alt_stub.S */
6718/*
6719 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
6720 * any interesting requests and then jump to the real instruction
6721 * handler.  Unlike the Arm handler, we can't do this as a tail call
6722 * because rIBASE is caller save and we need to reload it.
6723 *
6724 * Note that unlike in the Arm implementation, we should never arrive
6725 * here with a zero breakFlag because we always refresh rIBASE on
6726 * return.
6727 */
6728    .extern MterpCheckBefore
6729    REFRESH_IBASE
6730    movq    rSELF, OUT_ARG0
6731    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
6732    movq    rPC, OUT_ARG2
6733    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
6734    jmp     .L_op_nop+(27*128)
6735
6736/* ------------------------------ */
6737    .balign 128
6738.L_ALT_op_const_class: /* 0x1c */
6739/* File: x86_64/alt_stub.S */
6740/*
6741 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
6742 * any interesting requests and then jump to the real instruction
6743 * handler.  Unlike the Arm handler, we can't do this as a tail call
6744 * because rIBASE is caller save and we need to reload it.
6745 *
6746 * Note that unlike in the Arm implementation, we should never arrive
6747 * here with a zero breakFlag because we always refresh rIBASE on
6748 * return.
6749 */
6750    .extern MterpCheckBefore
6751    REFRESH_IBASE
6752    movq    rSELF, OUT_ARG0
6753    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
6754    movq    rPC, OUT_ARG2
6755    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
6756    jmp     .L_op_nop+(28*128)
6757
6758/* ------------------------------ */
6759    .balign 128
6760.L_ALT_op_monitor_enter: /* 0x1d */
6761/* File: x86_64/alt_stub.S */
6762/*
6763 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
6764 * any interesting requests and then jump to the real instruction
6765 * handler.  Unlike the Arm handler, we can't do this as a tail call
6766 * because rIBASE is caller save and we need to reload it.
6767 *
6768 * Note that unlike in the Arm implementation, we should never arrive
6769 * here with a zero breakFlag because we always refresh rIBASE on
6770 * return.
6771 */
6772    .extern MterpCheckBefore
6773    REFRESH_IBASE
6774    movq    rSELF, OUT_ARG0
6775    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
6776    movq    rPC, OUT_ARG2
6777    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
6778    jmp     .L_op_nop+(29*128)
6779
6780/* ------------------------------ */
6781    .balign 128
6782.L_ALT_op_monitor_exit: /* 0x1e */
6783/* File: x86_64/alt_stub.S */
6784/*
6785 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
6786 * any interesting requests and then jump to the real instruction
6787 * handler.  Unlike the Arm handler, we can't do this as a tail call
6788 * because rIBASE is caller save and we need to reload it.
6789 *
6790 * Note that unlike in the Arm implementation, we should never arrive
6791 * here with a zero breakFlag because we always refresh rIBASE on
6792 * return.
6793 */
6794    .extern MterpCheckBefore
6795    REFRESH_IBASE
6796    movq    rSELF, OUT_ARG0
6797    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
6798    movq    rPC, OUT_ARG2
6799    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
6800    jmp     .L_op_nop+(30*128)
6801
6802/* ------------------------------ */
6803    .balign 128
6804.L_ALT_op_check_cast: /* 0x1f */
6805/* File: x86_64/alt_stub.S */
6806/*
6807 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
6808 * any interesting requests and then jump to the real instruction
6809 * handler.  Unlike the Arm handler, we can't do this as a tail call
6810 * because rIBASE is caller save and we need to reload it.
6811 *
6812 * Note that unlike in the Arm implementation, we should never arrive
6813 * here with a zero breakFlag because we always refresh rIBASE on
6814 * return.
6815 */
6816    .extern MterpCheckBefore
6817    REFRESH_IBASE
6818    movq    rSELF, OUT_ARG0
6819    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
6820    movq    rPC, OUT_ARG2
6821    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
6822    jmp     .L_op_nop+(31*128)
6823
6824/* ------------------------------ */
6825    .balign 128
6826.L_ALT_op_instance_of: /* 0x20 */
6827/* File: x86_64/alt_stub.S */
6828/*
6829 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
6830 * any interesting requests and then jump to the real instruction
6831 * handler.  Unlike the Arm handler, we can't do this as a tail call
6832 * because rIBASE is caller save and we need to reload it.
6833 *
6834 * Note that unlike in the Arm implementation, we should never arrive
6835 * here with a zero breakFlag because we always refresh rIBASE on
6836 * return.
6837 */
6838    .extern MterpCheckBefore
6839    REFRESH_IBASE
6840    movq    rSELF, OUT_ARG0
6841    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
6842    movq    rPC, OUT_ARG2
6843    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
6844    jmp     .L_op_nop+(32*128)
6845
6846/* ------------------------------ */
6847    .balign 128
6848.L_ALT_op_array_length: /* 0x21 */
6849/* File: x86_64/alt_stub.S */
6850/*
6851 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
6852 * any interesting requests and then jump to the real instruction
6853 * handler.  Unlike the Arm handler, we can't do this as a tail call
6854 * because rIBASE is caller save and we need to reload it.
6855 *
6856 * Note that unlike in the Arm implementation, we should never arrive
6857 * here with a zero breakFlag because we always refresh rIBASE on
6858 * return.
6859 */
6860    .extern MterpCheckBefore
6861    REFRESH_IBASE
6862    movq    rSELF, OUT_ARG0
6863    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
6864    movq    rPC, OUT_ARG2
6865    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
6866    jmp     .L_op_nop+(33*128)
6867
6868/* ------------------------------ */
6869    .balign 128
6870.L_ALT_op_new_instance: /* 0x22 */
6871/* File: x86_64/alt_stub.S */
6872/*
6873 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
6874 * any interesting requests and then jump to the real instruction
6875 * handler.  Unlike the Arm handler, we can't do this as a tail call
6876 * because rIBASE is caller save and we need to reload it.
6877 *
6878 * Note that unlike in the Arm implementation, we should never arrive
6879 * here with a zero breakFlag because we always refresh rIBASE on
6880 * return.
6881 */
6882    .extern MterpCheckBefore
6883    REFRESH_IBASE
6884    movq    rSELF, OUT_ARG0
6885    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
6886    movq    rPC, OUT_ARG2
6887    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
6888    jmp     .L_op_nop+(34*128)
6889
6890/* ------------------------------ */
6891    .balign 128
6892.L_ALT_op_new_array: /* 0x23 */
6893/* File: x86_64/alt_stub.S */
6894/*
6895 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
6896 * any interesting requests and then jump to the real instruction
6897 * handler.  Unlike the Arm handler, we can't do this as a tail call
6898 * because rIBASE is caller save and we need to reload it.
6899 *
6900 * Note that unlike in the Arm implementation, we should never arrive
6901 * here with a zero breakFlag because we always refresh rIBASE on
6902 * return.
6903 */
6904    .extern MterpCheckBefore
6905    REFRESH_IBASE
6906    movq    rSELF, OUT_ARG0
6907    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
6908    movq    rPC, OUT_ARG2
6909    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
6910    jmp     .L_op_nop+(35*128)
6911
6912/* ------------------------------ */
6913    .balign 128
6914.L_ALT_op_filled_new_array: /* 0x24 */
6915/* File: x86_64/alt_stub.S */
6916/*
6917 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
6918 * any interesting requests and then jump to the real instruction
6919 * handler.  Unlike the Arm handler, we can't do this as a tail call
6920 * because rIBASE is caller save and we need to reload it.
6921 *
6922 * Note that unlike in the Arm implementation, we should never arrive
6923 * here with a zero breakFlag because we always refresh rIBASE on
6924 * return.
6925 */
6926    .extern MterpCheckBefore
6927    REFRESH_IBASE
6928    movq    rSELF, OUT_ARG0
6929    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
6930    movq    rPC, OUT_ARG2
6931    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
6932    jmp     .L_op_nop+(36*128)
6933
6934/* ------------------------------ */
6935    .balign 128
6936.L_ALT_op_filled_new_array_range: /* 0x25 */
6937/* File: x86_64/alt_stub.S */
6938/*
6939 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
6940 * any interesting requests and then jump to the real instruction
6941 * handler.  Unlike the Arm handler, we can't do this as a tail call
6942 * because rIBASE is caller save and we need to reload it.
6943 *
6944 * Note that unlike in the Arm implementation, we should never arrive
6945 * here with a zero breakFlag because we always refresh rIBASE on
6946 * return.
6947 */
6948    .extern MterpCheckBefore
6949    REFRESH_IBASE
6950    movq    rSELF, OUT_ARG0
6951    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
6952    movq    rPC, OUT_ARG2
6953    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
6954    jmp     .L_op_nop+(37*128)
6955
6956/* ------------------------------ */
6957    .balign 128
6958.L_ALT_op_fill_array_data: /* 0x26 */
6959/* File: x86_64/alt_stub.S */
6960/*
6961 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
6962 * any interesting requests and then jump to the real instruction
6963 * handler.  Unlike the Arm handler, we can't do this as a tail call
6964 * because rIBASE is caller save and we need to reload it.
6965 *
6966 * Note that unlike in the Arm implementation, we should never arrive
6967 * here with a zero breakFlag because we always refresh rIBASE on
6968 * return.
6969 */
6970    .extern MterpCheckBefore
6971    REFRESH_IBASE
6972    movq    rSELF, OUT_ARG0
6973    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
6974    movq    rPC, OUT_ARG2
6975    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
6976    jmp     .L_op_nop+(38*128)
6977
6978/* ------------------------------ */
6979    .balign 128
6980.L_ALT_op_throw: /* 0x27 */
6981/* File: x86_64/alt_stub.S */
6982/*
6983 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
6984 * any interesting requests and then jump to the real instruction
6985 * handler.  Unlike the Arm handler, we can't do this as a tail call
6986 * because rIBASE is caller save and we need to reload it.
6987 *
6988 * Note that unlike in the Arm implementation, we should never arrive
6989 * here with a zero breakFlag because we always refresh rIBASE on
6990 * return.
6991 */
6992    .extern MterpCheckBefore
6993    REFRESH_IBASE
6994    movq    rSELF, OUT_ARG0
6995    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
6996    movq    rPC, OUT_ARG2
6997    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
6998    jmp     .L_op_nop+(39*128)
6999
7000/* ------------------------------ */
7001    .balign 128
7002.L_ALT_op_goto: /* 0x28 */
7003/* File: x86_64/alt_stub.S */
7004/*
7005 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7006 * any interesting requests and then jump to the real instruction
7007 * handler.  Unlike the Arm handler, we can't do this as a tail call
7008 * because rIBASE is caller save and we need to reload it.
7009 *
7010 * Note that unlike in the Arm implementation, we should never arrive
7011 * here with a zero breakFlag because we always refresh rIBASE on
7012 * return.
7013 */
7014    .extern MterpCheckBefore
7015    REFRESH_IBASE
7016    movq    rSELF, OUT_ARG0
7017    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7018    movq    rPC, OUT_ARG2
7019    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7020    jmp     .L_op_nop+(40*128)
7021
7022/* ------------------------------ */
7023    .balign 128
7024.L_ALT_op_goto_16: /* 0x29 */
7025/* File: x86_64/alt_stub.S */
7026/*
7027 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7028 * any interesting requests and then jump to the real instruction
7029 * handler.  Unlike the Arm handler, we can't do this as a tail call
7030 * because rIBASE is caller save and we need to reload it.
7031 *
7032 * Note that unlike in the Arm implementation, we should never arrive
7033 * here with a zero breakFlag because we always refresh rIBASE on
7034 * return.
7035 */
7036    .extern MterpCheckBefore
7037    REFRESH_IBASE
7038    movq    rSELF, OUT_ARG0
7039    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7040    movq    rPC, OUT_ARG2
7041    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7042    jmp     .L_op_nop+(41*128)
7043
7044/* ------------------------------ */
7045    .balign 128
7046.L_ALT_op_goto_32: /* 0x2a */
7047/* File: x86_64/alt_stub.S */
7048/*
7049 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7050 * any interesting requests and then jump to the real instruction
7051 * handler.  Unlike the Arm handler, we can't do this as a tail call
7052 * because rIBASE is caller save and we need to reload it.
7053 *
7054 * Note that unlike in the Arm implementation, we should never arrive
7055 * here with a zero breakFlag because we always refresh rIBASE on
7056 * return.
7057 */
7058    .extern MterpCheckBefore
7059    REFRESH_IBASE
7060    movq    rSELF, OUT_ARG0
7061    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7062    movq    rPC, OUT_ARG2
7063    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7064    jmp     .L_op_nop+(42*128)
7065
7066/* ------------------------------ */
7067    .balign 128
7068.L_ALT_op_packed_switch: /* 0x2b */
7069/* File: x86_64/alt_stub.S */
7070/*
7071 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7072 * any interesting requests and then jump to the real instruction
7073 * handler.  Unlike the Arm handler, we can't do this as a tail call
7074 * because rIBASE is caller save and we need to reload it.
7075 *
7076 * Note that unlike in the Arm implementation, we should never arrive
7077 * here with a zero breakFlag because we always refresh rIBASE on
7078 * return.
7079 */
7080    .extern MterpCheckBefore
7081    REFRESH_IBASE
7082    movq    rSELF, OUT_ARG0
7083    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7084    movq    rPC, OUT_ARG2
7085    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7086    jmp     .L_op_nop+(43*128)
7087
7088/* ------------------------------ */
7089    .balign 128
7090.L_ALT_op_sparse_switch: /* 0x2c */
7091/* File: x86_64/alt_stub.S */
7092/*
7093 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7094 * any interesting requests and then jump to the real instruction
7095 * handler.  Unlike the Arm handler, we can't do this as a tail call
7096 * because rIBASE is caller save and we need to reload it.
7097 *
7098 * Note that unlike in the Arm implementation, we should never arrive
7099 * here with a zero breakFlag because we always refresh rIBASE on
7100 * return.
7101 */
7102    .extern MterpCheckBefore
7103    REFRESH_IBASE
7104    movq    rSELF, OUT_ARG0
7105    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7106    movq    rPC, OUT_ARG2
7107    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7108    jmp     .L_op_nop+(44*128)
7109
7110/* ------------------------------ */
7111    .balign 128
7112.L_ALT_op_cmpl_float: /* 0x2d */
7113/* File: x86_64/alt_stub.S */
7114/*
7115 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7116 * any interesting requests and then jump to the real instruction
7117 * handler.  Unlike the Arm handler, we can't do this as a tail call
7118 * because rIBASE is caller save and we need to reload it.
7119 *
7120 * Note that unlike in the Arm implementation, we should never arrive
7121 * here with a zero breakFlag because we always refresh rIBASE on
7122 * return.
7123 */
7124    .extern MterpCheckBefore
7125    REFRESH_IBASE
7126    movq    rSELF, OUT_ARG0
7127    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7128    movq    rPC, OUT_ARG2
7129    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7130    jmp     .L_op_nop+(45*128)
7131
7132/* ------------------------------ */
7133    .balign 128
7134.L_ALT_op_cmpg_float: /* 0x2e */
7135/* File: x86_64/alt_stub.S */
7136/*
7137 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7138 * any interesting requests and then jump to the real instruction
7139 * handler.  Unlike the Arm handler, we can't do this as a tail call
7140 * because rIBASE is caller save and we need to reload it.
7141 *
7142 * Note that unlike in the Arm implementation, we should never arrive
7143 * here with a zero breakFlag because we always refresh rIBASE on
7144 * return.
7145 */
7146    .extern MterpCheckBefore
7147    REFRESH_IBASE
7148    movq    rSELF, OUT_ARG0
7149    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7150    movq    rPC, OUT_ARG2
7151    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7152    jmp     .L_op_nop+(46*128)
7153
7154/* ------------------------------ */
7155    .balign 128
7156.L_ALT_op_cmpl_double: /* 0x2f */
7157/* File: x86_64/alt_stub.S */
7158/*
7159 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7160 * any interesting requests and then jump to the real instruction
7161 * handler.  Unlike the Arm handler, we can't do this as a tail call
7162 * because rIBASE is caller save and we need to reload it.
7163 *
7164 * Note that unlike in the Arm implementation, we should never arrive
7165 * here with a zero breakFlag because we always refresh rIBASE on
7166 * return.
7167 */
7168    .extern MterpCheckBefore
7169    REFRESH_IBASE
7170    movq    rSELF, OUT_ARG0
7171    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7172    movq    rPC, OUT_ARG2
7173    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7174    jmp     .L_op_nop+(47*128)
7175
7176/* ------------------------------ */
7177    .balign 128
7178.L_ALT_op_cmpg_double: /* 0x30 */
7179/* File: x86_64/alt_stub.S */
7180/*
7181 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7182 * any interesting requests and then jump to the real instruction
7183 * handler.  Unlike the Arm handler, we can't do this as a tail call
7184 * because rIBASE is caller save and we need to reload it.
7185 *
7186 * Note that unlike in the Arm implementation, we should never arrive
7187 * here with a zero breakFlag because we always refresh rIBASE on
7188 * return.
7189 */
7190    .extern MterpCheckBefore
7191    REFRESH_IBASE
7192    movq    rSELF, OUT_ARG0
7193    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7194    movq    rPC, OUT_ARG2
7195    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7196    jmp     .L_op_nop+(48*128)
7197
7198/* ------------------------------ */
7199    .balign 128
7200.L_ALT_op_cmp_long: /* 0x31 */
7201/* File: x86_64/alt_stub.S */
7202/*
7203 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7204 * any interesting requests and then jump to the real instruction
7205 * handler.  Unlike the Arm handler, we can't do this as a tail call
7206 * because rIBASE is caller save and we need to reload it.
7207 *
7208 * Note that unlike in the Arm implementation, we should never arrive
7209 * here with a zero breakFlag because we always refresh rIBASE on
7210 * return.
7211 */
7212    .extern MterpCheckBefore
7213    REFRESH_IBASE
7214    movq    rSELF, OUT_ARG0
7215    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7216    movq    rPC, OUT_ARG2
7217    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7218    jmp     .L_op_nop+(49*128)
7219
7220/* ------------------------------ */
7221    .balign 128
7222.L_ALT_op_if_eq: /* 0x32 */
7223/* File: x86_64/alt_stub.S */
7224/*
7225 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7226 * any interesting requests and then jump to the real instruction
7227 * handler.  Unlike the Arm handler, we can't do this as a tail call
7228 * because rIBASE is caller save and we need to reload it.
7229 *
7230 * Note that unlike in the Arm implementation, we should never arrive
7231 * here with a zero breakFlag because we always refresh rIBASE on
7232 * return.
7233 */
7234    .extern MterpCheckBefore
7235    REFRESH_IBASE
7236    movq    rSELF, OUT_ARG0
7237    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7238    movq    rPC, OUT_ARG2
7239    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7240    jmp     .L_op_nop+(50*128)
7241
7242/* ------------------------------ */
7243    .balign 128
7244.L_ALT_op_if_ne: /* 0x33 */
7245/* File: x86_64/alt_stub.S */
7246/*
7247 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7248 * any interesting requests and then jump to the real instruction
7249 * handler.  Unlike the Arm handler, we can't do this as a tail call
7250 * because rIBASE is caller save and we need to reload it.
7251 *
7252 * Note that unlike in the Arm implementation, we should never arrive
7253 * here with a zero breakFlag because we always refresh rIBASE on
7254 * return.
7255 */
7256    .extern MterpCheckBefore
7257    REFRESH_IBASE
7258    movq    rSELF, OUT_ARG0
7259    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7260    movq    rPC, OUT_ARG2
7261    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7262    jmp     .L_op_nop+(51*128)
7263
7264/* ------------------------------ */
7265    .balign 128
7266.L_ALT_op_if_lt: /* 0x34 */
7267/* File: x86_64/alt_stub.S */
7268/*
7269 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7270 * any interesting requests and then jump to the real instruction
7271 * handler.  Unlike the Arm handler, we can't do this as a tail call
7272 * because rIBASE is caller save and we need to reload it.
7273 *
7274 * Note that unlike in the Arm implementation, we should never arrive
7275 * here with a zero breakFlag because we always refresh rIBASE on
7276 * return.
7277 */
7278    .extern MterpCheckBefore
7279    REFRESH_IBASE
7280    movq    rSELF, OUT_ARG0
7281    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7282    movq    rPC, OUT_ARG2
7283    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7284    jmp     .L_op_nop+(52*128)
7285
7286/* ------------------------------ */
7287    .balign 128
7288.L_ALT_op_if_ge: /* 0x35 */
7289/* File: x86_64/alt_stub.S */
7290/*
7291 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7292 * any interesting requests and then jump to the real instruction
7293 * handler.  Unlike the Arm handler, we can't do this as a tail call
7294 * because rIBASE is caller save and we need to reload it.
7295 *
7296 * Note that unlike in the Arm implementation, we should never arrive
7297 * here with a zero breakFlag because we always refresh rIBASE on
7298 * return.
7299 */
7300    .extern MterpCheckBefore
7301    REFRESH_IBASE
7302    movq    rSELF, OUT_ARG0
7303    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7304    movq    rPC, OUT_ARG2
7305    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7306    jmp     .L_op_nop+(53*128)
7307
7308/* ------------------------------ */
7309    .balign 128
7310.L_ALT_op_if_gt: /* 0x36 */
7311/* File: x86_64/alt_stub.S */
7312/*
7313 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7314 * any interesting requests and then jump to the real instruction
7315 * handler.  Unlike the Arm handler, we can't do this as a tail call
7316 * because rIBASE is caller save and we need to reload it.
7317 *
7318 * Note that unlike in the Arm implementation, we should never arrive
7319 * here with a zero breakFlag because we always refresh rIBASE on
7320 * return.
7321 */
7322    .extern MterpCheckBefore
7323    REFRESH_IBASE
7324    movq    rSELF, OUT_ARG0
7325    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7326    movq    rPC, OUT_ARG2
7327    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7328    jmp     .L_op_nop+(54*128)
7329
7330/* ------------------------------ */
7331    .balign 128
7332.L_ALT_op_if_le: /* 0x37 */
7333/* File: x86_64/alt_stub.S */
7334/*
7335 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7336 * any interesting requests and then jump to the real instruction
7337 * handler.  Unlike the Arm handler, we can't do this as a tail call
7338 * because rIBASE is caller save and we need to reload it.
7339 *
7340 * Note that unlike in the Arm implementation, we should never arrive
7341 * here with a zero breakFlag because we always refresh rIBASE on
7342 * return.
7343 */
7344    .extern MterpCheckBefore
7345    REFRESH_IBASE
7346    movq    rSELF, OUT_ARG0
7347    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7348    movq    rPC, OUT_ARG2
7349    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7350    jmp     .L_op_nop+(55*128)
7351
7352/* ------------------------------ */
7353    .balign 128
7354.L_ALT_op_if_eqz: /* 0x38 */
7355/* File: x86_64/alt_stub.S */
7356/*
7357 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7358 * any interesting requests and then jump to the real instruction
7359 * handler.  Unlike the Arm handler, we can't do this as a tail call
7360 * because rIBASE is caller save and we need to reload it.
7361 *
7362 * Note that unlike in the Arm implementation, we should never arrive
7363 * here with a zero breakFlag because we always refresh rIBASE on
7364 * return.
7365 */
7366    .extern MterpCheckBefore
7367    REFRESH_IBASE
7368    movq    rSELF, OUT_ARG0
7369    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7370    movq    rPC, OUT_ARG2
7371    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7372    jmp     .L_op_nop+(56*128)
7373
7374/* ------------------------------ */
7375    .balign 128
7376.L_ALT_op_if_nez: /* 0x39 */
7377/* File: x86_64/alt_stub.S */
7378/*
7379 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7380 * any interesting requests and then jump to the real instruction
7381 * handler.  Unlike the Arm handler, we can't do this as a tail call
7382 * because rIBASE is caller save and we need to reload it.
7383 *
7384 * Note that unlike in the Arm implementation, we should never arrive
7385 * here with a zero breakFlag because we always refresh rIBASE on
7386 * return.
7387 */
7388    .extern MterpCheckBefore
7389    REFRESH_IBASE
7390    movq    rSELF, OUT_ARG0
7391    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7392    movq    rPC, OUT_ARG2
7393    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7394    jmp     .L_op_nop+(57*128)
7395
7396/* ------------------------------ */
7397    .balign 128
7398.L_ALT_op_if_ltz: /* 0x3a */
7399/* File: x86_64/alt_stub.S */
7400/*
7401 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7402 * any interesting requests and then jump to the real instruction
7403 * handler.  Unlike the Arm handler, we can't do this as a tail call
7404 * because rIBASE is caller save and we need to reload it.
7405 *
7406 * Note that unlike in the Arm implementation, we should never arrive
7407 * here with a zero breakFlag because we always refresh rIBASE on
7408 * return.
7409 */
7410    .extern MterpCheckBefore
7411    REFRESH_IBASE
7412    movq    rSELF, OUT_ARG0
7413    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7414    movq    rPC, OUT_ARG2
7415    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7416    jmp     .L_op_nop+(58*128)
7417
7418/* ------------------------------ */
7419    .balign 128
7420.L_ALT_op_if_gez: /* 0x3b */
7421/* File: x86_64/alt_stub.S */
7422/*
7423 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7424 * any interesting requests and then jump to the real instruction
7425 * handler.  Unlike the Arm handler, we can't do this as a tail call
7426 * because rIBASE is caller save and we need to reload it.
7427 *
7428 * Note that unlike in the Arm implementation, we should never arrive
7429 * here with a zero breakFlag because we always refresh rIBASE on
7430 * return.
7431 */
7432    .extern MterpCheckBefore
7433    REFRESH_IBASE
7434    movq    rSELF, OUT_ARG0
7435    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7436    movq    rPC, OUT_ARG2
7437    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7438    jmp     .L_op_nop+(59*128)
7439
7440/* ------------------------------ */
7441    .balign 128
7442.L_ALT_op_if_gtz: /* 0x3c */
7443/* File: x86_64/alt_stub.S */
7444/*
7445 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7446 * any interesting requests and then jump to the real instruction
7447 * handler.  Unlike the Arm handler, we can't do this as a tail call
7448 * because rIBASE is caller save and we need to reload it.
7449 *
7450 * Note that unlike in the Arm implementation, we should never arrive
7451 * here with a zero breakFlag because we always refresh rIBASE on
7452 * return.
7453 */
7454    .extern MterpCheckBefore
7455    REFRESH_IBASE
7456    movq    rSELF, OUT_ARG0
7457    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7458    movq    rPC, OUT_ARG2
7459    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7460    jmp     .L_op_nop+(60*128)
7461
7462/* ------------------------------ */
7463    .balign 128
7464.L_ALT_op_if_lez: /* 0x3d */
7465/* File: x86_64/alt_stub.S */
7466/*
7467 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7468 * any interesting requests and then jump to the real instruction
7469 * handler.  Unlike the Arm handler, we can't do this as a tail call
7470 * because rIBASE is caller save and we need to reload it.
7471 *
7472 * Note that unlike in the Arm implementation, we should never arrive
7473 * here with a zero breakFlag because we always refresh rIBASE on
7474 * return.
7475 */
7476    .extern MterpCheckBefore
7477    REFRESH_IBASE
7478    movq    rSELF, OUT_ARG0
7479    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7480    movq    rPC, OUT_ARG2
7481    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7482    jmp     .L_op_nop+(61*128)
7483
7484/* ------------------------------ */
7485    .balign 128
7486.L_ALT_op_unused_3e: /* 0x3e */
7487/* File: x86_64/alt_stub.S */
7488/*
7489 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7490 * any interesting requests and then jump to the real instruction
7491 * handler.  Unlike the Arm handler, we can't do this as a tail call
7492 * because rIBASE is caller save and we need to reload it.
7493 *
7494 * Note that unlike in the Arm implementation, we should never arrive
7495 * here with a zero breakFlag because we always refresh rIBASE on
7496 * return.
7497 */
7498    .extern MterpCheckBefore
7499    REFRESH_IBASE
7500    movq    rSELF, OUT_ARG0
7501    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7502    movq    rPC, OUT_ARG2
7503    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7504    jmp     .L_op_nop+(62*128)
7505
7506/* ------------------------------ */
7507    .balign 128
7508.L_ALT_op_unused_3f: /* 0x3f */
7509/* File: x86_64/alt_stub.S */
7510/*
7511 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7512 * any interesting requests and then jump to the real instruction
7513 * handler.  Unlike the Arm handler, we can't do this as a tail call
7514 * because rIBASE is caller save and we need to reload it.
7515 *
7516 * Note that unlike in the Arm implementation, we should never arrive
7517 * here with a zero breakFlag because we always refresh rIBASE on
7518 * return.
7519 */
7520    .extern MterpCheckBefore
7521    REFRESH_IBASE
7522    movq    rSELF, OUT_ARG0
7523    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7524    movq    rPC, OUT_ARG2
7525    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7526    jmp     .L_op_nop+(63*128)
7527
7528/* ------------------------------ */
7529    .balign 128
7530.L_ALT_op_unused_40: /* 0x40 */
7531/* File: x86_64/alt_stub.S */
7532/*
7533 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7534 * any interesting requests and then jump to the real instruction
7535 * handler.  Unlike the Arm handler, we can't do this as a tail call
7536 * because rIBASE is caller save and we need to reload it.
7537 *
7538 * Note that unlike in the Arm implementation, we should never arrive
7539 * here with a zero breakFlag because we always refresh rIBASE on
7540 * return.
7541 */
7542    .extern MterpCheckBefore
7543    REFRESH_IBASE
7544    movq    rSELF, OUT_ARG0
7545    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7546    movq    rPC, OUT_ARG2
7547    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7548    jmp     .L_op_nop+(64*128)
7549
7550/* ------------------------------ */
7551    .balign 128
7552.L_ALT_op_unused_41: /* 0x41 */
7553/* File: x86_64/alt_stub.S */
7554/*
7555 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7556 * any interesting requests and then jump to the real instruction
7557 * handler.  Unlike the Arm handler, we can't do this as a tail call
7558 * because rIBASE is caller save and we need to reload it.
7559 *
7560 * Note that unlike in the Arm implementation, we should never arrive
7561 * here with a zero breakFlag because we always refresh rIBASE on
7562 * return.
7563 */
7564    .extern MterpCheckBefore
7565    REFRESH_IBASE
7566    movq    rSELF, OUT_ARG0
7567    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7568    movq    rPC, OUT_ARG2
7569    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7570    jmp     .L_op_nop+(65*128)
7571
7572/* ------------------------------ */
7573    .balign 128
7574.L_ALT_op_unused_42: /* 0x42 */
7575/* File: x86_64/alt_stub.S */
7576/*
7577 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7578 * any interesting requests and then jump to the real instruction
7579 * handler.  Unlike the Arm handler, we can't do this as a tail call
7580 * because rIBASE is caller save and we need to reload it.
7581 *
7582 * Note that unlike in the Arm implementation, we should never arrive
7583 * here with a zero breakFlag because we always refresh rIBASE on
7584 * return.
7585 */
7586    .extern MterpCheckBefore
7587    REFRESH_IBASE
7588    movq    rSELF, OUT_ARG0
7589    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7590    movq    rPC, OUT_ARG2
7591    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7592    jmp     .L_op_nop+(66*128)
7593
7594/* ------------------------------ */
7595    .balign 128
7596.L_ALT_op_unused_43: /* 0x43 */
7597/* File: x86_64/alt_stub.S */
7598/*
7599 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7600 * any interesting requests and then jump to the real instruction
7601 * handler.  Unlike the Arm handler, we can't do this as a tail call
7602 * because rIBASE is caller save and we need to reload it.
7603 *
7604 * Note that unlike in the Arm implementation, we should never arrive
7605 * here with a zero breakFlag because we always refresh rIBASE on
7606 * return.
7607 */
7608    .extern MterpCheckBefore
7609    REFRESH_IBASE
7610    movq    rSELF, OUT_ARG0
7611    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7612    movq    rPC, OUT_ARG2
7613    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7614    jmp     .L_op_nop+(67*128)
7615
7616/* ------------------------------ */
7617    .balign 128
7618.L_ALT_op_aget: /* 0x44 */
7619/* File: x86_64/alt_stub.S */
7620/*
7621 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7622 * any interesting requests and then jump to the real instruction
7623 * handler.  Unlike the Arm handler, we can't do this as a tail call
7624 * because rIBASE is caller save and we need to reload it.
7625 *
7626 * Note that unlike in the Arm implementation, we should never arrive
7627 * here with a zero breakFlag because we always refresh rIBASE on
7628 * return.
7629 */
7630    .extern MterpCheckBefore
7631    REFRESH_IBASE
7632    movq    rSELF, OUT_ARG0
7633    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7634    movq    rPC, OUT_ARG2
7635    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7636    jmp     .L_op_nop+(68*128)
7637
7638/* ------------------------------ */
7639    .balign 128
7640.L_ALT_op_aget_wide: /* 0x45 */
7641/* File: x86_64/alt_stub.S */
7642/*
7643 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7644 * any interesting requests and then jump to the real instruction
7645 * handler.  Unlike the Arm handler, we can't do this as a tail call
7646 * because rIBASE is caller save and we need to reload it.
7647 *
7648 * Note that unlike in the Arm implementation, we should never arrive
7649 * here with a zero breakFlag because we always refresh rIBASE on
7650 * return.
7651 */
7652    .extern MterpCheckBefore
7653    REFRESH_IBASE
7654    movq    rSELF, OUT_ARG0
7655    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7656    movq    rPC, OUT_ARG2
7657    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7658    jmp     .L_op_nop+(69*128)
7659
7660/* ------------------------------ */
7661    .balign 128
7662.L_ALT_op_aget_object: /* 0x46 */
7663/* File: x86_64/alt_stub.S */
7664/*
7665 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7666 * any interesting requests and then jump to the real instruction
7667 * handler.  Unlike the Arm handler, we can't do this as a tail call
7668 * because rIBASE is caller save and we need to reload it.
7669 *
7670 * Note that unlike in the Arm implementation, we should never arrive
7671 * here with a zero breakFlag because we always refresh rIBASE on
7672 * return.
7673 */
7674    .extern MterpCheckBefore
7675    REFRESH_IBASE
7676    movq    rSELF, OUT_ARG0
7677    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7678    movq    rPC, OUT_ARG2
7679    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7680    jmp     .L_op_nop+(70*128)
7681
7682/* ------------------------------ */
7683    .balign 128
7684.L_ALT_op_aget_boolean: /* 0x47 */
7685/* File: x86_64/alt_stub.S */
7686/*
7687 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7688 * any interesting requests and then jump to the real instruction
7689 * handler.  Unlike the Arm handler, we can't do this as a tail call
7690 * because rIBASE is caller save and we need to reload it.
7691 *
7692 * Note that unlike in the Arm implementation, we should never arrive
7693 * here with a zero breakFlag because we always refresh rIBASE on
7694 * return.
7695 */
7696    .extern MterpCheckBefore
7697    REFRESH_IBASE
7698    movq    rSELF, OUT_ARG0
7699    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7700    movq    rPC, OUT_ARG2
7701    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7702    jmp     .L_op_nop+(71*128)
7703
7704/* ------------------------------ */
7705    .balign 128
7706.L_ALT_op_aget_byte: /* 0x48 */
7707/* File: x86_64/alt_stub.S */
7708/*
7709 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7710 * any interesting requests and then jump to the real instruction
7711 * handler.  Unlike the Arm handler, we can't do this as a tail call
7712 * because rIBASE is caller save and we need to reload it.
7713 *
7714 * Note that unlike in the Arm implementation, we should never arrive
7715 * here with a zero breakFlag because we always refresh rIBASE on
7716 * return.
7717 */
7718    .extern MterpCheckBefore
7719    REFRESH_IBASE
7720    movq    rSELF, OUT_ARG0
7721    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7722    movq    rPC, OUT_ARG2
7723    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7724    jmp     .L_op_nop+(72*128)
7725
7726/* ------------------------------ */
7727    .balign 128
7728.L_ALT_op_aget_char: /* 0x49 */
7729/* File: x86_64/alt_stub.S */
7730/*
7731 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7732 * any interesting requests and then jump to the real instruction
7733 * handler.  Unlike the Arm handler, we can't do this as a tail call
7734 * because rIBASE is caller save and we need to reload it.
7735 *
7736 * Note that unlike in the Arm implementation, we should never arrive
7737 * here with a zero breakFlag because we always refresh rIBASE on
7738 * return.
7739 */
7740    .extern MterpCheckBefore
7741    REFRESH_IBASE
7742    movq    rSELF, OUT_ARG0
7743    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7744    movq    rPC, OUT_ARG2
7745    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7746    jmp     .L_op_nop+(73*128)
7747
7748/* ------------------------------ */
7749    .balign 128
7750.L_ALT_op_aget_short: /* 0x4a */
7751/* File: x86_64/alt_stub.S */
7752/*
7753 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7754 * any interesting requests and then jump to the real instruction
7755 * handler.  Unlike the Arm handler, we can't do this as a tail call
7756 * because rIBASE is caller save and we need to reload it.
7757 *
7758 * Note that unlike in the Arm implementation, we should never arrive
7759 * here with a zero breakFlag because we always refresh rIBASE on
7760 * return.
7761 */
7762    .extern MterpCheckBefore
7763    REFRESH_IBASE
7764    movq    rSELF, OUT_ARG0
7765    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7766    movq    rPC, OUT_ARG2
7767    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7768    jmp     .L_op_nop+(74*128)
7769
7770/* ------------------------------ */
7771    .balign 128
7772.L_ALT_op_aput: /* 0x4b */
7773/* File: x86_64/alt_stub.S */
7774/*
7775 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7776 * any interesting requests and then jump to the real instruction
7777 * handler.  Unlike the Arm handler, we can't do this as a tail call
7778 * because rIBASE is caller save and we need to reload it.
7779 *
7780 * Note that unlike in the Arm implementation, we should never arrive
7781 * here with a zero breakFlag because we always refresh rIBASE on
7782 * return.
7783 */
7784    .extern MterpCheckBefore
7785    REFRESH_IBASE
7786    movq    rSELF, OUT_ARG0
7787    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7788    movq    rPC, OUT_ARG2
7789    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7790    jmp     .L_op_nop+(75*128)
7791
7792/* ------------------------------ */
7793    .balign 128
7794.L_ALT_op_aput_wide: /* 0x4c */
7795/* File: x86_64/alt_stub.S */
7796/*
7797 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7798 * any interesting requests and then jump to the real instruction
7799 * handler.  Unlike the Arm handler, we can't do this as a tail call
7800 * because rIBASE is caller save and we need to reload it.
7801 *
7802 * Note that unlike in the Arm implementation, we should never arrive
7803 * here with a zero breakFlag because we always refresh rIBASE on
7804 * return.
7805 */
7806    .extern MterpCheckBefore
7807    REFRESH_IBASE
7808    movq    rSELF, OUT_ARG0
7809    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7810    movq    rPC, OUT_ARG2
7811    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7812    jmp     .L_op_nop+(76*128)
7813
7814/* ------------------------------ */
7815    .balign 128
7816.L_ALT_op_aput_object: /* 0x4d */
7817/* File: x86_64/alt_stub.S */
7818/*
7819 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7820 * any interesting requests and then jump to the real instruction
7821 * handler.  Unlike the Arm handler, we can't do this as a tail call
7822 * because rIBASE is caller save and we need to reload it.
7823 *
7824 * Note that unlike in the Arm implementation, we should never arrive
7825 * here with a zero breakFlag because we always refresh rIBASE on
7826 * return.
7827 */
7828    .extern MterpCheckBefore
7829    REFRESH_IBASE
7830    movq    rSELF, OUT_ARG0
7831    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7832    movq    rPC, OUT_ARG2
7833    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7834    jmp     .L_op_nop+(77*128)
7835
7836/* ------------------------------ */
7837    .balign 128
7838.L_ALT_op_aput_boolean: /* 0x4e */
7839/* File: x86_64/alt_stub.S */
7840/*
7841 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7842 * any interesting requests and then jump to the real instruction
7843 * handler.  Unlike the Arm handler, we can't do this as a tail call
7844 * because rIBASE is caller save and we need to reload it.
7845 *
7846 * Note that unlike in the Arm implementation, we should never arrive
7847 * here with a zero breakFlag because we always refresh rIBASE on
7848 * return.
7849 */
7850    .extern MterpCheckBefore
7851    REFRESH_IBASE
7852    movq    rSELF, OUT_ARG0
7853    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7854    movq    rPC, OUT_ARG2
7855    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7856    jmp     .L_op_nop+(78*128)
7857
7858/* ------------------------------ */
7859    .balign 128
7860.L_ALT_op_aput_byte: /* 0x4f */
7861/* File: x86_64/alt_stub.S */
7862/*
7863 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7864 * any interesting requests and then jump to the real instruction
7865 * handler.  Unlike the Arm handler, we can't do this as a tail call
7866 * because rIBASE is caller save and we need to reload it.
7867 *
7868 * Note that unlike in the Arm implementation, we should never arrive
7869 * here with a zero breakFlag because we always refresh rIBASE on
7870 * return.
7871 */
7872    .extern MterpCheckBefore
7873    REFRESH_IBASE
7874    movq    rSELF, OUT_ARG0
7875    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7876    movq    rPC, OUT_ARG2
7877    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7878    jmp     .L_op_nop+(79*128)
7879
7880/* ------------------------------ */
7881    .balign 128
7882.L_ALT_op_aput_char: /* 0x50 */
7883/* File: x86_64/alt_stub.S */
7884/*
7885 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7886 * any interesting requests and then jump to the real instruction
7887 * handler.  Unlike the Arm handler, we can't do this as a tail call
7888 * because rIBASE is caller save and we need to reload it.
7889 *
7890 * Note that unlike in the Arm implementation, we should never arrive
7891 * here with a zero breakFlag because we always refresh rIBASE on
7892 * return.
7893 */
7894    .extern MterpCheckBefore
7895    REFRESH_IBASE
7896    movq    rSELF, OUT_ARG0
7897    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7898    movq    rPC, OUT_ARG2
7899    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7900    jmp     .L_op_nop+(80*128)
7901
7902/* ------------------------------ */
7903    .balign 128
7904.L_ALT_op_aput_short: /* 0x51 */
7905/* File: x86_64/alt_stub.S */
7906/*
7907 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7908 * any interesting requests and then jump to the real instruction
7909 * handler.  Unlike the Arm handler, we can't do this as a tail call
7910 * because rIBASE is caller save and we need to reload it.
7911 *
7912 * Note that unlike in the Arm implementation, we should never arrive
7913 * here with a zero breakFlag because we always refresh rIBASE on
7914 * return.
7915 */
7916    .extern MterpCheckBefore
7917    REFRESH_IBASE
7918    movq    rSELF, OUT_ARG0
7919    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7920    movq    rPC, OUT_ARG2
7921    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7922    jmp     .L_op_nop+(81*128)
7923
7924/* ------------------------------ */
7925    .balign 128
7926.L_ALT_op_iget: /* 0x52 */
7927/* File: x86_64/alt_stub.S */
7928/*
7929 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7930 * any interesting requests and then jump to the real instruction
7931 * handler.  Unlike the Arm handler, we can't do this as a tail call
7932 * because rIBASE is caller save and we need to reload it.
7933 *
7934 * Note that unlike in the Arm implementation, we should never arrive
7935 * here with a zero breakFlag because we always refresh rIBASE on
7936 * return.
7937 */
7938    .extern MterpCheckBefore
7939    REFRESH_IBASE
7940    movq    rSELF, OUT_ARG0
7941    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7942    movq    rPC, OUT_ARG2
7943    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7944    jmp     .L_op_nop+(82*128)
7945
7946/* ------------------------------ */
7947    .balign 128
7948.L_ALT_op_iget_wide: /* 0x53 */
7949/* File: x86_64/alt_stub.S */
7950/*
7951 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7952 * any interesting requests and then jump to the real instruction
7953 * handler.  Unlike the Arm handler, we can't do this as a tail call
7954 * because rIBASE is caller save and we need to reload it.
7955 *
7956 * Note that unlike in the Arm implementation, we should never arrive
7957 * here with a zero breakFlag because we always refresh rIBASE on
7958 * return.
7959 */
7960    .extern MterpCheckBefore
7961    REFRESH_IBASE
7962    movq    rSELF, OUT_ARG0
7963    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7964    movq    rPC, OUT_ARG2
7965    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7966    jmp     .L_op_nop+(83*128)
7967
7968/* ------------------------------ */
7969    .balign 128
7970.L_ALT_op_iget_object: /* 0x54 */
7971/* File: x86_64/alt_stub.S */
7972/*
7973 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7974 * any interesting requests and then jump to the real instruction
7975 * handler.  Unlike the Arm handler, we can't do this as a tail call
7976 * because rIBASE is caller save and we need to reload it.
7977 *
7978 * Note that unlike in the Arm implementation, we should never arrive
7979 * here with a zero breakFlag because we always refresh rIBASE on
7980 * return.
7981 */
7982    .extern MterpCheckBefore
7983    REFRESH_IBASE
7984    movq    rSELF, OUT_ARG0
7985    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
7986    movq    rPC, OUT_ARG2
7987    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
7988    jmp     .L_op_nop+(84*128)
7989
7990/* ------------------------------ */
7991    .balign 128
7992.L_ALT_op_iget_boolean: /* 0x55 */
7993/* File: x86_64/alt_stub.S */
7994/*
7995 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7996 * any interesting requests and then jump to the real instruction
7997 * handler.  Unlike the Arm handler, we can't do this as a tail call
7998 * because rIBASE is caller save and we need to reload it.
7999 *
8000 * Note that unlike in the Arm implementation, we should never arrive
8001 * here with a zero breakFlag because we always refresh rIBASE on
8002 * return.
8003 */
8004    .extern MterpCheckBefore
8005    REFRESH_IBASE
8006    movq    rSELF, OUT_ARG0
8007    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8008    movq    rPC, OUT_ARG2
8009    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8010    jmp     .L_op_nop+(85*128)
8011
8012/* ------------------------------ */
8013    .balign 128
8014.L_ALT_op_iget_byte: /* 0x56 */
8015/* File: x86_64/alt_stub.S */
8016/*
8017 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8018 * any interesting requests and then jump to the real instruction
8019 * handler.  Unlike the Arm handler, we can't do this as a tail call
8020 * because rIBASE is caller save and we need to reload it.
8021 *
8022 * Note that unlike in the Arm implementation, we should never arrive
8023 * here with a zero breakFlag because we always refresh rIBASE on
8024 * return.
8025 */
8026    .extern MterpCheckBefore
8027    REFRESH_IBASE
8028    movq    rSELF, OUT_ARG0
8029    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8030    movq    rPC, OUT_ARG2
8031    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8032    jmp     .L_op_nop+(86*128)
8033
8034/* ------------------------------ */
8035    .balign 128
8036.L_ALT_op_iget_char: /* 0x57 */
8037/* File: x86_64/alt_stub.S */
8038/*
8039 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8040 * any interesting requests and then jump to the real instruction
8041 * handler.  Unlike the Arm handler, we can't do this as a tail call
8042 * because rIBASE is caller save and we need to reload it.
8043 *
8044 * Note that unlike in the Arm implementation, we should never arrive
8045 * here with a zero breakFlag because we always refresh rIBASE on
8046 * return.
8047 */
8048    .extern MterpCheckBefore
8049    REFRESH_IBASE
8050    movq    rSELF, OUT_ARG0
8051    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8052    movq    rPC, OUT_ARG2
8053    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8054    jmp     .L_op_nop+(87*128)
8055
8056/* ------------------------------ */
8057    .balign 128
8058.L_ALT_op_iget_short: /* 0x58 */
8059/* File: x86_64/alt_stub.S */
8060/*
8061 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8062 * any interesting requests and then jump to the real instruction
8063 * handler.  Unlike the Arm handler, we can't do this as a tail call
8064 * because rIBASE is caller save and we need to reload it.
8065 *
8066 * Note that unlike in the Arm implementation, we should never arrive
8067 * here with a zero breakFlag because we always refresh rIBASE on
8068 * return.
8069 */
8070    .extern MterpCheckBefore
8071    REFRESH_IBASE
8072    movq    rSELF, OUT_ARG0
8073    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8074    movq    rPC, OUT_ARG2
8075    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8076    jmp     .L_op_nop+(88*128)
8077
8078/* ------------------------------ */
8079    .balign 128
8080.L_ALT_op_iput: /* 0x59 */
8081/* File: x86_64/alt_stub.S */
8082/*
8083 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8084 * any interesting requests and then jump to the real instruction
8085 * handler.  Unlike the Arm handler, we can't do this as a tail call
8086 * because rIBASE is caller save and we need to reload it.
8087 *
8088 * Note that unlike in the Arm implementation, we should never arrive
8089 * here with a zero breakFlag because we always refresh rIBASE on
8090 * return.
8091 */
8092    .extern MterpCheckBefore
8093    REFRESH_IBASE
8094    movq    rSELF, OUT_ARG0
8095    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8096    movq    rPC, OUT_ARG2
8097    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8098    jmp     .L_op_nop+(89*128)
8099
8100/* ------------------------------ */
8101    .balign 128
8102.L_ALT_op_iput_wide: /* 0x5a */
8103/* File: x86_64/alt_stub.S */
8104/*
8105 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8106 * any interesting requests and then jump to the real instruction
8107 * handler.  Unlike the Arm handler, we can't do this as a tail call
8108 * because rIBASE is caller save and we need to reload it.
8109 *
8110 * Note that unlike in the Arm implementation, we should never arrive
8111 * here with a zero breakFlag because we always refresh rIBASE on
8112 * return.
8113 */
8114    .extern MterpCheckBefore
8115    REFRESH_IBASE
8116    movq    rSELF, OUT_ARG0
8117    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8118    movq    rPC, OUT_ARG2
8119    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8120    jmp     .L_op_nop+(90*128)
8121
8122/* ------------------------------ */
8123    .balign 128
8124.L_ALT_op_iput_object: /* 0x5b */
8125/* File: x86_64/alt_stub.S */
8126/*
8127 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8128 * any interesting requests and then jump to the real instruction
8129 * handler.  Unlike the Arm handler, we can't do this as a tail call
8130 * because rIBASE is caller save and we need to reload it.
8131 *
8132 * Note that unlike in the Arm implementation, we should never arrive
8133 * here with a zero breakFlag because we always refresh rIBASE on
8134 * return.
8135 */
8136    .extern MterpCheckBefore
8137    REFRESH_IBASE
8138    movq    rSELF, OUT_ARG0
8139    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8140    movq    rPC, OUT_ARG2
8141    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8142    jmp     .L_op_nop+(91*128)
8143
8144/* ------------------------------ */
8145    .balign 128
8146.L_ALT_op_iput_boolean: /* 0x5c */
8147/* File: x86_64/alt_stub.S */
8148/*
8149 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8150 * any interesting requests and then jump to the real instruction
8151 * handler.  Unlike the Arm handler, we can't do this as a tail call
8152 * because rIBASE is caller save and we need to reload it.
8153 *
8154 * Note that unlike in the Arm implementation, we should never arrive
8155 * here with a zero breakFlag because we always refresh rIBASE on
8156 * return.
8157 */
8158    .extern MterpCheckBefore
8159    REFRESH_IBASE
8160    movq    rSELF, OUT_ARG0
8161    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8162    movq    rPC, OUT_ARG2
8163    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8164    jmp     .L_op_nop+(92*128)
8165
8166/* ------------------------------ */
8167    .balign 128
8168.L_ALT_op_iput_byte: /* 0x5d */
8169/* File: x86_64/alt_stub.S */
8170/*
8171 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8172 * any interesting requests and then jump to the real instruction
8173 * handler.  Unlike the Arm handler, we can't do this as a tail call
8174 * because rIBASE is caller save and we need to reload it.
8175 *
8176 * Note that unlike in the Arm implementation, we should never arrive
8177 * here with a zero breakFlag because we always refresh rIBASE on
8178 * return.
8179 */
8180    .extern MterpCheckBefore
8181    REFRESH_IBASE
8182    movq    rSELF, OUT_ARG0
8183    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8184    movq    rPC, OUT_ARG2
8185    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8186    jmp     .L_op_nop+(93*128)
8187
8188/* ------------------------------ */
8189    .balign 128
8190.L_ALT_op_iput_char: /* 0x5e */
8191/* File: x86_64/alt_stub.S */
8192/*
8193 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8194 * any interesting requests and then jump to the real instruction
8195 * handler.  Unlike the Arm handler, we can't do this as a tail call
8196 * because rIBASE is caller save and we need to reload it.
8197 *
8198 * Note that unlike in the Arm implementation, we should never arrive
8199 * here with a zero breakFlag because we always refresh rIBASE on
8200 * return.
8201 */
8202    .extern MterpCheckBefore
8203    REFRESH_IBASE
8204    movq    rSELF, OUT_ARG0
8205    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8206    movq    rPC, OUT_ARG2
8207    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8208    jmp     .L_op_nop+(94*128)
8209
8210/* ------------------------------ */
8211    .balign 128
8212.L_ALT_op_iput_short: /* 0x5f */
8213/* File: x86_64/alt_stub.S */
8214/*
8215 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8216 * any interesting requests and then jump to the real instruction
8217 * handler.  Unlike the Arm handler, we can't do this as a tail call
8218 * because rIBASE is caller save and we need to reload it.
8219 *
8220 * Note that unlike in the Arm implementation, we should never arrive
8221 * here with a zero breakFlag because we always refresh rIBASE on
8222 * return.
8223 */
8224    .extern MterpCheckBefore
8225    REFRESH_IBASE
8226    movq    rSELF, OUT_ARG0
8227    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8228    movq    rPC, OUT_ARG2
8229    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8230    jmp     .L_op_nop+(95*128)
8231
8232/* ------------------------------ */
8233    .balign 128
8234.L_ALT_op_sget: /* 0x60 */
8235/* File: x86_64/alt_stub.S */
8236/*
8237 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8238 * any interesting requests and then jump to the real instruction
8239 * handler.  Unlike the Arm handler, we can't do this as a tail call
8240 * because rIBASE is caller save and we need to reload it.
8241 *
8242 * Note that unlike in the Arm implementation, we should never arrive
8243 * here with a zero breakFlag because we always refresh rIBASE on
8244 * return.
8245 */
8246    .extern MterpCheckBefore
8247    REFRESH_IBASE
8248    movq    rSELF, OUT_ARG0
8249    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8250    movq    rPC, OUT_ARG2
8251    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8252    jmp     .L_op_nop+(96*128)
8253
8254/* ------------------------------ */
8255    .balign 128
8256.L_ALT_op_sget_wide: /* 0x61 */
8257/* File: x86_64/alt_stub.S */
8258/*
8259 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8260 * any interesting requests and then jump to the real instruction
8261 * handler.  Unlike the Arm handler, we can't do this as a tail call
8262 * because rIBASE is caller save and we need to reload it.
8263 *
8264 * Note that unlike in the Arm implementation, we should never arrive
8265 * here with a zero breakFlag because we always refresh rIBASE on
8266 * return.
8267 */
8268    .extern MterpCheckBefore
8269    REFRESH_IBASE
8270    movq    rSELF, OUT_ARG0
8271    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8272    movq    rPC, OUT_ARG2
8273    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8274    jmp     .L_op_nop+(97*128)
8275
8276/* ------------------------------ */
8277    .balign 128
8278.L_ALT_op_sget_object: /* 0x62 */
8279/* File: x86_64/alt_stub.S */
8280/*
8281 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8282 * any interesting requests and then jump to the real instruction
8283 * handler.  Unlike the Arm handler, we can't do this as a tail call
8284 * because rIBASE is caller save and we need to reload it.
8285 *
8286 * Note that unlike in the Arm implementation, we should never arrive
8287 * here with a zero breakFlag because we always refresh rIBASE on
8288 * return.
8289 */
8290    .extern MterpCheckBefore
8291    REFRESH_IBASE
8292    movq    rSELF, OUT_ARG0
8293    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8294    movq    rPC, OUT_ARG2
8295    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8296    jmp     .L_op_nop+(98*128)
8297
8298/* ------------------------------ */
8299    .balign 128
8300.L_ALT_op_sget_boolean: /* 0x63 */
8301/* File: x86_64/alt_stub.S */
8302/*
8303 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8304 * any interesting requests and then jump to the real instruction
8305 * handler.  Unlike the Arm handler, we can't do this as a tail call
8306 * because rIBASE is caller save and we need to reload it.
8307 *
8308 * Note that unlike in the Arm implementation, we should never arrive
8309 * here with a zero breakFlag because we always refresh rIBASE on
8310 * return.
8311 */
8312    .extern MterpCheckBefore
8313    REFRESH_IBASE
8314    movq    rSELF, OUT_ARG0
8315    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8316    movq    rPC, OUT_ARG2
8317    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8318    jmp     .L_op_nop+(99*128)
8319
8320/* ------------------------------ */
8321    .balign 128
8322.L_ALT_op_sget_byte: /* 0x64 */
8323/* File: x86_64/alt_stub.S */
8324/*
8325 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8326 * any interesting requests and then jump to the real instruction
8327 * handler.  Unlike the Arm handler, we can't do this as a tail call
8328 * because rIBASE is caller save and we need to reload it.
8329 *
8330 * Note that unlike in the Arm implementation, we should never arrive
8331 * here with a zero breakFlag because we always refresh rIBASE on
8332 * return.
8333 */
8334    .extern MterpCheckBefore
8335    REFRESH_IBASE
8336    movq    rSELF, OUT_ARG0
8337    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8338    movq    rPC, OUT_ARG2
8339    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8340    jmp     .L_op_nop+(100*128)
8341
8342/* ------------------------------ */
8343    .balign 128
8344.L_ALT_op_sget_char: /* 0x65 */
8345/* File: x86_64/alt_stub.S */
8346/*
8347 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8348 * any interesting requests and then jump to the real instruction
8349 * handler.  Unlike the Arm handler, we can't do this as a tail call
8350 * because rIBASE is caller save and we need to reload it.
8351 *
8352 * Note that unlike in the Arm implementation, we should never arrive
8353 * here with a zero breakFlag because we always refresh rIBASE on
8354 * return.
8355 */
8356    .extern MterpCheckBefore
8357    REFRESH_IBASE
8358    movq    rSELF, OUT_ARG0
8359    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8360    movq    rPC, OUT_ARG2
8361    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8362    jmp     .L_op_nop+(101*128)
8363
8364/* ------------------------------ */
8365    .balign 128
8366.L_ALT_op_sget_short: /* 0x66 */
8367/* File: x86_64/alt_stub.S */
8368/*
8369 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8370 * any interesting requests and then jump to the real instruction
8371 * handler.  Unlike the Arm handler, we can't do this as a tail call
8372 * because rIBASE is caller save and we need to reload it.
8373 *
8374 * Note that unlike in the Arm implementation, we should never arrive
8375 * here with a zero breakFlag because we always refresh rIBASE on
8376 * return.
8377 */
8378    .extern MterpCheckBefore
8379    REFRESH_IBASE
8380    movq    rSELF, OUT_ARG0
8381    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8382    movq    rPC, OUT_ARG2
8383    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8384    jmp     .L_op_nop+(102*128)
8385
8386/* ------------------------------ */
8387    .balign 128
8388.L_ALT_op_sput: /* 0x67 */
8389/* File: x86_64/alt_stub.S */
8390/*
8391 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8392 * any interesting requests and then jump to the real instruction
8393 * handler.  Unlike the Arm handler, we can't do this as a tail call
8394 * because rIBASE is caller save and we need to reload it.
8395 *
8396 * Note that unlike in the Arm implementation, we should never arrive
8397 * here with a zero breakFlag because we always refresh rIBASE on
8398 * return.
8399 */
8400    .extern MterpCheckBefore
8401    REFRESH_IBASE
8402    movq    rSELF, OUT_ARG0
8403    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8404    movq    rPC, OUT_ARG2
8405    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8406    jmp     .L_op_nop+(103*128)
8407
8408/* ------------------------------ */
8409    .balign 128
8410.L_ALT_op_sput_wide: /* 0x68 */
8411/* File: x86_64/alt_stub.S */
8412/*
8413 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8414 * any interesting requests and then jump to the real instruction
8415 * handler.  Unlike the Arm handler, we can't do this as a tail call
8416 * because rIBASE is caller save and we need to reload it.
8417 *
8418 * Note that unlike in the Arm implementation, we should never arrive
8419 * here with a zero breakFlag because we always refresh rIBASE on
8420 * return.
8421 */
8422    .extern MterpCheckBefore
8423    REFRESH_IBASE
8424    movq    rSELF, OUT_ARG0
8425    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8426    movq    rPC, OUT_ARG2
8427    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8428    jmp     .L_op_nop+(104*128)
8429
8430/* ------------------------------ */
8431    .balign 128
8432.L_ALT_op_sput_object: /* 0x69 */
8433/* File: x86_64/alt_stub.S */
8434/*
8435 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8436 * any interesting requests and then jump to the real instruction
8437 * handler.  Unlike the Arm handler, we can't do this as a tail call
8438 * because rIBASE is caller save and we need to reload it.
8439 *
8440 * Note that unlike in the Arm implementation, we should never arrive
8441 * here with a zero breakFlag because we always refresh rIBASE on
8442 * return.
8443 */
8444    .extern MterpCheckBefore
8445    REFRESH_IBASE
8446    movq    rSELF, OUT_ARG0
8447    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8448    movq    rPC, OUT_ARG2
8449    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8450    jmp     .L_op_nop+(105*128)
8451
8452/* ------------------------------ */
8453    .balign 128
8454.L_ALT_op_sput_boolean: /* 0x6a */
8455/* File: x86_64/alt_stub.S */
8456/*
8457 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8458 * any interesting requests and then jump to the real instruction
8459 * handler.  Unlike the Arm handler, we can't do this as a tail call
8460 * because rIBASE is caller save and we need to reload it.
8461 *
8462 * Note that unlike in the Arm implementation, we should never arrive
8463 * here with a zero breakFlag because we always refresh rIBASE on
8464 * return.
8465 */
8466    .extern MterpCheckBefore
8467    REFRESH_IBASE
8468    movq    rSELF, OUT_ARG0
8469    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8470    movq    rPC, OUT_ARG2
8471    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8472    jmp     .L_op_nop+(106*128)
8473
8474/* ------------------------------ */
8475    .balign 128
8476.L_ALT_op_sput_byte: /* 0x6b */
8477/* File: x86_64/alt_stub.S */
8478/*
8479 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8480 * any interesting requests and then jump to the real instruction
8481 * handler.  Unlike the Arm handler, we can't do this as a tail call
8482 * because rIBASE is caller save and we need to reload it.
8483 *
8484 * Note that unlike in the Arm implementation, we should never arrive
8485 * here with a zero breakFlag because we always refresh rIBASE on
8486 * return.
8487 */
8488    .extern MterpCheckBefore
8489    REFRESH_IBASE
8490    movq    rSELF, OUT_ARG0
8491    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8492    movq    rPC, OUT_ARG2
8493    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8494    jmp     .L_op_nop+(107*128)
8495
8496/* ------------------------------ */
8497    .balign 128
8498.L_ALT_op_sput_char: /* 0x6c */
8499/* File: x86_64/alt_stub.S */
8500/*
8501 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8502 * any interesting requests and then jump to the real instruction
8503 * handler.  Unlike the Arm handler, we can't do this as a tail call
8504 * because rIBASE is caller save and we need to reload it.
8505 *
8506 * Note that unlike in the Arm implementation, we should never arrive
8507 * here with a zero breakFlag because we always refresh rIBASE on
8508 * return.
8509 */
8510    .extern MterpCheckBefore
8511    REFRESH_IBASE
8512    movq    rSELF, OUT_ARG0
8513    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8514    movq    rPC, OUT_ARG2
8515    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8516    jmp     .L_op_nop+(108*128)
8517
8518/* ------------------------------ */
8519    .balign 128
8520.L_ALT_op_sput_short: /* 0x6d */
8521/* File: x86_64/alt_stub.S */
8522/*
8523 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8524 * any interesting requests and then jump to the real instruction
8525 * handler.  Unlike the Arm handler, we can't do this as a tail call
8526 * because rIBASE is caller save and we need to reload it.
8527 *
8528 * Note that unlike in the Arm implementation, we should never arrive
8529 * here with a zero breakFlag because we always refresh rIBASE on
8530 * return.
8531 */
8532    .extern MterpCheckBefore
8533    REFRESH_IBASE
8534    movq    rSELF, OUT_ARG0
8535    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8536    movq    rPC, OUT_ARG2
8537    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8538    jmp     .L_op_nop+(109*128)
8539
8540/* ------------------------------ */
8541    .balign 128
8542.L_ALT_op_invoke_virtual: /* 0x6e */
8543/* File: x86_64/alt_stub.S */
8544/*
8545 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8546 * any interesting requests and then jump to the real instruction
8547 * handler.  Unlike the Arm handler, we can't do this as a tail call
8548 * because rIBASE is caller save and we need to reload it.
8549 *
8550 * Note that unlike in the Arm implementation, we should never arrive
8551 * here with a zero breakFlag because we always refresh rIBASE on
8552 * return.
8553 */
8554    .extern MterpCheckBefore
8555    REFRESH_IBASE
8556    movq    rSELF, OUT_ARG0
8557    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8558    movq    rPC, OUT_ARG2
8559    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8560    jmp     .L_op_nop+(110*128)
8561
8562/* ------------------------------ */
8563    .balign 128
8564.L_ALT_op_invoke_super: /* 0x6f */
8565/* File: x86_64/alt_stub.S */
8566/*
8567 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8568 * any interesting requests and then jump to the real instruction
8569 * handler.  Unlike the Arm handler, we can't do this as a tail call
8570 * because rIBASE is caller save and we need to reload it.
8571 *
8572 * Note that unlike in the Arm implementation, we should never arrive
8573 * here with a zero breakFlag because we always refresh rIBASE on
8574 * return.
8575 */
8576    .extern MterpCheckBefore
8577    REFRESH_IBASE
8578    movq    rSELF, OUT_ARG0
8579    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8580    movq    rPC, OUT_ARG2
8581    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8582    jmp     .L_op_nop+(111*128)
8583
8584/* ------------------------------ */
8585    .balign 128
8586.L_ALT_op_invoke_direct: /* 0x70 */
8587/* File: x86_64/alt_stub.S */
8588/*
8589 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8590 * any interesting requests and then jump to the real instruction
8591 * handler.  Unlike the Arm handler, we can't do this as a tail call
8592 * because rIBASE is caller save and we need to reload it.
8593 *
8594 * Note that unlike in the Arm implementation, we should never arrive
8595 * here with a zero breakFlag because we always refresh rIBASE on
8596 * return.
8597 */
8598    .extern MterpCheckBefore
8599    REFRESH_IBASE
8600    movq    rSELF, OUT_ARG0
8601    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8602    movq    rPC, OUT_ARG2
8603    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8604    jmp     .L_op_nop+(112*128)
8605
8606/* ------------------------------ */
8607    .balign 128
8608.L_ALT_op_invoke_static: /* 0x71 */
8609/* File: x86_64/alt_stub.S */
8610/*
8611 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8612 * any interesting requests and then jump to the real instruction
8613 * handler.  Unlike the Arm handler, we can't do this as a tail call
8614 * because rIBASE is caller save and we need to reload it.
8615 *
8616 * Note that unlike in the Arm implementation, we should never arrive
8617 * here with a zero breakFlag because we always refresh rIBASE on
8618 * return.
8619 */
8620    .extern MterpCheckBefore
8621    REFRESH_IBASE
8622    movq    rSELF, OUT_ARG0
8623    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8624    movq    rPC, OUT_ARG2
8625    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8626    jmp     .L_op_nop+(113*128)
8627
8628/* ------------------------------ */
8629    .balign 128
8630.L_ALT_op_invoke_interface: /* 0x72 */
8631/* File: x86_64/alt_stub.S */
8632/*
8633 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8634 * any interesting requests and then jump to the real instruction
8635 * handler.  Unlike the Arm handler, we can't do this as a tail call
8636 * because rIBASE is caller save and we need to reload it.
8637 *
8638 * Note that unlike in the Arm implementation, we should never arrive
8639 * here with a zero breakFlag because we always refresh rIBASE on
8640 * return.
8641 */
8642    .extern MterpCheckBefore
8643    REFRESH_IBASE
8644    movq    rSELF, OUT_ARG0
8645    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8646    movq    rPC, OUT_ARG2
8647    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8648    jmp     .L_op_nop+(114*128)
8649
8650/* ------------------------------ */
8651    .balign 128
8652.L_ALT_op_return_void_no_barrier: /* 0x73 */
8653/* File: x86_64/alt_stub.S */
8654/*
8655 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8656 * any interesting requests and then jump to the real instruction
8657 * handler.  Unlike the Arm handler, we can't do this as a tail call
8658 * because rIBASE is caller save and we need to reload it.
8659 *
8660 * Note that unlike in the Arm implementation, we should never arrive
8661 * here with a zero breakFlag because we always refresh rIBASE on
8662 * return.
8663 */
8664    .extern MterpCheckBefore
8665    REFRESH_IBASE
8666    movq    rSELF, OUT_ARG0
8667    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8668    movq    rPC, OUT_ARG2
8669    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8670    jmp     .L_op_nop+(115*128)
8671
8672/* ------------------------------ */
8673    .balign 128
8674.L_ALT_op_invoke_virtual_range: /* 0x74 */
8675/* File: x86_64/alt_stub.S */
8676/*
8677 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8678 * any interesting requests and then jump to the real instruction
8679 * handler.  Unlike the Arm handler, we can't do this as a tail call
8680 * because rIBASE is caller save and we need to reload it.
8681 *
8682 * Note that unlike in the Arm implementation, we should never arrive
8683 * here with a zero breakFlag because we always refresh rIBASE on
8684 * return.
8685 */
8686    .extern MterpCheckBefore
8687    REFRESH_IBASE
8688    movq    rSELF, OUT_ARG0
8689    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8690    movq    rPC, OUT_ARG2
8691    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8692    jmp     .L_op_nop+(116*128)
8693
8694/* ------------------------------ */
8695    .balign 128
8696.L_ALT_op_invoke_super_range: /* 0x75 */
8697/* File: x86_64/alt_stub.S */
8698/*
8699 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8700 * any interesting requests and then jump to the real instruction
8701 * handler.  Unlike the Arm handler, we can't do this as a tail call
8702 * because rIBASE is caller save and we need to reload it.
8703 *
8704 * Note that unlike in the Arm implementation, we should never arrive
8705 * here with a zero breakFlag because we always refresh rIBASE on
8706 * return.
8707 */
8708    .extern MterpCheckBefore
8709    REFRESH_IBASE
8710    movq    rSELF, OUT_ARG0
8711    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8712    movq    rPC, OUT_ARG2
8713    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8714    jmp     .L_op_nop+(117*128)
8715
8716/* ------------------------------ */
8717    .balign 128
8718.L_ALT_op_invoke_direct_range: /* 0x76 */
8719/* File: x86_64/alt_stub.S */
8720/*
8721 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8722 * any interesting requests and then jump to the real instruction
8723 * handler.  Unlike the Arm handler, we can't do this as a tail call
8724 * because rIBASE is caller save and we need to reload it.
8725 *
8726 * Note that unlike in the Arm implementation, we should never arrive
8727 * here with a zero breakFlag because we always refresh rIBASE on
8728 * return.
8729 */
8730    .extern MterpCheckBefore
8731    REFRESH_IBASE
8732    movq    rSELF, OUT_ARG0
8733    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8734    movq    rPC, OUT_ARG2
8735    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8736    jmp     .L_op_nop+(118*128)
8737
8738/* ------------------------------ */
8739    .balign 128
8740.L_ALT_op_invoke_static_range: /* 0x77 */
8741/* File: x86_64/alt_stub.S */
8742/*
8743 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8744 * any interesting requests and then jump to the real instruction
8745 * handler.  Unlike the Arm handler, we can't do this as a tail call
8746 * because rIBASE is caller save and we need to reload it.
8747 *
8748 * Note that unlike in the Arm implementation, we should never arrive
8749 * here with a zero breakFlag because we always refresh rIBASE on
8750 * return.
8751 */
8752    .extern MterpCheckBefore
8753    REFRESH_IBASE
8754    movq    rSELF, OUT_ARG0
8755    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8756    movq    rPC, OUT_ARG2
8757    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8758    jmp     .L_op_nop+(119*128)
8759
8760/* ------------------------------ */
8761    .balign 128
8762.L_ALT_op_invoke_interface_range: /* 0x78 */
8763/* File: x86_64/alt_stub.S */
8764/*
8765 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8766 * any interesting requests and then jump to the real instruction
8767 * handler.  Unlike the Arm handler, we can't do this as a tail call
8768 * because rIBASE is caller save and we need to reload it.
8769 *
8770 * Note that unlike in the Arm implementation, we should never arrive
8771 * here with a zero breakFlag because we always refresh rIBASE on
8772 * return.
8773 */
8774    .extern MterpCheckBefore
8775    REFRESH_IBASE
8776    movq    rSELF, OUT_ARG0
8777    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8778    movq    rPC, OUT_ARG2
8779    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8780    jmp     .L_op_nop+(120*128)
8781
8782/* ------------------------------ */
8783    .balign 128
8784.L_ALT_op_unused_79: /* 0x79 */
8785/* File: x86_64/alt_stub.S */
8786/*
8787 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8788 * any interesting requests and then jump to the real instruction
8789 * handler.  Unlike the Arm handler, we can't do this as a tail call
8790 * because rIBASE is caller save and we need to reload it.
8791 *
8792 * Note that unlike in the Arm implementation, we should never arrive
8793 * here with a zero breakFlag because we always refresh rIBASE on
8794 * return.
8795 */
8796    .extern MterpCheckBefore
8797    REFRESH_IBASE
8798    movq    rSELF, OUT_ARG0
8799    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8800    movq    rPC, OUT_ARG2
8801    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8802    jmp     .L_op_nop+(121*128)
8803
8804/* ------------------------------ */
8805    .balign 128
8806.L_ALT_op_unused_7a: /* 0x7a */
8807/* File: x86_64/alt_stub.S */
8808/*
8809 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8810 * any interesting requests and then jump to the real instruction
8811 * handler.  Unlike the Arm handler, we can't do this as a tail call
8812 * because rIBASE is caller save and we need to reload it.
8813 *
8814 * Note that unlike in the Arm implementation, we should never arrive
8815 * here with a zero breakFlag because we always refresh rIBASE on
8816 * return.
8817 */
8818    .extern MterpCheckBefore
8819    REFRESH_IBASE
8820    movq    rSELF, OUT_ARG0
8821    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8822    movq    rPC, OUT_ARG2
8823    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8824    jmp     .L_op_nop+(122*128)
8825
8826/* ------------------------------ */
8827    .balign 128
8828.L_ALT_op_neg_int: /* 0x7b */
8829/* File: x86_64/alt_stub.S */
8830/*
8831 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8832 * any interesting requests and then jump to the real instruction
8833 * handler.  Unlike the Arm handler, we can't do this as a tail call
8834 * because rIBASE is caller save and we need to reload it.
8835 *
8836 * Note that unlike in the Arm implementation, we should never arrive
8837 * here with a zero breakFlag because we always refresh rIBASE on
8838 * return.
8839 */
8840    .extern MterpCheckBefore
8841    REFRESH_IBASE
8842    movq    rSELF, OUT_ARG0
8843    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8844    movq    rPC, OUT_ARG2
8845    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8846    jmp     .L_op_nop+(123*128)
8847
8848/* ------------------------------ */
8849    .balign 128
8850.L_ALT_op_not_int: /* 0x7c */
8851/* File: x86_64/alt_stub.S */
8852/*
8853 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8854 * any interesting requests and then jump to the real instruction
8855 * handler.  Unlike the Arm handler, we can't do this as a tail call
8856 * because rIBASE is caller save and we need to reload it.
8857 *
8858 * Note that unlike in the Arm implementation, we should never arrive
8859 * here with a zero breakFlag because we always refresh rIBASE on
8860 * return.
8861 */
8862    .extern MterpCheckBefore
8863    REFRESH_IBASE
8864    movq    rSELF, OUT_ARG0
8865    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8866    movq    rPC, OUT_ARG2
8867    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8868    jmp     .L_op_nop+(124*128)
8869
8870/* ------------------------------ */
8871    .balign 128
8872.L_ALT_op_neg_long: /* 0x7d */
8873/* File: x86_64/alt_stub.S */
8874/*
8875 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8876 * any interesting requests and then jump to the real instruction
8877 * handler.  Unlike the Arm handler, we can't do this as a tail call
8878 * because rIBASE is caller save and we need to reload it.
8879 *
8880 * Note that unlike in the Arm implementation, we should never arrive
8881 * here with a zero breakFlag because we always refresh rIBASE on
8882 * return.
8883 */
8884    .extern MterpCheckBefore
8885    REFRESH_IBASE
8886    movq    rSELF, OUT_ARG0
8887    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8888    movq    rPC, OUT_ARG2
8889    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8890    jmp     .L_op_nop+(125*128)
8891
8892/* ------------------------------ */
8893    .balign 128
8894.L_ALT_op_not_long: /* 0x7e */
8895/* File: x86_64/alt_stub.S */
8896/*
8897 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8898 * any interesting requests and then jump to the real instruction
8899 * handler.  Unlike the Arm handler, we can't do this as a tail call
8900 * because rIBASE is caller save and we need to reload it.
8901 *
8902 * Note that unlike in the Arm implementation, we should never arrive
8903 * here with a zero breakFlag because we always refresh rIBASE on
8904 * return.
8905 */
8906    .extern MterpCheckBefore
8907    REFRESH_IBASE
8908    movq    rSELF, OUT_ARG0
8909    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8910    movq    rPC, OUT_ARG2
8911    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8912    jmp     .L_op_nop+(126*128)
8913
8914/* ------------------------------ */
8915    .balign 128
8916.L_ALT_op_neg_float: /* 0x7f */
8917/* File: x86_64/alt_stub.S */
8918/*
8919 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8920 * any interesting requests and then jump to the real instruction
8921 * handler.  Unlike the Arm handler, we can't do this as a tail call
8922 * because rIBASE is caller save and we need to reload it.
8923 *
8924 * Note that unlike in the Arm implementation, we should never arrive
8925 * here with a zero breakFlag because we always refresh rIBASE on
8926 * return.
8927 */
8928    .extern MterpCheckBefore
8929    REFRESH_IBASE
8930    movq    rSELF, OUT_ARG0
8931    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8932    movq    rPC, OUT_ARG2
8933    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8934    jmp     .L_op_nop+(127*128)
8935
8936/* ------------------------------ */
8937    .balign 128
8938.L_ALT_op_neg_double: /* 0x80 */
8939/* File: x86_64/alt_stub.S */
8940/*
8941 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8942 * any interesting requests and then jump to the real instruction
8943 * handler.  Unlike the Arm handler, we can't do this as a tail call
8944 * because rIBASE is caller save and we need to reload it.
8945 *
8946 * Note that unlike in the Arm implementation, we should never arrive
8947 * here with a zero breakFlag because we always refresh rIBASE on
8948 * return.
8949 */
8950    .extern MterpCheckBefore
8951    REFRESH_IBASE
8952    movq    rSELF, OUT_ARG0
8953    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8954    movq    rPC, OUT_ARG2
8955    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8956    jmp     .L_op_nop+(128*128)
8957
8958/* ------------------------------ */
8959    .balign 128
8960.L_ALT_op_int_to_long: /* 0x81 */
8961/* File: x86_64/alt_stub.S */
8962/*
8963 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8964 * any interesting requests and then jump to the real instruction
8965 * handler.  Unlike the Arm handler, we can't do this as a tail call
8966 * because rIBASE is caller save and we need to reload it.
8967 *
8968 * Note that unlike in the Arm implementation, we should never arrive
8969 * here with a zero breakFlag because we always refresh rIBASE on
8970 * return.
8971 */
8972    .extern MterpCheckBefore
8973    REFRESH_IBASE
8974    movq    rSELF, OUT_ARG0
8975    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8976    movq    rPC, OUT_ARG2
8977    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
8978    jmp     .L_op_nop+(129*128)
8979
8980/* ------------------------------ */
8981    .balign 128
8982.L_ALT_op_int_to_float: /* 0x82 */
8983/* File: x86_64/alt_stub.S */
8984/*
8985 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8986 * any interesting requests and then jump to the real instruction
8987 * handler.  Unlike the Arm handler, we can't do this as a tail call
8988 * because rIBASE is caller save and we need to reload it.
8989 *
8990 * Note that unlike in the Arm implementation, we should never arrive
8991 * here with a zero breakFlag because we always refresh rIBASE on
8992 * return.
8993 */
8994    .extern MterpCheckBefore
8995    REFRESH_IBASE
8996    movq    rSELF, OUT_ARG0
8997    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
8998    movq    rPC, OUT_ARG2
8999    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9000    jmp     .L_op_nop+(130*128)
9001
9002/* ------------------------------ */
9003    .balign 128
9004.L_ALT_op_int_to_double: /* 0x83 */
9005/* File: x86_64/alt_stub.S */
9006/*
9007 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9008 * any interesting requests and then jump to the real instruction
9009 * handler.  Unlike the Arm handler, we can't do this as a tail call
9010 * because rIBASE is caller save and we need to reload it.
9011 *
9012 * Note that unlike in the Arm implementation, we should never arrive
9013 * here with a zero breakFlag because we always refresh rIBASE on
9014 * return.
9015 */
9016    .extern MterpCheckBefore
9017    REFRESH_IBASE
9018    movq    rSELF, OUT_ARG0
9019    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9020    movq    rPC, OUT_ARG2
9021    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9022    jmp     .L_op_nop+(131*128)
9023
9024/* ------------------------------ */
9025    .balign 128
9026.L_ALT_op_long_to_int: /* 0x84 */
9027/* File: x86_64/alt_stub.S */
9028/*
9029 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9030 * any interesting requests and then jump to the real instruction
9031 * handler.  Unlike the Arm handler, we can't do this as a tail call
9032 * because rIBASE is caller save and we need to reload it.
9033 *
9034 * Note that unlike in the Arm implementation, we should never arrive
9035 * here with a zero breakFlag because we always refresh rIBASE on
9036 * return.
9037 */
9038    .extern MterpCheckBefore
9039    REFRESH_IBASE
9040    movq    rSELF, OUT_ARG0
9041    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9042    movq    rPC, OUT_ARG2
9043    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9044    jmp     .L_op_nop+(132*128)
9045
9046/* ------------------------------ */
9047    .balign 128
9048.L_ALT_op_long_to_float: /* 0x85 */
9049/* File: x86_64/alt_stub.S */
9050/*
9051 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9052 * any interesting requests and then jump to the real instruction
9053 * handler.  Unlike the Arm handler, we can't do this as a tail call
9054 * because rIBASE is caller save and we need to reload it.
9055 *
9056 * Note that unlike in the Arm implementation, we should never arrive
9057 * here with a zero breakFlag because we always refresh rIBASE on
9058 * return.
9059 */
9060    .extern MterpCheckBefore
9061    REFRESH_IBASE
9062    movq    rSELF, OUT_ARG0
9063    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9064    movq    rPC, OUT_ARG2
9065    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9066    jmp     .L_op_nop+(133*128)
9067
9068/* ------------------------------ */
9069    .balign 128
9070.L_ALT_op_long_to_double: /* 0x86 */
9071/* File: x86_64/alt_stub.S */
9072/*
9073 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9074 * any interesting requests and then jump to the real instruction
9075 * handler.  Unlike the Arm handler, we can't do this as a tail call
9076 * because rIBASE is caller save and we need to reload it.
9077 *
9078 * Note that unlike in the Arm implementation, we should never arrive
9079 * here with a zero breakFlag because we always refresh rIBASE on
9080 * return.
9081 */
9082    .extern MterpCheckBefore
9083    REFRESH_IBASE
9084    movq    rSELF, OUT_ARG0
9085    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9086    movq    rPC, OUT_ARG2
9087    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9088    jmp     .L_op_nop+(134*128)
9089
9090/* ------------------------------ */
9091    .balign 128
9092.L_ALT_op_float_to_int: /* 0x87 */
9093/* File: x86_64/alt_stub.S */
9094/*
9095 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9096 * any interesting requests and then jump to the real instruction
9097 * handler.  Unlike the Arm handler, we can't do this as a tail call
9098 * because rIBASE is caller save and we need to reload it.
9099 *
9100 * Note that unlike in the Arm implementation, we should never arrive
9101 * here with a zero breakFlag because we always refresh rIBASE on
9102 * return.
9103 */
9104    .extern MterpCheckBefore
9105    REFRESH_IBASE
9106    movq    rSELF, OUT_ARG0
9107    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9108    movq    rPC, OUT_ARG2
9109    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9110    jmp     .L_op_nop+(135*128)
9111
9112/* ------------------------------ */
9113    .balign 128
9114.L_ALT_op_float_to_long: /* 0x88 */
9115/* File: x86_64/alt_stub.S */
9116/*
9117 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9118 * any interesting requests and then jump to the real instruction
9119 * handler.  Unlike the Arm handler, we can't do this as a tail call
9120 * because rIBASE is caller save and we need to reload it.
9121 *
9122 * Note that unlike in the Arm implementation, we should never arrive
9123 * here with a zero breakFlag because we always refresh rIBASE on
9124 * return.
9125 */
9126    .extern MterpCheckBefore
9127    REFRESH_IBASE
9128    movq    rSELF, OUT_ARG0
9129    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9130    movq    rPC, OUT_ARG2
9131    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9132    jmp     .L_op_nop+(136*128)
9133
9134/* ------------------------------ */
9135    .balign 128
9136.L_ALT_op_float_to_double: /* 0x89 */
9137/* File: x86_64/alt_stub.S */
9138/*
9139 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9140 * any interesting requests and then jump to the real instruction
9141 * handler.  Unlike the Arm handler, we can't do this as a tail call
9142 * because rIBASE is caller save and we need to reload it.
9143 *
9144 * Note that unlike in the Arm implementation, we should never arrive
9145 * here with a zero breakFlag because we always refresh rIBASE on
9146 * return.
9147 */
9148    .extern MterpCheckBefore
9149    REFRESH_IBASE
9150    movq    rSELF, OUT_ARG0
9151    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9152    movq    rPC, OUT_ARG2
9153    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9154    jmp     .L_op_nop+(137*128)
9155
9156/* ------------------------------ */
9157    .balign 128
9158.L_ALT_op_double_to_int: /* 0x8a */
9159/* File: x86_64/alt_stub.S */
9160/*
9161 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9162 * any interesting requests and then jump to the real instruction
9163 * handler.  Unlike the Arm handler, we can't do this as a tail call
9164 * because rIBASE is caller save and we need to reload it.
9165 *
9166 * Note that unlike in the Arm implementation, we should never arrive
9167 * here with a zero breakFlag because we always refresh rIBASE on
9168 * return.
9169 */
9170    .extern MterpCheckBefore
9171    REFRESH_IBASE
9172    movq    rSELF, OUT_ARG0
9173    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9174    movq    rPC, OUT_ARG2
9175    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9176    jmp     .L_op_nop+(138*128)
9177
9178/* ------------------------------ */
9179    .balign 128
9180.L_ALT_op_double_to_long: /* 0x8b */
9181/* File: x86_64/alt_stub.S */
9182/*
9183 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9184 * any interesting requests and then jump to the real instruction
9185 * handler.  Unlike the Arm handler, we can't do this as a tail call
9186 * because rIBASE is caller save and we need to reload it.
9187 *
9188 * Note that unlike in the Arm implementation, we should never arrive
9189 * here with a zero breakFlag because we always refresh rIBASE on
9190 * return.
9191 */
9192    .extern MterpCheckBefore
9193    REFRESH_IBASE
9194    movq    rSELF, OUT_ARG0
9195    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9196    movq    rPC, OUT_ARG2
9197    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9198    jmp     .L_op_nop+(139*128)
9199
9200/* ------------------------------ */
9201    .balign 128
9202.L_ALT_op_double_to_float: /* 0x8c */
9203/* File: x86_64/alt_stub.S */
9204/*
9205 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9206 * any interesting requests and then jump to the real instruction
9207 * handler.  Unlike the Arm handler, we can't do this as a tail call
9208 * because rIBASE is caller save and we need to reload it.
9209 *
9210 * Note that unlike in the Arm implementation, we should never arrive
9211 * here with a zero breakFlag because we always refresh rIBASE on
9212 * return.
9213 */
9214    .extern MterpCheckBefore
9215    REFRESH_IBASE
9216    movq    rSELF, OUT_ARG0
9217    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9218    movq    rPC, OUT_ARG2
9219    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9220    jmp     .L_op_nop+(140*128)
9221
9222/* ------------------------------ */
9223    .balign 128
9224.L_ALT_op_int_to_byte: /* 0x8d */
9225/* File: x86_64/alt_stub.S */
9226/*
9227 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9228 * any interesting requests and then jump to the real instruction
9229 * handler.  Unlike the Arm handler, we can't do this as a tail call
9230 * because rIBASE is caller save and we need to reload it.
9231 *
9232 * Note that unlike in the Arm implementation, we should never arrive
9233 * here with a zero breakFlag because we always refresh rIBASE on
9234 * return.
9235 */
9236    .extern MterpCheckBefore
9237    REFRESH_IBASE
9238    movq    rSELF, OUT_ARG0
9239    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9240    movq    rPC, OUT_ARG2
9241    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9242    jmp     .L_op_nop+(141*128)
9243
9244/* ------------------------------ */
9245    .balign 128
9246.L_ALT_op_int_to_char: /* 0x8e */
9247/* File: x86_64/alt_stub.S */
9248/*
9249 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9250 * any interesting requests and then jump to the real instruction
9251 * handler.  Unlike the Arm handler, we can't do this as a tail call
9252 * because rIBASE is caller save and we need to reload it.
9253 *
9254 * Note that unlike in the Arm implementation, we should never arrive
9255 * here with a zero breakFlag because we always refresh rIBASE on
9256 * return.
9257 */
9258    .extern MterpCheckBefore
9259    REFRESH_IBASE
9260    movq    rSELF, OUT_ARG0
9261    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9262    movq    rPC, OUT_ARG2
9263    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9264    jmp     .L_op_nop+(142*128)
9265
9266/* ------------------------------ */
9267    .balign 128
9268.L_ALT_op_int_to_short: /* 0x8f */
9269/* File: x86_64/alt_stub.S */
9270/*
9271 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9272 * any interesting requests and then jump to the real instruction
9273 * handler.  Unlike the Arm handler, we can't do this as a tail call
9274 * because rIBASE is caller save and we need to reload it.
9275 *
9276 * Note that unlike in the Arm implementation, we should never arrive
9277 * here with a zero breakFlag because we always refresh rIBASE on
9278 * return.
9279 */
9280    .extern MterpCheckBefore
9281    REFRESH_IBASE
9282    movq    rSELF, OUT_ARG0
9283    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9284    movq    rPC, OUT_ARG2
9285    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9286    jmp     .L_op_nop+(143*128)
9287
9288/* ------------------------------ */
9289    .balign 128
9290.L_ALT_op_add_int: /* 0x90 */
9291/* File: x86_64/alt_stub.S */
9292/*
9293 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9294 * any interesting requests and then jump to the real instruction
9295 * handler.  Unlike the Arm handler, we can't do this as a tail call
9296 * because rIBASE is caller save and we need to reload it.
9297 *
9298 * Note that unlike in the Arm implementation, we should never arrive
9299 * here with a zero breakFlag because we always refresh rIBASE on
9300 * return.
9301 */
9302    .extern MterpCheckBefore
9303    REFRESH_IBASE
9304    movq    rSELF, OUT_ARG0
9305    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9306    movq    rPC, OUT_ARG2
9307    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9308    jmp     .L_op_nop+(144*128)
9309
9310/* ------------------------------ */
9311    .balign 128
9312.L_ALT_op_sub_int: /* 0x91 */
9313/* File: x86_64/alt_stub.S */
9314/*
9315 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9316 * any interesting requests and then jump to the real instruction
9317 * handler.  Unlike the Arm handler, we can't do this as a tail call
9318 * because rIBASE is caller save and we need to reload it.
9319 *
9320 * Note that unlike in the Arm implementation, we should never arrive
9321 * here with a zero breakFlag because we always refresh rIBASE on
9322 * return.
9323 */
9324    .extern MterpCheckBefore
9325    REFRESH_IBASE
9326    movq    rSELF, OUT_ARG0
9327    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9328    movq    rPC, OUT_ARG2
9329    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9330    jmp     .L_op_nop+(145*128)
9331
9332/* ------------------------------ */
9333    .balign 128
9334.L_ALT_op_mul_int: /* 0x92 */
9335/* File: x86_64/alt_stub.S */
9336/*
9337 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9338 * any interesting requests and then jump to the real instruction
9339 * handler.  Unlike the Arm handler, we can't do this as a tail call
9340 * because rIBASE is caller save and we need to reload it.
9341 *
9342 * Note that unlike in the Arm implementation, we should never arrive
9343 * here with a zero breakFlag because we always refresh rIBASE on
9344 * return.
9345 */
9346    .extern MterpCheckBefore
9347    REFRESH_IBASE
9348    movq    rSELF, OUT_ARG0
9349    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9350    movq    rPC, OUT_ARG2
9351    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9352    jmp     .L_op_nop+(146*128)
9353
9354/* ------------------------------ */
9355    .balign 128
9356.L_ALT_op_div_int: /* 0x93 */
9357/* File: x86_64/alt_stub.S */
9358/*
9359 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9360 * any interesting requests and then jump to the real instruction
9361 * handler.  Unlike the Arm handler, we can't do this as a tail call
9362 * because rIBASE is caller save and we need to reload it.
9363 *
9364 * Note that unlike in the Arm implementation, we should never arrive
9365 * here with a zero breakFlag because we always refresh rIBASE on
9366 * return.
9367 */
9368    .extern MterpCheckBefore
9369    REFRESH_IBASE
9370    movq    rSELF, OUT_ARG0
9371    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9372    movq    rPC, OUT_ARG2
9373    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9374    jmp     .L_op_nop+(147*128)
9375
9376/* ------------------------------ */
9377    .balign 128
9378.L_ALT_op_rem_int: /* 0x94 */
9379/* File: x86_64/alt_stub.S */
9380/*
9381 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9382 * any interesting requests and then jump to the real instruction
9383 * handler.  Unlike the Arm handler, we can't do this as a tail call
9384 * because rIBASE is caller save and we need to reload it.
9385 *
9386 * Note that unlike in the Arm implementation, we should never arrive
9387 * here with a zero breakFlag because we always refresh rIBASE on
9388 * return.
9389 */
9390    .extern MterpCheckBefore
9391    REFRESH_IBASE
9392    movq    rSELF, OUT_ARG0
9393    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9394    movq    rPC, OUT_ARG2
9395    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9396    jmp     .L_op_nop+(148*128)
9397
9398/* ------------------------------ */
9399    .balign 128
9400.L_ALT_op_and_int: /* 0x95 */
9401/* File: x86_64/alt_stub.S */
9402/*
9403 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9404 * any interesting requests and then jump to the real instruction
9405 * handler.  Unlike the Arm handler, we can't do this as a tail call
9406 * because rIBASE is caller save and we need to reload it.
9407 *
9408 * Note that unlike in the Arm implementation, we should never arrive
9409 * here with a zero breakFlag because we always refresh rIBASE on
9410 * return.
9411 */
9412    .extern MterpCheckBefore
9413    REFRESH_IBASE
9414    movq    rSELF, OUT_ARG0
9415    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9416    movq    rPC, OUT_ARG2
9417    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9418    jmp     .L_op_nop+(149*128)
9419
9420/* ------------------------------ */
9421    .balign 128
9422.L_ALT_op_or_int: /* 0x96 */
9423/* File: x86_64/alt_stub.S */
9424/*
9425 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9426 * any interesting requests and then jump to the real instruction
9427 * handler.  Unlike the Arm handler, we can't do this as a tail call
9428 * because rIBASE is caller save and we need to reload it.
9429 *
9430 * Note that unlike in the Arm implementation, we should never arrive
9431 * here with a zero breakFlag because we always refresh rIBASE on
9432 * return.
9433 */
9434    .extern MterpCheckBefore
9435    REFRESH_IBASE
9436    movq    rSELF, OUT_ARG0
9437    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9438    movq    rPC, OUT_ARG2
9439    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9440    jmp     .L_op_nop+(150*128)
9441
9442/* ------------------------------ */
9443    .balign 128
9444.L_ALT_op_xor_int: /* 0x97 */
9445/* File: x86_64/alt_stub.S */
9446/*
9447 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9448 * any interesting requests and then jump to the real instruction
9449 * handler.  Unlike the Arm handler, we can't do this as a tail call
9450 * because rIBASE is caller save and we need to reload it.
9451 *
9452 * Note that unlike in the Arm implementation, we should never arrive
9453 * here with a zero breakFlag because we always refresh rIBASE on
9454 * return.
9455 */
9456    .extern MterpCheckBefore
9457    REFRESH_IBASE
9458    movq    rSELF, OUT_ARG0
9459    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9460    movq    rPC, OUT_ARG2
9461    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9462    jmp     .L_op_nop+(151*128)
9463
9464/* ------------------------------ */
9465    .balign 128
9466.L_ALT_op_shl_int: /* 0x98 */
9467/* File: x86_64/alt_stub.S */
9468/*
9469 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9470 * any interesting requests and then jump to the real instruction
9471 * handler.  Unlike the Arm handler, we can't do this as a tail call
9472 * because rIBASE is caller save and we need to reload it.
9473 *
9474 * Note that unlike in the Arm implementation, we should never arrive
9475 * here with a zero breakFlag because we always refresh rIBASE on
9476 * return.
9477 */
9478    .extern MterpCheckBefore
9479    REFRESH_IBASE
9480    movq    rSELF, OUT_ARG0
9481    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9482    movq    rPC, OUT_ARG2
9483    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9484    jmp     .L_op_nop+(152*128)
9485
9486/* ------------------------------ */
9487    .balign 128
9488.L_ALT_op_shr_int: /* 0x99 */
9489/* File: x86_64/alt_stub.S */
9490/*
9491 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9492 * any interesting requests and then jump to the real instruction
9493 * handler.  Unlike the Arm handler, we can't do this as a tail call
9494 * because rIBASE is caller save and we need to reload it.
9495 *
9496 * Note that unlike in the Arm implementation, we should never arrive
9497 * here with a zero breakFlag because we always refresh rIBASE on
9498 * return.
9499 */
9500    .extern MterpCheckBefore
9501    REFRESH_IBASE
9502    movq    rSELF, OUT_ARG0
9503    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9504    movq    rPC, OUT_ARG2
9505    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9506    jmp     .L_op_nop+(153*128)
9507
9508/* ------------------------------ */
9509    .balign 128
9510.L_ALT_op_ushr_int: /* 0x9a */
9511/* File: x86_64/alt_stub.S */
9512/*
9513 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9514 * any interesting requests and then jump to the real instruction
9515 * handler.  Unlike the Arm handler, we can't do this as a tail call
9516 * because rIBASE is caller save and we need to reload it.
9517 *
9518 * Note that unlike in the Arm implementation, we should never arrive
9519 * here with a zero breakFlag because we always refresh rIBASE on
9520 * return.
9521 */
9522    .extern MterpCheckBefore
9523    REFRESH_IBASE
9524    movq    rSELF, OUT_ARG0
9525    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9526    movq    rPC, OUT_ARG2
9527    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9528    jmp     .L_op_nop+(154*128)
9529
9530/* ------------------------------ */
9531    .balign 128
9532.L_ALT_op_add_long: /* 0x9b */
9533/* File: x86_64/alt_stub.S */
9534/*
9535 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9536 * any interesting requests and then jump to the real instruction
9537 * handler.  Unlike the Arm handler, we can't do this as a tail call
9538 * because rIBASE is caller save and we need to reload it.
9539 *
9540 * Note that unlike in the Arm implementation, we should never arrive
9541 * here with a zero breakFlag because we always refresh rIBASE on
9542 * return.
9543 */
9544    .extern MterpCheckBefore
9545    REFRESH_IBASE
9546    movq    rSELF, OUT_ARG0
9547    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9548    movq    rPC, OUT_ARG2
9549    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9550    jmp     .L_op_nop+(155*128)
9551
9552/* ------------------------------ */
9553    .balign 128
9554.L_ALT_op_sub_long: /* 0x9c */
9555/* File: x86_64/alt_stub.S */
9556/*
9557 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9558 * any interesting requests and then jump to the real instruction
9559 * handler.  Unlike the Arm handler, we can't do this as a tail call
9560 * because rIBASE is caller save and we need to reload it.
9561 *
9562 * Note that unlike in the Arm implementation, we should never arrive
9563 * here with a zero breakFlag because we always refresh rIBASE on
9564 * return.
9565 */
9566    .extern MterpCheckBefore
9567    REFRESH_IBASE
9568    movq    rSELF, OUT_ARG0
9569    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9570    movq    rPC, OUT_ARG2
9571    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9572    jmp     .L_op_nop+(156*128)
9573
9574/* ------------------------------ */
9575    .balign 128
9576.L_ALT_op_mul_long: /* 0x9d */
9577/* File: x86_64/alt_stub.S */
9578/*
9579 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9580 * any interesting requests and then jump to the real instruction
9581 * handler.  Unlike the Arm handler, we can't do this as a tail call
9582 * because rIBASE is caller save and we need to reload it.
9583 *
9584 * Note that unlike in the Arm implementation, we should never arrive
9585 * here with a zero breakFlag because we always refresh rIBASE on
9586 * return.
9587 */
9588    .extern MterpCheckBefore
9589    REFRESH_IBASE
9590    movq    rSELF, OUT_ARG0
9591    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9592    movq    rPC, OUT_ARG2
9593    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9594    jmp     .L_op_nop+(157*128)
9595
9596/* ------------------------------ */
9597    .balign 128
9598.L_ALT_op_div_long: /* 0x9e */
9599/* File: x86_64/alt_stub.S */
9600/*
9601 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9602 * any interesting requests and then jump to the real instruction
9603 * handler.  Unlike the Arm handler, we can't do this as a tail call
9604 * because rIBASE is caller save and we need to reload it.
9605 *
9606 * Note that unlike in the Arm implementation, we should never arrive
9607 * here with a zero breakFlag because we always refresh rIBASE on
9608 * return.
9609 */
9610    .extern MterpCheckBefore
9611    REFRESH_IBASE
9612    movq    rSELF, OUT_ARG0
9613    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9614    movq    rPC, OUT_ARG2
9615    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9616    jmp     .L_op_nop+(158*128)
9617
9618/* ------------------------------ */
9619    .balign 128
9620.L_ALT_op_rem_long: /* 0x9f */
9621/* File: x86_64/alt_stub.S */
9622/*
9623 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9624 * any interesting requests and then jump to the real instruction
9625 * handler.  Unlike the Arm handler, we can't do this as a tail call
9626 * because rIBASE is caller save and we need to reload it.
9627 *
9628 * Note that unlike in the Arm implementation, we should never arrive
9629 * here with a zero breakFlag because we always refresh rIBASE on
9630 * return.
9631 */
9632    .extern MterpCheckBefore
9633    REFRESH_IBASE
9634    movq    rSELF, OUT_ARG0
9635    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9636    movq    rPC, OUT_ARG2
9637    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9638    jmp     .L_op_nop+(159*128)
9639
9640/* ------------------------------ */
9641    .balign 128
9642.L_ALT_op_and_long: /* 0xa0 */
9643/* File: x86_64/alt_stub.S */
9644/*
9645 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9646 * any interesting requests and then jump to the real instruction
9647 * handler.  Unlike the Arm handler, we can't do this as a tail call
9648 * because rIBASE is caller save and we need to reload it.
9649 *
9650 * Note that unlike in the Arm implementation, we should never arrive
9651 * here with a zero breakFlag because we always refresh rIBASE on
9652 * return.
9653 */
9654    .extern MterpCheckBefore
9655    REFRESH_IBASE
9656    movq    rSELF, OUT_ARG0
9657    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9658    movq    rPC, OUT_ARG2
9659    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9660    jmp     .L_op_nop+(160*128)
9661
9662/* ------------------------------ */
9663    .balign 128
9664.L_ALT_op_or_long: /* 0xa1 */
9665/* File: x86_64/alt_stub.S */
9666/*
9667 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9668 * any interesting requests and then jump to the real instruction
9669 * handler.  Unlike the Arm handler, we can't do this as a tail call
9670 * because rIBASE is caller save and we need to reload it.
9671 *
9672 * Note that unlike in the Arm implementation, we should never arrive
9673 * here with a zero breakFlag because we always refresh rIBASE on
9674 * return.
9675 */
9676    .extern MterpCheckBefore
9677    REFRESH_IBASE
9678    movq    rSELF, OUT_ARG0
9679    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9680    movq    rPC, OUT_ARG2
9681    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9682    jmp     .L_op_nop+(161*128)
9683
9684/* ------------------------------ */
9685    .balign 128
9686.L_ALT_op_xor_long: /* 0xa2 */
9687/* File: x86_64/alt_stub.S */
9688/*
9689 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9690 * any interesting requests and then jump to the real instruction
9691 * handler.  Unlike the Arm handler, we can't do this as a tail call
9692 * because rIBASE is caller save and we need to reload it.
9693 *
9694 * Note that unlike in the Arm implementation, we should never arrive
9695 * here with a zero breakFlag because we always refresh rIBASE on
9696 * return.
9697 */
9698    .extern MterpCheckBefore
9699    REFRESH_IBASE
9700    movq    rSELF, OUT_ARG0
9701    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9702    movq    rPC, OUT_ARG2
9703    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9704    jmp     .L_op_nop+(162*128)
9705
9706/* ------------------------------ */
9707    .balign 128
9708.L_ALT_op_shl_long: /* 0xa3 */
9709/* File: x86_64/alt_stub.S */
9710/*
9711 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9712 * any interesting requests and then jump to the real instruction
9713 * handler.  Unlike the Arm handler, we can't do this as a tail call
9714 * because rIBASE is caller save and we need to reload it.
9715 *
9716 * Note that unlike in the Arm implementation, we should never arrive
9717 * here with a zero breakFlag because we always refresh rIBASE on
9718 * return.
9719 */
9720    .extern MterpCheckBefore
9721    REFRESH_IBASE
9722    movq    rSELF, OUT_ARG0
9723    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9724    movq    rPC, OUT_ARG2
9725    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9726    jmp     .L_op_nop+(163*128)
9727
9728/* ------------------------------ */
9729    .balign 128
9730.L_ALT_op_shr_long: /* 0xa4 */
9731/* File: x86_64/alt_stub.S */
9732/*
9733 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9734 * any interesting requests and then jump to the real instruction
9735 * handler.  Unlike the Arm handler, we can't do this as a tail call
9736 * because rIBASE is caller save and we need to reload it.
9737 *
9738 * Note that unlike in the Arm implementation, we should never arrive
9739 * here with a zero breakFlag because we always refresh rIBASE on
9740 * return.
9741 */
9742    .extern MterpCheckBefore
9743    REFRESH_IBASE
9744    movq    rSELF, OUT_ARG0
9745    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9746    movq    rPC, OUT_ARG2
9747    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9748    jmp     .L_op_nop+(164*128)
9749
9750/* ------------------------------ */
9751    .balign 128
9752.L_ALT_op_ushr_long: /* 0xa5 */
9753/* File: x86_64/alt_stub.S */
9754/*
9755 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9756 * any interesting requests and then jump to the real instruction
9757 * handler.  Unlike the Arm handler, we can't do this as a tail call
9758 * because rIBASE is caller save and we need to reload it.
9759 *
9760 * Note that unlike in the Arm implementation, we should never arrive
9761 * here with a zero breakFlag because we always refresh rIBASE on
9762 * return.
9763 */
9764    .extern MterpCheckBefore
9765    REFRESH_IBASE
9766    movq    rSELF, OUT_ARG0
9767    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9768    movq    rPC, OUT_ARG2
9769    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9770    jmp     .L_op_nop+(165*128)
9771
9772/* ------------------------------ */
9773    .balign 128
9774.L_ALT_op_add_float: /* 0xa6 */
9775/* File: x86_64/alt_stub.S */
9776/*
9777 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9778 * any interesting requests and then jump to the real instruction
9779 * handler.  Unlike the Arm handler, we can't do this as a tail call
9780 * because rIBASE is caller save and we need to reload it.
9781 *
9782 * Note that unlike in the Arm implementation, we should never arrive
9783 * here with a zero breakFlag because we always refresh rIBASE on
9784 * return.
9785 */
9786    .extern MterpCheckBefore
9787    REFRESH_IBASE
9788    movq    rSELF, OUT_ARG0
9789    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9790    movq    rPC, OUT_ARG2
9791    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9792    jmp     .L_op_nop+(166*128)
9793
9794/* ------------------------------ */
9795    .balign 128
9796.L_ALT_op_sub_float: /* 0xa7 */
9797/* File: x86_64/alt_stub.S */
9798/*
9799 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9800 * any interesting requests and then jump to the real instruction
9801 * handler.  Unlike the Arm handler, we can't do this as a tail call
9802 * because rIBASE is caller save and we need to reload it.
9803 *
9804 * Note that unlike in the Arm implementation, we should never arrive
9805 * here with a zero breakFlag because we always refresh rIBASE on
9806 * return.
9807 */
9808    .extern MterpCheckBefore
9809    REFRESH_IBASE
9810    movq    rSELF, OUT_ARG0
9811    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9812    movq    rPC, OUT_ARG2
9813    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9814    jmp     .L_op_nop+(167*128)
9815
9816/* ------------------------------ */
9817    .balign 128
9818.L_ALT_op_mul_float: /* 0xa8 */
9819/* File: x86_64/alt_stub.S */
9820/*
9821 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9822 * any interesting requests and then jump to the real instruction
9823 * handler.  Unlike the Arm handler, we can't do this as a tail call
9824 * because rIBASE is caller save and we need to reload it.
9825 *
9826 * Note that unlike in the Arm implementation, we should never arrive
9827 * here with a zero breakFlag because we always refresh rIBASE on
9828 * return.
9829 */
9830    .extern MterpCheckBefore
9831    REFRESH_IBASE
9832    movq    rSELF, OUT_ARG0
9833    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9834    movq    rPC, OUT_ARG2
9835    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9836    jmp     .L_op_nop+(168*128)
9837
9838/* ------------------------------ */
9839    .balign 128
9840.L_ALT_op_div_float: /* 0xa9 */
9841/* File: x86_64/alt_stub.S */
9842/*
9843 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9844 * any interesting requests and then jump to the real instruction
9845 * handler.  Unlike the Arm handler, we can't do this as a tail call
9846 * because rIBASE is caller save and we need to reload it.
9847 *
9848 * Note that unlike in the Arm implementation, we should never arrive
9849 * here with a zero breakFlag because we always refresh rIBASE on
9850 * return.
9851 */
9852    .extern MterpCheckBefore
9853    REFRESH_IBASE
9854    movq    rSELF, OUT_ARG0
9855    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9856    movq    rPC, OUT_ARG2
9857    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9858    jmp     .L_op_nop+(169*128)
9859
9860/* ------------------------------ */
9861    .balign 128
9862.L_ALT_op_rem_float: /* 0xaa */
9863/* File: x86_64/alt_stub.S */
9864/*
9865 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9866 * any interesting requests and then jump to the real instruction
9867 * handler.  Unlike the Arm handler, we can't do this as a tail call
9868 * because rIBASE is caller save and we need to reload it.
9869 *
9870 * Note that unlike in the Arm implementation, we should never arrive
9871 * here with a zero breakFlag because we always refresh rIBASE on
9872 * return.
9873 */
9874    .extern MterpCheckBefore
9875    REFRESH_IBASE
9876    movq    rSELF, OUT_ARG0
9877    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9878    movq    rPC, OUT_ARG2
9879    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9880    jmp     .L_op_nop+(170*128)
9881
9882/* ------------------------------ */
9883    .balign 128
9884.L_ALT_op_add_double: /* 0xab */
9885/* File: x86_64/alt_stub.S */
9886/*
9887 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9888 * any interesting requests and then jump to the real instruction
9889 * handler.  Unlike the Arm handler, we can't do this as a tail call
9890 * because rIBASE is caller save and we need to reload it.
9891 *
9892 * Note that unlike in the Arm implementation, we should never arrive
9893 * here with a zero breakFlag because we always refresh rIBASE on
9894 * return.
9895 */
9896    .extern MterpCheckBefore
9897    REFRESH_IBASE
9898    movq    rSELF, OUT_ARG0
9899    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9900    movq    rPC, OUT_ARG2
9901    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9902    jmp     .L_op_nop+(171*128)
9903
9904/* ------------------------------ */
9905    .balign 128
9906.L_ALT_op_sub_double: /* 0xac */
9907/* File: x86_64/alt_stub.S */
9908/*
9909 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9910 * any interesting requests and then jump to the real instruction
9911 * handler.  Unlike the Arm handler, we can't do this as a tail call
9912 * because rIBASE is caller save and we need to reload it.
9913 *
9914 * Note that unlike in the Arm implementation, we should never arrive
9915 * here with a zero breakFlag because we always refresh rIBASE on
9916 * return.
9917 */
9918    .extern MterpCheckBefore
9919    REFRESH_IBASE
9920    movq    rSELF, OUT_ARG0
9921    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9922    movq    rPC, OUT_ARG2
9923    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9924    jmp     .L_op_nop+(172*128)
9925
9926/* ------------------------------ */
9927    .balign 128
9928.L_ALT_op_mul_double: /* 0xad */
9929/* File: x86_64/alt_stub.S */
9930/*
9931 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9932 * any interesting requests and then jump to the real instruction
9933 * handler.  Unlike the Arm handler, we can't do this as a tail call
9934 * because rIBASE is caller save and we need to reload it.
9935 *
9936 * Note that unlike in the Arm implementation, we should never arrive
9937 * here with a zero breakFlag because we always refresh rIBASE on
9938 * return.
9939 */
9940    .extern MterpCheckBefore
9941    REFRESH_IBASE
9942    movq    rSELF, OUT_ARG0
9943    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9944    movq    rPC, OUT_ARG2
9945    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9946    jmp     .L_op_nop+(173*128)
9947
9948/* ------------------------------ */
9949    .balign 128
9950.L_ALT_op_div_double: /* 0xae */
9951/* File: x86_64/alt_stub.S */
9952/*
9953 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9954 * any interesting requests and then jump to the real instruction
9955 * handler.  Unlike the Arm handler, we can't do this as a tail call
9956 * because rIBASE is caller save and we need to reload it.
9957 *
9958 * Note that unlike in the Arm implementation, we should never arrive
9959 * here with a zero breakFlag because we always refresh rIBASE on
9960 * return.
9961 */
9962    .extern MterpCheckBefore
9963    REFRESH_IBASE
9964    movq    rSELF, OUT_ARG0
9965    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9966    movq    rPC, OUT_ARG2
9967    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9968    jmp     .L_op_nop+(174*128)
9969
9970/* ------------------------------ */
9971    .balign 128
9972.L_ALT_op_rem_double: /* 0xaf */
9973/* File: x86_64/alt_stub.S */
9974/*
9975 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9976 * any interesting requests and then jump to the real instruction
9977 * handler.  Unlike the Arm handler, we can't do this as a tail call
9978 * because rIBASE is caller save and we need to reload it.
9979 *
9980 * Note that unlike in the Arm implementation, we should never arrive
9981 * here with a zero breakFlag because we always refresh rIBASE on
9982 * return.
9983 */
9984    .extern MterpCheckBefore
9985    REFRESH_IBASE
9986    movq    rSELF, OUT_ARG0
9987    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
9988    movq    rPC, OUT_ARG2
9989    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
9990    jmp     .L_op_nop+(175*128)
9991
9992/* ------------------------------ */
9993    .balign 128
9994.L_ALT_op_add_int_2addr: /* 0xb0 */
9995/* File: x86_64/alt_stub.S */
9996/*
9997 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9998 * any interesting requests and then jump to the real instruction
9999 * handler.  Unlike the Arm handler, we can't do this as a tail call
10000 * because rIBASE is caller save and we need to reload it.
10001 *
10002 * Note that unlike in the Arm implementation, we should never arrive
10003 * here with a zero breakFlag because we always refresh rIBASE on
10004 * return.
10005 */
10006    .extern MterpCheckBefore
10007    REFRESH_IBASE
10008    movq    rSELF, OUT_ARG0
10009    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10010    movq    rPC, OUT_ARG2
10011    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10012    jmp     .L_op_nop+(176*128)
10013
10014/* ------------------------------ */
10015    .balign 128
10016.L_ALT_op_sub_int_2addr: /* 0xb1 */
10017/* File: x86_64/alt_stub.S */
10018/*
10019 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10020 * any interesting requests and then jump to the real instruction
10021 * handler.  Unlike the Arm handler, we can't do this as a tail call
10022 * because rIBASE is caller save and we need to reload it.
10023 *
10024 * Note that unlike in the Arm implementation, we should never arrive
10025 * here with a zero breakFlag because we always refresh rIBASE on
10026 * return.
10027 */
10028    .extern MterpCheckBefore
10029    REFRESH_IBASE
10030    movq    rSELF, OUT_ARG0
10031    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10032    movq    rPC, OUT_ARG2
10033    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10034    jmp     .L_op_nop+(177*128)
10035
10036/* ------------------------------ */
10037    .balign 128
10038.L_ALT_op_mul_int_2addr: /* 0xb2 */
10039/* File: x86_64/alt_stub.S */
10040/*
10041 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10042 * any interesting requests and then jump to the real instruction
10043 * handler.  Unlike the Arm handler, we can't do this as a tail call
10044 * because rIBASE is caller save and we need to reload it.
10045 *
10046 * Note that unlike in the Arm implementation, we should never arrive
10047 * here with a zero breakFlag because we always refresh rIBASE on
10048 * return.
10049 */
10050    .extern MterpCheckBefore
10051    REFRESH_IBASE
10052    movq    rSELF, OUT_ARG0
10053    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10054    movq    rPC, OUT_ARG2
10055    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10056    jmp     .L_op_nop+(178*128)
10057
10058/* ------------------------------ */
10059    .balign 128
10060.L_ALT_op_div_int_2addr: /* 0xb3 */
10061/* File: x86_64/alt_stub.S */
10062/*
10063 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10064 * any interesting requests and then jump to the real instruction
10065 * handler.  Unlike the Arm handler, we can't do this as a tail call
10066 * because rIBASE is caller save and we need to reload it.
10067 *
10068 * Note that unlike in the Arm implementation, we should never arrive
10069 * here with a zero breakFlag because we always refresh rIBASE on
10070 * return.
10071 */
10072    .extern MterpCheckBefore
10073    REFRESH_IBASE
10074    movq    rSELF, OUT_ARG0
10075    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10076    movq    rPC, OUT_ARG2
10077    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10078    jmp     .L_op_nop+(179*128)
10079
10080/* ------------------------------ */
10081    .balign 128
10082.L_ALT_op_rem_int_2addr: /* 0xb4 */
10083/* File: x86_64/alt_stub.S */
10084/*
10085 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10086 * any interesting requests and then jump to the real instruction
10087 * handler.  Unlike the Arm handler, we can't do this as a tail call
10088 * because rIBASE is caller save and we need to reload it.
10089 *
10090 * Note that unlike in the Arm implementation, we should never arrive
10091 * here with a zero breakFlag because we always refresh rIBASE on
10092 * return.
10093 */
10094    .extern MterpCheckBefore
10095    REFRESH_IBASE
10096    movq    rSELF, OUT_ARG0
10097    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10098    movq    rPC, OUT_ARG2
10099    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10100    jmp     .L_op_nop+(180*128)
10101
10102/* ------------------------------ */
10103    .balign 128
10104.L_ALT_op_and_int_2addr: /* 0xb5 */
10105/* File: x86_64/alt_stub.S */
10106/*
10107 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10108 * any interesting requests and then jump to the real instruction
10109 * handler.  Unlike the Arm handler, we can't do this as a tail call
10110 * because rIBASE is caller save and we need to reload it.
10111 *
10112 * Note that unlike in the Arm implementation, we should never arrive
10113 * here with a zero breakFlag because we always refresh rIBASE on
10114 * return.
10115 */
10116    .extern MterpCheckBefore
10117    REFRESH_IBASE
10118    movq    rSELF, OUT_ARG0
10119    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10120    movq    rPC, OUT_ARG2
10121    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10122    jmp     .L_op_nop+(181*128)
10123
10124/* ------------------------------ */
10125    .balign 128
10126.L_ALT_op_or_int_2addr: /* 0xb6 */
10127/* File: x86_64/alt_stub.S */
10128/*
10129 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10130 * any interesting requests and then jump to the real instruction
10131 * handler.  Unlike the Arm handler, we can't do this as a tail call
10132 * because rIBASE is caller save and we need to reload it.
10133 *
10134 * Note that unlike in the Arm implementation, we should never arrive
10135 * here with a zero breakFlag because we always refresh rIBASE on
10136 * return.
10137 */
10138    .extern MterpCheckBefore
10139    REFRESH_IBASE
10140    movq    rSELF, OUT_ARG0
10141    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10142    movq    rPC, OUT_ARG2
10143    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10144    jmp     .L_op_nop+(182*128)
10145
10146/* ------------------------------ */
10147    .balign 128
10148.L_ALT_op_xor_int_2addr: /* 0xb7 */
10149/* File: x86_64/alt_stub.S */
10150/*
10151 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10152 * any interesting requests and then jump to the real instruction
10153 * handler.  Unlike the Arm handler, we can't do this as a tail call
10154 * because rIBASE is caller save and we need to reload it.
10155 *
10156 * Note that unlike in the Arm implementation, we should never arrive
10157 * here with a zero breakFlag because we always refresh rIBASE on
10158 * return.
10159 */
10160    .extern MterpCheckBefore
10161    REFRESH_IBASE
10162    movq    rSELF, OUT_ARG0
10163    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10164    movq    rPC, OUT_ARG2
10165    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10166    jmp     .L_op_nop+(183*128)
10167
10168/* ------------------------------ */
10169    .balign 128
10170.L_ALT_op_shl_int_2addr: /* 0xb8 */
10171/* File: x86_64/alt_stub.S */
10172/*
10173 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10174 * any interesting requests and then jump to the real instruction
10175 * handler.  Unlike the Arm handler, we can't do this as a tail call
10176 * because rIBASE is caller save and we need to reload it.
10177 *
10178 * Note that unlike in the Arm implementation, we should never arrive
10179 * here with a zero breakFlag because we always refresh rIBASE on
10180 * return.
10181 */
10182    .extern MterpCheckBefore
10183    REFRESH_IBASE
10184    movq    rSELF, OUT_ARG0
10185    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10186    movq    rPC, OUT_ARG2
10187    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10188    jmp     .L_op_nop+(184*128)
10189
10190/* ------------------------------ */
10191    .balign 128
10192.L_ALT_op_shr_int_2addr: /* 0xb9 */
10193/* File: x86_64/alt_stub.S */
10194/*
10195 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10196 * any interesting requests and then jump to the real instruction
10197 * handler.  Unlike the Arm handler, we can't do this as a tail call
10198 * because rIBASE is caller save and we need to reload it.
10199 *
10200 * Note that unlike in the Arm implementation, we should never arrive
10201 * here with a zero breakFlag because we always refresh rIBASE on
10202 * return.
10203 */
10204    .extern MterpCheckBefore
10205    REFRESH_IBASE
10206    movq    rSELF, OUT_ARG0
10207    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10208    movq    rPC, OUT_ARG2
10209    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10210    jmp     .L_op_nop+(185*128)
10211
10212/* ------------------------------ */
10213    .balign 128
10214.L_ALT_op_ushr_int_2addr: /* 0xba */
10215/* File: x86_64/alt_stub.S */
10216/*
10217 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10218 * any interesting requests and then jump to the real instruction
10219 * handler.  Unlike the Arm handler, we can't do this as a tail call
10220 * because rIBASE is caller save and we need to reload it.
10221 *
10222 * Note that unlike in the Arm implementation, we should never arrive
10223 * here with a zero breakFlag because we always refresh rIBASE on
10224 * return.
10225 */
10226    .extern MterpCheckBefore
10227    REFRESH_IBASE
10228    movq    rSELF, OUT_ARG0
10229    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10230    movq    rPC, OUT_ARG2
10231    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10232    jmp     .L_op_nop+(186*128)
10233
10234/* ------------------------------ */
10235    .balign 128
10236.L_ALT_op_add_long_2addr: /* 0xbb */
10237/* File: x86_64/alt_stub.S */
10238/*
10239 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10240 * any interesting requests and then jump to the real instruction
10241 * handler.  Unlike the Arm handler, we can't do this as a tail call
10242 * because rIBASE is caller save and we need to reload it.
10243 *
10244 * Note that unlike in the Arm implementation, we should never arrive
10245 * here with a zero breakFlag because we always refresh rIBASE on
10246 * return.
10247 */
10248    .extern MterpCheckBefore
10249    REFRESH_IBASE
10250    movq    rSELF, OUT_ARG0
10251    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10252    movq    rPC, OUT_ARG2
10253    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10254    jmp     .L_op_nop+(187*128)
10255
10256/* ------------------------------ */
10257    .balign 128
10258.L_ALT_op_sub_long_2addr: /* 0xbc */
10259/* File: x86_64/alt_stub.S */
10260/*
10261 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10262 * any interesting requests and then jump to the real instruction
10263 * handler.  Unlike the Arm handler, we can't do this as a tail call
10264 * because rIBASE is caller save and we need to reload it.
10265 *
10266 * Note that unlike in the Arm implementation, we should never arrive
10267 * here with a zero breakFlag because we always refresh rIBASE on
10268 * return.
10269 */
10270    .extern MterpCheckBefore
10271    REFRESH_IBASE
10272    movq    rSELF, OUT_ARG0
10273    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10274    movq    rPC, OUT_ARG2
10275    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10276    jmp     .L_op_nop+(188*128)
10277
10278/* ------------------------------ */
10279    .balign 128
10280.L_ALT_op_mul_long_2addr: /* 0xbd */
10281/* File: x86_64/alt_stub.S */
10282/*
10283 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10284 * any interesting requests and then jump to the real instruction
10285 * handler.  Unlike the Arm handler, we can't do this as a tail call
10286 * because rIBASE is caller save and we need to reload it.
10287 *
10288 * Note that unlike in the Arm implementation, we should never arrive
10289 * here with a zero breakFlag because we always refresh rIBASE on
10290 * return.
10291 */
10292    .extern MterpCheckBefore
10293    REFRESH_IBASE
10294    movq    rSELF, OUT_ARG0
10295    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10296    movq    rPC, OUT_ARG2
10297    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10298    jmp     .L_op_nop+(189*128)
10299
10300/* ------------------------------ */
10301    .balign 128
10302.L_ALT_op_div_long_2addr: /* 0xbe */
10303/* File: x86_64/alt_stub.S */
10304/*
10305 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10306 * any interesting requests and then jump to the real instruction
10307 * handler.  Unlike the Arm handler, we can't do this as a tail call
10308 * because rIBASE is caller save and we need to reload it.
10309 *
10310 * Note that unlike in the Arm implementation, we should never arrive
10311 * here with a zero breakFlag because we always refresh rIBASE on
10312 * return.
10313 */
10314    .extern MterpCheckBefore
10315    REFRESH_IBASE
10316    movq    rSELF, OUT_ARG0
10317    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10318    movq    rPC, OUT_ARG2
10319    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10320    jmp     .L_op_nop+(190*128)
10321
10322/* ------------------------------ */
10323    .balign 128
10324.L_ALT_op_rem_long_2addr: /* 0xbf */
10325/* File: x86_64/alt_stub.S */
10326/*
10327 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10328 * any interesting requests and then jump to the real instruction
10329 * handler.  Unlike the Arm handler, we can't do this as a tail call
10330 * because rIBASE is caller save and we need to reload it.
10331 *
10332 * Note that unlike in the Arm implementation, we should never arrive
10333 * here with a zero breakFlag because we always refresh rIBASE on
10334 * return.
10335 */
10336    .extern MterpCheckBefore
10337    REFRESH_IBASE
10338    movq    rSELF, OUT_ARG0
10339    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10340    movq    rPC, OUT_ARG2
10341    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10342    jmp     .L_op_nop+(191*128)
10343
10344/* ------------------------------ */
10345    .balign 128
10346.L_ALT_op_and_long_2addr: /* 0xc0 */
10347/* File: x86_64/alt_stub.S */
10348/*
10349 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10350 * any interesting requests and then jump to the real instruction
10351 * handler.  Unlike the Arm handler, we can't do this as a tail call
10352 * because rIBASE is caller save and we need to reload it.
10353 *
10354 * Note that unlike in the Arm implementation, we should never arrive
10355 * here with a zero breakFlag because we always refresh rIBASE on
10356 * return.
10357 */
10358    .extern MterpCheckBefore
10359    REFRESH_IBASE
10360    movq    rSELF, OUT_ARG0
10361    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10362    movq    rPC, OUT_ARG2
10363    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10364    jmp     .L_op_nop+(192*128)
10365
10366/* ------------------------------ */
10367    .balign 128
10368.L_ALT_op_or_long_2addr: /* 0xc1 */
10369/* File: x86_64/alt_stub.S */
10370/*
10371 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10372 * any interesting requests and then jump to the real instruction
10373 * handler.  Unlike the Arm handler, we can't do this as a tail call
10374 * because rIBASE is caller save and we need to reload it.
10375 *
10376 * Note that unlike in the Arm implementation, we should never arrive
10377 * here with a zero breakFlag because we always refresh rIBASE on
10378 * return.
10379 */
10380    .extern MterpCheckBefore
10381    REFRESH_IBASE
10382    movq    rSELF, OUT_ARG0
10383    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10384    movq    rPC, OUT_ARG2
10385    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10386    jmp     .L_op_nop+(193*128)
10387
10388/* ------------------------------ */
10389    .balign 128
10390.L_ALT_op_xor_long_2addr: /* 0xc2 */
10391/* File: x86_64/alt_stub.S */
10392/*
10393 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10394 * any interesting requests and then jump to the real instruction
10395 * handler.  Unlike the Arm handler, we can't do this as a tail call
10396 * because rIBASE is caller save and we need to reload it.
10397 *
10398 * Note that unlike in the Arm implementation, we should never arrive
10399 * here with a zero breakFlag because we always refresh rIBASE on
10400 * return.
10401 */
10402    .extern MterpCheckBefore
10403    REFRESH_IBASE
10404    movq    rSELF, OUT_ARG0
10405    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10406    movq    rPC, OUT_ARG2
10407    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10408    jmp     .L_op_nop+(194*128)
10409
10410/* ------------------------------ */
10411    .balign 128
10412.L_ALT_op_shl_long_2addr: /* 0xc3 */
10413/* File: x86_64/alt_stub.S */
10414/*
10415 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10416 * any interesting requests and then jump to the real instruction
10417 * handler.  Unlike the Arm handler, we can't do this as a tail call
10418 * because rIBASE is caller save and we need to reload it.
10419 *
10420 * Note that unlike in the Arm implementation, we should never arrive
10421 * here with a zero breakFlag because we always refresh rIBASE on
10422 * return.
10423 */
10424    .extern MterpCheckBefore
10425    REFRESH_IBASE
10426    movq    rSELF, OUT_ARG0
10427    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10428    movq    rPC, OUT_ARG2
10429    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10430    jmp     .L_op_nop+(195*128)
10431
10432/* ------------------------------ */
10433    .balign 128
10434.L_ALT_op_shr_long_2addr: /* 0xc4 */
10435/* File: x86_64/alt_stub.S */
10436/*
10437 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10438 * any interesting requests and then jump to the real instruction
10439 * handler.  Unlike the Arm handler, we can't do this as a tail call
10440 * because rIBASE is caller save and we need to reload it.
10441 *
10442 * Note that unlike in the Arm implementation, we should never arrive
10443 * here with a zero breakFlag because we always refresh rIBASE on
10444 * return.
10445 */
10446    .extern MterpCheckBefore
10447    REFRESH_IBASE
10448    movq    rSELF, OUT_ARG0
10449    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10450    movq    rPC, OUT_ARG2
10451    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10452    jmp     .L_op_nop+(196*128)
10453
10454/* ------------------------------ */
10455    .balign 128
10456.L_ALT_op_ushr_long_2addr: /* 0xc5 */
10457/* File: x86_64/alt_stub.S */
10458/*
10459 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10460 * any interesting requests and then jump to the real instruction
10461 * handler.  Unlike the Arm handler, we can't do this as a tail call
10462 * because rIBASE is caller save and we need to reload it.
10463 *
10464 * Note that unlike in the Arm implementation, we should never arrive
10465 * here with a zero breakFlag because we always refresh rIBASE on
10466 * return.
10467 */
10468    .extern MterpCheckBefore
10469    REFRESH_IBASE
10470    movq    rSELF, OUT_ARG0
10471    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10472    movq    rPC, OUT_ARG2
10473    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10474    jmp     .L_op_nop+(197*128)
10475
10476/* ------------------------------ */
10477    .balign 128
10478.L_ALT_op_add_float_2addr: /* 0xc6 */
10479/* File: x86_64/alt_stub.S */
10480/*
10481 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10482 * any interesting requests and then jump to the real instruction
10483 * handler.  Unlike the Arm handler, we can't do this as a tail call
10484 * because rIBASE is caller save and we need to reload it.
10485 *
10486 * Note that unlike in the Arm implementation, we should never arrive
10487 * here with a zero breakFlag because we always refresh rIBASE on
10488 * return.
10489 */
10490    .extern MterpCheckBefore
10491    REFRESH_IBASE
10492    movq    rSELF, OUT_ARG0
10493    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10494    movq    rPC, OUT_ARG2
10495    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10496    jmp     .L_op_nop+(198*128)
10497
10498/* ------------------------------ */
10499    .balign 128
10500.L_ALT_op_sub_float_2addr: /* 0xc7 */
10501/* File: x86_64/alt_stub.S */
10502/*
10503 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10504 * any interesting requests and then jump to the real instruction
10505 * handler.  Unlike the Arm handler, we can't do this as a tail call
10506 * because rIBASE is caller save and we need to reload it.
10507 *
10508 * Note that unlike in the Arm implementation, we should never arrive
10509 * here with a zero breakFlag because we always refresh rIBASE on
10510 * return.
10511 */
10512    .extern MterpCheckBefore
10513    REFRESH_IBASE
10514    movq    rSELF, OUT_ARG0
10515    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10516    movq    rPC, OUT_ARG2
10517    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10518    jmp     .L_op_nop+(199*128)
10519
10520/* ------------------------------ */
10521    .balign 128
10522.L_ALT_op_mul_float_2addr: /* 0xc8 */
10523/* File: x86_64/alt_stub.S */
10524/*
10525 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10526 * any interesting requests and then jump to the real instruction
10527 * handler.  Unlike the Arm handler, we can't do this as a tail call
10528 * because rIBASE is caller save and we need to reload it.
10529 *
10530 * Note that unlike in the Arm implementation, we should never arrive
10531 * here with a zero breakFlag because we always refresh rIBASE on
10532 * return.
10533 */
10534    .extern MterpCheckBefore
10535    REFRESH_IBASE
10536    movq    rSELF, OUT_ARG0
10537    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10538    movq    rPC, OUT_ARG2
10539    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10540    jmp     .L_op_nop+(200*128)
10541
10542/* ------------------------------ */
10543    .balign 128
10544.L_ALT_op_div_float_2addr: /* 0xc9 */
10545/* File: x86_64/alt_stub.S */
10546/*
10547 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10548 * any interesting requests and then jump to the real instruction
10549 * handler.  Unlike the Arm handler, we can't do this as a tail call
10550 * because rIBASE is caller save and we need to reload it.
10551 *
10552 * Note that unlike in the Arm implementation, we should never arrive
10553 * here with a zero breakFlag because we always refresh rIBASE on
10554 * return.
10555 */
10556    .extern MterpCheckBefore
10557    REFRESH_IBASE
10558    movq    rSELF, OUT_ARG0
10559    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10560    movq    rPC, OUT_ARG2
10561    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10562    jmp     .L_op_nop+(201*128)
10563
10564/* ------------------------------ */
10565    .balign 128
10566.L_ALT_op_rem_float_2addr: /* 0xca */
10567/* File: x86_64/alt_stub.S */
10568/*
10569 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10570 * any interesting requests and then jump to the real instruction
10571 * handler.  Unlike the Arm handler, we can't do this as a tail call
10572 * because rIBASE is caller save and we need to reload it.
10573 *
10574 * Note that unlike in the Arm implementation, we should never arrive
10575 * here with a zero breakFlag because we always refresh rIBASE on
10576 * return.
10577 */
10578    .extern MterpCheckBefore
10579    REFRESH_IBASE
10580    movq    rSELF, OUT_ARG0
10581    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10582    movq    rPC, OUT_ARG2
10583    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10584    jmp     .L_op_nop+(202*128)
10585
10586/* ------------------------------ */
10587    .balign 128
10588.L_ALT_op_add_double_2addr: /* 0xcb */
10589/* File: x86_64/alt_stub.S */
10590/*
10591 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10592 * any interesting requests and then jump to the real instruction
10593 * handler.  Unlike the Arm handler, we can't do this as a tail call
10594 * because rIBASE is caller save and we need to reload it.
10595 *
10596 * Note that unlike in the Arm implementation, we should never arrive
10597 * here with a zero breakFlag because we always refresh rIBASE on
10598 * return.
10599 */
10600    .extern MterpCheckBefore
10601    REFRESH_IBASE
10602    movq    rSELF, OUT_ARG0
10603    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10604    movq    rPC, OUT_ARG2
10605    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10606    jmp     .L_op_nop+(203*128)
10607
10608/* ------------------------------ */
10609    .balign 128
10610.L_ALT_op_sub_double_2addr: /* 0xcc */
10611/* File: x86_64/alt_stub.S */
10612/*
10613 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10614 * any interesting requests and then jump to the real instruction
10615 * handler.  Unlike the Arm handler, we can't do this as a tail call
10616 * because rIBASE is caller save and we need to reload it.
10617 *
10618 * Note that unlike in the Arm implementation, we should never arrive
10619 * here with a zero breakFlag because we always refresh rIBASE on
10620 * return.
10621 */
10622    .extern MterpCheckBefore
10623    REFRESH_IBASE
10624    movq    rSELF, OUT_ARG0
10625    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10626    movq    rPC, OUT_ARG2
10627    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10628    jmp     .L_op_nop+(204*128)
10629
10630/* ------------------------------ */
10631    .balign 128
10632.L_ALT_op_mul_double_2addr: /* 0xcd */
10633/* File: x86_64/alt_stub.S */
10634/*
10635 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10636 * any interesting requests and then jump to the real instruction
10637 * handler.  Unlike the Arm handler, we can't do this as a tail call
10638 * because rIBASE is caller save and we need to reload it.
10639 *
10640 * Note that unlike in the Arm implementation, we should never arrive
10641 * here with a zero breakFlag because we always refresh rIBASE on
10642 * return.
10643 */
10644    .extern MterpCheckBefore
10645    REFRESH_IBASE
10646    movq    rSELF, OUT_ARG0
10647    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10648    movq    rPC, OUT_ARG2
10649    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10650    jmp     .L_op_nop+(205*128)
10651
10652/* ------------------------------ */
10653    .balign 128
10654.L_ALT_op_div_double_2addr: /* 0xce */
10655/* File: x86_64/alt_stub.S */
10656/*
10657 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10658 * any interesting requests and then jump to the real instruction
10659 * handler.  Unlike the Arm handler, we can't do this as a tail call
10660 * because rIBASE is caller save and we need to reload it.
10661 *
10662 * Note that unlike in the Arm implementation, we should never arrive
10663 * here with a zero breakFlag because we always refresh rIBASE on
10664 * return.
10665 */
10666    .extern MterpCheckBefore
10667    REFRESH_IBASE
10668    movq    rSELF, OUT_ARG0
10669    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10670    movq    rPC, OUT_ARG2
10671    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10672    jmp     .L_op_nop+(206*128)
10673
10674/* ------------------------------ */
10675    .balign 128
10676.L_ALT_op_rem_double_2addr: /* 0xcf */
10677/* File: x86_64/alt_stub.S */
10678/*
10679 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10680 * any interesting requests and then jump to the real instruction
10681 * handler.  Unlike the Arm handler, we can't do this as a tail call
10682 * because rIBASE is caller save and we need to reload it.
10683 *
10684 * Note that unlike in the Arm implementation, we should never arrive
10685 * here with a zero breakFlag because we always refresh rIBASE on
10686 * return.
10687 */
10688    .extern MterpCheckBefore
10689    REFRESH_IBASE
10690    movq    rSELF, OUT_ARG0
10691    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10692    movq    rPC, OUT_ARG2
10693    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10694    jmp     .L_op_nop+(207*128)
10695
10696/* ------------------------------ */
10697    .balign 128
10698.L_ALT_op_add_int_lit16: /* 0xd0 */
10699/* File: x86_64/alt_stub.S */
10700/*
10701 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10702 * any interesting requests and then jump to the real instruction
10703 * handler.  Unlike the Arm handler, we can't do this as a tail call
10704 * because rIBASE is caller save and we need to reload it.
10705 *
10706 * Note that unlike in the Arm implementation, we should never arrive
10707 * here with a zero breakFlag because we always refresh rIBASE on
10708 * return.
10709 */
10710    .extern MterpCheckBefore
10711    REFRESH_IBASE
10712    movq    rSELF, OUT_ARG0
10713    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10714    movq    rPC, OUT_ARG2
10715    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10716    jmp     .L_op_nop+(208*128)
10717
10718/* ------------------------------ */
10719    .balign 128
10720.L_ALT_op_rsub_int: /* 0xd1 */
10721/* File: x86_64/alt_stub.S */
10722/*
10723 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10724 * any interesting requests and then jump to the real instruction
10725 * handler.  Unlike the Arm handler, we can't do this as a tail call
10726 * because rIBASE is caller save and we need to reload it.
10727 *
10728 * Note that unlike in the Arm implementation, we should never arrive
10729 * here with a zero breakFlag because we always refresh rIBASE on
10730 * return.
10731 */
10732    .extern MterpCheckBefore
10733    REFRESH_IBASE
10734    movq    rSELF, OUT_ARG0
10735    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10736    movq    rPC, OUT_ARG2
10737    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10738    jmp     .L_op_nop+(209*128)
10739
10740/* ------------------------------ */
10741    .balign 128
10742.L_ALT_op_mul_int_lit16: /* 0xd2 */
10743/* File: x86_64/alt_stub.S */
10744/*
10745 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10746 * any interesting requests and then jump to the real instruction
10747 * handler.  Unlike the Arm handler, we can't do this as a tail call
10748 * because rIBASE is caller save and we need to reload it.
10749 *
10750 * Note that unlike in the Arm implementation, we should never arrive
10751 * here with a zero breakFlag because we always refresh rIBASE on
10752 * return.
10753 */
10754    .extern MterpCheckBefore
10755    REFRESH_IBASE
10756    movq    rSELF, OUT_ARG0
10757    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10758    movq    rPC, OUT_ARG2
10759    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10760    jmp     .L_op_nop+(210*128)
10761
10762/* ------------------------------ */
10763    .balign 128
10764.L_ALT_op_div_int_lit16: /* 0xd3 */
10765/* File: x86_64/alt_stub.S */
10766/*
10767 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10768 * any interesting requests and then jump to the real instruction
10769 * handler.  Unlike the Arm handler, we can't do this as a tail call
10770 * because rIBASE is caller save and we need to reload it.
10771 *
10772 * Note that unlike in the Arm implementation, we should never arrive
10773 * here with a zero breakFlag because we always refresh rIBASE on
10774 * return.
10775 */
10776    .extern MterpCheckBefore
10777    REFRESH_IBASE
10778    movq    rSELF, OUT_ARG0
10779    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10780    movq    rPC, OUT_ARG2
10781    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10782    jmp     .L_op_nop+(211*128)
10783
10784/* ------------------------------ */
10785    .balign 128
10786.L_ALT_op_rem_int_lit16: /* 0xd4 */
10787/* File: x86_64/alt_stub.S */
10788/*
10789 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10790 * any interesting requests and then jump to the real instruction
10791 * handler.  Unlike the Arm handler, we can't do this as a tail call
10792 * because rIBASE is caller save and we need to reload it.
10793 *
10794 * Note that unlike in the Arm implementation, we should never arrive
10795 * here with a zero breakFlag because we always refresh rIBASE on
10796 * return.
10797 */
10798    .extern MterpCheckBefore
10799    REFRESH_IBASE
10800    movq    rSELF, OUT_ARG0
10801    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10802    movq    rPC, OUT_ARG2
10803    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10804    jmp     .L_op_nop+(212*128)
10805
10806/* ------------------------------ */
10807    .balign 128
10808.L_ALT_op_and_int_lit16: /* 0xd5 */
10809/* File: x86_64/alt_stub.S */
10810/*
10811 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10812 * any interesting requests and then jump to the real instruction
10813 * handler.  Unlike the Arm handler, we can't do this as a tail call
10814 * because rIBASE is caller save and we need to reload it.
10815 *
10816 * Note that unlike in the Arm implementation, we should never arrive
10817 * here with a zero breakFlag because we always refresh rIBASE on
10818 * return.
10819 */
10820    .extern MterpCheckBefore
10821    REFRESH_IBASE
10822    movq    rSELF, OUT_ARG0
10823    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10824    movq    rPC, OUT_ARG2
10825    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10826    jmp     .L_op_nop+(213*128)
10827
10828/* ------------------------------ */
10829    .balign 128
10830.L_ALT_op_or_int_lit16: /* 0xd6 */
10831/* File: x86_64/alt_stub.S */
10832/*
10833 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10834 * any interesting requests and then jump to the real instruction
10835 * handler.  Unlike the Arm handler, we can't do this as a tail call
10836 * because rIBASE is caller save and we need to reload it.
10837 *
10838 * Note that unlike in the Arm implementation, we should never arrive
10839 * here with a zero breakFlag because we always refresh rIBASE on
10840 * return.
10841 */
10842    .extern MterpCheckBefore
10843    REFRESH_IBASE
10844    movq    rSELF, OUT_ARG0
10845    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10846    movq    rPC, OUT_ARG2
10847    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10848    jmp     .L_op_nop+(214*128)
10849
10850/* ------------------------------ */
10851    .balign 128
10852.L_ALT_op_xor_int_lit16: /* 0xd7 */
10853/* File: x86_64/alt_stub.S */
10854/*
10855 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10856 * any interesting requests and then jump to the real instruction
10857 * handler.  Unlike the Arm handler, we can't do this as a tail call
10858 * because rIBASE is caller save and we need to reload it.
10859 *
10860 * Note that unlike in the Arm implementation, we should never arrive
10861 * here with a zero breakFlag because we always refresh rIBASE on
10862 * return.
10863 */
10864    .extern MterpCheckBefore
10865    REFRESH_IBASE
10866    movq    rSELF, OUT_ARG0
10867    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10868    movq    rPC, OUT_ARG2
10869    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10870    jmp     .L_op_nop+(215*128)
10871
10872/* ------------------------------ */
10873    .balign 128
10874.L_ALT_op_add_int_lit8: /* 0xd8 */
10875/* File: x86_64/alt_stub.S */
10876/*
10877 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10878 * any interesting requests and then jump to the real instruction
10879 * handler.  Unlike the Arm handler, we can't do this as a tail call
10880 * because rIBASE is caller save and we need to reload it.
10881 *
10882 * Note that unlike in the Arm implementation, we should never arrive
10883 * here with a zero breakFlag because we always refresh rIBASE on
10884 * return.
10885 */
10886    .extern MterpCheckBefore
10887    REFRESH_IBASE
10888    movq    rSELF, OUT_ARG0
10889    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10890    movq    rPC, OUT_ARG2
10891    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10892    jmp     .L_op_nop+(216*128)
10893
10894/* ------------------------------ */
10895    .balign 128
10896.L_ALT_op_rsub_int_lit8: /* 0xd9 */
10897/* File: x86_64/alt_stub.S */
10898/*
10899 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10900 * any interesting requests and then jump to the real instruction
10901 * handler.  Unlike the Arm handler, we can't do this as a tail call
10902 * because rIBASE is caller save and we need to reload it.
10903 *
10904 * Note that unlike in the Arm implementation, we should never arrive
10905 * here with a zero breakFlag because we always refresh rIBASE on
10906 * return.
10907 */
10908    .extern MterpCheckBefore
10909    REFRESH_IBASE
10910    movq    rSELF, OUT_ARG0
10911    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10912    movq    rPC, OUT_ARG2
10913    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10914    jmp     .L_op_nop+(217*128)
10915
10916/* ------------------------------ */
10917    .balign 128
10918.L_ALT_op_mul_int_lit8: /* 0xda */
10919/* File: x86_64/alt_stub.S */
10920/*
10921 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10922 * any interesting requests and then jump to the real instruction
10923 * handler.  Unlike the Arm handler, we can't do this as a tail call
10924 * because rIBASE is caller save and we need to reload it.
10925 *
10926 * Note that unlike in the Arm implementation, we should never arrive
10927 * here with a zero breakFlag because we always refresh rIBASE on
10928 * return.
10929 */
10930    .extern MterpCheckBefore
10931    REFRESH_IBASE
10932    movq    rSELF, OUT_ARG0
10933    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10934    movq    rPC, OUT_ARG2
10935    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10936    jmp     .L_op_nop+(218*128)
10937
10938/* ------------------------------ */
10939    .balign 128
10940.L_ALT_op_div_int_lit8: /* 0xdb */
10941/* File: x86_64/alt_stub.S */
10942/*
10943 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10944 * any interesting requests and then jump to the real instruction
10945 * handler.  Unlike the Arm handler, we can't do this as a tail call
10946 * because rIBASE is caller save and we need to reload it.
10947 *
10948 * Note that unlike in the Arm implementation, we should never arrive
10949 * here with a zero breakFlag because we always refresh rIBASE on
10950 * return.
10951 */
10952    .extern MterpCheckBefore
10953    REFRESH_IBASE
10954    movq    rSELF, OUT_ARG0
10955    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10956    movq    rPC, OUT_ARG2
10957    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10958    jmp     .L_op_nop+(219*128)
10959
10960/* ------------------------------ */
10961    .balign 128
10962.L_ALT_op_rem_int_lit8: /* 0xdc */
10963/* File: x86_64/alt_stub.S */
10964/*
10965 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10966 * any interesting requests and then jump to the real instruction
10967 * handler.  Unlike the Arm handler, we can't do this as a tail call
10968 * because rIBASE is caller save and we need to reload it.
10969 *
10970 * Note that unlike in the Arm implementation, we should never arrive
10971 * here with a zero breakFlag because we always refresh rIBASE on
10972 * return.
10973 */
10974    .extern MterpCheckBefore
10975    REFRESH_IBASE
10976    movq    rSELF, OUT_ARG0
10977    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
10978    movq    rPC, OUT_ARG2
10979    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
10980    jmp     .L_op_nop+(220*128)
10981
10982/* ------------------------------ */
10983    .balign 128
10984.L_ALT_op_and_int_lit8: /* 0xdd */
10985/* File: x86_64/alt_stub.S */
10986/*
10987 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10988 * any interesting requests and then jump to the real instruction
10989 * handler.  Unlike the Arm handler, we can't do this as a tail call
10990 * because rIBASE is caller save and we need to reload it.
10991 *
10992 * Note that unlike in the Arm implementation, we should never arrive
10993 * here with a zero breakFlag because we always refresh rIBASE on
10994 * return.
10995 */
10996    .extern MterpCheckBefore
10997    REFRESH_IBASE
10998    movq    rSELF, OUT_ARG0
10999    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11000    movq    rPC, OUT_ARG2
11001    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
11002    jmp     .L_op_nop+(221*128)
11003
11004/* ------------------------------ */
11005    .balign 128
11006.L_ALT_op_or_int_lit8: /* 0xde */
11007/* File: x86_64/alt_stub.S */
11008/*
11009 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11010 * any interesting requests and then jump to the real instruction
11011 * handler.  Unlike the Arm handler, we can't do this as a tail call
11012 * because rIBASE is caller save and we need to reload it.
11013 *
11014 * Note that unlike in the Arm implementation, we should never arrive
11015 * here with a zero breakFlag because we always refresh rIBASE on
11016 * return.
11017 */
11018    .extern MterpCheckBefore
11019    REFRESH_IBASE
11020    movq    rSELF, OUT_ARG0
11021    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11022    movq    rPC, OUT_ARG2
11023    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
11024    jmp     .L_op_nop+(222*128)
11025
11026/* ------------------------------ */
11027    .balign 128
11028.L_ALT_op_xor_int_lit8: /* 0xdf */
11029/* File: x86_64/alt_stub.S */
11030/*
11031 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11032 * any interesting requests and then jump to the real instruction
11033 * handler.  Unlike the Arm handler, we can't do this as a tail call
11034 * because rIBASE is caller save and we need to reload it.
11035 *
11036 * Note that unlike in the Arm implementation, we should never arrive
11037 * here with a zero breakFlag because we always refresh rIBASE on
11038 * return.
11039 */
11040    .extern MterpCheckBefore
11041    REFRESH_IBASE
11042    movq    rSELF, OUT_ARG0
11043    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11044    movq    rPC, OUT_ARG2
11045    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
11046    jmp     .L_op_nop+(223*128)
11047
11048/* ------------------------------ */
11049    .balign 128
11050.L_ALT_op_shl_int_lit8: /* 0xe0 */
11051/* File: x86_64/alt_stub.S */
11052/*
11053 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11054 * any interesting requests and then jump to the real instruction
11055 * handler.  Unlike the Arm handler, we can't do this as a tail call
11056 * because rIBASE is caller save and we need to reload it.
11057 *
11058 * Note that unlike in the Arm implementation, we should never arrive
11059 * here with a zero breakFlag because we always refresh rIBASE on
11060 * return.
11061 */
11062    .extern MterpCheckBefore
11063    REFRESH_IBASE
11064    movq    rSELF, OUT_ARG0
11065    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11066    movq    rPC, OUT_ARG2
11067    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
11068    jmp     .L_op_nop+(224*128)
11069
11070/* ------------------------------ */
11071    .balign 128
11072.L_ALT_op_shr_int_lit8: /* 0xe1 */
11073/* File: x86_64/alt_stub.S */
11074/*
11075 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11076 * any interesting requests and then jump to the real instruction
11077 * handler.  Unlike the Arm handler, we can't do this as a tail call
11078 * because rIBASE is caller save and we need to reload it.
11079 *
11080 * Note that unlike in the Arm implementation, we should never arrive
11081 * here with a zero breakFlag because we always refresh rIBASE on
11082 * return.
11083 */
11084    .extern MterpCheckBefore
11085    REFRESH_IBASE
11086    movq    rSELF, OUT_ARG0
11087    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11088    movq    rPC, OUT_ARG2
11089    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
11090    jmp     .L_op_nop+(225*128)
11091
11092/* ------------------------------ */
11093    .balign 128
11094.L_ALT_op_ushr_int_lit8: /* 0xe2 */
11095/* File: x86_64/alt_stub.S */
11096/*
11097 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11098 * any interesting requests and then jump to the real instruction
11099 * handler.  Unlike the Arm handler, we can't do this as a tail call
11100 * because rIBASE is caller save and we need to reload it.
11101 *
11102 * Note that unlike in the Arm implementation, we should never arrive
11103 * here with a zero breakFlag because we always refresh rIBASE on
11104 * return.
11105 */
11106    .extern MterpCheckBefore
11107    REFRESH_IBASE
11108    movq    rSELF, OUT_ARG0
11109    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11110    movq    rPC, OUT_ARG2
11111    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
11112    jmp     .L_op_nop+(226*128)
11113
11114/* ------------------------------ */
11115    .balign 128
11116.L_ALT_op_iget_quick: /* 0xe3 */
11117/* File: x86_64/alt_stub.S */
11118/*
11119 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11120 * any interesting requests and then jump to the real instruction
11121 * handler.  Unlike the Arm handler, we can't do this as a tail call
11122 * because rIBASE is caller save and we need to reload it.
11123 *
11124 * Note that unlike in the Arm implementation, we should never arrive
11125 * here with a zero breakFlag because we always refresh rIBASE on
11126 * return.
11127 */
11128    .extern MterpCheckBefore
11129    REFRESH_IBASE
11130    movq    rSELF, OUT_ARG0
11131    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11132    movq    rPC, OUT_ARG2
11133    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
11134    jmp     .L_op_nop+(227*128)
11135
11136/* ------------------------------ */
11137    .balign 128
11138.L_ALT_op_iget_wide_quick: /* 0xe4 */
11139/* File: x86_64/alt_stub.S */
11140/*
11141 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11142 * any interesting requests and then jump to the real instruction
11143 * handler.  Unlike the Arm handler, we can't do this as a tail call
11144 * because rIBASE is caller save and we need to reload it.
11145 *
11146 * Note that unlike in the Arm implementation, we should never arrive
11147 * here with a zero breakFlag because we always refresh rIBASE on
11148 * return.
11149 */
11150    .extern MterpCheckBefore
11151    REFRESH_IBASE
11152    movq    rSELF, OUT_ARG0
11153    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11154    movq    rPC, OUT_ARG2
11155    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
11156    jmp     .L_op_nop+(228*128)
11157
11158/* ------------------------------ */
11159    .balign 128
11160.L_ALT_op_iget_object_quick: /* 0xe5 */
11161/* File: x86_64/alt_stub.S */
11162/*
11163 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11164 * any interesting requests and then jump to the real instruction
11165 * handler.  Unlike the Arm handler, we can't do this as a tail call
11166 * because rIBASE is caller save and we need to reload it.
11167 *
11168 * Note that unlike in the Arm implementation, we should never arrive
11169 * here with a zero breakFlag because we always refresh rIBASE on
11170 * return.
11171 */
11172    .extern MterpCheckBefore
11173    REFRESH_IBASE
11174    movq    rSELF, OUT_ARG0
11175    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11176    movq    rPC, OUT_ARG2
11177    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
11178    jmp     .L_op_nop+(229*128)
11179
11180/* ------------------------------ */
11181    .balign 128
11182.L_ALT_op_iput_quick: /* 0xe6 */
11183/* File: x86_64/alt_stub.S */
11184/*
11185 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11186 * any interesting requests and then jump to the real instruction
11187 * handler.  Unlike the Arm handler, we can't do this as a tail call
11188 * because rIBASE is caller save and we need to reload it.
11189 *
11190 * Note that unlike in the Arm implementation, we should never arrive
11191 * here with a zero breakFlag because we always refresh rIBASE on
11192 * return.
11193 */
11194    .extern MterpCheckBefore
11195    REFRESH_IBASE
11196    movq    rSELF, OUT_ARG0
11197    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11198    movq    rPC, OUT_ARG2
11199    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
11200    jmp     .L_op_nop+(230*128)
11201
11202/* ------------------------------ */
11203    .balign 128
11204.L_ALT_op_iput_wide_quick: /* 0xe7 */
11205/* File: x86_64/alt_stub.S */
11206/*
11207 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11208 * any interesting requests and then jump to the real instruction
11209 * handler.  Unlike the Arm handler, we can't do this as a tail call
11210 * because rIBASE is caller save and we need to reload it.
11211 *
11212 * Note that unlike in the Arm implementation, we should never arrive
11213 * here with a zero breakFlag because we always refresh rIBASE on
11214 * return.
11215 */
11216    .extern MterpCheckBefore
11217    REFRESH_IBASE
11218    movq    rSELF, OUT_ARG0
11219    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11220    movq    rPC, OUT_ARG2
11221    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
11222    jmp     .L_op_nop+(231*128)
11223
11224/* ------------------------------ */
11225    .balign 128
11226.L_ALT_op_iput_object_quick: /* 0xe8 */
11227/* File: x86_64/alt_stub.S */
11228/*
11229 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11230 * any interesting requests and then jump to the real instruction
11231 * handler.  Unlike the Arm handler, we can't do this as a tail call
11232 * because rIBASE is caller save and we need to reload it.
11233 *
11234 * Note that unlike in the Arm implementation, we should never arrive
11235 * here with a zero breakFlag because we always refresh rIBASE on
11236 * return.
11237 */
11238    .extern MterpCheckBefore
11239    REFRESH_IBASE
11240    movq    rSELF, OUT_ARG0
11241    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11242    movq    rPC, OUT_ARG2
11243    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
11244    jmp     .L_op_nop+(232*128)
11245
11246/* ------------------------------ */
11247    .balign 128
11248.L_ALT_op_invoke_virtual_quick: /* 0xe9 */
11249/* File: x86_64/alt_stub.S */
11250/*
11251 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11252 * any interesting requests and then jump to the real instruction
11253 * handler.  Unlike the Arm handler, we can't do this as a tail call
11254 * because rIBASE is caller save and we need to reload it.
11255 *
11256 * Note that unlike in the Arm implementation, we should never arrive
11257 * here with a zero breakFlag because we always refresh rIBASE on
11258 * return.
11259 */
11260    .extern MterpCheckBefore
11261    REFRESH_IBASE
11262    movq    rSELF, OUT_ARG0
11263    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11264    movq    rPC, OUT_ARG2
11265    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
11266    jmp     .L_op_nop+(233*128)
11267
11268/* ------------------------------ */
11269    .balign 128
11270.L_ALT_op_invoke_virtual_range_quick: /* 0xea */
11271/* File: x86_64/alt_stub.S */
11272/*
11273 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11274 * any interesting requests and then jump to the real instruction
11275 * handler.  Unlike the Arm handler, we can't do this as a tail call
11276 * because rIBASE is caller save and we need to reload it.
11277 *
11278 * Note that unlike in the Arm implementation, we should never arrive
11279 * here with a zero breakFlag because we always refresh rIBASE on
11280 * return.
11281 */
11282    .extern MterpCheckBefore
11283    REFRESH_IBASE
11284    movq    rSELF, OUT_ARG0
11285    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11286    movq    rPC, OUT_ARG2
11287    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
11288    jmp     .L_op_nop+(234*128)
11289
11290/* ------------------------------ */
11291    .balign 128
11292.L_ALT_op_iput_boolean_quick: /* 0xeb */
11293/* File: x86_64/alt_stub.S */
11294/*
11295 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11296 * any interesting requests and then jump to the real instruction
11297 * handler.  Unlike the Arm handler, we can't do this as a tail call
11298 * because rIBASE is caller save and we need to reload it.
11299 *
11300 * Note that unlike in the Arm implementation, we should never arrive
11301 * here with a zero breakFlag because we always refresh rIBASE on
11302 * return.
11303 */
11304    .extern MterpCheckBefore
11305    REFRESH_IBASE
11306    movq    rSELF, OUT_ARG0
11307    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11308    movq    rPC, OUT_ARG2
11309    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
11310    jmp     .L_op_nop+(235*128)
11311
11312/* ------------------------------ */
11313    .balign 128
11314.L_ALT_op_iput_byte_quick: /* 0xec */
11315/* File: x86_64/alt_stub.S */
11316/*
11317 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11318 * any interesting requests and then jump to the real instruction
11319 * handler.  Unlike the Arm handler, we can't do this as a tail call
11320 * because rIBASE is caller save and we need to reload it.
11321 *
11322 * Note that unlike in the Arm implementation, we should never arrive
11323 * here with a zero breakFlag because we always refresh rIBASE on
11324 * return.
11325 */
11326    .extern MterpCheckBefore
11327    REFRESH_IBASE
11328    movq    rSELF, OUT_ARG0
11329    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11330    movq    rPC, OUT_ARG2
11331    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
11332    jmp     .L_op_nop+(236*128)
11333
11334/* ------------------------------ */
11335    .balign 128
11336.L_ALT_op_iput_char_quick: /* 0xed */
11337/* File: x86_64/alt_stub.S */
11338/*
11339 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11340 * any interesting requests and then jump to the real instruction
11341 * handler.  Unlike the Arm handler, we can't do this as a tail call
11342 * because rIBASE is caller save and we need to reload it.
11343 *
11344 * Note that unlike in the Arm implementation, we should never arrive
11345 * here with a zero breakFlag because we always refresh rIBASE on
11346 * return.
11347 */
11348    .extern MterpCheckBefore
11349    REFRESH_IBASE
11350    movq    rSELF, OUT_ARG0
11351    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11352    movq    rPC, OUT_ARG2
11353    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
11354    jmp     .L_op_nop+(237*128)
11355
11356/* ------------------------------ */
11357    .balign 128
11358.L_ALT_op_iput_short_quick: /* 0xee */
11359/* File: x86_64/alt_stub.S */
11360/*
11361 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11362 * any interesting requests and then jump to the real instruction
11363 * handler.  Unlike the Arm handler, we can't do this as a tail call
11364 * because rIBASE is caller save and we need to reload it.
11365 *
11366 * Note that unlike in the Arm implementation, we should never arrive
11367 * here with a zero breakFlag because we always refresh rIBASE on
11368 * return.
11369 */
11370    .extern MterpCheckBefore
11371    REFRESH_IBASE
11372    movq    rSELF, OUT_ARG0
11373    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11374    movq    rPC, OUT_ARG2
11375    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
11376    jmp     .L_op_nop+(238*128)
11377
11378/* ------------------------------ */
11379    .balign 128
11380.L_ALT_op_iget_boolean_quick: /* 0xef */
11381/* File: x86_64/alt_stub.S */
11382/*
11383 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11384 * any interesting requests and then jump to the real instruction
11385 * handler.  Unlike the Arm handler, we can't do this as a tail call
11386 * because rIBASE is caller save and we need to reload it.
11387 *
11388 * Note that unlike in the Arm implementation, we should never arrive
11389 * here with a zero breakFlag because we always refresh rIBASE on
11390 * return.
11391 */
11392    .extern MterpCheckBefore
11393    REFRESH_IBASE
11394    movq    rSELF, OUT_ARG0
11395    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11396    movq    rPC, OUT_ARG2
11397    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
11398    jmp     .L_op_nop+(239*128)
11399
11400/* ------------------------------ */
11401    .balign 128
11402.L_ALT_op_iget_byte_quick: /* 0xf0 */
11403/* File: x86_64/alt_stub.S */
11404/*
11405 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11406 * any interesting requests and then jump to the real instruction
11407 * handler.  Unlike the Arm handler, we can't do this as a tail call
11408 * because rIBASE is caller save and we need to reload it.
11409 *
11410 * Note that unlike in the Arm implementation, we should never arrive
11411 * here with a zero breakFlag because we always refresh rIBASE on
11412 * return.
11413 */
11414    .extern MterpCheckBefore
11415    REFRESH_IBASE
11416    movq    rSELF, OUT_ARG0
11417    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11418    movq    rPC, OUT_ARG2
11419    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
11420    jmp     .L_op_nop+(240*128)
11421
11422/* ------------------------------ */
11423    .balign 128
11424.L_ALT_op_iget_char_quick: /* 0xf1 */
11425/* File: x86_64/alt_stub.S */
11426/*
11427 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11428 * any interesting requests and then jump to the real instruction
11429 * handler.  Unlike the Arm handler, we can't do this as a tail call
11430 * because rIBASE is caller save and we need to reload it.
11431 *
11432 * Note that unlike in the Arm implementation, we should never arrive
11433 * here with a zero breakFlag because we always refresh rIBASE on
11434 * return.
11435 */
11436    .extern MterpCheckBefore
11437    REFRESH_IBASE
11438    movq    rSELF, OUT_ARG0
11439    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11440    movq    rPC, OUT_ARG2
11441    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
11442    jmp     .L_op_nop+(241*128)
11443
11444/* ------------------------------ */
11445    .balign 128
11446.L_ALT_op_iget_short_quick: /* 0xf2 */
11447/* File: x86_64/alt_stub.S */
11448/*
11449 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11450 * any interesting requests and then jump to the real instruction
11451 * handler.  Unlike the Arm handler, we can't do this as a tail call
11452 * because rIBASE is caller save and we need to reload it.
11453 *
11454 * Note that unlike in the Arm implementation, we should never arrive
11455 * here with a zero breakFlag because we always refresh rIBASE on
11456 * return.
11457 */
11458    .extern MterpCheckBefore
11459    REFRESH_IBASE
11460    movq    rSELF, OUT_ARG0
11461    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11462    movq    rPC, OUT_ARG2
11463    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
11464    jmp     .L_op_nop+(242*128)
11465
11466/* ------------------------------ */
11467    .balign 128
11468.L_ALT_op_unused_f3: /* 0xf3 */
11469/* File: x86_64/alt_stub.S */
11470/*
11471 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11472 * any interesting requests and then jump to the real instruction
11473 * handler.  Unlike the Arm handler, we can't do this as a tail call
11474 * because rIBASE is caller save and we need to reload it.
11475 *
11476 * Note that unlike in the Arm implementation, we should never arrive
11477 * here with a zero breakFlag because we always refresh rIBASE on
11478 * return.
11479 */
11480    .extern MterpCheckBefore
11481    REFRESH_IBASE
11482    movq    rSELF, OUT_ARG0
11483    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11484    movq    rPC, OUT_ARG2
11485    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
11486    jmp     .L_op_nop+(243*128)
11487
11488/* ------------------------------ */
11489    .balign 128
11490.L_ALT_op_unused_f4: /* 0xf4 */
11491/* File: x86_64/alt_stub.S */
11492/*
11493 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11494 * any interesting requests and then jump to the real instruction
11495 * handler.  Unlike the Arm handler, we can't do this as a tail call
11496 * because rIBASE is caller save and we need to reload it.
11497 *
11498 * Note that unlike in the Arm implementation, we should never arrive
11499 * here with a zero breakFlag because we always refresh rIBASE on
11500 * return.
11501 */
11502    .extern MterpCheckBefore
11503    REFRESH_IBASE
11504    movq    rSELF, OUT_ARG0
11505    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11506    movq    rPC, OUT_ARG2
11507    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
11508    jmp     .L_op_nop+(244*128)
11509
11510/* ------------------------------ */
11511    .balign 128
11512.L_ALT_op_unused_f5: /* 0xf5 */
11513/* File: x86_64/alt_stub.S */
11514/*
11515 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11516 * any interesting requests and then jump to the real instruction
11517 * handler.  Unlike the Arm handler, we can't do this as a tail call
11518 * because rIBASE is caller save and we need to reload it.
11519 *
11520 * Note that unlike in the Arm implementation, we should never arrive
11521 * here with a zero breakFlag because we always refresh rIBASE on
11522 * return.
11523 */
11524    .extern MterpCheckBefore
11525    REFRESH_IBASE
11526    movq    rSELF, OUT_ARG0
11527    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11528    movq    rPC, OUT_ARG2
11529    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
11530    jmp     .L_op_nop+(245*128)
11531
11532/* ------------------------------ */
11533    .balign 128
11534.L_ALT_op_unused_f6: /* 0xf6 */
11535/* File: x86_64/alt_stub.S */
11536/*
11537 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11538 * any interesting requests and then jump to the real instruction
11539 * handler.  Unlike the Arm handler, we can't do this as a tail call
11540 * because rIBASE is caller save and we need to reload it.
11541 *
11542 * Note that unlike in the Arm implementation, we should never arrive
11543 * here with a zero breakFlag because we always refresh rIBASE on
11544 * return.
11545 */
11546    .extern MterpCheckBefore
11547    REFRESH_IBASE
11548    movq    rSELF, OUT_ARG0
11549    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11550    movq    rPC, OUT_ARG2
11551    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
11552    jmp     .L_op_nop+(246*128)
11553
11554/* ------------------------------ */
11555    .balign 128
11556.L_ALT_op_unused_f7: /* 0xf7 */
11557/* File: x86_64/alt_stub.S */
11558/*
11559 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11560 * any interesting requests and then jump to the real instruction
11561 * handler.  Unlike the Arm handler, we can't do this as a tail call
11562 * because rIBASE is caller save and we need to reload it.
11563 *
11564 * Note that unlike in the Arm implementation, we should never arrive
11565 * here with a zero breakFlag because we always refresh rIBASE on
11566 * return.
11567 */
11568    .extern MterpCheckBefore
11569    REFRESH_IBASE
11570    movq    rSELF, OUT_ARG0
11571    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11572    movq    rPC, OUT_ARG2
11573    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
11574    jmp     .L_op_nop+(247*128)
11575
11576/* ------------------------------ */
11577    .balign 128
11578.L_ALT_op_unused_f8: /* 0xf8 */
11579/* File: x86_64/alt_stub.S */
11580/*
11581 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11582 * any interesting requests and then jump to the real instruction
11583 * handler.  Unlike the Arm handler, we can't do this as a tail call
11584 * because rIBASE is caller save and we need to reload it.
11585 *
11586 * Note that unlike in the Arm implementation, we should never arrive
11587 * here with a zero breakFlag because we always refresh rIBASE on
11588 * return.
11589 */
11590    .extern MterpCheckBefore
11591    REFRESH_IBASE
11592    movq    rSELF, OUT_ARG0
11593    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11594    movq    rPC, OUT_ARG2
11595    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
11596    jmp     .L_op_nop+(248*128)
11597
11598/* ------------------------------ */
11599    .balign 128
11600.L_ALT_op_unused_f9: /* 0xf9 */
11601/* File: x86_64/alt_stub.S */
11602/*
11603 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11604 * any interesting requests and then jump to the real instruction
11605 * handler.  Unlike the Arm handler, we can't do this as a tail call
11606 * because rIBASE is caller save and we need to reload it.
11607 *
11608 * Note that unlike in the Arm implementation, we should never arrive
11609 * here with a zero breakFlag because we always refresh rIBASE on
11610 * return.
11611 */
11612    .extern MterpCheckBefore
11613    REFRESH_IBASE
11614    movq    rSELF, OUT_ARG0
11615    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11616    movq    rPC, OUT_ARG2
11617    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
11618    jmp     .L_op_nop+(249*128)
11619
11620/* ------------------------------ */
11621    .balign 128
11622.L_ALT_op_invoke_polymorphic: /* 0xfa */
11623/* File: x86_64/alt_stub.S */
11624/*
11625 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11626 * any interesting requests and then jump to the real instruction
11627 * handler.  Unlike the Arm handler, we can't do this as a tail call
11628 * because rIBASE is caller save and we need to reload it.
11629 *
11630 * Note that unlike in the Arm implementation, we should never arrive
11631 * here with a zero breakFlag because we always refresh rIBASE on
11632 * return.
11633 */
11634    .extern MterpCheckBefore
11635    REFRESH_IBASE
11636    movq    rSELF, OUT_ARG0
11637    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11638    movq    rPC, OUT_ARG2
11639    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
11640    jmp     .L_op_nop+(250*128)
11641
11642/* ------------------------------ */
11643    .balign 128
11644.L_ALT_op_invoke_polymorphic_range: /* 0xfb */
11645/* File: x86_64/alt_stub.S */
11646/*
11647 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11648 * any interesting requests and then jump to the real instruction
11649 * handler.  Unlike the Arm handler, we can't do this as a tail call
11650 * because rIBASE is caller save and we need to reload it.
11651 *
11652 * Note that unlike in the Arm implementation, we should never arrive
11653 * here with a zero breakFlag because we always refresh rIBASE on
11654 * return.
11655 */
11656    .extern MterpCheckBefore
11657    REFRESH_IBASE
11658    movq    rSELF, OUT_ARG0
11659    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11660    movq    rPC, OUT_ARG2
11661    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
11662    jmp     .L_op_nop+(251*128)
11663
11664/* ------------------------------ */
11665    .balign 128
11666.L_ALT_op_invoke_custom: /* 0xfc */
11667/* File: x86_64/alt_stub.S */
11668/*
11669 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11670 * any interesting requests and then jump to the real instruction
11671 * handler.  Unlike the Arm handler, we can't do this as a tail call
11672 * because rIBASE is caller save and we need to reload it.
11673 *
11674 * Note that unlike in the Arm implementation, we should never arrive
11675 * here with a zero breakFlag because we always refresh rIBASE on
11676 * return.
11677 */
11678    .extern MterpCheckBefore
11679    REFRESH_IBASE
11680    movq    rSELF, OUT_ARG0
11681    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11682    movq    rPC, OUT_ARG2
11683    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
11684    jmp     .L_op_nop+(252*128)
11685
11686/* ------------------------------ */
11687    .balign 128
11688.L_ALT_op_invoke_custom_range: /* 0xfd */
11689/* File: x86_64/alt_stub.S */
11690/*
11691 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11692 * any interesting requests and then jump to the real instruction
11693 * handler.  Unlike the Arm handler, we can't do this as a tail call
11694 * because rIBASE is caller save and we need to reload it.
11695 *
11696 * Note that unlike in the Arm implementation, we should never arrive
11697 * here with a zero breakFlag because we always refresh rIBASE on
11698 * return.
11699 */
11700    .extern MterpCheckBefore
11701    REFRESH_IBASE
11702    movq    rSELF, OUT_ARG0
11703    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11704    movq    rPC, OUT_ARG2
11705    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
11706    jmp     .L_op_nop+(253*128)
11707
11708/* ------------------------------ */
11709    .balign 128
11710.L_ALT_op_unused_fe: /* 0xfe */
11711/* File: x86_64/alt_stub.S */
11712/*
11713 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11714 * any interesting requests and then jump to the real instruction
11715 * handler.  Unlike the Arm handler, we can't do this as a tail call
11716 * because rIBASE is caller save and we need to reload it.
11717 *
11718 * Note that unlike in the Arm implementation, we should never arrive
11719 * here with a zero breakFlag because we always refresh rIBASE on
11720 * return.
11721 */
11722    .extern MterpCheckBefore
11723    REFRESH_IBASE
11724    movq    rSELF, OUT_ARG0
11725    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11726    movq    rPC, OUT_ARG2
11727    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
11728    jmp     .L_op_nop+(254*128)
11729
11730/* ------------------------------ */
11731    .balign 128
11732.L_ALT_op_unused_ff: /* 0xff */
11733/* File: x86_64/alt_stub.S */
11734/*
11735 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11736 * any interesting requests and then jump to the real instruction
11737 * handler.  Unlike the Arm handler, we can't do this as a tail call
11738 * because rIBASE is caller save and we need to reload it.
11739 *
11740 * Note that unlike in the Arm implementation, we should never arrive
11741 * here with a zero breakFlag because we always refresh rIBASE on
11742 * return.
11743 */
11744    .extern MterpCheckBefore
11745    REFRESH_IBASE
11746    movq    rSELF, OUT_ARG0
11747    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11748    movq    rPC, OUT_ARG2
11749    call    SYMBOL(MterpCheckBefore)        # (self, shadow_frame, dex_pc_ptr)
11750    jmp     .L_op_nop+(255*128)
11751
11752    .balign 128
11753    SIZE(SYMBOL(artMterpAsmAltInstructionStart),SYMBOL(artMterpAsmAltInstructionStart))
11754    .global SYMBOL(artMterpAsmAltInstructionEnd)
11755SYMBOL(artMterpAsmAltInstructionEnd):
11756/* File: x86_64/footer.S */
11757/*
11758 * ===========================================================================
11759 *  Common subroutines and data
11760 * ===========================================================================
11761 */
11762
11763    .text
11764    .align  2
11765
11766/*
11767 * We've detected a condition that will result in an exception, but the exception
11768 * has not yet been thrown.  Just bail out to the reference interpreter to deal with it.
11769 * TUNING: for consistency, we may want to just go ahead and handle these here.
11770 */
11771common_errDivideByZero:
11772    EXPORT_PC
11773#if MTERP_LOGGING
11774    movq    rSELF, OUT_ARG0
11775    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11776    call    SYMBOL(MterpLogDivideByZeroException)
11777#endif
11778    jmp     MterpCommonFallback
11779
11780common_errArrayIndex:
11781    EXPORT_PC
11782#if MTERP_LOGGING
11783    movq    rSELF, OUT_ARG0
11784    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11785    call    SYMBOL(MterpLogArrayIndexException)
11786#endif
11787    jmp     MterpCommonFallback
11788
11789common_errNegativeArraySize:
11790    EXPORT_PC
11791#if MTERP_LOGGING
11792    movq    rSELF, OUT_ARG0
11793    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11794    call    SYMBOL(MterpLogNegativeArraySizeException)
11795#endif
11796    jmp     MterpCommonFallback
11797
11798common_errNoSuchMethod:
11799    EXPORT_PC
11800#if MTERP_LOGGING
11801    movq    rSELF, OUT_ARG0
11802    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11803    call    SYMBOL(MterpLogNoSuchMethodException)
11804#endif
11805    jmp     MterpCommonFallback
11806
11807common_errNullObject:
11808    EXPORT_PC
11809#if MTERP_LOGGING
11810    movq    rSELF, OUT_ARG0
11811    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11812    call    SYMBOL(MterpLogNullObjectException)
11813#endif
11814    jmp     MterpCommonFallback
11815
11816common_exceptionThrown:
11817    EXPORT_PC
11818#if MTERP_LOGGING
11819    movq    rSELF, OUT_ARG0
11820    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11821    call    SYMBOL(MterpLogExceptionThrownException)
11822#endif
11823    jmp     MterpCommonFallback
11824
11825MterpSuspendFallback:
11826    EXPORT_PC
11827#if MTERP_LOGGING
11828    movq    rSELF, OUT_ARG0
11829    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11830    movl    THREAD_FLAGS_OFFSET(OUT_ARG0), OUT_32_ARG2
11831    call    SYMBOL(MterpLogSuspendFallback)
11832#endif
11833    jmp     MterpCommonFallback
11834
11835/*
11836 * If we're here, something is out of the ordinary.  If there is a pending
11837 * exception, handle it.  Otherwise, roll back and retry with the reference
11838 * interpreter.
11839 */
11840MterpPossibleException:
11841    movq    rSELF, %rcx
11842    cmpq    $0, THREAD_EXCEPTION_OFFSET(%rcx)
11843    jz      MterpFallback
11844    /* intentional fallthrough - handle pending exception. */
11845
11846/*
11847 * On return from a runtime helper routine, we've found a pending exception.
11848 * Can we handle it here - or need to bail out to caller?
11849 *
11850 */
11851MterpException:
11852    movq    rSELF, OUT_ARG0
11853    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11854    call    SYMBOL(MterpHandleException)
11855    testb   %al, %al
11856    jz      MterpExceptionReturn
11857    movq    OFF_FP_CODE_ITEM(rFP), %rax
11858    mov     OFF_FP_DEX_PC(rFP), %ecx
11859    leaq    CODEITEM_INSNS_OFFSET(%rax), rPC
11860    leaq    (rPC, %rcx, 2), rPC
11861    movq    rPC, OFF_FP_DEX_PC_PTR(rFP)
11862    /* Do we need to switch interpreters? */
11863    call    SYMBOL(MterpShouldSwitchInterpreters)
11864    testb   %al, %al
11865    jnz     MterpFallback
11866    /* resume execution at catch block */
11867    REFRESH_IBASE
11868    FETCH_INST
11869    GOTO_NEXT
11870    /* NOTE: no fallthrough */
11871
11872/*
11873 * Common handling for branches with support for Jit profiling.
11874 * On entry:
11875 *    rINST          <= signed offset
11876 *    rPROFILE       <= signed hotness countdown (expanded to 32 bits)
11877 *    condition bits <= set to establish sign of offset (use "NoFlags" entry if not)
11878 *
11879 * We have quite a few different cases for branch profiling, OSR detection and
11880 * suspend check support here.
11881 *
11882 * Taken backward branches:
11883 *    If profiling active, do hotness countdown and report if we hit zero.
11884 *    If in osr check mode, see if our target is a compiled loop header entry and do OSR if so.
11885 *    Is there a pending suspend request?  If so, suspend.
11886 *
11887 * Taken forward branches and not-taken backward branches:
11888 *    If in osr check mode, see if our target is a compiled loop header entry and do OSR if so.
11889 *
11890 * Our most common case is expected to be a taken backward branch with active jit profiling,
11891 * but no full OSR check and no pending suspend request.
11892 * Next most common case is not-taken branch with no full OSR check.
11893 *
11894 */
11895MterpCommonTakenBranch:
11896    jg      .L_forward_branch               # don't add forward branches to hotness
11897/*
11898 * We need to subtract 1 from positive values and we should not see 0 here,
11899 * so we may use the result of the comparison with -1.
11900 */
11901#if JIT_CHECK_OSR != -1
11902#  error "JIT_CHECK_OSR must be -1."
11903#endif
11904    cmpl    $JIT_CHECK_OSR, rPROFILE
11905    je      .L_osr_check
11906    decl    rPROFILE
11907    je      .L_add_batch                    # counted down to zero - report
11908.L_resume_backward_branch:
11909    movq    rSELF, %rax
11910    testl   $(THREAD_SUSPEND_OR_CHECKPOINT_REQUEST), THREAD_FLAGS_OFFSET(%rax)
11911    REFRESH_IBASE
11912    leaq    (rPC, rINSTq, 2), rPC
11913    FETCH_INST
11914    jnz     .L_suspend_request_pending
11915    GOTO_NEXT
11916
11917.L_suspend_request_pending:
11918    EXPORT_PC
11919    movq    rSELF, OUT_ARG0
11920    call    SYMBOL(MterpSuspendCheck)       # (self)
11921    testb   %al, %al
11922    jnz     MterpFallback
11923    REFRESH_IBASE                           # might have changed during suspend
11924    GOTO_NEXT
11925
11926.L_no_count_backwards:
11927    cmpl    $JIT_CHECK_OSR, rPROFILE         # possible OSR re-entry?
11928    jne     .L_resume_backward_branch
11929.L_osr_check:
11930    EXPORT_PC
11931    movq    rSELF, OUT_ARG0
11932    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11933    movq    rINSTq, OUT_ARG2
11934    call    SYMBOL(MterpMaybeDoOnStackReplacement) # (self, shadow_frame, offset)
11935    testb   %al, %al
11936    jz      .L_resume_backward_branch
11937    jmp     MterpOnStackReplacement
11938
11939.L_forward_branch:
11940    cmpl    $JIT_CHECK_OSR, rPROFILE         # possible OSR re-entry?
11941    je      .L_check_osr_forward
11942.L_resume_forward_branch:
11943    leaq    (rPC, rINSTq, 2), rPC
11944    FETCH_INST
11945    GOTO_NEXT
11946
11947.L_check_osr_forward:
11948    EXPORT_PC
11949    movq    rSELF, OUT_ARG0
11950    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11951    movq    rINSTq, OUT_ARG2
11952    call    SYMBOL(MterpMaybeDoOnStackReplacement) # (self, shadow_frame, offset)
11953    testb   %al, %al
11954    jz      .L_resume_forward_branch
11955    jmp     MterpOnStackReplacement
11956
11957.L_add_batch:
11958    movl    rPROFILE, %eax
11959    movq    OFF_FP_METHOD(rFP), OUT_ARG0
11960    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11961    movw    %ax, OFF_FP_COUNTDOWN_OFFSET(rFP)
11962    movq    rSELF, OUT_ARG2
11963    call    SYMBOL(MterpAddHotnessBatch)    # (method, shadow_frame, self)
11964    movswl  %ax, rPROFILE
11965    jmp     .L_no_count_backwards
11966
11967/*
11968 * Entered from the conditional branch handlers when OSR check request active on
11969 * not-taken path.  All Dalvik not-taken conditional branch offsets are 2.
11970 */
11971.L_check_not_taken_osr:
11972    EXPORT_PC
11973    movq    rSELF, OUT_ARG0
11974    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11975    movl    $2, OUT_32_ARG2
11976    call    SYMBOL(MterpMaybeDoOnStackReplacement) # (self, shadow_frame, offset)
11977    testb   %al, %al
11978    jnz     MterpOnStackReplacement
11979    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
11980
11981/*
11982 * On-stack replacement has happened, and now we've returned from the compiled method.
11983 */
11984MterpOnStackReplacement:
11985#if MTERP_LOGGING
11986    movq    rSELF, OUT_ARG0
11987    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
11988    movl    rINST, OUT_32_ARG2
11989    call    SYMBOL(MterpLogOSR)
11990#endif
11991    movl    $1, %eax
11992    jmp     MterpDone
11993
11994/*
11995 * Bail out to reference interpreter.
11996 */
11997MterpFallback:
11998    EXPORT_PC
11999#if MTERP_LOGGING
12000    movq    rSELF, OUT_ARG0
12001    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
12002    call    SYMBOL(MterpLogFallback)
12003#endif
12004MterpCommonFallback:
12005    xorl    %eax, %eax
12006    jmp     MterpDone
12007
12008/*
12009 * On entry:
12010 *  uint32_t* rFP  (should still be live, pointer to base of vregs)
12011 */
12012MterpExceptionReturn:
12013    movl    $1, %eax
12014    jmp     MterpDone
12015MterpReturn:
12016    movq    OFF_FP_RESULT_REGISTER(rFP), %rdx
12017    movq    %rax, (%rdx)
12018    movl    $1, %eax
12019MterpDone:
12020/*
12021 * At this point, we expect rPROFILE to be non-zero.  If negative, hotness is disabled or we're
12022 * checking for OSR.  If greater than zero, we might have unreported hotness to register
12023 * (the difference between the ending rPROFILE and the cached hotness counter).  rPROFILE
12024 * should only reach zero immediately after a hotness decrement, and is then reset to either
12025 * a negative special state or the new non-zero countdown value.
12026 */
12027    testl   rPROFILE, rPROFILE
12028    jle     MRestoreFrame                   # if > 0, we may have some counts to report.
12029
12030    movl    %eax, rINST                     # stash return value
12031    /* Report cached hotness counts */
12032    movl    rPROFILE, %eax
12033    movq    OFF_FP_METHOD(rFP), OUT_ARG0
12034    leaq    OFF_FP_SHADOWFRAME(rFP), OUT_ARG1
12035    movw    %ax, OFF_FP_COUNTDOWN_OFFSET(rFP)
12036    movq    rSELF, OUT_ARG2
12037    call    SYMBOL(MterpAddHotnessBatch)    # (method, shadow_frame, self)
12038    movl    rINST, %eax                     # restore return value
12039
12040    /* pop up frame */
12041MRestoreFrame:
12042    addq    $FRAME_SIZE, %rsp
12043    .cfi_adjust_cfa_offset -FRAME_SIZE
12044
12045    /* Restore callee save register */
12046    POP %r15
12047    POP %r14
12048    POP %r13
12049    POP %r12
12050    POP %rbp
12051    POP %rbx
12052    ret
12053    .cfi_endproc
12054    SIZE(ExecuteMterpImpl,ExecuteMterpImpl)
12055
12056