• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * This file was generated automatically by gen-mterp.py for 'mips64'.
3 *
4 * --> DO NOT EDIT <--
5 */
6
7/* File: mips64/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#include <machine/regdef.h>
25
26/* TODO: add the missing file and use its FP register definitions. */
27/* #include <machine/fpregdef.h> */
28/* FP register definitions */
29#define f0  $f0
30#define f1  $f1
31#define f2  $f2
32#define f3  $f3
33#define f12 $f12
34#define f13 $f13
35
36/*
37 * It looks like the GNU assembler currently does not support the blec and bgtc
38 * idioms, which should translate into bgec and bltc respectively with swapped
39 * left and right register operands.
40 * TODO: remove these macros when the assembler is fixed.
41 */
42.macro blec lreg, rreg, target
43    bgec    \rreg, \lreg, \target
44.endm
45.macro bgtc lreg, rreg, target
46    bltc    \rreg, \lreg, \target
47.endm
48
49/*
50Mterp and MIPS64 notes:
51
52The following registers have fixed assignments:
53
54  reg nick      purpose
55  s0  rPC       interpreted program counter, used for fetching instructions
56  s1  rFP       interpreted frame pointer, used for accessing locals and args
57  s2  rSELF     self (Thread) pointer
58  s3  rINST     first 16-bit code unit of current instruction
59  s4  rIBASE    interpreted instruction base pointer, used for computed goto
60  s5  rREFS     base of object references in shadow frame  (ideally, we'll get rid of this later).
61*/
62
63/* During bringup, we'll use the shadow frame model instead of rFP */
64/* single-purpose registers, given names for clarity */
65#define rPC     s0
66#define rFP     s1
67#define rSELF   s2
68#define rINST   s3
69#define rIBASE  s4
70#define rREFS   s5
71
72/*
73 * This is a #include, not a %include, because we want the C pre-processor
74 * to expand the macros into assembler assignment statements.
75 */
76#include "asm_support.h"
77
78/*
79 * Instead of holding a pointer to the shadow frame, we keep rFP at the base of the vregs.  So,
80 * to access other shadow frame fields, we need to use a backwards offset.  Define those here.
81 */
82#define OFF_FP(a) (a - SHADOWFRAME_VREGS_OFFSET)
83#define OFF_FP_NUMBER_OF_VREGS OFF_FP(SHADOWFRAME_NUMBER_OF_VREGS_OFFSET)
84#define OFF_FP_DEX_PC OFF_FP(SHADOWFRAME_DEX_PC_OFFSET)
85#define OFF_FP_LINK OFF_FP(SHADOWFRAME_LINK_OFFSET)
86#define OFF_FP_METHOD OFF_FP(SHADOWFRAME_METHOD_OFFSET)
87#define OFF_FP_RESULT_REGISTER OFF_FP(SHADOWFRAME_RESULT_REGISTER_OFFSET)
88#define OFF_FP_DEX_PC_PTR OFF_FP(SHADOWFRAME_DEX_PC_PTR_OFFSET)
89#define OFF_FP_CODE_ITEM OFF_FP(SHADOWFRAME_CODE_ITEM_OFFSET)
90#define OFF_FP_SHADOWFRAME (-SHADOWFRAME_VREGS_OFFSET)
91
92#define MTERP_PROFILE_BRANCHES 1
93#define MTERP_LOGGING 0
94
95/*
96 * "export" the PC to dex_pc field in the shadow frame, f/b/o future exception objects.  Must
97 * be done *before* something throws.
98 *
99 * It's okay to do this more than once.
100 *
101 * NOTE: the fast interpreter keeps track of dex pc as a direct pointer to the mapped
102 * dex byte codes.  However, the rest of the runtime expects dex pc to be an instruction
103 * offset into the code_items_[] array.  For effiency, we will "export" the
104 * current dex pc as a direct pointer using the EXPORT_PC macro, and rely on GetDexPC
105 * to convert to a dex pc when needed.
106 */
107.macro EXPORT_PC
108    sd      rPC, OFF_FP_DEX_PC_PTR(rFP)
109.endm
110
111/*
112 * Refresh handler table.
113 */
114.macro REFRESH_IBASE
115    ld      rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)
116.endm
117
118/*
119 * Fetch the next instruction from rPC into rINST.  Does not advance rPC.
120 */
121.macro FETCH_INST
122    lhu     rINST, 0(rPC)
123.endm
124
125/* Advance rPC by some number of code units. */
126.macro ADVANCE count
127    daddu   rPC, rPC, (\count) * 2
128.endm
129
130/*
131 * Fetch the next instruction from the specified offset.  Advances rPC
132 * to point to the next instruction.
133 *
134 * This must come AFTER anything that can throw an exception, or the
135 * exception catch may miss.  (This also implies that it must come after
136 * EXPORT_PC.)
137 */
138.macro FETCH_ADVANCE_INST count
139    ADVANCE \count
140    FETCH_INST
141.endm
142
143/*
144 * Similar to FETCH_ADVANCE_INST, but does not update rPC.  Used to load
145 * rINST ahead of possible exception point.  Be sure to manually advance rPC
146 * later.
147 */
148.macro PREFETCH_INST count
149    lhu     rINST, ((\count) * 2)(rPC)
150.endm
151
152/*
153 * Put the instruction's opcode field into the specified register.
154 */
155.macro GET_INST_OPCODE reg
156    and     \reg, rINST, 255
157.endm
158
159/*
160 * Begin executing the opcode in _reg.
161 */
162.macro GOTO_OPCODE reg
163    .set noat
164    sll     AT, \reg, 7
165    daddu   AT, rIBASE, AT
166    jic     AT, 0
167    .set at
168.endm
169
170/*
171 * Get/set the 32-bit value from a Dalvik register.
172 * Note, GET_VREG does sign extension to 64 bits while
173 * GET_VREG_U does zero extension to 64 bits.
174 * One is useful for arithmetic while the other is
175 * useful for storing the result value as 64-bit.
176 */
177.macro GET_VREG reg, vreg
178    .set noat
179    dlsa    AT, \vreg, rFP, 2
180    lw      \reg, 0(AT)
181    .set at
182.endm
183.macro GET_VREG_U reg, vreg
184    .set noat
185    dlsa    AT, \vreg, rFP, 2
186    lwu     \reg, 0(AT)
187    .set at
188.endm
189.macro GET_VREG_FLOAT reg, vreg
190    .set noat
191    dlsa    AT, \vreg, rFP, 2
192    lwc1    \reg, 0(AT)
193    .set at
194.endm
195.macro SET_VREG reg, vreg
196    .set noat
197    dlsa    AT, \vreg, rFP, 2
198    sw      \reg, 0(AT)
199    dlsa    AT, \vreg, rREFS, 2
200    sw      zero, 0(AT)
201    .set at
202.endm
203.macro SET_VREG_OBJECT reg, vreg
204    .set noat
205    dlsa    AT, \vreg, rFP, 2
206    sw      \reg, 0(AT)
207    dlsa    AT, \vreg, rREFS, 2
208    sw      \reg, 0(AT)
209    .set at
210.endm
211.macro SET_VREG_FLOAT reg, vreg
212    .set noat
213    dlsa    AT, \vreg, rFP, 2
214    swc1    \reg, 0(AT)
215    dlsa    AT, \vreg, rREFS, 2
216    sw      zero, 0(AT)
217    .set at
218.endm
219
220/*
221 * Get/set the 64-bit value from a Dalvik register.
222 * Avoid unaligned memory accesses.
223 * Note, SET_VREG_WIDE clobbers the register containing the value being stored.
224 * Note, SET_VREG_DOUBLE clobbers the register containing the Dalvik register number.
225 */
226.macro GET_VREG_WIDE reg, vreg
227    .set noat
228    dlsa    AT, \vreg, rFP, 2
229    lw      \reg, 0(AT)
230    lw      AT, 4(AT)
231    dinsu   \reg, AT, 32, 32
232    .set at
233.endm
234.macro GET_VREG_DOUBLE reg, vreg
235    .set noat
236    dlsa    AT, \vreg, rFP, 2
237    lwc1    \reg, 0(AT)
238    lw      AT, 4(AT)
239    mthc1   AT, \reg
240    .set at
241.endm
242.macro SET_VREG_WIDE reg, vreg
243    .set noat
244    dlsa    AT, \vreg, rFP, 2
245    sw      \reg, 0(AT)
246    drotr32 \reg, \reg, 0
247    sw      \reg, 4(AT)
248    dlsa    AT, \vreg, rREFS, 2
249    sw      zero, 0(AT)
250    sw      zero, 4(AT)
251    .set at
252.endm
253.macro SET_VREG_DOUBLE reg, vreg
254    .set noat
255    dlsa    AT, \vreg, rREFS, 2
256    sw      zero, 0(AT)
257    sw      zero, 4(AT)
258    dlsa    AT, \vreg, rFP, 2
259    swc1    \reg, 0(AT)
260    mfhc1   \vreg, \reg
261    sw      \vreg, 4(AT)
262    .set at
263.endm
264
265/*
266 * On-stack offsets for spilling/unspilling callee-saved registers
267 * and the frame size.
268 */
269#define STACK_OFFSET_RA 0
270#define STACK_OFFSET_GP 8
271#define STACK_OFFSET_S0 16
272#define STACK_OFFSET_S1 24
273#define STACK_OFFSET_S2 32
274#define STACK_OFFSET_S3 40
275#define STACK_OFFSET_S4 48
276#define STACK_OFFSET_S5 56
277#define STACK_SIZE      64
278
279/* Constants for float/double_to_int/long conversions */
280#define INT_MIN             0x80000000
281#define INT_MIN_AS_FLOAT    0xCF000000
282#define INT_MIN_AS_DOUBLE   0xC1E0000000000000
283#define LONG_MIN            0x8000000000000000
284#define LONG_MIN_AS_FLOAT   0xDF000000
285#define LONG_MIN_AS_DOUBLE  0xC3E0000000000000
286
287/* File: mips64/entry.S */
288/*
289 * Copyright (C) 2016 The Android Open Source Project
290 *
291 * Licensed under the Apache License, Version 2.0 (the "License");
292 * you may not use this file except in compliance with the License.
293 * You may obtain a copy of the License at
294 *
295 *      http://www.apache.org/licenses/LICENSE-2.0
296 *
297 * Unless required by applicable law or agreed to in writing, software
298 * distributed under the License is distributed on an "AS IS" BASIS,
299 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
300 * See the License for the specific language governing permissions and
301 * limitations under the License.
302 */
303
304/*
305 * Interpreter entry point.
306 */
307
308    .set    reorder
309
310    .text
311    .global ExecuteMterpImpl
312    .type   ExecuteMterpImpl, %function
313    .balign 16
314/*
315 * On entry:
316 *  a0  Thread* self
317 *  a1  code_item
318 *  a2  ShadowFrame
319 *  a3  JValue* result_register
320 *
321 */
322ExecuteMterpImpl:
323    .cfi_startproc
324    .cpsetup t9, t8, ExecuteMterpImpl
325
326    .cfi_def_cfa sp, 0
327    daddu   sp, sp, -STACK_SIZE
328    .cfi_adjust_cfa_offset STACK_SIZE
329
330    sd      t8, STACK_OFFSET_GP(sp)
331    .cfi_rel_offset 28, STACK_OFFSET_GP
332    sd      ra, STACK_OFFSET_RA(sp)
333    .cfi_rel_offset 31, STACK_OFFSET_RA
334
335    sd      s0, STACK_OFFSET_S0(sp)
336    .cfi_rel_offset 16, STACK_OFFSET_S0
337    sd      s1, STACK_OFFSET_S1(sp)
338    .cfi_rel_offset 17, STACK_OFFSET_S1
339    sd      s2, STACK_OFFSET_S2(sp)
340    .cfi_rel_offset 18, STACK_OFFSET_S2
341    sd      s3, STACK_OFFSET_S3(sp)
342    .cfi_rel_offset 19, STACK_OFFSET_S3
343    sd      s4, STACK_OFFSET_S4(sp)
344    .cfi_rel_offset 20, STACK_OFFSET_S4
345    sd      s5, STACK_OFFSET_S5(sp)
346    .cfi_rel_offset 21, STACK_OFFSET_S5
347
348    /* Remember the return register */
349    sd      a3, SHADOWFRAME_RESULT_REGISTER_OFFSET(a2)
350
351    /* Remember the code_item */
352    sd      a1, SHADOWFRAME_CODE_ITEM_OFFSET(a2)
353
354    /* set up "named" registers */
355    move    rSELF, a0
356    daddu   rFP, a2, SHADOWFRAME_VREGS_OFFSET
357    lw      v0, SHADOWFRAME_NUMBER_OF_VREGS_OFFSET(a2)
358    dlsa    rREFS, v0, rFP, 2
359    daddu   rPC, a1, CODEITEM_INSNS_OFFSET
360    lw      v0, SHADOWFRAME_DEX_PC_OFFSET(a2)
361    dlsa    rPC, v0, rPC, 1
362    EXPORT_PC
363
364    /* Starting ibase */
365    REFRESH_IBASE
366
367    /* start executing the instruction at rPC */
368    FETCH_INST
369    GET_INST_OPCODE v0
370    GOTO_OPCODE v0
371
372    /* NOTE: no fallthrough */
373
374
375    .global artMterpAsmInstructionStart
376    .type   artMterpAsmInstructionStart, %function
377artMterpAsmInstructionStart = .L_op_nop
378    .text
379
380/* ------------------------------ */
381    .balign 128
382.L_op_nop: /* 0x00 */
383/* File: mips64/op_nop.S */
384    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
385    GET_INST_OPCODE v0                  # extract opcode from rINST
386    GOTO_OPCODE v0                      # jump to next instruction
387
388/* ------------------------------ */
389    .balign 128
390.L_op_move: /* 0x01 */
391/* File: mips64/op_move.S */
392    /* for move, move-object, long-to-int */
393    /* op vA, vB */
394    ext     a2, rINST, 8, 4             # a2 <- A
395    ext     a3, rINST, 12, 4            # a3 <- B
396    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
397    GET_VREG a0, a3                     # a0 <- vB
398    GET_INST_OPCODE v0                  # extract opcode from rINST
399    .if 0
400    SET_VREG_OBJECT a0, a2              # vA <- vB
401    .else
402    SET_VREG a0, a2                     # vA <- vB
403    .endif
404    GOTO_OPCODE v0                      # jump to next instruction
405
406/* ------------------------------ */
407    .balign 128
408.L_op_move_from16: /* 0x02 */
409/* File: mips64/op_move_from16.S */
410    /* for: move/from16, move-object/from16 */
411    /* op vAA, vBBBB */
412    lhu     a3, 2(rPC)                  # a3 <- BBBB
413    srl     a2, rINST, 8                # a2 <- AA
414    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
415    GET_VREG a0, a3                     # a0 <- vBBBB
416    GET_INST_OPCODE v0                  # extract opcode from rINST
417    .if 0
418    SET_VREG_OBJECT a0, a2              # vAA <- vBBBB
419    .else
420    SET_VREG a0, a2                     # vAA <- vBBBB
421    .endif
422    GOTO_OPCODE v0                      # jump to next instruction
423
424/* ------------------------------ */
425    .balign 128
426.L_op_move_16: /* 0x03 */
427/* File: mips64/op_move_16.S */
428    /* for: move/16, move-object/16 */
429    /* op vAAAA, vBBBB */
430    lhu     a3, 4(rPC)                  # a3 <- BBBB
431    lhu     a2, 2(rPC)                  # a2 <- AAAA
432    FETCH_ADVANCE_INST 3                # advance rPC, load rINST
433    GET_VREG a0, a3                     # a0 <- vBBBB
434    GET_INST_OPCODE v0                  # extract opcode from rINST
435    .if 0
436    SET_VREG_OBJECT a0, a2              # vAAAA <- vBBBB
437    .else
438    SET_VREG a0, a2                     # vAAAA <- vBBBB
439    .endif
440    GOTO_OPCODE v0                      # jump to next instruction
441
442/* ------------------------------ */
443    .balign 128
444.L_op_move_wide: /* 0x04 */
445/* File: mips64/op_move_wide.S */
446    /* move-wide vA, vB */
447    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
448    ext     a3, rINST, 12, 4            # a3 <- B
449    ext     a2, rINST, 8, 4             # a2 <- A
450    GET_VREG_WIDE a0, a3                # a0 <- vB
451    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
452    GET_INST_OPCODE v0                  # extract opcode from rINST
453    SET_VREG_WIDE a0, a2                # vA <- vB
454    GOTO_OPCODE v0                      # jump to next instruction
455
456/* ------------------------------ */
457    .balign 128
458.L_op_move_wide_from16: /* 0x05 */
459/* File: mips64/op_move_wide_from16.S */
460    /* move-wide/from16 vAA, vBBBB */
461    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
462    lhu     a3, 2(rPC)                  # a3 <- BBBB
463    srl     a2, rINST, 8                # a2 <- AA
464    GET_VREG_WIDE a0, a3                # a0 <- vBBBB
465    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
466    GET_INST_OPCODE v0                  # extract opcode from rINST
467    SET_VREG_WIDE a0, a2                # vAA <- vBBBB
468    GOTO_OPCODE v0                      # jump to next instruction
469
470/* ------------------------------ */
471    .balign 128
472.L_op_move_wide_16: /* 0x06 */
473/* File: mips64/op_move_wide_16.S */
474    /* move-wide/16 vAAAA, vBBBB */
475    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
476    lhu     a3, 4(rPC)                  # a3 <- BBBB
477    lhu     a2, 2(rPC)                  # a2 <- AAAA
478    GET_VREG_WIDE a0, a3                # a0 <- vBBBB
479    FETCH_ADVANCE_INST 3                # advance rPC, load rINST
480    GET_INST_OPCODE v0                  # extract opcode from rINST
481    SET_VREG_WIDE a0, a2                # vAAAA <- vBBBB
482    GOTO_OPCODE v0                      # jump to next instruction
483
484/* ------------------------------ */
485    .balign 128
486.L_op_move_object: /* 0x07 */
487/* File: mips64/op_move_object.S */
488/* File: mips64/op_move.S */
489    /* for move, move-object, long-to-int */
490    /* op vA, vB */
491    ext     a2, rINST, 8, 4             # a2 <- A
492    ext     a3, rINST, 12, 4            # a3 <- B
493    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
494    GET_VREG a0, a3                     # a0 <- vB
495    GET_INST_OPCODE v0                  # extract opcode from rINST
496    .if 1
497    SET_VREG_OBJECT a0, a2              # vA <- vB
498    .else
499    SET_VREG a0, a2                     # vA <- vB
500    .endif
501    GOTO_OPCODE v0                      # jump to next instruction
502
503
504/* ------------------------------ */
505    .balign 128
506.L_op_move_object_from16: /* 0x08 */
507/* File: mips64/op_move_object_from16.S */
508/* File: mips64/op_move_from16.S */
509    /* for: move/from16, move-object/from16 */
510    /* op vAA, vBBBB */
511    lhu     a3, 2(rPC)                  # a3 <- BBBB
512    srl     a2, rINST, 8                # a2 <- AA
513    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
514    GET_VREG a0, a3                     # a0 <- vBBBB
515    GET_INST_OPCODE v0                  # extract opcode from rINST
516    .if 1
517    SET_VREG_OBJECT a0, a2              # vAA <- vBBBB
518    .else
519    SET_VREG a0, a2                     # vAA <- vBBBB
520    .endif
521    GOTO_OPCODE v0                      # jump to next instruction
522
523
524/* ------------------------------ */
525    .balign 128
526.L_op_move_object_16: /* 0x09 */
527/* File: mips64/op_move_object_16.S */
528/* File: mips64/op_move_16.S */
529    /* for: move/16, move-object/16 */
530    /* op vAAAA, vBBBB */
531    lhu     a3, 4(rPC)                  # a3 <- BBBB
532    lhu     a2, 2(rPC)                  # a2 <- AAAA
533    FETCH_ADVANCE_INST 3                # advance rPC, load rINST
534    GET_VREG a0, a3                     # a0 <- vBBBB
535    GET_INST_OPCODE v0                  # extract opcode from rINST
536    .if 1
537    SET_VREG_OBJECT a0, a2              # vAAAA <- vBBBB
538    .else
539    SET_VREG a0, a2                     # vAAAA <- vBBBB
540    .endif
541    GOTO_OPCODE v0                      # jump to next instruction
542
543
544/* ------------------------------ */
545    .balign 128
546.L_op_move_result: /* 0x0a */
547/* File: mips64/op_move_result.S */
548    /* for: move-result, move-result-object */
549    /* op vAA */
550    srl     a2, rINST, 8                # a2 <- AA
551    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
552    ld      a0, OFF_FP_RESULT_REGISTER(rFP)  # get pointer to result JType
553    lw      a0, 0(a0)                   # a0 <- result.i
554    GET_INST_OPCODE v0                  # extract opcode from rINST
555    .if 0
556    SET_VREG_OBJECT a0, a2              # vAA <- result
557    .else
558    SET_VREG a0, a2                     # vAA <- result
559    .endif
560    GOTO_OPCODE v0                      # jump to next instruction
561
562/* ------------------------------ */
563    .balign 128
564.L_op_move_result_wide: /* 0x0b */
565/* File: mips64/op_move_result_wide.S */
566    /* for: move-result-wide */
567    /* op vAA */
568    srl     a2, rINST, 8                # a2 <- AA
569    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
570    ld      a0, OFF_FP_RESULT_REGISTER(rFP)  # get pointer to result JType
571    ld      a0, 0(a0)                   # a0 <- result.j
572    GET_INST_OPCODE v0                  # extract opcode from rINST
573    SET_VREG_WIDE a0, a2                # vAA <- result
574    GOTO_OPCODE v0                      # jump to next instruction
575
576/* ------------------------------ */
577    .balign 128
578.L_op_move_result_object: /* 0x0c */
579/* File: mips64/op_move_result_object.S */
580/* File: mips64/op_move_result.S */
581    /* for: move-result, move-result-object */
582    /* op vAA */
583    srl     a2, rINST, 8                # a2 <- AA
584    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
585    ld      a0, OFF_FP_RESULT_REGISTER(rFP)  # get pointer to result JType
586    lw      a0, 0(a0)                   # a0 <- result.i
587    GET_INST_OPCODE v0                  # extract opcode from rINST
588    .if 1
589    SET_VREG_OBJECT a0, a2              # vAA <- result
590    .else
591    SET_VREG a0, a2                     # vAA <- result
592    .endif
593    GOTO_OPCODE v0                      # jump to next instruction
594
595
596/* ------------------------------ */
597    .balign 128
598.L_op_move_exception: /* 0x0d */
599/* File: mips64/op_move_exception.S */
600    /* move-exception vAA */
601    srl     a2, rINST, 8                # a2 <- AA
602    ld      a0, THREAD_EXCEPTION_OFFSET(rSELF)  # load exception obj
603    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
604    SET_VREG_OBJECT a0, a2              # vAA <- exception obj
605    GET_INST_OPCODE v0                  # extract opcode from rINST
606    sd      zero, THREAD_EXCEPTION_OFFSET(rSELF)  # clear exception
607    GOTO_OPCODE v0                      # jump to next instruction
608
609/* ------------------------------ */
610    .balign 128
611.L_op_return_void: /* 0x0e */
612/* File: mips64/op_return_void.S */
613    .extern MterpThreadFenceForConstructor
614    .extern MterpSuspendCheck
615    jal     MterpThreadFenceForConstructor
616    lw      ra, THREAD_FLAGS_OFFSET(rSELF)
617    move    a0, rSELF
618    and     ra, ra, (THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
619    beqzc   ra, 1f
620    jal     MterpSuspendCheck           # (self)
6211:
622    li      a0, 0
623    b       MterpReturn
624
625/* ------------------------------ */
626    .balign 128
627.L_op_return: /* 0x0f */
628/* File: mips64/op_return.S */
629    /*
630     * Return a 32-bit value.
631     *
632     * for: return, return-object
633     */
634    /* op vAA */
635    .extern MterpThreadFenceForConstructor
636    .extern MterpSuspendCheck
637    jal     MterpThreadFenceForConstructor
638    lw      ra, THREAD_FLAGS_OFFSET(rSELF)
639    move    a0, rSELF
640    and     ra, ra, (THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
641    beqzc   ra, 1f
642    jal     MterpSuspendCheck           # (self)
6431:
644    srl     a2, rINST, 8                # a2 <- AA
645    GET_VREG_U a0, a2                   # a0 <- vAA
646    b       MterpReturn
647
648/* ------------------------------ */
649    .balign 128
650.L_op_return_wide: /* 0x10 */
651/* File: mips64/op_return_wide.S */
652    /*
653     * Return a 64-bit value.
654     */
655    /* return-wide vAA */
656    /* op vAA */
657    .extern MterpThreadFenceForConstructor
658    .extern MterpSuspendCheck
659    jal     MterpThreadFenceForConstructor
660    lw      ra, THREAD_FLAGS_OFFSET(rSELF)
661    move    a0, rSELF
662    and     ra, ra, (THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
663    beqzc   ra, 1f
664    jal     MterpSuspendCheck           # (self)
6651:
666    srl     a2, rINST, 8                # a2 <- AA
667    GET_VREG_WIDE a0, a2                # a0 <- vAA
668    b       MterpReturn
669
670/* ------------------------------ */
671    .balign 128
672.L_op_return_object: /* 0x11 */
673/* File: mips64/op_return_object.S */
674/* File: mips64/op_return.S */
675    /*
676     * Return a 32-bit value.
677     *
678     * for: return, return-object
679     */
680    /* op vAA */
681    .extern MterpThreadFenceForConstructor
682    .extern MterpSuspendCheck
683    jal     MterpThreadFenceForConstructor
684    lw      ra, THREAD_FLAGS_OFFSET(rSELF)
685    move    a0, rSELF
686    and     ra, ra, (THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
687    beqzc   ra, 1f
688    jal     MterpSuspendCheck           # (self)
6891:
690    srl     a2, rINST, 8                # a2 <- AA
691    GET_VREG_U a0, a2                   # a0 <- vAA
692    b       MterpReturn
693
694
695/* ------------------------------ */
696    .balign 128
697.L_op_const_4: /* 0x12 */
698/* File: mips64/op_const_4.S */
699    /* const/4 vA, #+B */
700    ext     a2, rINST, 8, 4             # a2 <- A
701    seh     a0, rINST                   # sign extend B in rINST
702    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
703    sra     a0, a0, 12                  # shift B into its final position
704    GET_INST_OPCODE v0                  # extract opcode from rINST
705    SET_VREG a0, a2                     # vA <- +B
706    GOTO_OPCODE v0                      # jump to next instruction
707
708/* ------------------------------ */
709    .balign 128
710.L_op_const_16: /* 0x13 */
711/* File: mips64/op_const_16.S */
712    /* const/16 vAA, #+BBBB */
713    srl     a2, rINST, 8                # a2 <- AA
714    lh      a0, 2(rPC)                  # a0 <- sign-extended BBBB
715    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
716    GET_INST_OPCODE v0                  # extract opcode from rINST
717    SET_VREG a0, a2                     # vAA <- +BBBB
718    GOTO_OPCODE v0                      # jump to next instruction
719
720/* ------------------------------ */
721    .balign 128
722.L_op_const: /* 0x14 */
723/* File: mips64/op_const.S */
724    /* const vAA, #+BBBBbbbb */
725    srl     a2, rINST, 8                # a2 <- AA
726    lh      a0, 2(rPC)                  # a0 <- bbbb (low)
727    lh      a1, 4(rPC)                  # a1 <- BBBB (high)
728    FETCH_ADVANCE_INST 3                # advance rPC, load rINST
729    ins     a0, a1, 16, 16              # a0 = BBBBbbbb
730    GET_INST_OPCODE v0                  # extract opcode from rINST
731    SET_VREG a0, a2                     # vAA <- +BBBBbbbb
732    GOTO_OPCODE v0                      # jump to next instruction
733
734/* ------------------------------ */
735    .balign 128
736.L_op_const_high16: /* 0x15 */
737/* File: mips64/op_const_high16.S */
738    /* const/high16 vAA, #+BBBB0000 */
739    srl     a2, rINST, 8                # a2 <- AA
740    lh      a0, 2(rPC)                  # a0 <- BBBB
741    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
742    sll     a0, a0, 16                  # a0 <- BBBB0000
743    GET_INST_OPCODE v0                  # extract opcode from rINST
744    SET_VREG a0, a2                     # vAA <- +BBBB0000
745    GOTO_OPCODE v0                      # jump to next instruction
746
747/* ------------------------------ */
748    .balign 128
749.L_op_const_wide_16: /* 0x16 */
750/* File: mips64/op_const_wide_16.S */
751    /* const-wide/16 vAA, #+BBBB */
752    srl     a2, rINST, 8                # a2 <- AA
753    lh      a0, 2(rPC)                  # a0 <- sign-extended BBBB
754    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
755    GET_INST_OPCODE v0                  # extract opcode from rINST
756    SET_VREG_WIDE a0, a2                # vAA <- +BBBB
757    GOTO_OPCODE v0                      # jump to next instruction
758
759/* ------------------------------ */
760    .balign 128
761.L_op_const_wide_32: /* 0x17 */
762/* File: mips64/op_const_wide_32.S */
763    /* const-wide/32 vAA, #+BBBBbbbb */
764    srl     a2, rINST, 8                # a2 <- AA
765    lh      a0, 2(rPC)                  # a0 <- bbbb (low)
766    lh      a1, 4(rPC)                  # a1 <- BBBB (high)
767    FETCH_ADVANCE_INST 3                # advance rPC, load rINST
768    ins     a0, a1, 16, 16              # a0 = BBBBbbbb
769    GET_INST_OPCODE v0                  # extract opcode from rINST
770    SET_VREG_WIDE a0, a2                # vAA <- +BBBBbbbb
771    GOTO_OPCODE v0                      # jump to next instruction
772
773/* ------------------------------ */
774    .balign 128
775.L_op_const_wide: /* 0x18 */
776/* File: mips64/op_const_wide.S */
777    /* const-wide vAA, #+HHHHhhhhBBBBbbbb */
778    srl     a4, rINST, 8                # a4 <- AA
779    lh      a0, 2(rPC)                  # a0 <- bbbb (low)
780    lh      a1, 4(rPC)                  # a1 <- BBBB (low middle)
781    lh      a2, 6(rPC)                  # a2 <- hhhh (high middle)
782    lh      a3, 8(rPC)                  # a3 <- HHHH (high)
783    FETCH_ADVANCE_INST 5                # advance rPC, load rINST
784    ins     a0, a1, 16, 16              # a0 = BBBBbbbb
785    ins     a2, a3, 16, 16              # a2 = HHHHhhhh
786    dinsu   a0, a2, 32, 32              # a0 = HHHHhhhhBBBBbbbb
787    GET_INST_OPCODE v0                  # extract opcode from rINST
788    SET_VREG_WIDE a0, a4                # vAA <- +HHHHhhhhBBBBbbbb
789    GOTO_OPCODE v0                      # jump to next instruction
790
791/* ------------------------------ */
792    .balign 128
793.L_op_const_wide_high16: /* 0x19 */
794/* File: mips64/op_const_wide_high16.S */
795    /* const-wide/high16 vAA, #+BBBB000000000000 */
796    srl     a2, rINST, 8                # a2 <- AA
797    lh      a0, 2(rPC)                  # a0 <- BBBB
798    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
799    dsll32  a0, a0, 16                  # a0 <- BBBB000000000000
800    GET_INST_OPCODE v0                  # extract opcode from rINST
801    SET_VREG_WIDE a0, a2                # vAA <- +BBBB000000000000
802    GOTO_OPCODE v0                      # jump to next instruction
803
804/* ------------------------------ */
805    .balign 128
806.L_op_const_string: /* 0x1a */
807/* File: mips64/op_const_string.S */
808    /* const/string vAA, String//BBBB */
809    .extern MterpConstString
810    EXPORT_PC
811    lhu     a0, 2(rPC)                  # a0 <- BBBB
812    srl     a1, rINST, 8                # a1 <- AA
813    daddu   a2, rFP, OFF_FP_SHADOWFRAME
814    move    a3, rSELF
815    jal     MterpConstString            # (index, tgt_reg, shadow_frame, self)
816    PREFETCH_INST 2                     # load rINST
817    bnez    v0, MterpPossibleException  # let reference interpreter deal with it.
818    ADVANCE 2                           # advance rPC
819    GET_INST_OPCODE v0                  # extract opcode from rINST
820    GOTO_OPCODE v0                      # jump to next instruction
821
822/* ------------------------------ */
823    .balign 128
824.L_op_const_string_jumbo: /* 0x1b */
825/* File: mips64/op_const_string_jumbo.S */
826    /* const/string vAA, String//BBBBBBBB */
827    .extern MterpConstString
828    EXPORT_PC
829    lh      a0, 2(rPC)                  # a0 <- bbbb (low)
830    lh      a4, 4(rPC)                  # a4 <- BBBB (high)
831    srl     a1, rINST, 8                # a1 <- AA
832    ins     a0, a4, 16, 16              # a0 <- BBBBbbbb
833    daddu   a2, rFP, OFF_FP_SHADOWFRAME
834    move    a3, rSELF
835    jal     MterpConstString            # (index, tgt_reg, shadow_frame, self)
836    PREFETCH_INST 3                     # load rINST
837    bnez    v0, MterpPossibleException  # let reference interpreter deal with it.
838    ADVANCE 3                           # advance rPC
839    GET_INST_OPCODE v0                  # extract opcode from rINST
840    GOTO_OPCODE v0                      # jump to next instruction
841
842/* ------------------------------ */
843    .balign 128
844.L_op_const_class: /* 0x1c */
845/* File: mips64/op_const_class.S */
846    /* const/class vAA, Class//BBBB */
847    .extern MterpConstClass
848    EXPORT_PC
849    lhu     a0, 2(rPC)                  # a0 <- BBBB
850    srl     a1, rINST, 8                # a1 <- AA
851    daddu   a2, rFP, OFF_FP_SHADOWFRAME
852    move    a3, rSELF
853    jal     MterpConstClass             # (index, tgt_reg, shadow_frame, self)
854    PREFETCH_INST 2                     # load rINST
855    bnez    v0, MterpPossibleException  # let reference interpreter deal with it.
856    ADVANCE 2                           # advance rPC
857    GET_INST_OPCODE v0                  # extract opcode from rINST
858    GOTO_OPCODE v0                      # jump to next instruction
859
860/* ------------------------------ */
861    .balign 128
862.L_op_monitor_enter: /* 0x1d */
863/* File: mips64/op_monitor_enter.S */
864    /*
865     * Synchronize on an object.
866     */
867    /* monitor-enter vAA */
868    .extern artLockObjectFromCode
869    EXPORT_PC
870    srl     a2, rINST, 8                # a2 <- AA
871    GET_VREG_U a0, a2                   # a0 <- vAA (object)
872    move    a1, rSELF                   # a1 <- self
873    jal     artLockObjectFromCode
874    bnezc   v0, MterpException
875    FETCH_ADVANCE_INST 1
876    GET_INST_OPCODE v0                  # extract opcode from rINST
877    GOTO_OPCODE v0                      # jump to next instruction
878
879/* ------------------------------ */
880    .balign 128
881.L_op_monitor_exit: /* 0x1e */
882/* File: mips64/op_monitor_exit.S */
883    /*
884     * Unlock an object.
885     *
886     * Exceptions that occur when unlocking a monitor need to appear as
887     * if they happened at the following instruction.  See the Dalvik
888     * instruction spec.
889     */
890    /* monitor-exit vAA */
891    .extern artUnlockObjectFromCode
892    EXPORT_PC
893    srl     a2, rINST, 8                # a2 <- AA
894    GET_VREG_U a0, a2                   # a0 <- vAA (object)
895    move    a1, rSELF                   # a1 <- self
896    jal     artUnlockObjectFromCode     # v0 <- success for unlock(self, obj)
897    bnezc   v0, MterpException
898    FETCH_ADVANCE_INST 1                # before throw: advance rPC, load rINST
899    GET_INST_OPCODE v0                  # extract opcode from rINST
900    GOTO_OPCODE v0                      # jump to next instruction
901
902/* ------------------------------ */
903    .balign 128
904.L_op_check_cast: /* 0x1f */
905/* File: mips64/op_check_cast.S */
906    /*
907     * Check to see if a cast from one class to another is allowed.
908     */
909    /* check-cast vAA, class//BBBB */
910    .extern MterpCheckCast
911    EXPORT_PC
912    lhu     a0, 2(rPC)                  # a0 <- BBBB
913    srl     a1, rINST, 8                # a1 <- AA
914    dlsa    a1, a1, rFP, 2              # a1 <- &object
915    ld      a2, OFF_FP_METHOD(rFP)      # a2 <- method
916    move    a3, rSELF                   # a3 <- self
917    jal     MterpCheckCast              # (index, &obj, method, self)
918    PREFETCH_INST 2
919    bnez    v0, MterpPossibleException
920    ADVANCE 2
921    GET_INST_OPCODE v0                  # extract opcode from rINST
922    GOTO_OPCODE v0                      # jump to next instruction
923
924/* ------------------------------ */
925    .balign 128
926.L_op_instance_of: /* 0x20 */
927/* File: mips64/op_instance_of.S */
928    /*
929     * Check to see if an object reference is an instance of a class.
930     *
931     * Most common situation is a non-null object, being compared against
932     * an already-resolved class.
933     */
934    /* instance-of vA, vB, class//CCCC */
935    .extern MterpInstanceOf
936    EXPORT_PC
937    lhu     a0, 2(rPC)                  # a0 <- CCCC
938    srl     a1, rINST, 12               # a1 <- B
939    dlsa    a1, a1, rFP, 2              # a1 <- &object
940    ld      a2, OFF_FP_METHOD(rFP)      # a2 <- method
941    move    a3, rSELF                   # a3 <- self
942    jal     MterpInstanceOf             # (index, &obj, method, self)
943    ld      a1, THREAD_EXCEPTION_OFFSET(rSELF)
944    ext     a2, rINST, 8, 4             # a2 <- A
945    PREFETCH_INST 2
946    bnez    a1, MterpException
947    ADVANCE 2                           # advance rPC
948    SET_VREG v0, a2                     # vA <- v0
949    GET_INST_OPCODE v0                  # extract opcode from rINST
950    GOTO_OPCODE v0                      # jump to next instruction
951
952/* ------------------------------ */
953    .balign 128
954.L_op_array_length: /* 0x21 */
955/* File: mips64/op_array_length.S */
956    /*
957     * Return the length of an array.
958     */
959    srl     a1, rINST, 12               # a1 <- B
960    GET_VREG_U a0, a1                   # a0 <- vB (object ref)
961    ext     a2, rINST, 8, 4             # a2 <- A
962    beqz    a0, common_errNullObject    # yup, fail
963    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
964    lw      a3, MIRROR_ARRAY_LENGTH_OFFSET(a0)  # a3 <- array length
965    GET_INST_OPCODE v0                  # extract opcode from rINST
966    SET_VREG a3, a2                     # vB <- length
967    GOTO_OPCODE v0                      # jump to next instruction
968
969/* ------------------------------ */
970    .balign 128
971.L_op_new_instance: /* 0x22 */
972/* File: mips64/op_new_instance.S */
973    /*
974     * Create a new instance of a class.
975     */
976    /* new-instance vAA, class//BBBB */
977    .extern MterpNewInstance
978    EXPORT_PC
979    daddu   a0, rFP, OFF_FP_SHADOWFRAME
980    move    a1, rSELF
981    move    a2, rINST
982    jal     MterpNewInstance            # (shadow_frame, self, inst_data)
983    beqzc   v0, MterpPossibleException
984    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
985    GET_INST_OPCODE v0                  # extract opcode from rINST
986    GOTO_OPCODE v0                      # jump to next instruction
987
988/* ------------------------------ */
989    .balign 128
990.L_op_new_array: /* 0x23 */
991/* File: mips64/op_new_array.S */
992    /*
993     * Allocate an array of objects, specified with the array class
994     * and a count.
995     *
996     * The verifier guarantees that this is an array class, so we don't
997     * check for it here.
998     */
999    /* new-array vA, vB, class//CCCC */
1000    .extern MterpNewArray
1001    EXPORT_PC
1002    daddu   a0, rFP, OFF_FP_SHADOWFRAME
1003    move    a1, rPC
1004    move    a2, rINST
1005    move    a3, rSELF
1006    jal     MterpNewArray
1007    beqzc   v0, MterpPossibleException
1008    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
1009    GET_INST_OPCODE v0                  # extract opcode from rINST
1010    GOTO_OPCODE v0                      # jump to next instruction
1011
1012/* ------------------------------ */
1013    .balign 128
1014.L_op_filled_new_array: /* 0x24 */
1015/* File: mips64/op_filled_new_array.S */
1016    /*
1017     * Create a new array with elements filled from registers.
1018     *
1019     * for: filled-new-array, filled-new-array/range
1020     */
1021    /* op vB, {vD, vE, vF, vG, vA}, class//CCCC */
1022    /* op {vCCCC..v(CCCC+AA-1)}, type//BBBB */
1023    .extern MterpFilledNewArray
1024    EXPORT_PC
1025    daddu   a0, rFP, OFF_FP_SHADOWFRAME
1026    move    a1, rPC
1027    move    a2, rSELF
1028    jal     MterpFilledNewArray
1029    beqzc   v0, MterpPossibleException
1030    FETCH_ADVANCE_INST 3                # advance rPC, load rINST
1031    GET_INST_OPCODE v0                  # extract opcode from rINST
1032    GOTO_OPCODE v0                      # jump to next instruction
1033
1034/* ------------------------------ */
1035    .balign 128
1036.L_op_filled_new_array_range: /* 0x25 */
1037/* File: mips64/op_filled_new_array_range.S */
1038/* File: mips64/op_filled_new_array.S */
1039    /*
1040     * Create a new array with elements filled from registers.
1041     *
1042     * for: filled-new-array, filled-new-array/range
1043     */
1044    /* op vB, {vD, vE, vF, vG, vA}, class//CCCC */
1045    /* op {vCCCC..v(CCCC+AA-1)}, type//BBBB */
1046    .extern MterpFilledNewArrayRange
1047    EXPORT_PC
1048    daddu   a0, rFP, OFF_FP_SHADOWFRAME
1049    move    a1, rPC
1050    move    a2, rSELF
1051    jal     MterpFilledNewArrayRange
1052    beqzc   v0, MterpPossibleException
1053    FETCH_ADVANCE_INST 3                # advance rPC, load rINST
1054    GET_INST_OPCODE v0                  # extract opcode from rINST
1055    GOTO_OPCODE v0                      # jump to next instruction
1056
1057
1058/* ------------------------------ */
1059    .balign 128
1060.L_op_fill_array_data: /* 0x26 */
1061/* File: mips64/op_fill_array_data.S */
1062    /* fill-array-data vAA, +BBBBBBBB */
1063    .extern MterpFillArrayData
1064    EXPORT_PC
1065    lh      a1, 2(rPC)                  # a1 <- bbbb (lo)
1066    lh      a0, 4(rPC)                  # a0 <- BBBB (hi)
1067    srl     a3, rINST, 8                # a3 <- AA
1068    ins     a1, a0, 16, 16              # a1 <- BBBBbbbb
1069    GET_VREG_U a0, a3                   # a0 <- vAA (array object)
1070    dlsa    a1, a1, rPC, 1              # a1 <- PC + BBBBbbbb*2 (array data off.)
1071    jal     MterpFillArrayData          # (obj, payload)
1072    beqzc   v0, MterpPossibleException  # exception?
1073    FETCH_ADVANCE_INST 3                # advance rPC, load rINST
1074    GET_INST_OPCODE v0                  # extract opcode from rINST
1075    GOTO_OPCODE v0                      # jump to next instruction
1076
1077/* ------------------------------ */
1078    .balign 128
1079.L_op_throw: /* 0x27 */
1080/* File: mips64/op_throw.S */
1081    /*
1082     * Throw an exception object in the current thread.
1083     */
1084    /* throw vAA */
1085    EXPORT_PC
1086    srl     a2, rINST, 8                # a2 <- AA
1087    GET_VREG_U a0, a2                   # a0 <- vAA (exception object)
1088    beqzc   a0, common_errNullObject
1089    sd      a0, THREAD_EXCEPTION_OFFSET(rSELF)  # thread->exception <- obj
1090    b       MterpException
1091
1092/* ------------------------------ */
1093    .balign 128
1094.L_op_goto: /* 0x28 */
1095/* File: mips64/op_goto.S */
1096    /*
1097     * Unconditional branch, 8-bit offset.
1098     *
1099     * The branch distance is a signed code-unit offset, which we need to
1100     * double to get a byte offset.
1101     */
1102    /* goto +AA */
1103    .extern MterpProfileBranch
1104    srl     rINST, rINST, 8
1105    seb     rINST, rINST                # rINST <- offset (sign-extended AA)
1106#if MTERP_PROFILE_BRANCHES
1107    EXPORT_PC
1108    move    a0, rSELF
1109    daddu   a1, rFP, OFF_FP_SHADOWFRAME
1110    move    a2, rINST
1111    jal     MterpProfileBranch          # (self, shadow_frame, offset)
1112    bnezc   v0, MterpOnStackReplacement # Note: offset must be in rINST
1113#endif
1114    dlsa    rPC, rINST, rPC, 1          # rPC <- rPC + offset * 2
1115    lw      ra, THREAD_FLAGS_OFFSET(rSELF)  # Preload flags for MterpCheckSuspendAndContinue
1116    move    a0, rINST                   # a0 <- offset
1117    FETCH_INST                          # load rINST
1118    bltz    a0, MterpCheckSuspendAndContinue  # suspend check if backwards branch
1119    GET_INST_OPCODE v0                  # extract opcode from rINST
1120    GOTO_OPCODE v0                      # jump to next instruction
1121
1122/* ------------------------------ */
1123    .balign 128
1124.L_op_goto_16: /* 0x29 */
1125/* File: mips64/op_goto_16.S */
1126    /*
1127     * Unconditional branch, 16-bit offset.
1128     *
1129     * The branch distance is a signed code-unit offset, which we need to
1130     * double to get a byte offset.
1131     */
1132    /* goto/16 +AAAA */
1133    .extern MterpProfileBranch
1134    lh      rINST, 2(rPC)               # rINST <- offset (sign-extended AAAA)
1135#if MTERP_PROFILE_BRANCHES
1136    EXPORT_PC
1137    move    a0, rSELF
1138    daddu   a1, rFP, OFF_FP_SHADOWFRAME
1139    move    a2, rINST
1140    jal     MterpProfileBranch          # (self, shadow_frame, offset)
1141    bnezc   v0, MterpOnStackReplacement # Note: offset must be in rINST
1142#endif
1143    dlsa    rPC, rINST, rPC, 1          # rPC <- rPC + offset * 2
1144    lw      ra, THREAD_FLAGS_OFFSET(rSELF)  # Preload flags for MterpCheckSuspendAndContinue
1145    move    a0, rINST                   # a0 <- offset
1146    FETCH_INST                          # load rINST
1147    bltz    a0, MterpCheckSuspendAndContinue  # suspend check if backwards branch
1148    GET_INST_OPCODE v0                  # extract opcode from rINST
1149    GOTO_OPCODE v0                      # jump to next instruction
1150
1151/* ------------------------------ */
1152    .balign 128
1153.L_op_goto_32: /* 0x2a */
1154/* File: mips64/op_goto_32.S */
1155    /*
1156     * Unconditional branch, 32-bit offset.
1157     *
1158     * The branch distance is a signed code-unit offset, which we need to
1159     * double to get a byte offset.
1160     *
1161     * Unlike most opcodes, this one is allowed to branch to itself, so
1162     * our "backward branch" test must be "<=0" instead of "<0".
1163     */
1164    /* goto/32 +AAAAAAAA */
1165    .extern MterpProfileBranch
1166    lh      rINST, 2(rPC)               # rINST <- aaaa (low)
1167    lh      a1, 4(rPC)                  # a1 <- AAAA (high)
1168    ins     rINST, a1, 16, 16           # rINST <- offset (sign-extended AAAAaaaa)
1169#if MTERP_PROFILE_BRANCHES
1170    EXPORT_PC
1171    move    a0, rSELF
1172    daddu   a1, rFP, OFF_FP_SHADOWFRAME
1173    move    a2, rINST
1174    jal     MterpProfileBranch          # (self, shadow_frame, offset)
1175    bnezc   v0, MterpOnStackReplacement # Note: offset must be in rINST
1176#endif
1177    dlsa    rPC, rINST, rPC, 1          # rPC <- rPC + offset * 2
1178    lw      ra, THREAD_FLAGS_OFFSET(rSELF)  # Preload flags for MterpCheckSuspendAndContinue
1179    move    a0, rINST                   # a0 <- offset
1180    FETCH_INST                          # load rINST
1181    blez    a0, MterpCheckSuspendAndContinue  # suspend check if backwards branch
1182    GET_INST_OPCODE v0                  # extract opcode from rINST
1183    GOTO_OPCODE v0                      # jump to next instruction
1184
1185/* ------------------------------ */
1186    .balign 128
1187.L_op_packed_switch: /* 0x2b */
1188/* File: mips64/op_packed_switch.S */
1189    /*
1190     * Handle a packed-switch or sparse-switch instruction.  In both cases
1191     * we decode it and hand it off to a helper function.
1192     *
1193     * We don't really expect backward branches in a switch statement, but
1194     * they're perfectly legal, so we check for them here.
1195     *
1196     * for: packed-switch, sparse-switch
1197     */
1198    /* op vAA, +BBBBBBBB */
1199    .extern MterpDoPackedSwitch
1200    .extern MterpProfileBranch
1201    lh      a0, 2(rPC)                  # a0 <- bbbb (lo)
1202    lh      a1, 4(rPC)                  # a1 <- BBBB (hi)
1203    srl     a3, rINST, 8                # a3 <- AA
1204    ins     a0, a1, 16, 16              # a0 <- BBBBbbbb
1205    GET_VREG a1, a3                     # a1 <- vAA
1206    dlsa    a0, a0, rPC, 1              # a0 <- PC + BBBBbbbb*2
1207    jal     MterpDoPackedSwitch                       # v0 <- code-unit branch offset
1208    move    rINST, v0
1209#if MTERP_PROFILE_BRANCHES
1210    EXPORT_PC
1211    move    a0, rSELF
1212    daddu   a1, rFP, OFF_FP_SHADOWFRAME
1213    move    a2, rINST
1214    jal     MterpProfileBranch          # (self, shadow_frame, offset)
1215    bnezc   v0, MterpOnStackReplacement # Note: offset must be in rINST
1216#endif
1217    dlsa    rPC, rINST, rPC, 1          # rPC <- rPC + offset * 2
1218    lw      ra, THREAD_FLAGS_OFFSET(rSELF)  # Preload flags for MterpCheckSuspendAndContinue
1219    move    a0, rINST                   # a0 <- offset
1220    FETCH_INST                          # load rINST
1221    blez    a0, MterpCheckSuspendAndContinue  # suspend check if backwards branch
1222    GET_INST_OPCODE v0                  # extract opcode from rINST
1223    GOTO_OPCODE v0                      # jump to next instruction
1224
1225/* ------------------------------ */
1226    .balign 128
1227.L_op_sparse_switch: /* 0x2c */
1228/* File: mips64/op_sparse_switch.S */
1229/* File: mips64/op_packed_switch.S */
1230    /*
1231     * Handle a packed-switch or sparse-switch instruction.  In both cases
1232     * we decode it and hand it off to a helper function.
1233     *
1234     * We don't really expect backward branches in a switch statement, but
1235     * they're perfectly legal, so we check for them here.
1236     *
1237     * for: packed-switch, sparse-switch
1238     */
1239    /* op vAA, +BBBBBBBB */
1240    .extern MterpDoSparseSwitch
1241    .extern MterpProfileBranch
1242    lh      a0, 2(rPC)                  # a0 <- bbbb (lo)
1243    lh      a1, 4(rPC)                  # a1 <- BBBB (hi)
1244    srl     a3, rINST, 8                # a3 <- AA
1245    ins     a0, a1, 16, 16              # a0 <- BBBBbbbb
1246    GET_VREG a1, a3                     # a1 <- vAA
1247    dlsa    a0, a0, rPC, 1              # a0 <- PC + BBBBbbbb*2
1248    jal     MterpDoSparseSwitch                       # v0 <- code-unit branch offset
1249    move    rINST, v0
1250#if MTERP_PROFILE_BRANCHES
1251    EXPORT_PC
1252    move    a0, rSELF
1253    daddu   a1, rFP, OFF_FP_SHADOWFRAME
1254    move    a2, rINST
1255    jal     MterpProfileBranch          # (self, shadow_frame, offset)
1256    bnezc   v0, MterpOnStackReplacement # Note: offset must be in rINST
1257#endif
1258    dlsa    rPC, rINST, rPC, 1          # rPC <- rPC + offset * 2
1259    lw      ra, THREAD_FLAGS_OFFSET(rSELF)  # Preload flags for MterpCheckSuspendAndContinue
1260    move    a0, rINST                   # a0 <- offset
1261    FETCH_INST                          # load rINST
1262    blez    a0, MterpCheckSuspendAndContinue  # suspend check if backwards branch
1263    GET_INST_OPCODE v0                  # extract opcode from rINST
1264    GOTO_OPCODE v0                      # jump to next instruction
1265
1266
1267/* ------------------------------ */
1268    .balign 128
1269.L_op_cmpl_float: /* 0x2d */
1270/* File: mips64/op_cmpl_float.S */
1271/* File: mips64/fcmp.S */
1272    /*
1273     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1274     * destination register based on the results of the comparison.
1275     *
1276     * For: cmpl-float, cmpg-float
1277     */
1278    /* op vAA, vBB, vCC */
1279    srl     a4, rINST, 8                # a4 <- AA
1280    lbu     a2, 2(rPC)                  # a2 <- BB
1281    lbu     a3, 3(rPC)                  # a3 <- CC
1282    GET_VREG_FLOAT f0, a2               # f0 <- vBB
1283    GET_VREG_FLOAT f1, a3               # f1 <- vCC
1284    cmp.eq.s f2, f0, f1
1285    li      a0, 0
1286    bc1nez  f2, 1f                      # done if vBB == vCC (ordered)
1287    .if 0
1288    cmp.lt.s f2, f0, f1
1289    li      a0, -1
1290    bc1nez  f2, 1f                      # done if vBB < vCC (ordered)
1291    li      a0, 1                       # vBB > vCC or unordered
1292    .else
1293    cmp.lt.s f2, f1, f0
1294    li      a0, 1
1295    bc1nez  f2, 1f                      # done if vBB > vCC (ordered)
1296    li      a0, -1                      # vBB < vCC or unordered
1297    .endif
12981:
1299    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
1300    GET_INST_OPCODE v0                  # extract opcode from rINST
1301    SET_VREG a0, a4                     # vAA <- a0
1302    GOTO_OPCODE v0                      # jump to next instruction
1303
1304
1305/* ------------------------------ */
1306    .balign 128
1307.L_op_cmpg_float: /* 0x2e */
1308/* File: mips64/op_cmpg_float.S */
1309/* File: mips64/fcmp.S */
1310    /*
1311     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1312     * destination register based on the results of the comparison.
1313     *
1314     * For: cmpl-float, cmpg-float
1315     */
1316    /* op vAA, vBB, vCC */
1317    srl     a4, rINST, 8                # a4 <- AA
1318    lbu     a2, 2(rPC)                  # a2 <- BB
1319    lbu     a3, 3(rPC)                  # a3 <- CC
1320    GET_VREG_FLOAT f0, a2               # f0 <- vBB
1321    GET_VREG_FLOAT f1, a3               # f1 <- vCC
1322    cmp.eq.s f2, f0, f1
1323    li      a0, 0
1324    bc1nez  f2, 1f                      # done if vBB == vCC (ordered)
1325    .if 1
1326    cmp.lt.s f2, f0, f1
1327    li      a0, -1
1328    bc1nez  f2, 1f                      # done if vBB < vCC (ordered)
1329    li      a0, 1                       # vBB > vCC or unordered
1330    .else
1331    cmp.lt.s f2, f1, f0
1332    li      a0, 1
1333    bc1nez  f2, 1f                      # done if vBB > vCC (ordered)
1334    li      a0, -1                      # vBB < vCC or unordered
1335    .endif
13361:
1337    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
1338    GET_INST_OPCODE v0                  # extract opcode from rINST
1339    SET_VREG a0, a4                     # vAA <- a0
1340    GOTO_OPCODE v0                      # jump to next instruction
1341
1342
1343/* ------------------------------ */
1344    .balign 128
1345.L_op_cmpl_double: /* 0x2f */
1346/* File: mips64/op_cmpl_double.S */
1347/* File: mips64/fcmpWide.S */
1348    /*
1349     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1350     * destination register based on the results of the comparison.
1351     *
1352     * For: cmpl-double, cmpg-double
1353     */
1354    /* op vAA, vBB, vCC */
1355    srl     a4, rINST, 8                # a4 <- AA
1356    lbu     a2, 2(rPC)                  # a2 <- BB
1357    lbu     a3, 3(rPC)                  # a3 <- CC
1358    GET_VREG_DOUBLE f0, a2              # f0 <- vBB
1359    GET_VREG_DOUBLE f1, a3              # f1 <- vCC
1360    cmp.eq.d f2, f0, f1
1361    li      a0, 0
1362    bc1nez  f2, 1f                      # done if vBB == vCC (ordered)
1363    .if 0
1364    cmp.lt.d f2, f0, f1
1365    li      a0, -1
1366    bc1nez  f2, 1f                      # done if vBB < vCC (ordered)
1367    li      a0, 1                       # vBB > vCC or unordered
1368    .else
1369    cmp.lt.d f2, f1, f0
1370    li      a0, 1
1371    bc1nez  f2, 1f                      # done if vBB > vCC (ordered)
1372    li      a0, -1                      # vBB < vCC or unordered
1373    .endif
13741:
1375    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
1376    GET_INST_OPCODE v0                  # extract opcode from rINST
1377    SET_VREG a0, a4                     # vAA <- a0
1378    GOTO_OPCODE v0                      # jump to next instruction
1379
1380
1381/* ------------------------------ */
1382    .balign 128
1383.L_op_cmpg_double: /* 0x30 */
1384/* File: mips64/op_cmpg_double.S */
1385/* File: mips64/fcmpWide.S */
1386    /*
1387     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1388     * destination register based on the results of the comparison.
1389     *
1390     * For: cmpl-double, cmpg-double
1391     */
1392    /* op vAA, vBB, vCC */
1393    srl     a4, rINST, 8                # a4 <- AA
1394    lbu     a2, 2(rPC)                  # a2 <- BB
1395    lbu     a3, 3(rPC)                  # a3 <- CC
1396    GET_VREG_DOUBLE f0, a2              # f0 <- vBB
1397    GET_VREG_DOUBLE f1, a3              # f1 <- vCC
1398    cmp.eq.d f2, f0, f1
1399    li      a0, 0
1400    bc1nez  f2, 1f                      # done if vBB == vCC (ordered)
1401    .if 1
1402    cmp.lt.d f2, f0, f1
1403    li      a0, -1
1404    bc1nez  f2, 1f                      # done if vBB < vCC (ordered)
1405    li      a0, 1                       # vBB > vCC or unordered
1406    .else
1407    cmp.lt.d f2, f1, f0
1408    li      a0, 1
1409    bc1nez  f2, 1f                      # done if vBB > vCC (ordered)
1410    li      a0, -1                      # vBB < vCC or unordered
1411    .endif
14121:
1413    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
1414    GET_INST_OPCODE v0                  # extract opcode from rINST
1415    SET_VREG a0, a4                     # vAA <- a0
1416    GOTO_OPCODE v0                      # jump to next instruction
1417
1418
1419/* ------------------------------ */
1420    .balign 128
1421.L_op_cmp_long: /* 0x31 */
1422/* File: mips64/op_cmp_long.S */
1423    /* cmp-long vAA, vBB, vCC */
1424    lbu     a2, 2(rPC)                  # a2 <- BB
1425    lbu     a3, 3(rPC)                  # a3 <- CC
1426    srl     a4, rINST, 8                # a4 <- AA
1427    GET_VREG_WIDE a0, a2                # a0 <- vBB
1428    GET_VREG_WIDE a1, a3                # a1 <- vCC
1429    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
1430    slt     a2, a0, a1
1431    slt     a0, a1, a0
1432    subu    a0, a0, a2
1433    GET_INST_OPCODE v0                  # extract opcode from rINST
1434    SET_VREG a0, a4                     # vAA <- result
1435    GOTO_OPCODE v0                      # jump to next instruction
1436
1437/* ------------------------------ */
1438    .balign 128
1439.L_op_if_eq: /* 0x32 */
1440/* File: mips64/op_if_eq.S */
1441/* File: mips64/bincmp.S */
1442    /*
1443     * Generic two-operand compare-and-branch operation.  Provide a "condition"
1444     * fragment that specifies the comparison to perform, e.g. for
1445     * "if-le" you would use "le".
1446     *
1447     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1448     */
1449    /* if-cmp vA, vB, +CCCC */
1450    .extern MterpProfileBranch
1451    ext     a2, rINST, 8, 4             # a2 <- A
1452    ext     a3, rINST, 12, 4            # a3 <- B
1453    lh      rINST, 2(rPC)               # rINST <- offset (sign-extended CCCC)
1454    GET_VREG a0, a2                     # a0 <- vA
1455    GET_VREG a1, a3                     # a1 <- vB
1456    beqc a0, a1, 1f
1457    li      rINST, 2                    # offset if branch not taken
14581:
1459#if MTERP_PROFILE_BRANCHES
1460    EXPORT_PC
1461    move    a0, rSELF
1462    daddu   a1, rFP, OFF_FP_SHADOWFRAME
1463    move    a2, rINST
1464    jal     MterpProfileBranch          # (self, shadow_frame, offset)
1465    bnezc   v0, MterpOnStackReplacement # Note: offset must be in rINST
1466#endif
1467    dlsa    rPC, rINST, rPC, 1          # rPC <- rPC + offset * 2
1468    lw      ra, THREAD_FLAGS_OFFSET(rSELF)  # Preload flags for MterpCheckSuspendAndContinue
1469    move    a0, rINST                   # a0 <- offset
1470    FETCH_INST                          # load rINST
1471    bltz    a0, MterpCheckSuspendAndContinue  # suspend check if backwards branch
1472    GET_INST_OPCODE v0                  # extract opcode from rINST
1473    GOTO_OPCODE v0                      # jump to next instruction
1474
1475
1476/* ------------------------------ */
1477    .balign 128
1478.L_op_if_ne: /* 0x33 */
1479/* File: mips64/op_if_ne.S */
1480/* File: mips64/bincmp.S */
1481    /*
1482     * Generic two-operand compare-and-branch operation.  Provide a "condition"
1483     * fragment that specifies the comparison to perform, e.g. for
1484     * "if-le" you would use "le".
1485     *
1486     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1487     */
1488    /* if-cmp vA, vB, +CCCC */
1489    .extern MterpProfileBranch
1490    ext     a2, rINST, 8, 4             # a2 <- A
1491    ext     a3, rINST, 12, 4            # a3 <- B
1492    lh      rINST, 2(rPC)               # rINST <- offset (sign-extended CCCC)
1493    GET_VREG a0, a2                     # a0 <- vA
1494    GET_VREG a1, a3                     # a1 <- vB
1495    bnec a0, a1, 1f
1496    li      rINST, 2                    # offset if branch not taken
14971:
1498#if MTERP_PROFILE_BRANCHES
1499    EXPORT_PC
1500    move    a0, rSELF
1501    daddu   a1, rFP, OFF_FP_SHADOWFRAME
1502    move    a2, rINST
1503    jal     MterpProfileBranch          # (self, shadow_frame, offset)
1504    bnezc   v0, MterpOnStackReplacement # Note: offset must be in rINST
1505#endif
1506    dlsa    rPC, rINST, rPC, 1          # rPC <- rPC + offset * 2
1507    lw      ra, THREAD_FLAGS_OFFSET(rSELF)  # Preload flags for MterpCheckSuspendAndContinue
1508    move    a0, rINST                   # a0 <- offset
1509    FETCH_INST                          # load rINST
1510    bltz    a0, MterpCheckSuspendAndContinue  # suspend check if backwards branch
1511    GET_INST_OPCODE v0                  # extract opcode from rINST
1512    GOTO_OPCODE v0                      # jump to next instruction
1513
1514
1515/* ------------------------------ */
1516    .balign 128
1517.L_op_if_lt: /* 0x34 */
1518/* File: mips64/op_if_lt.S */
1519/* File: mips64/bincmp.S */
1520    /*
1521     * Generic two-operand compare-and-branch operation.  Provide a "condition"
1522     * fragment that specifies the comparison to perform, e.g. for
1523     * "if-le" you would use "le".
1524     *
1525     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1526     */
1527    /* if-cmp vA, vB, +CCCC */
1528    .extern MterpProfileBranch
1529    ext     a2, rINST, 8, 4             # a2 <- A
1530    ext     a3, rINST, 12, 4            # a3 <- B
1531    lh      rINST, 2(rPC)               # rINST <- offset (sign-extended CCCC)
1532    GET_VREG a0, a2                     # a0 <- vA
1533    GET_VREG a1, a3                     # a1 <- vB
1534    bltc a0, a1, 1f
1535    li      rINST, 2                    # offset if branch not taken
15361:
1537#if MTERP_PROFILE_BRANCHES
1538    EXPORT_PC
1539    move    a0, rSELF
1540    daddu   a1, rFP, OFF_FP_SHADOWFRAME
1541    move    a2, rINST
1542    jal     MterpProfileBranch          # (self, shadow_frame, offset)
1543    bnezc   v0, MterpOnStackReplacement # Note: offset must be in rINST
1544#endif
1545    dlsa    rPC, rINST, rPC, 1          # rPC <- rPC + offset * 2
1546    lw      ra, THREAD_FLAGS_OFFSET(rSELF)  # Preload flags for MterpCheckSuspendAndContinue
1547    move    a0, rINST                   # a0 <- offset
1548    FETCH_INST                          # load rINST
1549    bltz    a0, MterpCheckSuspendAndContinue  # suspend check if backwards branch
1550    GET_INST_OPCODE v0                  # extract opcode from rINST
1551    GOTO_OPCODE v0                      # jump to next instruction
1552
1553
1554/* ------------------------------ */
1555    .balign 128
1556.L_op_if_ge: /* 0x35 */
1557/* File: mips64/op_if_ge.S */
1558/* File: mips64/bincmp.S */
1559    /*
1560     * Generic two-operand compare-and-branch operation.  Provide a "condition"
1561     * fragment that specifies the comparison to perform, e.g. for
1562     * "if-le" you would use "le".
1563     *
1564     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1565     */
1566    /* if-cmp vA, vB, +CCCC */
1567    .extern MterpProfileBranch
1568    ext     a2, rINST, 8, 4             # a2 <- A
1569    ext     a3, rINST, 12, 4            # a3 <- B
1570    lh      rINST, 2(rPC)               # rINST <- offset (sign-extended CCCC)
1571    GET_VREG a0, a2                     # a0 <- vA
1572    GET_VREG a1, a3                     # a1 <- vB
1573    bgec a0, a1, 1f
1574    li      rINST, 2                    # offset if branch not taken
15751:
1576#if MTERP_PROFILE_BRANCHES
1577    EXPORT_PC
1578    move    a0, rSELF
1579    daddu   a1, rFP, OFF_FP_SHADOWFRAME
1580    move    a2, rINST
1581    jal     MterpProfileBranch          # (self, shadow_frame, offset)
1582    bnezc   v0, MterpOnStackReplacement # Note: offset must be in rINST
1583#endif
1584    dlsa    rPC, rINST, rPC, 1          # rPC <- rPC + offset * 2
1585    lw      ra, THREAD_FLAGS_OFFSET(rSELF)  # Preload flags for MterpCheckSuspendAndContinue
1586    move    a0, rINST                   # a0 <- offset
1587    FETCH_INST                          # load rINST
1588    bltz    a0, MterpCheckSuspendAndContinue  # suspend check if backwards branch
1589    GET_INST_OPCODE v0                  # extract opcode from rINST
1590    GOTO_OPCODE v0                      # jump to next instruction
1591
1592
1593/* ------------------------------ */
1594    .balign 128
1595.L_op_if_gt: /* 0x36 */
1596/* File: mips64/op_if_gt.S */
1597/* File: mips64/bincmp.S */
1598    /*
1599     * Generic two-operand compare-and-branch operation.  Provide a "condition"
1600     * fragment that specifies the comparison to perform, e.g. for
1601     * "if-le" you would use "le".
1602     *
1603     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1604     */
1605    /* if-cmp vA, vB, +CCCC */
1606    .extern MterpProfileBranch
1607    ext     a2, rINST, 8, 4             # a2 <- A
1608    ext     a3, rINST, 12, 4            # a3 <- B
1609    lh      rINST, 2(rPC)               # rINST <- offset (sign-extended CCCC)
1610    GET_VREG a0, a2                     # a0 <- vA
1611    GET_VREG a1, a3                     # a1 <- vB
1612    bgtc a0, a1, 1f
1613    li      rINST, 2                    # offset if branch not taken
16141:
1615#if MTERP_PROFILE_BRANCHES
1616    EXPORT_PC
1617    move    a0, rSELF
1618    daddu   a1, rFP, OFF_FP_SHADOWFRAME
1619    move    a2, rINST
1620    jal     MterpProfileBranch          # (self, shadow_frame, offset)
1621    bnezc   v0, MterpOnStackReplacement # Note: offset must be in rINST
1622#endif
1623    dlsa    rPC, rINST, rPC, 1          # rPC <- rPC + offset * 2
1624    lw      ra, THREAD_FLAGS_OFFSET(rSELF)  # Preload flags for MterpCheckSuspendAndContinue
1625    move    a0, rINST                   # a0 <- offset
1626    FETCH_INST                          # load rINST
1627    bltz    a0, MterpCheckSuspendAndContinue  # suspend check if backwards branch
1628    GET_INST_OPCODE v0                  # extract opcode from rINST
1629    GOTO_OPCODE v0                      # jump to next instruction
1630
1631
1632/* ------------------------------ */
1633    .balign 128
1634.L_op_if_le: /* 0x37 */
1635/* File: mips64/op_if_le.S */
1636/* File: mips64/bincmp.S */
1637    /*
1638     * Generic two-operand compare-and-branch operation.  Provide a "condition"
1639     * fragment that specifies the comparison to perform, e.g. for
1640     * "if-le" you would use "le".
1641     *
1642     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1643     */
1644    /* if-cmp vA, vB, +CCCC */
1645    .extern MterpProfileBranch
1646    ext     a2, rINST, 8, 4             # a2 <- A
1647    ext     a3, rINST, 12, 4            # a3 <- B
1648    lh      rINST, 2(rPC)               # rINST <- offset (sign-extended CCCC)
1649    GET_VREG a0, a2                     # a0 <- vA
1650    GET_VREG a1, a3                     # a1 <- vB
1651    blec a0, a1, 1f
1652    li      rINST, 2                    # offset if branch not taken
16531:
1654#if MTERP_PROFILE_BRANCHES
1655    EXPORT_PC
1656    move    a0, rSELF
1657    daddu   a1, rFP, OFF_FP_SHADOWFRAME
1658    move    a2, rINST
1659    jal     MterpProfileBranch          # (self, shadow_frame, offset)
1660    bnezc   v0, MterpOnStackReplacement # Note: offset must be in rINST
1661#endif
1662    dlsa    rPC, rINST, rPC, 1          # rPC <- rPC + offset * 2
1663    lw      ra, THREAD_FLAGS_OFFSET(rSELF)  # Preload flags for MterpCheckSuspendAndContinue
1664    move    a0, rINST                   # a0 <- offset
1665    FETCH_INST                          # load rINST
1666    bltz    a0, MterpCheckSuspendAndContinue  # suspend check if backwards branch
1667    GET_INST_OPCODE v0                  # extract opcode from rINST
1668    GOTO_OPCODE v0                      # jump to next instruction
1669
1670
1671/* ------------------------------ */
1672    .balign 128
1673.L_op_if_eqz: /* 0x38 */
1674/* File: mips64/op_if_eqz.S */
1675/* File: mips64/zcmp.S */
1676    /*
1677     * Generic one-operand compare-and-branch operation.  Provide a "condition"
1678     * fragment that specifies the comparison to perform, e.g. for
1679     * "if-lez" you would use "le".
1680     *
1681     * For: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1682     */
1683    /* if-cmp vAA, +BBBB */
1684    .extern MterpProfileBranch
1685    srl     a2, rINST, 8                # a2 <- AA
1686    lh      rINST, 2(rPC)               # rINST <- offset (sign-extended BBBB)
1687    GET_VREG a0, a2                     # a0 <- vAA
1688    beqzc a0, 1f
1689    li      rINST, 2                    # offset if branch not taken
16901:
1691#if MTERP_PROFILE_BRANCHES
1692    EXPORT_PC
1693    move    a0, rSELF
1694    daddu   a1, rFP, OFF_FP_SHADOWFRAME
1695    move    a2, rINST
1696    jal     MterpProfileBranch          # (self, shadow_frame, offset)
1697    bnezc   v0, MterpOnStackReplacement # Note: offset must be in rINST
1698#endif
1699    dlsa    rPC, rINST, rPC, 1          # rPC <- rPC + offset * 2
1700    lw      ra, THREAD_FLAGS_OFFSET(rSELF)  # Preload flags for MterpCheckSuspendAndContinue
1701    move    a0, rINST                   # a0 <- offset
1702    FETCH_INST                          # load rINST
1703    bltz    a0, MterpCheckSuspendAndContinue  # suspend check if backwards branch
1704    GET_INST_OPCODE v0                  # extract opcode from rINST
1705    GOTO_OPCODE v0                      # jump to next instruction
1706
1707
1708/* ------------------------------ */
1709    .balign 128
1710.L_op_if_nez: /* 0x39 */
1711/* File: mips64/op_if_nez.S */
1712/* File: mips64/zcmp.S */
1713    /*
1714     * Generic one-operand compare-and-branch operation.  Provide a "condition"
1715     * fragment that specifies the comparison to perform, e.g. for
1716     * "if-lez" you would use "le".
1717     *
1718     * For: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1719     */
1720    /* if-cmp vAA, +BBBB */
1721    .extern MterpProfileBranch
1722    srl     a2, rINST, 8                # a2 <- AA
1723    lh      rINST, 2(rPC)               # rINST <- offset (sign-extended BBBB)
1724    GET_VREG a0, a2                     # a0 <- vAA
1725    bnezc a0, 1f
1726    li      rINST, 2                    # offset if branch not taken
17271:
1728#if MTERP_PROFILE_BRANCHES
1729    EXPORT_PC
1730    move    a0, rSELF
1731    daddu   a1, rFP, OFF_FP_SHADOWFRAME
1732    move    a2, rINST
1733    jal     MterpProfileBranch          # (self, shadow_frame, offset)
1734    bnezc   v0, MterpOnStackReplacement # Note: offset must be in rINST
1735#endif
1736    dlsa    rPC, rINST, rPC, 1          # rPC <- rPC + offset * 2
1737    lw      ra, THREAD_FLAGS_OFFSET(rSELF)  # Preload flags for MterpCheckSuspendAndContinue
1738    move    a0, rINST                   # a0 <- offset
1739    FETCH_INST                          # load rINST
1740    bltz    a0, MterpCheckSuspendAndContinue  # suspend check if backwards branch
1741    GET_INST_OPCODE v0                  # extract opcode from rINST
1742    GOTO_OPCODE v0                      # jump to next instruction
1743
1744
1745/* ------------------------------ */
1746    .balign 128
1747.L_op_if_ltz: /* 0x3a */
1748/* File: mips64/op_if_ltz.S */
1749/* File: mips64/zcmp.S */
1750    /*
1751     * Generic one-operand compare-and-branch operation.  Provide a "condition"
1752     * fragment that specifies the comparison to perform, e.g. for
1753     * "if-lez" you would use "le".
1754     *
1755     * For: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1756     */
1757    /* if-cmp vAA, +BBBB */
1758    .extern MterpProfileBranch
1759    srl     a2, rINST, 8                # a2 <- AA
1760    lh      rINST, 2(rPC)               # rINST <- offset (sign-extended BBBB)
1761    GET_VREG a0, a2                     # a0 <- vAA
1762    bltzc a0, 1f
1763    li      rINST, 2                    # offset if branch not taken
17641:
1765#if MTERP_PROFILE_BRANCHES
1766    EXPORT_PC
1767    move    a0, rSELF
1768    daddu   a1, rFP, OFF_FP_SHADOWFRAME
1769    move    a2, rINST
1770    jal     MterpProfileBranch          # (self, shadow_frame, offset)
1771    bnezc   v0, MterpOnStackReplacement # Note: offset must be in rINST
1772#endif
1773    dlsa    rPC, rINST, rPC, 1          # rPC <- rPC + offset * 2
1774    lw      ra, THREAD_FLAGS_OFFSET(rSELF)  # Preload flags for MterpCheckSuspendAndContinue
1775    move    a0, rINST                   # a0 <- offset
1776    FETCH_INST                          # load rINST
1777    bltz    a0, MterpCheckSuspendAndContinue  # suspend check if backwards branch
1778    GET_INST_OPCODE v0                  # extract opcode from rINST
1779    GOTO_OPCODE v0                      # jump to next instruction
1780
1781
1782/* ------------------------------ */
1783    .balign 128
1784.L_op_if_gez: /* 0x3b */
1785/* File: mips64/op_if_gez.S */
1786/* File: mips64/zcmp.S */
1787    /*
1788     * Generic one-operand compare-and-branch operation.  Provide a "condition"
1789     * fragment that specifies the comparison to perform, e.g. for
1790     * "if-lez" you would use "le".
1791     *
1792     * For: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1793     */
1794    /* if-cmp vAA, +BBBB */
1795    .extern MterpProfileBranch
1796    srl     a2, rINST, 8                # a2 <- AA
1797    lh      rINST, 2(rPC)               # rINST <- offset (sign-extended BBBB)
1798    GET_VREG a0, a2                     # a0 <- vAA
1799    bgezc a0, 1f
1800    li      rINST, 2                    # offset if branch not taken
18011:
1802#if MTERP_PROFILE_BRANCHES
1803    EXPORT_PC
1804    move    a0, rSELF
1805    daddu   a1, rFP, OFF_FP_SHADOWFRAME
1806    move    a2, rINST
1807    jal     MterpProfileBranch          # (self, shadow_frame, offset)
1808    bnezc   v0, MterpOnStackReplacement # Note: offset must be in rINST
1809#endif
1810    dlsa    rPC, rINST, rPC, 1          # rPC <- rPC + offset * 2
1811    lw      ra, THREAD_FLAGS_OFFSET(rSELF)  # Preload flags for MterpCheckSuspendAndContinue
1812    move    a0, rINST                   # a0 <- offset
1813    FETCH_INST                          # load rINST
1814    bltz    a0, MterpCheckSuspendAndContinue  # suspend check if backwards branch
1815    GET_INST_OPCODE v0                  # extract opcode from rINST
1816    GOTO_OPCODE v0                      # jump to next instruction
1817
1818
1819/* ------------------------------ */
1820    .balign 128
1821.L_op_if_gtz: /* 0x3c */
1822/* File: mips64/op_if_gtz.S */
1823/* File: mips64/zcmp.S */
1824    /*
1825     * Generic one-operand compare-and-branch operation.  Provide a "condition"
1826     * fragment that specifies the comparison to perform, e.g. for
1827     * "if-lez" you would use "le".
1828     *
1829     * For: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1830     */
1831    /* if-cmp vAA, +BBBB */
1832    .extern MterpProfileBranch
1833    srl     a2, rINST, 8                # a2 <- AA
1834    lh      rINST, 2(rPC)               # rINST <- offset (sign-extended BBBB)
1835    GET_VREG a0, a2                     # a0 <- vAA
1836    bgtzc a0, 1f
1837    li      rINST, 2                    # offset if branch not taken
18381:
1839#if MTERP_PROFILE_BRANCHES
1840    EXPORT_PC
1841    move    a0, rSELF
1842    daddu   a1, rFP, OFF_FP_SHADOWFRAME
1843    move    a2, rINST
1844    jal     MterpProfileBranch          # (self, shadow_frame, offset)
1845    bnezc   v0, MterpOnStackReplacement # Note: offset must be in rINST
1846#endif
1847    dlsa    rPC, rINST, rPC, 1          # rPC <- rPC + offset * 2
1848    lw      ra, THREAD_FLAGS_OFFSET(rSELF)  # Preload flags for MterpCheckSuspendAndContinue
1849    move    a0, rINST                   # a0 <- offset
1850    FETCH_INST                          # load rINST
1851    bltz    a0, MterpCheckSuspendAndContinue  # suspend check if backwards branch
1852    GET_INST_OPCODE v0                  # extract opcode from rINST
1853    GOTO_OPCODE v0                      # jump to next instruction
1854
1855
1856/* ------------------------------ */
1857    .balign 128
1858.L_op_if_lez: /* 0x3d */
1859/* File: mips64/op_if_lez.S */
1860/* File: mips64/zcmp.S */
1861    /*
1862     * Generic one-operand compare-and-branch operation.  Provide a "condition"
1863     * fragment that specifies the comparison to perform, e.g. for
1864     * "if-lez" you would use "le".
1865     *
1866     * For: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1867     */
1868    /* if-cmp vAA, +BBBB */
1869    .extern MterpProfileBranch
1870    srl     a2, rINST, 8                # a2 <- AA
1871    lh      rINST, 2(rPC)               # rINST <- offset (sign-extended BBBB)
1872    GET_VREG a0, a2                     # a0 <- vAA
1873    blezc a0, 1f
1874    li      rINST, 2                    # offset if branch not taken
18751:
1876#if MTERP_PROFILE_BRANCHES
1877    EXPORT_PC
1878    move    a0, rSELF
1879    daddu   a1, rFP, OFF_FP_SHADOWFRAME
1880    move    a2, rINST
1881    jal     MterpProfileBranch          # (self, shadow_frame, offset)
1882    bnezc   v0, MterpOnStackReplacement # Note: offset must be in rINST
1883#endif
1884    dlsa    rPC, rINST, rPC, 1          # rPC <- rPC + offset * 2
1885    lw      ra, THREAD_FLAGS_OFFSET(rSELF)  # Preload flags for MterpCheckSuspendAndContinue
1886    move    a0, rINST                   # a0 <- offset
1887    FETCH_INST                          # load rINST
1888    bltz    a0, MterpCheckSuspendAndContinue  # suspend check if backwards branch
1889    GET_INST_OPCODE v0                  # extract opcode from rINST
1890    GOTO_OPCODE v0                      # jump to next instruction
1891
1892
1893/* ------------------------------ */
1894    .balign 128
1895.L_op_unused_3e: /* 0x3e */
1896/* File: mips64/op_unused_3e.S */
1897/* File: mips64/unused.S */
1898/*
1899 * Bail to reference interpreter to throw.
1900 */
1901    b       MterpFallback
1902
1903
1904/* ------------------------------ */
1905    .balign 128
1906.L_op_unused_3f: /* 0x3f */
1907/* File: mips64/op_unused_3f.S */
1908/* File: mips64/unused.S */
1909/*
1910 * Bail to reference interpreter to throw.
1911 */
1912    b       MterpFallback
1913
1914
1915/* ------------------------------ */
1916    .balign 128
1917.L_op_unused_40: /* 0x40 */
1918/* File: mips64/op_unused_40.S */
1919/* File: mips64/unused.S */
1920/*
1921 * Bail to reference interpreter to throw.
1922 */
1923    b       MterpFallback
1924
1925
1926/* ------------------------------ */
1927    .balign 128
1928.L_op_unused_41: /* 0x41 */
1929/* File: mips64/op_unused_41.S */
1930/* File: mips64/unused.S */
1931/*
1932 * Bail to reference interpreter to throw.
1933 */
1934    b       MterpFallback
1935
1936
1937/* ------------------------------ */
1938    .balign 128
1939.L_op_unused_42: /* 0x42 */
1940/* File: mips64/op_unused_42.S */
1941/* File: mips64/unused.S */
1942/*
1943 * Bail to reference interpreter to throw.
1944 */
1945    b       MterpFallback
1946
1947
1948/* ------------------------------ */
1949    .balign 128
1950.L_op_unused_43: /* 0x43 */
1951/* File: mips64/op_unused_43.S */
1952/* File: mips64/unused.S */
1953/*
1954 * Bail to reference interpreter to throw.
1955 */
1956    b       MterpFallback
1957
1958
1959/* ------------------------------ */
1960    .balign 128
1961.L_op_aget: /* 0x44 */
1962/* File: mips64/op_aget.S */
1963    /*
1964     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1965     *
1966     * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1967     *
1968     * NOTE: assumes data offset for arrays is the same for all non-wide types.
1969     * If this changes, specialize.
1970     */
1971    /* op vAA, vBB, vCC */
1972    lbu     a2, 2(rPC)                  # a2 <- BB
1973    lbu     a3, 3(rPC)                  # a3 <- CC
1974    srl     a4, rINST, 8                # a4 <- AA
1975    GET_VREG_U a0, a2                   # a0 <- vBB (array object)
1976    GET_VREG a1, a3                     # a1 <- vCC (requested index)
1977    beqz    a0, common_errNullObject    # bail if null array object
1978    lw      a3, MIRROR_ARRAY_LENGTH_OFFSET(a0)  # a3 <- arrayObj->length
1979    .if 2
1980    # [d]lsa does not support shift count of 0.
1981    dlsa    a0, a1, a0, 2          # a0 <- arrayObj + index*width
1982    .else
1983    daddu   a0, a1, a0                  # a0 <- arrayObj + index*width
1984    .endif
1985    bgeu    a1, a3, common_errArrayIndex  # unsigned compare: index >= length, bail
1986    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
1987    lw   a2, MIRROR_INT_ARRAY_DATA_OFFSET(a0)        # a2 <- vBB[vCC]
1988    GET_INST_OPCODE v0                  # extract opcode from rINST
1989    SET_VREG a2, a4                     # vAA <- a2
1990    GOTO_OPCODE v0                      # jump to next instruction
1991
1992/* ------------------------------ */
1993    .balign 128
1994.L_op_aget_wide: /* 0x45 */
1995/* File: mips64/op_aget_wide.S */
1996    /*
1997     * Array get, 64 bits.  vAA <- vBB[vCC].
1998     *
1999     */
2000    /* aget-wide vAA, vBB, vCC */
2001    lbu     a2, 2(rPC)                  # a2 <- BB
2002    lbu     a3, 3(rPC)                  # a3 <- CC
2003    srl     a4, rINST, 8                # a4 <- AA
2004    GET_VREG_U a0, a2                   # a0 <- vBB (array object)
2005    GET_VREG a1, a3                     # a1 <- vCC (requested index)
2006    beqz    a0, common_errNullObject    # bail if null array object
2007    lw      a3, MIRROR_ARRAY_LENGTH_OFFSET(a0)  # a3 <- arrayObj->length
2008    dlsa    a0, a1, a0, 3               # a0 <- arrayObj + index*width
2009    bgeu    a1, a3, common_errArrayIndex  # unsigned compare: index >= length, bail
2010    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
2011    lw      a2, MIRROR_WIDE_ARRAY_DATA_OFFSET(a0)
2012    lw      a3, (MIRROR_WIDE_ARRAY_DATA_OFFSET+4)(a0)
2013    dinsu   a2, a3, 32, 32              # a2 <- vBB[vCC]
2014    GET_INST_OPCODE v0                  # extract opcode from rINST
2015    SET_VREG_WIDE a2, a4                # vAA <- a2
2016    GOTO_OPCODE v0                      # jump to next instruction
2017
2018/* ------------------------------ */
2019    .balign 128
2020.L_op_aget_object: /* 0x46 */
2021/* File: mips64/op_aget_object.S */
2022    /*
2023     * Array object get.  vAA <- vBB[vCC].
2024     *
2025     * for: aget-object
2026     */
2027    /* op vAA, vBB, vCC */
2028    .extern artAGetObjectFromMterp
2029    lbu     a2, 2(rPC)                  # a2 <- BB
2030    lbu     a3, 3(rPC)                  # a3 <- CC
2031    EXPORT_PC
2032    GET_VREG_U a0, a2                   # a0 <- vBB (array object)
2033    GET_VREG a1, a3                     # a1 <- vCC (requested index)
2034    jal     artAGetObjectFromMterp      # (array, index)
2035    ld      a1, THREAD_EXCEPTION_OFFSET(rSELF)
2036    srl     a4, rINST, 8                # a4 <- AA
2037    PREFETCH_INST 2
2038    bnez    a1, MterpException
2039    SET_VREG_OBJECT v0, a4              # vAA <- v0
2040    ADVANCE 2
2041    GET_INST_OPCODE v0                  # extract opcode from rINST
2042    GOTO_OPCODE v0                      # jump to next instruction
2043
2044/* ------------------------------ */
2045    .balign 128
2046.L_op_aget_boolean: /* 0x47 */
2047/* File: mips64/op_aget_boolean.S */
2048/* File: mips64/op_aget.S */
2049    /*
2050     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2051     *
2052     * for: aget, aget-boolean, aget-byte, aget-char, aget-short
2053     *
2054     * NOTE: assumes data offset for arrays is the same for all non-wide types.
2055     * If this changes, specialize.
2056     */
2057    /* op vAA, vBB, vCC */
2058    lbu     a2, 2(rPC)                  # a2 <- BB
2059    lbu     a3, 3(rPC)                  # a3 <- CC
2060    srl     a4, rINST, 8                # a4 <- AA
2061    GET_VREG_U a0, a2                   # a0 <- vBB (array object)
2062    GET_VREG a1, a3                     # a1 <- vCC (requested index)
2063    beqz    a0, common_errNullObject    # bail if null array object
2064    lw      a3, MIRROR_ARRAY_LENGTH_OFFSET(a0)  # a3 <- arrayObj->length
2065    .if 0
2066    # [d]lsa does not support shift count of 0.
2067    dlsa    a0, a1, a0, 0          # a0 <- arrayObj + index*width
2068    .else
2069    daddu   a0, a1, a0                  # a0 <- arrayObj + index*width
2070    .endif
2071    bgeu    a1, a3, common_errArrayIndex  # unsigned compare: index >= length, bail
2072    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
2073    lbu   a2, MIRROR_BOOLEAN_ARRAY_DATA_OFFSET(a0)        # a2 <- vBB[vCC]
2074    GET_INST_OPCODE v0                  # extract opcode from rINST
2075    SET_VREG a2, a4                     # vAA <- a2
2076    GOTO_OPCODE v0                      # jump to next instruction
2077
2078
2079/* ------------------------------ */
2080    .balign 128
2081.L_op_aget_byte: /* 0x48 */
2082/* File: mips64/op_aget_byte.S */
2083/* File: mips64/op_aget.S */
2084    /*
2085     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2086     *
2087     * for: aget, aget-boolean, aget-byte, aget-char, aget-short
2088     *
2089     * NOTE: assumes data offset for arrays is the same for all non-wide types.
2090     * If this changes, specialize.
2091     */
2092    /* op vAA, vBB, vCC */
2093    lbu     a2, 2(rPC)                  # a2 <- BB
2094    lbu     a3, 3(rPC)                  # a3 <- CC
2095    srl     a4, rINST, 8                # a4 <- AA
2096    GET_VREG_U a0, a2                   # a0 <- vBB (array object)
2097    GET_VREG a1, a3                     # a1 <- vCC (requested index)
2098    beqz    a0, common_errNullObject    # bail if null array object
2099    lw      a3, MIRROR_ARRAY_LENGTH_OFFSET(a0)  # a3 <- arrayObj->length
2100    .if 0
2101    # [d]lsa does not support shift count of 0.
2102    dlsa    a0, a1, a0, 0          # a0 <- arrayObj + index*width
2103    .else
2104    daddu   a0, a1, a0                  # a0 <- arrayObj + index*width
2105    .endif
2106    bgeu    a1, a3, common_errArrayIndex  # unsigned compare: index >= length, bail
2107    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
2108    lb   a2, MIRROR_BYTE_ARRAY_DATA_OFFSET(a0)        # a2 <- vBB[vCC]
2109    GET_INST_OPCODE v0                  # extract opcode from rINST
2110    SET_VREG a2, a4                     # vAA <- a2
2111    GOTO_OPCODE v0                      # jump to next instruction
2112
2113
2114/* ------------------------------ */
2115    .balign 128
2116.L_op_aget_char: /* 0x49 */
2117/* File: mips64/op_aget_char.S */
2118/* File: mips64/op_aget.S */
2119    /*
2120     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2121     *
2122     * for: aget, aget-boolean, aget-byte, aget-char, aget-short
2123     *
2124     * NOTE: assumes data offset for arrays is the same for all non-wide types.
2125     * If this changes, specialize.
2126     */
2127    /* op vAA, vBB, vCC */
2128    lbu     a2, 2(rPC)                  # a2 <- BB
2129    lbu     a3, 3(rPC)                  # a3 <- CC
2130    srl     a4, rINST, 8                # a4 <- AA
2131    GET_VREG_U a0, a2                   # a0 <- vBB (array object)
2132    GET_VREG a1, a3                     # a1 <- vCC (requested index)
2133    beqz    a0, common_errNullObject    # bail if null array object
2134    lw      a3, MIRROR_ARRAY_LENGTH_OFFSET(a0)  # a3 <- arrayObj->length
2135    .if 1
2136    # [d]lsa does not support shift count of 0.
2137    dlsa    a0, a1, a0, 1          # a0 <- arrayObj + index*width
2138    .else
2139    daddu   a0, a1, a0                  # a0 <- arrayObj + index*width
2140    .endif
2141    bgeu    a1, a3, common_errArrayIndex  # unsigned compare: index >= length, bail
2142    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
2143    lhu   a2, MIRROR_CHAR_ARRAY_DATA_OFFSET(a0)        # a2 <- vBB[vCC]
2144    GET_INST_OPCODE v0                  # extract opcode from rINST
2145    SET_VREG a2, a4                     # vAA <- a2
2146    GOTO_OPCODE v0                      # jump to next instruction
2147
2148
2149/* ------------------------------ */
2150    .balign 128
2151.L_op_aget_short: /* 0x4a */
2152/* File: mips64/op_aget_short.S */
2153/* File: mips64/op_aget.S */
2154    /*
2155     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2156     *
2157     * for: aget, aget-boolean, aget-byte, aget-char, aget-short
2158     *
2159     * NOTE: assumes data offset for arrays is the same for all non-wide types.
2160     * If this changes, specialize.
2161     */
2162    /* op vAA, vBB, vCC */
2163    lbu     a2, 2(rPC)                  # a2 <- BB
2164    lbu     a3, 3(rPC)                  # a3 <- CC
2165    srl     a4, rINST, 8                # a4 <- AA
2166    GET_VREG_U a0, a2                   # a0 <- vBB (array object)
2167    GET_VREG a1, a3                     # a1 <- vCC (requested index)
2168    beqz    a0, common_errNullObject    # bail if null array object
2169    lw      a3, MIRROR_ARRAY_LENGTH_OFFSET(a0)  # a3 <- arrayObj->length
2170    .if 1
2171    # [d]lsa does not support shift count of 0.
2172    dlsa    a0, a1, a0, 1          # a0 <- arrayObj + index*width
2173    .else
2174    daddu   a0, a1, a0                  # a0 <- arrayObj + index*width
2175    .endif
2176    bgeu    a1, a3, common_errArrayIndex  # unsigned compare: index >= length, bail
2177    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
2178    lh   a2, MIRROR_SHORT_ARRAY_DATA_OFFSET(a0)        # a2 <- vBB[vCC]
2179    GET_INST_OPCODE v0                  # extract opcode from rINST
2180    SET_VREG a2, a4                     # vAA <- a2
2181    GOTO_OPCODE v0                      # jump to next instruction
2182
2183
2184/* ------------------------------ */
2185    .balign 128
2186.L_op_aput: /* 0x4b */
2187/* File: mips64/op_aput.S */
2188    /*
2189     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2190     *
2191     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2192     *
2193     * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2194     * If this changes, specialize.
2195     */
2196    /* op vAA, vBB, vCC */
2197    lbu     a2, 2(rPC)                  # a2 <- BB
2198    lbu     a3, 3(rPC)                  # a3 <- CC
2199    srl     a4, rINST, 8                # a4 <- AA
2200    GET_VREG_U a0, a2                   # a0 <- vBB (array object)
2201    GET_VREG a1, a3                     # a1 <- vCC (requested index)
2202    beqz    a0, common_errNullObject    # bail if null array object
2203    lw      a3, MIRROR_ARRAY_LENGTH_OFFSET(a0)  # a3 <- arrayObj->length
2204    .if 2
2205    # [d]lsa does not support shift count of 0.
2206    dlsa    a0, a1, a0, 2          # a0 <- arrayObj + index*width
2207    .else
2208    daddu   a0, a1, a0                  # a0 <- arrayObj + index*width
2209    .endif
2210    bgeu    a1, a3, common_errArrayIndex  # unsigned compare: index >= length, bail
2211    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
2212    GET_VREG a2, a4                     # a2 <- vAA
2213    GET_INST_OPCODE v0                  # extract opcode from rINST
2214    sw  a2, MIRROR_INT_ARRAY_DATA_OFFSET(a0)        # vBB[vCC] <- a2
2215    GOTO_OPCODE v0                      # jump to next instruction
2216
2217/* ------------------------------ */
2218    .balign 128
2219.L_op_aput_wide: /* 0x4c */
2220/* File: mips64/op_aput_wide.S */
2221    /*
2222     * Array put, 64 bits.  vBB[vCC] <- vAA.
2223     *
2224     */
2225    /* aput-wide vAA, vBB, vCC */
2226    lbu     a2, 2(rPC)                  # a2 <- BB
2227    lbu     a3, 3(rPC)                  # a3 <- CC
2228    srl     a4, rINST, 8                # a4 <- AA
2229    GET_VREG_U a0, a2                   # a0 <- vBB (array object)
2230    GET_VREG a1, a3                     # a1 <- vCC (requested index)
2231    beqz    a0, common_errNullObject    # bail if null array object
2232    lw      a3, MIRROR_ARRAY_LENGTH_OFFSET(a0)  # a3 <- arrayObj->length
2233    dlsa    a0, a1, a0, 3               # a0 <- arrayObj + index*width
2234    bgeu    a1, a3, common_errArrayIndex  # unsigned compare: index >= length, bail
2235    GET_VREG_WIDE a2, a4                # a2 <- vAA
2236    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
2237    GET_INST_OPCODE v0                  # extract opcode from rINST
2238    sw      a2, MIRROR_WIDE_ARRAY_DATA_OFFSET(a0)
2239    dsrl32  a2, a2, 0
2240    sw      a2, (MIRROR_WIDE_ARRAY_DATA_OFFSET+4)(a0)  # vBB[vCC] <- a2
2241    GOTO_OPCODE v0                      # jump to next instruction
2242
2243/* ------------------------------ */
2244    .balign 128
2245.L_op_aput_object: /* 0x4d */
2246/* File: mips64/op_aput_object.S */
2247    /*
2248     * Store an object into an array.  vBB[vCC] <- vAA.
2249     */
2250    /* op vAA, vBB, vCC */
2251    .extern MterpAputObject
2252    EXPORT_PC
2253    daddu   a0, rFP, OFF_FP_SHADOWFRAME
2254    move    a1, rPC
2255    move    a2, rINST
2256    jal     MterpAputObject
2257    beqzc   v0, MterpPossibleException
2258    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
2259    GET_INST_OPCODE v0                  # extract opcode from rINST
2260    GOTO_OPCODE v0                      # jump to next instruction
2261
2262/* ------------------------------ */
2263    .balign 128
2264.L_op_aput_boolean: /* 0x4e */
2265/* File: mips64/op_aput_boolean.S */
2266/* File: mips64/op_aput.S */
2267    /*
2268     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2269     *
2270     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2271     *
2272     * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2273     * If this changes, specialize.
2274     */
2275    /* op vAA, vBB, vCC */
2276    lbu     a2, 2(rPC)                  # a2 <- BB
2277    lbu     a3, 3(rPC)                  # a3 <- CC
2278    srl     a4, rINST, 8                # a4 <- AA
2279    GET_VREG_U a0, a2                   # a0 <- vBB (array object)
2280    GET_VREG a1, a3                     # a1 <- vCC (requested index)
2281    beqz    a0, common_errNullObject    # bail if null array object
2282    lw      a3, MIRROR_ARRAY_LENGTH_OFFSET(a0)  # a3 <- arrayObj->length
2283    .if 0
2284    # [d]lsa does not support shift count of 0.
2285    dlsa    a0, a1, a0, 0          # a0 <- arrayObj + index*width
2286    .else
2287    daddu   a0, a1, a0                  # a0 <- arrayObj + index*width
2288    .endif
2289    bgeu    a1, a3, common_errArrayIndex  # unsigned compare: index >= length, bail
2290    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
2291    GET_VREG a2, a4                     # a2 <- vAA
2292    GET_INST_OPCODE v0                  # extract opcode from rINST
2293    sb  a2, MIRROR_BOOLEAN_ARRAY_DATA_OFFSET(a0)        # vBB[vCC] <- a2
2294    GOTO_OPCODE v0                      # jump to next instruction
2295
2296
2297/* ------------------------------ */
2298    .balign 128
2299.L_op_aput_byte: /* 0x4f */
2300/* File: mips64/op_aput_byte.S */
2301/* File: mips64/op_aput.S */
2302    /*
2303     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2304     *
2305     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2306     *
2307     * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2308     * If this changes, specialize.
2309     */
2310    /* op vAA, vBB, vCC */
2311    lbu     a2, 2(rPC)                  # a2 <- BB
2312    lbu     a3, 3(rPC)                  # a3 <- CC
2313    srl     a4, rINST, 8                # a4 <- AA
2314    GET_VREG_U a0, a2                   # a0 <- vBB (array object)
2315    GET_VREG a1, a3                     # a1 <- vCC (requested index)
2316    beqz    a0, common_errNullObject    # bail if null array object
2317    lw      a3, MIRROR_ARRAY_LENGTH_OFFSET(a0)  # a3 <- arrayObj->length
2318    .if 0
2319    # [d]lsa does not support shift count of 0.
2320    dlsa    a0, a1, a0, 0          # a0 <- arrayObj + index*width
2321    .else
2322    daddu   a0, a1, a0                  # a0 <- arrayObj + index*width
2323    .endif
2324    bgeu    a1, a3, common_errArrayIndex  # unsigned compare: index >= length, bail
2325    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
2326    GET_VREG a2, a4                     # a2 <- vAA
2327    GET_INST_OPCODE v0                  # extract opcode from rINST
2328    sb  a2, MIRROR_BYTE_ARRAY_DATA_OFFSET(a0)        # vBB[vCC] <- a2
2329    GOTO_OPCODE v0                      # jump to next instruction
2330
2331
2332/* ------------------------------ */
2333    .balign 128
2334.L_op_aput_char: /* 0x50 */
2335/* File: mips64/op_aput_char.S */
2336/* File: mips64/op_aput.S */
2337    /*
2338     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2339     *
2340     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2341     *
2342     * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2343     * If this changes, specialize.
2344     */
2345    /* op vAA, vBB, vCC */
2346    lbu     a2, 2(rPC)                  # a2 <- BB
2347    lbu     a3, 3(rPC)                  # a3 <- CC
2348    srl     a4, rINST, 8                # a4 <- AA
2349    GET_VREG_U a0, a2                   # a0 <- vBB (array object)
2350    GET_VREG a1, a3                     # a1 <- vCC (requested index)
2351    beqz    a0, common_errNullObject    # bail if null array object
2352    lw      a3, MIRROR_ARRAY_LENGTH_OFFSET(a0)  # a3 <- arrayObj->length
2353    .if 1
2354    # [d]lsa does not support shift count of 0.
2355    dlsa    a0, a1, a0, 1          # a0 <- arrayObj + index*width
2356    .else
2357    daddu   a0, a1, a0                  # a0 <- arrayObj + index*width
2358    .endif
2359    bgeu    a1, a3, common_errArrayIndex  # unsigned compare: index >= length, bail
2360    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
2361    GET_VREG a2, a4                     # a2 <- vAA
2362    GET_INST_OPCODE v0                  # extract opcode from rINST
2363    sh  a2, MIRROR_CHAR_ARRAY_DATA_OFFSET(a0)        # vBB[vCC] <- a2
2364    GOTO_OPCODE v0                      # jump to next instruction
2365
2366
2367/* ------------------------------ */
2368    .balign 128
2369.L_op_aput_short: /* 0x51 */
2370/* File: mips64/op_aput_short.S */
2371/* File: mips64/op_aput.S */
2372    /*
2373     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2374     *
2375     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2376     *
2377     * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2378     * If this changes, specialize.
2379     */
2380    /* op vAA, vBB, vCC */
2381    lbu     a2, 2(rPC)                  # a2 <- BB
2382    lbu     a3, 3(rPC)                  # a3 <- CC
2383    srl     a4, rINST, 8                # a4 <- AA
2384    GET_VREG_U a0, a2                   # a0 <- vBB (array object)
2385    GET_VREG a1, a3                     # a1 <- vCC (requested index)
2386    beqz    a0, common_errNullObject    # bail if null array object
2387    lw      a3, MIRROR_ARRAY_LENGTH_OFFSET(a0)  # a3 <- arrayObj->length
2388    .if 1
2389    # [d]lsa does not support shift count of 0.
2390    dlsa    a0, a1, a0, 1          # a0 <- arrayObj + index*width
2391    .else
2392    daddu   a0, a1, a0                  # a0 <- arrayObj + index*width
2393    .endif
2394    bgeu    a1, a3, common_errArrayIndex  # unsigned compare: index >= length, bail
2395    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
2396    GET_VREG a2, a4                     # a2 <- vAA
2397    GET_INST_OPCODE v0                  # extract opcode from rINST
2398    sh  a2, MIRROR_SHORT_ARRAY_DATA_OFFSET(a0)        # vBB[vCC] <- a2
2399    GOTO_OPCODE v0                      # jump to next instruction
2400
2401
2402/* ------------------------------ */
2403    .balign 128
2404.L_op_iget: /* 0x52 */
2405/* File: mips64/op_iget.S */
2406    /*
2407     * General instance field get.
2408     *
2409     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2410     */
2411    .extern artGet32InstanceFromCode
2412    EXPORT_PC
2413    lhu      a0, 2(rPC)                 # a0 <- field ref CCCC
2414    srl      a1, rINST, 12              # a1 <- B
2415    GET_VREG_U a1, a1                   # a1 <- fp[B], the object pointer
2416    ld       a2, OFF_FP_METHOD(rFP)     # a2 <- referrer
2417    move     a3, rSELF                  # a3 <- self
2418    jal      artGet32InstanceFromCode
2419    ld       a3, THREAD_EXCEPTION_OFFSET(rSELF)
2420    ext      a2, rINST, 8, 4            # a2 <- A
2421    PREFETCH_INST 2
2422    bnez     a3, MterpPossibleException # bail out
2423    .if 0
2424    SET_VREG_OBJECT v0, a2              # fp[A] <- v0
2425    .else
2426    SET_VREG v0, a2                     # fp[A] <- v0
2427    .endif
2428    ADVANCE 2
2429    GET_INST_OPCODE v0                  # extract opcode from rINST
2430    GOTO_OPCODE v0                      # jump to next instruction
2431
2432/* ------------------------------ */
2433    .balign 128
2434.L_op_iget_wide: /* 0x53 */
2435/* File: mips64/op_iget_wide.S */
2436    /*
2437     * 64-bit instance field get.
2438     *
2439     * for: iget-wide
2440     */
2441    .extern artGet64InstanceFromCode
2442    EXPORT_PC
2443    lhu      a0, 2(rPC)                 # a0 <- field ref CCCC
2444    srl      a1, rINST, 12              # a1 <- B
2445    GET_VREG_U a1, a1                   # a1 <- fp[B], the object pointer
2446    ld       a2, OFF_FP_METHOD(rFP)     # a2 <- referrer
2447    move     a3, rSELF                  # a3 <- self
2448    jal      artGet64InstanceFromCode
2449    ld       a3, THREAD_EXCEPTION_OFFSET(rSELF)
2450    ext      a2, rINST, 8, 4            # a2 <- A
2451    PREFETCH_INST 2
2452    bnez     a3, MterpPossibleException # bail out
2453    SET_VREG_WIDE v0, a2                # fp[A] <- v0
2454    ADVANCE 2
2455    GET_INST_OPCODE v0                  # extract opcode from rINST
2456    GOTO_OPCODE v0                      # jump to next instruction
2457
2458/* ------------------------------ */
2459    .balign 128
2460.L_op_iget_object: /* 0x54 */
2461/* File: mips64/op_iget_object.S */
2462/* File: mips64/op_iget.S */
2463    /*
2464     * General instance field get.
2465     *
2466     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2467     */
2468    .extern artGetObjInstanceFromCode
2469    EXPORT_PC
2470    lhu      a0, 2(rPC)                 # a0 <- field ref CCCC
2471    srl      a1, rINST, 12              # a1 <- B
2472    GET_VREG_U a1, a1                   # a1 <- fp[B], the object pointer
2473    ld       a2, OFF_FP_METHOD(rFP)     # a2 <- referrer
2474    move     a3, rSELF                  # a3 <- self
2475    jal      artGetObjInstanceFromCode
2476    ld       a3, THREAD_EXCEPTION_OFFSET(rSELF)
2477    ext      a2, rINST, 8, 4            # a2 <- A
2478    PREFETCH_INST 2
2479    bnez     a3, MterpPossibleException # bail out
2480    .if 1
2481    SET_VREG_OBJECT v0, a2              # fp[A] <- v0
2482    .else
2483    SET_VREG v0, a2                     # fp[A] <- v0
2484    .endif
2485    ADVANCE 2
2486    GET_INST_OPCODE v0                  # extract opcode from rINST
2487    GOTO_OPCODE v0                      # jump to next instruction
2488
2489
2490/* ------------------------------ */
2491    .balign 128
2492.L_op_iget_boolean: /* 0x55 */
2493/* File: mips64/op_iget_boolean.S */
2494/* File: mips64/op_iget.S */
2495    /*
2496     * General instance field get.
2497     *
2498     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2499     */
2500    .extern artGetBooleanInstanceFromCode
2501    EXPORT_PC
2502    lhu      a0, 2(rPC)                 # a0 <- field ref CCCC
2503    srl      a1, rINST, 12              # a1 <- B
2504    GET_VREG_U a1, a1                   # a1 <- fp[B], the object pointer
2505    ld       a2, OFF_FP_METHOD(rFP)     # a2 <- referrer
2506    move     a3, rSELF                  # a3 <- self
2507    jal      artGetBooleanInstanceFromCode
2508    ld       a3, THREAD_EXCEPTION_OFFSET(rSELF)
2509    ext      a2, rINST, 8, 4            # a2 <- A
2510    PREFETCH_INST 2
2511    bnez     a3, MterpPossibleException # bail out
2512    .if 0
2513    SET_VREG_OBJECT v0, a2              # fp[A] <- v0
2514    .else
2515    SET_VREG v0, a2                     # fp[A] <- v0
2516    .endif
2517    ADVANCE 2
2518    GET_INST_OPCODE v0                  # extract opcode from rINST
2519    GOTO_OPCODE v0                      # jump to next instruction
2520
2521
2522/* ------------------------------ */
2523    .balign 128
2524.L_op_iget_byte: /* 0x56 */
2525/* File: mips64/op_iget_byte.S */
2526/* File: mips64/op_iget.S */
2527    /*
2528     * General instance field get.
2529     *
2530     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2531     */
2532    .extern artGetByteInstanceFromCode
2533    EXPORT_PC
2534    lhu      a0, 2(rPC)                 # a0 <- field ref CCCC
2535    srl      a1, rINST, 12              # a1 <- B
2536    GET_VREG_U a1, a1                   # a1 <- fp[B], the object pointer
2537    ld       a2, OFF_FP_METHOD(rFP)     # a2 <- referrer
2538    move     a3, rSELF                  # a3 <- self
2539    jal      artGetByteInstanceFromCode
2540    ld       a3, THREAD_EXCEPTION_OFFSET(rSELF)
2541    ext      a2, rINST, 8, 4            # a2 <- A
2542    PREFETCH_INST 2
2543    bnez     a3, MterpPossibleException # bail out
2544    .if 0
2545    SET_VREG_OBJECT v0, a2              # fp[A] <- v0
2546    .else
2547    SET_VREG v0, a2                     # fp[A] <- v0
2548    .endif
2549    ADVANCE 2
2550    GET_INST_OPCODE v0                  # extract opcode from rINST
2551    GOTO_OPCODE v0                      # jump to next instruction
2552
2553
2554/* ------------------------------ */
2555    .balign 128
2556.L_op_iget_char: /* 0x57 */
2557/* File: mips64/op_iget_char.S */
2558/* File: mips64/op_iget.S */
2559    /*
2560     * General instance field get.
2561     *
2562     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2563     */
2564    .extern artGetCharInstanceFromCode
2565    EXPORT_PC
2566    lhu      a0, 2(rPC)                 # a0 <- field ref CCCC
2567    srl      a1, rINST, 12              # a1 <- B
2568    GET_VREG_U a1, a1                   # a1 <- fp[B], the object pointer
2569    ld       a2, OFF_FP_METHOD(rFP)     # a2 <- referrer
2570    move     a3, rSELF                  # a3 <- self
2571    jal      artGetCharInstanceFromCode
2572    ld       a3, THREAD_EXCEPTION_OFFSET(rSELF)
2573    ext      a2, rINST, 8, 4            # a2 <- A
2574    PREFETCH_INST 2
2575    bnez     a3, MterpPossibleException # bail out
2576    .if 0
2577    SET_VREG_OBJECT v0, a2              # fp[A] <- v0
2578    .else
2579    SET_VREG v0, a2                     # fp[A] <- v0
2580    .endif
2581    ADVANCE 2
2582    GET_INST_OPCODE v0                  # extract opcode from rINST
2583    GOTO_OPCODE v0                      # jump to next instruction
2584
2585
2586/* ------------------------------ */
2587    .balign 128
2588.L_op_iget_short: /* 0x58 */
2589/* File: mips64/op_iget_short.S */
2590/* File: mips64/op_iget.S */
2591    /*
2592     * General instance field get.
2593     *
2594     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2595     */
2596    .extern artGetShortInstanceFromCode
2597    EXPORT_PC
2598    lhu      a0, 2(rPC)                 # a0 <- field ref CCCC
2599    srl      a1, rINST, 12              # a1 <- B
2600    GET_VREG_U a1, a1                   # a1 <- fp[B], the object pointer
2601    ld       a2, OFF_FP_METHOD(rFP)     # a2 <- referrer
2602    move     a3, rSELF                  # a3 <- self
2603    jal      artGetShortInstanceFromCode
2604    ld       a3, THREAD_EXCEPTION_OFFSET(rSELF)
2605    ext      a2, rINST, 8, 4            # a2 <- A
2606    PREFETCH_INST 2
2607    bnez     a3, MterpPossibleException # bail out
2608    .if 0
2609    SET_VREG_OBJECT v0, a2              # fp[A] <- v0
2610    .else
2611    SET_VREG v0, a2                     # fp[A] <- v0
2612    .endif
2613    ADVANCE 2
2614    GET_INST_OPCODE v0                  # extract opcode from rINST
2615    GOTO_OPCODE v0                      # jump to next instruction
2616
2617
2618/* ------------------------------ */
2619    .balign 128
2620.L_op_iput: /* 0x59 */
2621/* File: mips64/op_iput.S */
2622    /*
2623     * General 32-bit instance field put.
2624     *
2625     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2626     */
2627    /* op vA, vB, field//CCCC */
2628    .extern artSet32InstanceFromMterp
2629    EXPORT_PC
2630    lhu     a0, 2(rPC)                  # a0 <- field ref CCCC
2631    srl     a1, rINST, 12               # a1 <- B
2632    GET_VREG_U a1, a1                   # a1 <- fp[B], the object pointer
2633    ext     a2, rINST, 8, 4             # a2 <- A
2634    GET_VREG a2, a2                     # a2 <- fp[A]
2635    ld      a3, OFF_FP_METHOD(rFP)      # a3 <- referrer
2636    PREFETCH_INST 2
2637    jal     artSet32InstanceFromMterp
2638    bnez    v0, MterpPossibleException  # bail out
2639    ADVANCE 2
2640    GET_INST_OPCODE v0                  # extract opcode from rINST
2641    GOTO_OPCODE v0                      # jump to next instruction
2642
2643/* ------------------------------ */
2644    .balign 128
2645.L_op_iput_wide: /* 0x5a */
2646/* File: mips64/op_iput_wide.S */
2647    /* iput-wide vA, vB, field//CCCC */
2648    .extern artSet64InstanceFromMterp
2649    EXPORT_PC
2650    lhu      a0, 2(rPC)                 # a0 <- field ref CCCC
2651    srl      a1, rINST, 12              # a1 <- B
2652    GET_VREG_U a1, a1                   # a1 <- fp[B], the object pointer
2653    ext      a2, rINST, 8, 4            # a2 <- A
2654    dlsa     a2, a2, rFP, 2             # a2 <- &fp[A]
2655    ld       a3, OFF_FP_METHOD(rFP)     # a3 <- referrer
2656    PREFETCH_INST 2
2657    jal      artSet64InstanceFromMterp
2658    bnez     v0, MterpPossibleException # bail out
2659    ADVANCE 2
2660    GET_INST_OPCODE v0                  # extract opcode from rINST
2661    GOTO_OPCODE v0                      # jump to next instruction
2662
2663/* ------------------------------ */
2664    .balign 128
2665.L_op_iput_object: /* 0x5b */
2666/* File: mips64/op_iput_object.S */
2667    .extern MterpIputObject
2668    EXPORT_PC
2669    daddu   a0, rFP, OFF_FP_SHADOWFRAME
2670    move    a1, rPC
2671    move    a2, rINST
2672    move    a3, rSELF
2673    jal     MterpIputObject
2674    beqzc   v0, MterpException
2675    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
2676    GET_INST_OPCODE v0                  # extract opcode from rINST
2677    GOTO_OPCODE v0                      # jump to next instruction
2678
2679/* ------------------------------ */
2680    .balign 128
2681.L_op_iput_boolean: /* 0x5c */
2682/* File: mips64/op_iput_boolean.S */
2683/* File: mips64/op_iput.S */
2684    /*
2685     * General 32-bit instance field put.
2686     *
2687     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2688     */
2689    /* op vA, vB, field//CCCC */
2690    .extern artSet8InstanceFromMterp
2691    EXPORT_PC
2692    lhu     a0, 2(rPC)                  # a0 <- field ref CCCC
2693    srl     a1, rINST, 12               # a1 <- B
2694    GET_VREG_U a1, a1                   # a1 <- fp[B], the object pointer
2695    ext     a2, rINST, 8, 4             # a2 <- A
2696    GET_VREG a2, a2                     # a2 <- fp[A]
2697    ld      a3, OFF_FP_METHOD(rFP)      # a3 <- referrer
2698    PREFETCH_INST 2
2699    jal     artSet8InstanceFromMterp
2700    bnez    v0, MterpPossibleException  # bail out
2701    ADVANCE 2
2702    GET_INST_OPCODE v0                  # extract opcode from rINST
2703    GOTO_OPCODE v0                      # jump to next instruction
2704
2705
2706/* ------------------------------ */
2707    .balign 128
2708.L_op_iput_byte: /* 0x5d */
2709/* File: mips64/op_iput_byte.S */
2710/* File: mips64/op_iput.S */
2711    /*
2712     * General 32-bit instance field put.
2713     *
2714     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2715     */
2716    /* op vA, vB, field//CCCC */
2717    .extern artSet8InstanceFromMterp
2718    EXPORT_PC
2719    lhu     a0, 2(rPC)                  # a0 <- field ref CCCC
2720    srl     a1, rINST, 12               # a1 <- B
2721    GET_VREG_U a1, a1                   # a1 <- fp[B], the object pointer
2722    ext     a2, rINST, 8, 4             # a2 <- A
2723    GET_VREG a2, a2                     # a2 <- fp[A]
2724    ld      a3, OFF_FP_METHOD(rFP)      # a3 <- referrer
2725    PREFETCH_INST 2
2726    jal     artSet8InstanceFromMterp
2727    bnez    v0, MterpPossibleException  # bail out
2728    ADVANCE 2
2729    GET_INST_OPCODE v0                  # extract opcode from rINST
2730    GOTO_OPCODE v0                      # jump to next instruction
2731
2732
2733/* ------------------------------ */
2734    .balign 128
2735.L_op_iput_char: /* 0x5e */
2736/* File: mips64/op_iput_char.S */
2737/* File: mips64/op_iput.S */
2738    /*
2739     * General 32-bit instance field put.
2740     *
2741     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2742     */
2743    /* op vA, vB, field//CCCC */
2744    .extern artSet16InstanceFromMterp
2745    EXPORT_PC
2746    lhu     a0, 2(rPC)                  # a0 <- field ref CCCC
2747    srl     a1, rINST, 12               # a1 <- B
2748    GET_VREG_U a1, a1                   # a1 <- fp[B], the object pointer
2749    ext     a2, rINST, 8, 4             # a2 <- A
2750    GET_VREG a2, a2                     # a2 <- fp[A]
2751    ld      a3, OFF_FP_METHOD(rFP)      # a3 <- referrer
2752    PREFETCH_INST 2
2753    jal     artSet16InstanceFromMterp
2754    bnez    v0, MterpPossibleException  # bail out
2755    ADVANCE 2
2756    GET_INST_OPCODE v0                  # extract opcode from rINST
2757    GOTO_OPCODE v0                      # jump to next instruction
2758
2759
2760/* ------------------------------ */
2761    .balign 128
2762.L_op_iput_short: /* 0x5f */
2763/* File: mips64/op_iput_short.S */
2764/* File: mips64/op_iput.S */
2765    /*
2766     * General 32-bit instance field put.
2767     *
2768     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2769     */
2770    /* op vA, vB, field//CCCC */
2771    .extern artSet16InstanceFromMterp
2772    EXPORT_PC
2773    lhu     a0, 2(rPC)                  # a0 <- field ref CCCC
2774    srl     a1, rINST, 12               # a1 <- B
2775    GET_VREG_U a1, a1                   # a1 <- fp[B], the object pointer
2776    ext     a2, rINST, 8, 4             # a2 <- A
2777    GET_VREG a2, a2                     # a2 <- fp[A]
2778    ld      a3, OFF_FP_METHOD(rFP)      # a3 <- referrer
2779    PREFETCH_INST 2
2780    jal     artSet16InstanceFromMterp
2781    bnez    v0, MterpPossibleException  # bail out
2782    ADVANCE 2
2783    GET_INST_OPCODE v0                  # extract opcode from rINST
2784    GOTO_OPCODE v0                      # jump to next instruction
2785
2786
2787/* ------------------------------ */
2788    .balign 128
2789.L_op_sget: /* 0x60 */
2790/* File: mips64/op_sget.S */
2791    /*
2792     * General SGET handler wrapper.
2793     *
2794     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2795     */
2796    /* op vAA, field//BBBB */
2797    .extern artGet32StaticFromCode
2798    EXPORT_PC
2799    lhu     a0, 2(rPC)                  # a0 <- field ref BBBB
2800    ld      a1, OFF_FP_METHOD(rFP)
2801    move    a2, rSELF
2802    jal     artGet32StaticFromCode
2803    ld      a3, THREAD_EXCEPTION_OFFSET(rSELF)
2804    srl     a2, rINST, 8                # a2 <- AA
2805
2806    PREFETCH_INST 2
2807    bnez    a3, MterpException          # bail out
2808    .if 0
2809    SET_VREG_OBJECT v0, a2              # fp[AA] <- v0
2810    .else
2811    SET_VREG v0, a2                     # fp[AA] <- v0
2812    .endif
2813    ADVANCE 2
2814    GET_INST_OPCODE v0                  # extract opcode from rINST
2815    GOTO_OPCODE v0
2816
2817/* ------------------------------ */
2818    .balign 128
2819.L_op_sget_wide: /* 0x61 */
2820/* File: mips64/op_sget_wide.S */
2821    /*
2822     * SGET_WIDE handler wrapper.
2823     *
2824     */
2825    /* sget-wide vAA, field//BBBB */
2826    .extern artGet64StaticFromCode
2827    EXPORT_PC
2828    lhu     a0, 2(rPC)                  # a0 <- field ref BBBB
2829    ld      a1, OFF_FP_METHOD(rFP)
2830    move    a2, rSELF
2831    jal     artGet64StaticFromCode
2832    ld      a3, THREAD_EXCEPTION_OFFSET(rSELF)
2833    srl     a4, rINST, 8                # a4 <- AA
2834    bnez    a3, MterpException          # bail out
2835    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
2836    SET_VREG_WIDE v0, a4
2837    GET_INST_OPCODE v0                  # extract opcode from rINST
2838    GOTO_OPCODE v0                      # jump to next instruction
2839
2840/* ------------------------------ */
2841    .balign 128
2842.L_op_sget_object: /* 0x62 */
2843/* File: mips64/op_sget_object.S */
2844/* File: mips64/op_sget.S */
2845    /*
2846     * General SGET handler wrapper.
2847     *
2848     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2849     */
2850    /* op vAA, field//BBBB */
2851    .extern artGetObjStaticFromCode
2852    EXPORT_PC
2853    lhu     a0, 2(rPC)                  # a0 <- field ref BBBB
2854    ld      a1, OFF_FP_METHOD(rFP)
2855    move    a2, rSELF
2856    jal     artGetObjStaticFromCode
2857    ld      a3, THREAD_EXCEPTION_OFFSET(rSELF)
2858    srl     a2, rINST, 8                # a2 <- AA
2859
2860    PREFETCH_INST 2
2861    bnez    a3, MterpException          # bail out
2862    .if 1
2863    SET_VREG_OBJECT v0, a2              # fp[AA] <- v0
2864    .else
2865    SET_VREG v0, a2                     # fp[AA] <- v0
2866    .endif
2867    ADVANCE 2
2868    GET_INST_OPCODE v0                  # extract opcode from rINST
2869    GOTO_OPCODE v0
2870
2871
2872/* ------------------------------ */
2873    .balign 128
2874.L_op_sget_boolean: /* 0x63 */
2875/* File: mips64/op_sget_boolean.S */
2876/* File: mips64/op_sget.S */
2877    /*
2878     * General SGET handler wrapper.
2879     *
2880     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2881     */
2882    /* op vAA, field//BBBB */
2883    .extern artGetBooleanStaticFromCode
2884    EXPORT_PC
2885    lhu     a0, 2(rPC)                  # a0 <- field ref BBBB
2886    ld      a1, OFF_FP_METHOD(rFP)
2887    move    a2, rSELF
2888    jal     artGetBooleanStaticFromCode
2889    ld      a3, THREAD_EXCEPTION_OFFSET(rSELF)
2890    srl     a2, rINST, 8                # a2 <- AA
2891    and v0, v0, 0xff
2892    PREFETCH_INST 2
2893    bnez    a3, MterpException          # bail out
2894    .if 0
2895    SET_VREG_OBJECT v0, a2              # fp[AA] <- v0
2896    .else
2897    SET_VREG v0, a2                     # fp[AA] <- v0
2898    .endif
2899    ADVANCE 2
2900    GET_INST_OPCODE v0                  # extract opcode from rINST
2901    GOTO_OPCODE v0
2902
2903
2904/* ------------------------------ */
2905    .balign 128
2906.L_op_sget_byte: /* 0x64 */
2907/* File: mips64/op_sget_byte.S */
2908/* File: mips64/op_sget.S */
2909    /*
2910     * General SGET handler wrapper.
2911     *
2912     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2913     */
2914    /* op vAA, field//BBBB */
2915    .extern artGetByteStaticFromCode
2916    EXPORT_PC
2917    lhu     a0, 2(rPC)                  # a0 <- field ref BBBB
2918    ld      a1, OFF_FP_METHOD(rFP)
2919    move    a2, rSELF
2920    jal     artGetByteStaticFromCode
2921    ld      a3, THREAD_EXCEPTION_OFFSET(rSELF)
2922    srl     a2, rINST, 8                # a2 <- AA
2923    seb v0, v0
2924    PREFETCH_INST 2
2925    bnez    a3, MterpException          # bail out
2926    .if 0
2927    SET_VREG_OBJECT v0, a2              # fp[AA] <- v0
2928    .else
2929    SET_VREG v0, a2                     # fp[AA] <- v0
2930    .endif
2931    ADVANCE 2
2932    GET_INST_OPCODE v0                  # extract opcode from rINST
2933    GOTO_OPCODE v0
2934
2935
2936/* ------------------------------ */
2937    .balign 128
2938.L_op_sget_char: /* 0x65 */
2939/* File: mips64/op_sget_char.S */
2940/* File: mips64/op_sget.S */
2941    /*
2942     * General SGET handler wrapper.
2943     *
2944     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2945     */
2946    /* op vAA, field//BBBB */
2947    .extern artGetCharStaticFromCode
2948    EXPORT_PC
2949    lhu     a0, 2(rPC)                  # a0 <- field ref BBBB
2950    ld      a1, OFF_FP_METHOD(rFP)
2951    move    a2, rSELF
2952    jal     artGetCharStaticFromCode
2953    ld      a3, THREAD_EXCEPTION_OFFSET(rSELF)
2954    srl     a2, rINST, 8                # a2 <- AA
2955    and v0, v0, 0xffff
2956    PREFETCH_INST 2
2957    bnez    a3, MterpException          # bail out
2958    .if 0
2959    SET_VREG_OBJECT v0, a2              # fp[AA] <- v0
2960    .else
2961    SET_VREG v0, a2                     # fp[AA] <- v0
2962    .endif
2963    ADVANCE 2
2964    GET_INST_OPCODE v0                  # extract opcode from rINST
2965    GOTO_OPCODE v0
2966
2967
2968/* ------------------------------ */
2969    .balign 128
2970.L_op_sget_short: /* 0x66 */
2971/* File: mips64/op_sget_short.S */
2972/* File: mips64/op_sget.S */
2973    /*
2974     * General SGET handler wrapper.
2975     *
2976     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2977     */
2978    /* op vAA, field//BBBB */
2979    .extern artGetShortStaticFromCode
2980    EXPORT_PC
2981    lhu     a0, 2(rPC)                  # a0 <- field ref BBBB
2982    ld      a1, OFF_FP_METHOD(rFP)
2983    move    a2, rSELF
2984    jal     artGetShortStaticFromCode
2985    ld      a3, THREAD_EXCEPTION_OFFSET(rSELF)
2986    srl     a2, rINST, 8                # a2 <- AA
2987    seh v0, v0
2988    PREFETCH_INST 2
2989    bnez    a3, MterpException          # bail out
2990    .if 0
2991    SET_VREG_OBJECT v0, a2              # fp[AA] <- v0
2992    .else
2993    SET_VREG v0, a2                     # fp[AA] <- v0
2994    .endif
2995    ADVANCE 2
2996    GET_INST_OPCODE v0                  # extract opcode from rINST
2997    GOTO_OPCODE v0
2998
2999
3000/* ------------------------------ */
3001    .balign 128
3002.L_op_sput: /* 0x67 */
3003/* File: mips64/op_sput.S */
3004    /*
3005     * General SPUT handler wrapper.
3006     *
3007     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3008     */
3009    /* op vAA, field//BBBB */
3010    .extern artSet32StaticFromCode
3011    EXPORT_PC
3012    lhu     a0, 2(rPC)                  # a0 <- field ref BBBB
3013    srl     a3, rINST, 8                # a3 <- AA
3014    GET_VREG a1, a3                     # a1 <- fp[AA]
3015    ld      a2, OFF_FP_METHOD(rFP)
3016    move    a3, rSELF
3017    PREFETCH_INST 2                     # Get next inst, but don't advance rPC
3018    jal     artSet32StaticFromCode
3019    bnezc   v0, MterpException          # 0 on success
3020    ADVANCE 2                           # Past exception point - now advance rPC
3021    GET_INST_OPCODE v0                  # extract opcode from rINST
3022    GOTO_OPCODE v0                      # jump to next instruction
3023
3024/* ------------------------------ */
3025    .balign 128
3026.L_op_sput_wide: /* 0x68 */
3027/* File: mips64/op_sput_wide.S */
3028    /*
3029     * SPUT_WIDE handler wrapper.
3030     *
3031     */
3032    /* sput-wide vAA, field//BBBB */
3033    .extern artSet64IndirectStaticFromMterp
3034    EXPORT_PC
3035    lhu     a0, 2(rPC)                  # a0 <- field ref BBBB
3036    ld      a1, OFF_FP_METHOD(rFP)
3037    srl     a2, rINST, 8                # a2 <- AA
3038    dlsa    a2, a2, rFP, 2
3039    move    a3, rSELF
3040    PREFETCH_INST 2                     # Get next inst, but don't advance rPC
3041    jal     artSet64IndirectStaticFromMterp
3042    bnezc   v0, MterpException          # 0 on success, -1 on failure
3043    ADVANCE 2                           # Past exception point - now advance rPC
3044    GET_INST_OPCODE v0                  # extract opcode from rINST
3045    GOTO_OPCODE v0                      # jump to next instruction
3046
3047/* ------------------------------ */
3048    .balign 128
3049.L_op_sput_object: /* 0x69 */
3050/* File: mips64/op_sput_object.S */
3051    .extern MterpSputObject
3052    EXPORT_PC
3053    daddu   a0, rFP, OFF_FP_SHADOWFRAME
3054    move    a1, rPC
3055    move    a2, rINST
3056    move    a3, rSELF
3057    jal     MterpSputObject
3058    beqzc   v0, MterpException
3059    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
3060    GET_INST_OPCODE v0                  # extract opcode from rINST
3061    GOTO_OPCODE v0                      # jump to next instruction
3062
3063/* ------------------------------ */
3064    .balign 128
3065.L_op_sput_boolean: /* 0x6a */
3066/* File: mips64/op_sput_boolean.S */
3067/* File: mips64/op_sput.S */
3068    /*
3069     * General SPUT handler wrapper.
3070     *
3071     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3072     */
3073    /* op vAA, field//BBBB */
3074    .extern artSet8StaticFromCode
3075    EXPORT_PC
3076    lhu     a0, 2(rPC)                  # a0 <- field ref BBBB
3077    srl     a3, rINST, 8                # a3 <- AA
3078    GET_VREG a1, a3                     # a1 <- fp[AA]
3079    ld      a2, OFF_FP_METHOD(rFP)
3080    move    a3, rSELF
3081    PREFETCH_INST 2                     # Get next inst, but don't advance rPC
3082    jal     artSet8StaticFromCode
3083    bnezc   v0, MterpException          # 0 on success
3084    ADVANCE 2                           # Past exception point - now advance rPC
3085    GET_INST_OPCODE v0                  # extract opcode from rINST
3086    GOTO_OPCODE v0                      # jump to next instruction
3087
3088
3089/* ------------------------------ */
3090    .balign 128
3091.L_op_sput_byte: /* 0x6b */
3092/* File: mips64/op_sput_byte.S */
3093/* File: mips64/op_sput.S */
3094    /*
3095     * General SPUT handler wrapper.
3096     *
3097     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3098     */
3099    /* op vAA, field//BBBB */
3100    .extern artSet8StaticFromCode
3101    EXPORT_PC
3102    lhu     a0, 2(rPC)                  # a0 <- field ref BBBB
3103    srl     a3, rINST, 8                # a3 <- AA
3104    GET_VREG a1, a3                     # a1 <- fp[AA]
3105    ld      a2, OFF_FP_METHOD(rFP)
3106    move    a3, rSELF
3107    PREFETCH_INST 2                     # Get next inst, but don't advance rPC
3108    jal     artSet8StaticFromCode
3109    bnezc   v0, MterpException          # 0 on success
3110    ADVANCE 2                           # Past exception point - now advance rPC
3111    GET_INST_OPCODE v0                  # extract opcode from rINST
3112    GOTO_OPCODE v0                      # jump to next instruction
3113
3114
3115/* ------------------------------ */
3116    .balign 128
3117.L_op_sput_char: /* 0x6c */
3118/* File: mips64/op_sput_char.S */
3119/* File: mips64/op_sput.S */
3120    /*
3121     * General SPUT handler wrapper.
3122     *
3123     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3124     */
3125    /* op vAA, field//BBBB */
3126    .extern artSet16StaticFromCode
3127    EXPORT_PC
3128    lhu     a0, 2(rPC)                  # a0 <- field ref BBBB
3129    srl     a3, rINST, 8                # a3 <- AA
3130    GET_VREG a1, a3                     # a1 <- fp[AA]
3131    ld      a2, OFF_FP_METHOD(rFP)
3132    move    a3, rSELF
3133    PREFETCH_INST 2                     # Get next inst, but don't advance rPC
3134    jal     artSet16StaticFromCode
3135    bnezc   v0, MterpException          # 0 on success
3136    ADVANCE 2                           # Past exception point - now advance rPC
3137    GET_INST_OPCODE v0                  # extract opcode from rINST
3138    GOTO_OPCODE v0                      # jump to next instruction
3139
3140
3141/* ------------------------------ */
3142    .balign 128
3143.L_op_sput_short: /* 0x6d */
3144/* File: mips64/op_sput_short.S */
3145/* File: mips64/op_sput.S */
3146    /*
3147     * General SPUT handler wrapper.
3148     *
3149     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3150     */
3151    /* op vAA, field//BBBB */
3152    .extern artSet16StaticFromCode
3153    EXPORT_PC
3154    lhu     a0, 2(rPC)                  # a0 <- field ref BBBB
3155    srl     a3, rINST, 8                # a3 <- AA
3156    GET_VREG a1, a3                     # a1 <- fp[AA]
3157    ld      a2, OFF_FP_METHOD(rFP)
3158    move    a3, rSELF
3159    PREFETCH_INST 2                     # Get next inst, but don't advance rPC
3160    jal     artSet16StaticFromCode
3161    bnezc   v0, MterpException          # 0 on success
3162    ADVANCE 2                           # Past exception point - now advance rPC
3163    GET_INST_OPCODE v0                  # extract opcode from rINST
3164    GOTO_OPCODE v0                      # jump to next instruction
3165
3166
3167/* ------------------------------ */
3168    .balign 128
3169.L_op_invoke_virtual: /* 0x6e */
3170/* File: mips64/op_invoke_virtual.S */
3171/* File: mips64/invoke.S */
3172    /*
3173     * Generic invoke handler wrapper.
3174     */
3175    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3176    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3177    .extern MterpInvokeVirtual
3178    .extern MterpShouldSwitchInterpreters
3179    EXPORT_PC
3180    move    a0, rSELF
3181    daddu   a1, rFP, OFF_FP_SHADOWFRAME
3182    move    a2, rPC
3183    move    a3, rINST
3184    jal     MterpInvokeVirtual
3185    beqzc   v0, MterpException
3186    FETCH_ADVANCE_INST 3
3187    jal     MterpShouldSwitchInterpreters
3188    bnezc   v0, MterpFallback
3189    GET_INST_OPCODE v0
3190    GOTO_OPCODE v0
3191
3192    /*
3193     * Handle a virtual method call.
3194     *
3195     * for: invoke-virtual, invoke-virtual/range
3196     */
3197    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3198    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3199
3200/* ------------------------------ */
3201    .balign 128
3202.L_op_invoke_super: /* 0x6f */
3203/* File: mips64/op_invoke_super.S */
3204/* File: mips64/invoke.S */
3205    /*
3206     * Generic invoke handler wrapper.
3207     */
3208    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3209    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3210    .extern MterpInvokeSuper
3211    .extern MterpShouldSwitchInterpreters
3212    EXPORT_PC
3213    move    a0, rSELF
3214    daddu   a1, rFP, OFF_FP_SHADOWFRAME
3215    move    a2, rPC
3216    move    a3, rINST
3217    jal     MterpInvokeSuper
3218    beqzc   v0, MterpException
3219    FETCH_ADVANCE_INST 3
3220    jal     MterpShouldSwitchInterpreters
3221    bnezc   v0, MterpFallback
3222    GET_INST_OPCODE v0
3223    GOTO_OPCODE v0
3224
3225    /*
3226     * Handle a "super" method call.
3227     *
3228     * for: invoke-super, invoke-super/range
3229     */
3230    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3231    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3232
3233/* ------------------------------ */
3234    .balign 128
3235.L_op_invoke_direct: /* 0x70 */
3236/* File: mips64/op_invoke_direct.S */
3237/* File: mips64/invoke.S */
3238    /*
3239     * Generic invoke handler wrapper.
3240     */
3241    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3242    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3243    .extern MterpInvokeDirect
3244    .extern MterpShouldSwitchInterpreters
3245    EXPORT_PC
3246    move    a0, rSELF
3247    daddu   a1, rFP, OFF_FP_SHADOWFRAME
3248    move    a2, rPC
3249    move    a3, rINST
3250    jal     MterpInvokeDirect
3251    beqzc   v0, MterpException
3252    FETCH_ADVANCE_INST 3
3253    jal     MterpShouldSwitchInterpreters
3254    bnezc   v0, MterpFallback
3255    GET_INST_OPCODE v0
3256    GOTO_OPCODE v0
3257
3258
3259/* ------------------------------ */
3260    .balign 128
3261.L_op_invoke_static: /* 0x71 */
3262/* File: mips64/op_invoke_static.S */
3263/* File: mips64/invoke.S */
3264    /*
3265     * Generic invoke handler wrapper.
3266     */
3267    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3268    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3269    .extern MterpInvokeStatic
3270    .extern MterpShouldSwitchInterpreters
3271    EXPORT_PC
3272    move    a0, rSELF
3273    daddu   a1, rFP, OFF_FP_SHADOWFRAME
3274    move    a2, rPC
3275    move    a3, rINST
3276    jal     MterpInvokeStatic
3277    beqzc   v0, MterpException
3278    FETCH_ADVANCE_INST 3
3279    jal     MterpShouldSwitchInterpreters
3280    bnezc   v0, MterpFallback
3281    GET_INST_OPCODE v0
3282    GOTO_OPCODE v0
3283
3284
3285/* ------------------------------ */
3286    .balign 128
3287.L_op_invoke_interface: /* 0x72 */
3288/* File: mips64/op_invoke_interface.S */
3289/* File: mips64/invoke.S */
3290    /*
3291     * Generic invoke handler wrapper.
3292     */
3293    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3294    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3295    .extern MterpInvokeInterface
3296    .extern MterpShouldSwitchInterpreters
3297    EXPORT_PC
3298    move    a0, rSELF
3299    daddu   a1, rFP, OFF_FP_SHADOWFRAME
3300    move    a2, rPC
3301    move    a3, rINST
3302    jal     MterpInvokeInterface
3303    beqzc   v0, MterpException
3304    FETCH_ADVANCE_INST 3
3305    jal     MterpShouldSwitchInterpreters
3306    bnezc   v0, MterpFallback
3307    GET_INST_OPCODE v0
3308    GOTO_OPCODE v0
3309
3310    /*
3311     * Handle an interface method call.
3312     *
3313     * for: invoke-interface, invoke-interface/range
3314     */
3315    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3316    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3317
3318/* ------------------------------ */
3319    .balign 128
3320.L_op_return_void_no_barrier: /* 0x73 */
3321/* File: mips64/op_return_void_no_barrier.S */
3322    .extern MterpSuspendCheck
3323    lw      ra, THREAD_FLAGS_OFFSET(rSELF)
3324    move    a0, rSELF
3325    and     ra, ra, (THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
3326    beqzc   ra, 1f
3327    jal     MterpSuspendCheck           # (self)
33281:
3329    li      a0, 0
3330    b       MterpReturn
3331
3332/* ------------------------------ */
3333    .balign 128
3334.L_op_invoke_virtual_range: /* 0x74 */
3335/* File: mips64/op_invoke_virtual_range.S */
3336/* File: mips64/invoke.S */
3337    /*
3338     * Generic invoke handler wrapper.
3339     */
3340    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3341    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3342    .extern MterpInvokeVirtualRange
3343    .extern MterpShouldSwitchInterpreters
3344    EXPORT_PC
3345    move    a0, rSELF
3346    daddu   a1, rFP, OFF_FP_SHADOWFRAME
3347    move    a2, rPC
3348    move    a3, rINST
3349    jal     MterpInvokeVirtualRange
3350    beqzc   v0, MterpException
3351    FETCH_ADVANCE_INST 3
3352    jal     MterpShouldSwitchInterpreters
3353    bnezc   v0, MterpFallback
3354    GET_INST_OPCODE v0
3355    GOTO_OPCODE v0
3356
3357
3358/* ------------------------------ */
3359    .balign 128
3360.L_op_invoke_super_range: /* 0x75 */
3361/* File: mips64/op_invoke_super_range.S */
3362/* File: mips64/invoke.S */
3363    /*
3364     * Generic invoke handler wrapper.
3365     */
3366    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3367    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3368    .extern MterpInvokeSuperRange
3369    .extern MterpShouldSwitchInterpreters
3370    EXPORT_PC
3371    move    a0, rSELF
3372    daddu   a1, rFP, OFF_FP_SHADOWFRAME
3373    move    a2, rPC
3374    move    a3, rINST
3375    jal     MterpInvokeSuperRange
3376    beqzc   v0, MterpException
3377    FETCH_ADVANCE_INST 3
3378    jal     MterpShouldSwitchInterpreters
3379    bnezc   v0, MterpFallback
3380    GET_INST_OPCODE v0
3381    GOTO_OPCODE v0
3382
3383
3384/* ------------------------------ */
3385    .balign 128
3386.L_op_invoke_direct_range: /* 0x76 */
3387/* File: mips64/op_invoke_direct_range.S */
3388/* File: mips64/invoke.S */
3389    /*
3390     * Generic invoke handler wrapper.
3391     */
3392    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3393    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3394    .extern MterpInvokeDirectRange
3395    .extern MterpShouldSwitchInterpreters
3396    EXPORT_PC
3397    move    a0, rSELF
3398    daddu   a1, rFP, OFF_FP_SHADOWFRAME
3399    move    a2, rPC
3400    move    a3, rINST
3401    jal     MterpInvokeDirectRange
3402    beqzc   v0, MterpException
3403    FETCH_ADVANCE_INST 3
3404    jal     MterpShouldSwitchInterpreters
3405    bnezc   v0, MterpFallback
3406    GET_INST_OPCODE v0
3407    GOTO_OPCODE v0
3408
3409
3410/* ------------------------------ */
3411    .balign 128
3412.L_op_invoke_static_range: /* 0x77 */
3413/* File: mips64/op_invoke_static_range.S */
3414/* File: mips64/invoke.S */
3415    /*
3416     * Generic invoke handler wrapper.
3417     */
3418    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3419    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3420    .extern MterpInvokeStaticRange
3421    .extern MterpShouldSwitchInterpreters
3422    EXPORT_PC
3423    move    a0, rSELF
3424    daddu   a1, rFP, OFF_FP_SHADOWFRAME
3425    move    a2, rPC
3426    move    a3, rINST
3427    jal     MterpInvokeStaticRange
3428    beqzc   v0, MterpException
3429    FETCH_ADVANCE_INST 3
3430    jal     MterpShouldSwitchInterpreters
3431    bnezc   v0, MterpFallback
3432    GET_INST_OPCODE v0
3433    GOTO_OPCODE v0
3434
3435
3436/* ------------------------------ */
3437    .balign 128
3438.L_op_invoke_interface_range: /* 0x78 */
3439/* File: mips64/op_invoke_interface_range.S */
3440/* File: mips64/invoke.S */
3441    /*
3442     * Generic invoke handler wrapper.
3443     */
3444    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3445    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3446    .extern MterpInvokeInterfaceRange
3447    .extern MterpShouldSwitchInterpreters
3448    EXPORT_PC
3449    move    a0, rSELF
3450    daddu   a1, rFP, OFF_FP_SHADOWFRAME
3451    move    a2, rPC
3452    move    a3, rINST
3453    jal     MterpInvokeInterfaceRange
3454    beqzc   v0, MterpException
3455    FETCH_ADVANCE_INST 3
3456    jal     MterpShouldSwitchInterpreters
3457    bnezc   v0, MterpFallback
3458    GET_INST_OPCODE v0
3459    GOTO_OPCODE v0
3460
3461
3462/* ------------------------------ */
3463    .balign 128
3464.L_op_unused_79: /* 0x79 */
3465/* File: mips64/op_unused_79.S */
3466/* File: mips64/unused.S */
3467/*
3468 * Bail to reference interpreter to throw.
3469 */
3470    b       MterpFallback
3471
3472
3473/* ------------------------------ */
3474    .balign 128
3475.L_op_unused_7a: /* 0x7a */
3476/* File: mips64/op_unused_7a.S */
3477/* File: mips64/unused.S */
3478/*
3479 * Bail to reference interpreter to throw.
3480 */
3481    b       MterpFallback
3482
3483
3484/* ------------------------------ */
3485    .balign 128
3486.L_op_neg_int: /* 0x7b */
3487/* File: mips64/op_neg_int.S */
3488/* File: mips64/unop.S */
3489    /*
3490     * Generic 32-bit unary operation.  Provide an "instr" line that
3491     * specifies an instruction that performs "a0 = op a0".
3492     *
3493     * for: int-to-byte, int-to-char, int-to-short,
3494     *      not-int, neg-int
3495     */
3496    /* unop vA, vB */
3497    ext     a3, rINST, 12, 4            # a3 <- B
3498    GET_VREG a0, a3                     # a0 <- vB
3499    ext     a2, rINST, 8, 4             # a2 <- A
3500                               # optional op
3501    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
3502    subu    a0, zero, a0                              # a0 <- op, a0-a3 changed
3503    GET_INST_OPCODE v0                  # extract opcode from rINST
3504    SET_VREG a0, a2                     # vA <- a0
3505    GOTO_OPCODE v0                      # jump to next instruction
3506
3507
3508/* ------------------------------ */
3509    .balign 128
3510.L_op_not_int: /* 0x7c */
3511/* File: mips64/op_not_int.S */
3512/* File: mips64/unop.S */
3513    /*
3514     * Generic 32-bit unary operation.  Provide an "instr" line that
3515     * specifies an instruction that performs "a0 = op a0".
3516     *
3517     * for: int-to-byte, int-to-char, int-to-short,
3518     *      not-int, neg-int
3519     */
3520    /* unop vA, vB */
3521    ext     a3, rINST, 12, 4            # a3 <- B
3522    GET_VREG a0, a3                     # a0 <- vB
3523    ext     a2, rINST, 8, 4             # a2 <- A
3524                               # optional op
3525    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
3526    nor     a0, zero, a0                              # a0 <- op, a0-a3 changed
3527    GET_INST_OPCODE v0                  # extract opcode from rINST
3528    SET_VREG a0, a2                     # vA <- a0
3529    GOTO_OPCODE v0                      # jump to next instruction
3530
3531
3532/* ------------------------------ */
3533    .balign 128
3534.L_op_neg_long: /* 0x7d */
3535/* File: mips64/op_neg_long.S */
3536/* File: mips64/unopWide.S */
3537    /*
3538     * Generic 64-bit unary operation.  Provide an "instr" line that
3539     * specifies an instruction that performs "a0 = op a0".
3540     *
3541     * For: not-long, neg-long
3542     */
3543    /* unop vA, vB */
3544    ext     a3, rINST, 12, 4            # a3 <- B
3545    GET_VREG_WIDE a0, a3                # a0 <- vB
3546    ext     a2, rINST, 8, 4             # a2 <- A
3547                               # optional op
3548    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
3549    dsubu   a0, zero, a0                              # a0 <- op, a0-a3 changed
3550    GET_INST_OPCODE v0                  # extract opcode from rINST
3551    SET_VREG_WIDE a0, a2                # vA <- a0
3552    GOTO_OPCODE v0                      # jump to next instruction
3553
3554
3555/* ------------------------------ */
3556    .balign 128
3557.L_op_not_long: /* 0x7e */
3558/* File: mips64/op_not_long.S */
3559/* File: mips64/unopWide.S */
3560    /*
3561     * Generic 64-bit unary operation.  Provide an "instr" line that
3562     * specifies an instruction that performs "a0 = op a0".
3563     *
3564     * For: not-long, neg-long
3565     */
3566    /* unop vA, vB */
3567    ext     a3, rINST, 12, 4            # a3 <- B
3568    GET_VREG_WIDE a0, a3                # a0 <- vB
3569    ext     a2, rINST, 8, 4             # a2 <- A
3570                               # optional op
3571    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
3572    nor     a0, zero, a0                              # a0 <- op, a0-a3 changed
3573    GET_INST_OPCODE v0                  # extract opcode from rINST
3574    SET_VREG_WIDE a0, a2                # vA <- a0
3575    GOTO_OPCODE v0                      # jump to next instruction
3576
3577
3578/* ------------------------------ */
3579    .balign 128
3580.L_op_neg_float: /* 0x7f */
3581/* File: mips64/op_neg_float.S */
3582/* File: mips64/fcvtHeader.S */
3583    /*
3584     * Loads a specified register from vB. Used primarily for conversions
3585     * from or to a floating-point type.
3586     *
3587     * Sets up a1 = A and a2 = B. a2 is later used by fcvtFooter.S to
3588     * store the result in vA and jump to the next instruction.
3589     *
3590     * For: int-to-float, int-to-double, long-to-float, long-to-double,
3591     *      float-to-int, float-to-long, float-to-double, double-to-int,
3592     *      double-to-long, double-to-float, neg-float, neg-double.
3593     */
3594    ext     a1, rINST, 8, 4             # a1 <- A
3595    srl     a2, rINST, 12               # a2 <- B
3596    GET_VREG_FLOAT f0, a2
3597    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
3598
3599    neg.s   f0, f0
3600/* File: mips64/fcvtFooter.S */
3601    /*
3602     * Stores a specified register containing the result of conversion
3603     * from or to a floating-point type and jumps to the next instruction.
3604     *
3605     * Expects a1 to contain the destination Dalvik register number.
3606     * a1 is set up by fcvtHeader.S.
3607     *
3608     * For: int-to-float, int-to-double, long-to-float, long-to-double,
3609     *      float-to-int, float-to-long, float-to-double, double-to-int,
3610     *      double-to-long, double-to-float, neg-float, neg-double.
3611     *
3612     * Note that this file can't be included after a break in other files
3613     * and in those files its contents appear as a copy.
3614     * See: float-to-int, float-to-long, double-to-int, double-to-long.
3615     */
3616    GET_INST_OPCODE v0                  # extract opcode from rINST
3617    SET_VREG_FLOAT f0, a1
3618    GOTO_OPCODE v0                      # jump to next instruction
3619
3620
3621/* ------------------------------ */
3622    .balign 128
3623.L_op_neg_double: /* 0x80 */
3624/* File: mips64/op_neg_double.S */
3625/* File: mips64/fcvtHeader.S */
3626    /*
3627     * Loads a specified register from vB. Used primarily for conversions
3628     * from or to a floating-point type.
3629     *
3630     * Sets up a1 = A and a2 = B. a2 is later used by fcvtFooter.S to
3631     * store the result in vA and jump to the next instruction.
3632     *
3633     * For: int-to-float, int-to-double, long-to-float, long-to-double,
3634     *      float-to-int, float-to-long, float-to-double, double-to-int,
3635     *      double-to-long, double-to-float, neg-float, neg-double.
3636     */
3637    ext     a1, rINST, 8, 4             # a1 <- A
3638    srl     a2, rINST, 12               # a2 <- B
3639    GET_VREG_DOUBLE f0, a2
3640    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
3641
3642    neg.d   f0, f0
3643/* File: mips64/fcvtFooter.S */
3644    /*
3645     * Stores a specified register containing the result of conversion
3646     * from or to a floating-point type and jumps to the next instruction.
3647     *
3648     * Expects a1 to contain the destination Dalvik register number.
3649     * a1 is set up by fcvtHeader.S.
3650     *
3651     * For: int-to-float, int-to-double, long-to-float, long-to-double,
3652     *      float-to-int, float-to-long, float-to-double, double-to-int,
3653     *      double-to-long, double-to-float, neg-float, neg-double.
3654     *
3655     * Note that this file can't be included after a break in other files
3656     * and in those files its contents appear as a copy.
3657     * See: float-to-int, float-to-long, double-to-int, double-to-long.
3658     */
3659    GET_INST_OPCODE v0                  # extract opcode from rINST
3660    SET_VREG_DOUBLE f0, a1
3661    GOTO_OPCODE v0                      # jump to next instruction
3662
3663
3664/* ------------------------------ */
3665    .balign 128
3666.L_op_int_to_long: /* 0x81 */
3667/* File: mips64/op_int_to_long.S */
3668    /* int-to-long vA, vB */
3669    ext     a3, rINST, 12, 4            # a3 <- B
3670    GET_VREG a0, a3                     # a0 <- vB (sign-extended to 64 bits)
3671    ext     a2, rINST, 8, 4             # a2 <- A
3672    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
3673    GET_INST_OPCODE v0                  # extract opcode from rINST
3674    SET_VREG_WIDE a0, a2                # vA <- vB
3675    GOTO_OPCODE v0                      # jump to next instruction
3676
3677/* ------------------------------ */
3678    .balign 128
3679.L_op_int_to_float: /* 0x82 */
3680/* File: mips64/op_int_to_float.S */
3681    /*
3682     * Conversion from or to floating-point happens in a floating-point register.
3683     * Therefore we load the input and store the output into or from a
3684     * floating-point register irrespective of the type.
3685     */
3686/* File: mips64/fcvtHeader.S */
3687    /*
3688     * Loads a specified register from vB. Used primarily for conversions
3689     * from or to a floating-point type.
3690     *
3691     * Sets up a1 = A and a2 = B. a2 is later used by fcvtFooter.S to
3692     * store the result in vA and jump to the next instruction.
3693     *
3694     * For: int-to-float, int-to-double, long-to-float, long-to-double,
3695     *      float-to-int, float-to-long, float-to-double, double-to-int,
3696     *      double-to-long, double-to-float, neg-float, neg-double.
3697     */
3698    ext     a1, rINST, 8, 4             # a1 <- A
3699    srl     a2, rINST, 12               # a2 <- B
3700    GET_VREG_FLOAT f0, a2
3701    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
3702
3703    cvt.s.w f0, f0
3704/* File: mips64/fcvtFooter.S */
3705    /*
3706     * Stores a specified register containing the result of conversion
3707     * from or to a floating-point type and jumps to the next instruction.
3708     *
3709     * Expects a1 to contain the destination Dalvik register number.
3710     * a1 is set up by fcvtHeader.S.
3711     *
3712     * For: int-to-float, int-to-double, long-to-float, long-to-double,
3713     *      float-to-int, float-to-long, float-to-double, double-to-int,
3714     *      double-to-long, double-to-float, neg-float, neg-double.
3715     *
3716     * Note that this file can't be included after a break in other files
3717     * and in those files its contents appear as a copy.
3718     * See: float-to-int, float-to-long, double-to-int, double-to-long.
3719     */
3720    GET_INST_OPCODE v0                  # extract opcode from rINST
3721    SET_VREG_FLOAT f0, a1
3722    GOTO_OPCODE v0                      # jump to next instruction
3723
3724
3725/* ------------------------------ */
3726    .balign 128
3727.L_op_int_to_double: /* 0x83 */
3728/* File: mips64/op_int_to_double.S */
3729    /*
3730     * Conversion from or to floating-point happens in a floating-point register.
3731     * Therefore we load the input and store the output into or from a
3732     * floating-point register irrespective of the type.
3733     */
3734/* File: mips64/fcvtHeader.S */
3735    /*
3736     * Loads a specified register from vB. Used primarily for conversions
3737     * from or to a floating-point type.
3738     *
3739     * Sets up a1 = A and a2 = B. a2 is later used by fcvtFooter.S to
3740     * store the result in vA and jump to the next instruction.
3741     *
3742     * For: int-to-float, int-to-double, long-to-float, long-to-double,
3743     *      float-to-int, float-to-long, float-to-double, double-to-int,
3744     *      double-to-long, double-to-float, neg-float, neg-double.
3745     */
3746    ext     a1, rINST, 8, 4             # a1 <- A
3747    srl     a2, rINST, 12               # a2 <- B
3748    GET_VREG_FLOAT f0, a2
3749    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
3750
3751    cvt.d.w f0, f0
3752/* File: mips64/fcvtFooter.S */
3753    /*
3754     * Stores a specified register containing the result of conversion
3755     * from or to a floating-point type and jumps to the next instruction.
3756     *
3757     * Expects a1 to contain the destination Dalvik register number.
3758     * a1 is set up by fcvtHeader.S.
3759     *
3760     * For: int-to-float, int-to-double, long-to-float, long-to-double,
3761     *      float-to-int, float-to-long, float-to-double, double-to-int,
3762     *      double-to-long, double-to-float, neg-float, neg-double.
3763     *
3764     * Note that this file can't be included after a break in other files
3765     * and in those files its contents appear as a copy.
3766     * See: float-to-int, float-to-long, double-to-int, double-to-long.
3767     */
3768    GET_INST_OPCODE v0                  # extract opcode from rINST
3769    SET_VREG_DOUBLE f0, a1
3770    GOTO_OPCODE v0                      # jump to next instruction
3771
3772
3773/* ------------------------------ */
3774    .balign 128
3775.L_op_long_to_int: /* 0x84 */
3776/* File: mips64/op_long_to_int.S */
3777/* we ignore the high word, making this equivalent to a 32-bit reg move */
3778/* File: mips64/op_move.S */
3779    /* for move, move-object, long-to-int */
3780    /* op vA, vB */
3781    ext     a2, rINST, 8, 4             # a2 <- A
3782    ext     a3, rINST, 12, 4            # a3 <- B
3783    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
3784    GET_VREG a0, a3                     # a0 <- vB
3785    GET_INST_OPCODE v0                  # extract opcode from rINST
3786    .if 0
3787    SET_VREG_OBJECT a0, a2              # vA <- vB
3788    .else
3789    SET_VREG a0, a2                     # vA <- vB
3790    .endif
3791    GOTO_OPCODE v0                      # jump to next instruction
3792
3793
3794/* ------------------------------ */
3795    .balign 128
3796.L_op_long_to_float: /* 0x85 */
3797/* File: mips64/op_long_to_float.S */
3798    /*
3799     * Conversion from or to floating-point happens in a floating-point register.
3800     * Therefore we load the input and store the output into or from a
3801     * floating-point register irrespective of the type.
3802     */
3803/* File: mips64/fcvtHeader.S */
3804    /*
3805     * Loads a specified register from vB. Used primarily for conversions
3806     * from or to a floating-point type.
3807     *
3808     * Sets up a1 = A and a2 = B. a2 is later used by fcvtFooter.S to
3809     * store the result in vA and jump to the next instruction.
3810     *
3811     * For: int-to-float, int-to-double, long-to-float, long-to-double,
3812     *      float-to-int, float-to-long, float-to-double, double-to-int,
3813     *      double-to-long, double-to-float, neg-float, neg-double.
3814     */
3815    ext     a1, rINST, 8, 4             # a1 <- A
3816    srl     a2, rINST, 12               # a2 <- B
3817    GET_VREG_DOUBLE f0, a2
3818    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
3819
3820    cvt.s.l f0, f0
3821/* File: mips64/fcvtFooter.S */
3822    /*
3823     * Stores a specified register containing the result of conversion
3824     * from or to a floating-point type and jumps to the next instruction.
3825     *
3826     * Expects a1 to contain the destination Dalvik register number.
3827     * a1 is set up by fcvtHeader.S.
3828     *
3829     * For: int-to-float, int-to-double, long-to-float, long-to-double,
3830     *      float-to-int, float-to-long, float-to-double, double-to-int,
3831     *      double-to-long, double-to-float, neg-float, neg-double.
3832     *
3833     * Note that this file can't be included after a break in other files
3834     * and in those files its contents appear as a copy.
3835     * See: float-to-int, float-to-long, double-to-int, double-to-long.
3836     */
3837    GET_INST_OPCODE v0                  # extract opcode from rINST
3838    SET_VREG_FLOAT f0, a1
3839    GOTO_OPCODE v0                      # jump to next instruction
3840
3841
3842/* ------------------------------ */
3843    .balign 128
3844.L_op_long_to_double: /* 0x86 */
3845/* File: mips64/op_long_to_double.S */
3846    /*
3847     * Conversion from or to floating-point happens in a floating-point register.
3848     * Therefore we load the input and store the output into or from a
3849     * floating-point register irrespective of the type.
3850     */
3851/* File: mips64/fcvtHeader.S */
3852    /*
3853     * Loads a specified register from vB. Used primarily for conversions
3854     * from or to a floating-point type.
3855     *
3856     * Sets up a1 = A and a2 = B. a2 is later used by fcvtFooter.S to
3857     * store the result in vA and jump to the next instruction.
3858     *
3859     * For: int-to-float, int-to-double, long-to-float, long-to-double,
3860     *      float-to-int, float-to-long, float-to-double, double-to-int,
3861     *      double-to-long, double-to-float, neg-float, neg-double.
3862     */
3863    ext     a1, rINST, 8, 4             # a1 <- A
3864    srl     a2, rINST, 12               # a2 <- B
3865    GET_VREG_DOUBLE f0, a2
3866    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
3867
3868    cvt.d.l f0, f0
3869/* File: mips64/fcvtFooter.S */
3870    /*
3871     * Stores a specified register containing the result of conversion
3872     * from or to a floating-point type and jumps to the next instruction.
3873     *
3874     * Expects a1 to contain the destination Dalvik register number.
3875     * a1 is set up by fcvtHeader.S.
3876     *
3877     * For: int-to-float, int-to-double, long-to-float, long-to-double,
3878     *      float-to-int, float-to-long, float-to-double, double-to-int,
3879     *      double-to-long, double-to-float, neg-float, neg-double.
3880     *
3881     * Note that this file can't be included after a break in other files
3882     * and in those files its contents appear as a copy.
3883     * See: float-to-int, float-to-long, double-to-int, double-to-long.
3884     */
3885    GET_INST_OPCODE v0                  # extract opcode from rINST
3886    SET_VREG_DOUBLE f0, a1
3887    GOTO_OPCODE v0                      # jump to next instruction
3888
3889
3890/* ------------------------------ */
3891    .balign 128
3892.L_op_float_to_int: /* 0x87 */
3893/* File: mips64/op_float_to_int.S */
3894/* File: mips64/fcvtHeader.S */
3895    /*
3896     * Loads a specified register from vB. Used primarily for conversions
3897     * from or to a floating-point type.
3898     *
3899     * Sets up a1 = A and a2 = B. a2 is later used by fcvtFooter.S to
3900     * store the result in vA and jump to the next instruction.
3901     *
3902     * For: int-to-float, int-to-double, long-to-float, long-to-double,
3903     *      float-to-int, float-to-long, float-to-double, double-to-int,
3904     *      double-to-long, double-to-float, neg-float, neg-double.
3905     */
3906    ext     a1, rINST, 8, 4             # a1 <- A
3907    srl     a2, rINST, 12               # a2 <- B
3908    GET_VREG_FLOAT f0, a2
3909    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
3910
3911    /*
3912     * TODO: simplify this when the MIPS64R6 emulator
3913     * supports NAN2008=1.
3914     */
3915    li      t0, INT_MIN_AS_FLOAT
3916    mtc1    t0, f1
3917    cmp.le.s f1, f1, f0
3918    bc1nez  f1, .Lop_float_to_int_trunc
3919    cmp.eq.s f1, f0, f0
3920    li      t0, INT_MIN
3921    mfc1    t1, f1
3922    and     t0, t0, t1
3923    b       .Lop_float_to_int_done
3924
3925/* ------------------------------ */
3926    .balign 128
3927.L_op_float_to_long: /* 0x88 */
3928/* File: mips64/op_float_to_long.S */
3929/* File: mips64/fcvtHeader.S */
3930    /*
3931     * Loads a specified register from vB. Used primarily for conversions
3932     * from or to a floating-point type.
3933     *
3934     * Sets up a1 = A and a2 = B. a2 is later used by fcvtFooter.S to
3935     * store the result in vA and jump to the next instruction.
3936     *
3937     * For: int-to-float, int-to-double, long-to-float, long-to-double,
3938     *      float-to-int, float-to-long, float-to-double, double-to-int,
3939     *      double-to-long, double-to-float, neg-float, neg-double.
3940     */
3941    ext     a1, rINST, 8, 4             # a1 <- A
3942    srl     a2, rINST, 12               # a2 <- B
3943    GET_VREG_FLOAT f0, a2
3944    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
3945
3946    /*
3947     * TODO: simplify this when the MIPS64R6 emulator
3948     * supports NAN2008=1.
3949     */
3950    li      t0, LONG_MIN_AS_FLOAT
3951    mtc1    t0, f1
3952    cmp.le.s f1, f1, f0
3953    bc1nez  f1, .Lop_float_to_long_trunc
3954    cmp.eq.s f1, f0, f0
3955    dli     t0, LONG_MIN
3956    mfc1    t1, f1
3957    and     t0, t0, t1
3958    b       .Lop_float_to_long_done
3959
3960/* ------------------------------ */
3961    .balign 128
3962.L_op_float_to_double: /* 0x89 */
3963/* File: mips64/op_float_to_double.S */
3964    /*
3965     * Conversion from or to floating-point happens in a floating-point register.
3966     * Therefore we load the input and store the output into or from a
3967     * floating-point register irrespective of the type.
3968     */
3969/* File: mips64/fcvtHeader.S */
3970    /*
3971     * Loads a specified register from vB. Used primarily for conversions
3972     * from or to a floating-point type.
3973     *
3974     * Sets up a1 = A and a2 = B. a2 is later used by fcvtFooter.S to
3975     * store the result in vA and jump to the next instruction.
3976     *
3977     * For: int-to-float, int-to-double, long-to-float, long-to-double,
3978     *      float-to-int, float-to-long, float-to-double, double-to-int,
3979     *      double-to-long, double-to-float, neg-float, neg-double.
3980     */
3981    ext     a1, rINST, 8, 4             # a1 <- A
3982    srl     a2, rINST, 12               # a2 <- B
3983    GET_VREG_FLOAT f0, a2
3984    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
3985
3986    cvt.d.s f0, f0
3987/* File: mips64/fcvtFooter.S */
3988    /*
3989     * Stores a specified register containing the result of conversion
3990     * from or to a floating-point type and jumps to the next instruction.
3991     *
3992     * Expects a1 to contain the destination Dalvik register number.
3993     * a1 is set up by fcvtHeader.S.
3994     *
3995     * For: int-to-float, int-to-double, long-to-float, long-to-double,
3996     *      float-to-int, float-to-long, float-to-double, double-to-int,
3997     *      double-to-long, double-to-float, neg-float, neg-double.
3998     *
3999     * Note that this file can't be included after a break in other files
4000     * and in those files its contents appear as a copy.
4001     * See: float-to-int, float-to-long, double-to-int, double-to-long.
4002     */
4003    GET_INST_OPCODE v0                  # extract opcode from rINST
4004    SET_VREG_DOUBLE f0, a1
4005    GOTO_OPCODE v0                      # jump to next instruction
4006
4007
4008/* ------------------------------ */
4009    .balign 128
4010.L_op_double_to_int: /* 0x8a */
4011/* File: mips64/op_double_to_int.S */
4012/* File: mips64/fcvtHeader.S */
4013    /*
4014     * Loads a specified register from vB. Used primarily for conversions
4015     * from or to a floating-point type.
4016     *
4017     * Sets up a1 = A and a2 = B. a2 is later used by fcvtFooter.S to
4018     * store the result in vA and jump to the next instruction.
4019     *
4020     * For: int-to-float, int-to-double, long-to-float, long-to-double,
4021     *      float-to-int, float-to-long, float-to-double, double-to-int,
4022     *      double-to-long, double-to-float, neg-float, neg-double.
4023     */
4024    ext     a1, rINST, 8, 4             # a1 <- A
4025    srl     a2, rINST, 12               # a2 <- B
4026    GET_VREG_DOUBLE f0, a2
4027    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
4028
4029    /*
4030     * TODO: simplify this when the MIPS64R6 emulator
4031     * supports NAN2008=1.
4032     */
4033    dli     t0, INT_MIN_AS_DOUBLE
4034    dmtc1   t0, f1
4035    cmp.le.d f1, f1, f0
4036    bc1nez  f1, .Lop_double_to_int_trunc
4037    cmp.eq.d f1, f0, f0
4038    li      t0, INT_MIN
4039    mfc1    t1, f1
4040    and     t0, t0, t1
4041    b       .Lop_double_to_int_done
4042
4043/* ------------------------------ */
4044    .balign 128
4045.L_op_double_to_long: /* 0x8b */
4046/* File: mips64/op_double_to_long.S */
4047/* File: mips64/fcvtHeader.S */
4048    /*
4049     * Loads a specified register from vB. Used primarily for conversions
4050     * from or to a floating-point type.
4051     *
4052     * Sets up a1 = A and a2 = B. a2 is later used by fcvtFooter.S to
4053     * store the result in vA and jump to the next instruction.
4054     *
4055     * For: int-to-float, int-to-double, long-to-float, long-to-double,
4056     *      float-to-int, float-to-long, float-to-double, double-to-int,
4057     *      double-to-long, double-to-float, neg-float, neg-double.
4058     */
4059    ext     a1, rINST, 8, 4             # a1 <- A
4060    srl     a2, rINST, 12               # a2 <- B
4061    GET_VREG_DOUBLE f0, a2
4062    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
4063
4064    /*
4065     * TODO: simplify this when the MIPS64R6 emulator
4066     * supports NAN2008=1.
4067     */
4068    dli     t0, LONG_MIN_AS_DOUBLE
4069    dmtc1   t0, f1
4070    cmp.le.d f1, f1, f0
4071    bc1nez  f1, .Lop_double_to_long_trunc
4072    cmp.eq.d f1, f0, f0
4073    dli     t0, LONG_MIN
4074    mfc1    t1, f1
4075    and     t0, t0, t1
4076    b       .Lop_double_to_long_done
4077
4078/* ------------------------------ */
4079    .balign 128
4080.L_op_double_to_float: /* 0x8c */
4081/* File: mips64/op_double_to_float.S */
4082    /*
4083     * Conversion from or to floating-point happens in a floating-point register.
4084     * Therefore we load the input and store the output into or from a
4085     * floating-point register irrespective of the type.
4086     */
4087/* File: mips64/fcvtHeader.S */
4088    /*
4089     * Loads a specified register from vB. Used primarily for conversions
4090     * from or to a floating-point type.
4091     *
4092     * Sets up a1 = A and a2 = B. a2 is later used by fcvtFooter.S to
4093     * store the result in vA and jump to the next instruction.
4094     *
4095     * For: int-to-float, int-to-double, long-to-float, long-to-double,
4096     *      float-to-int, float-to-long, float-to-double, double-to-int,
4097     *      double-to-long, double-to-float, neg-float, neg-double.
4098     */
4099    ext     a1, rINST, 8, 4             # a1 <- A
4100    srl     a2, rINST, 12               # a2 <- B
4101    GET_VREG_DOUBLE f0, a2
4102    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
4103
4104    cvt.s.d f0, f0
4105/* File: mips64/fcvtFooter.S */
4106    /*
4107     * Stores a specified register containing the result of conversion
4108     * from or to a floating-point type and jumps to the next instruction.
4109     *
4110     * Expects a1 to contain the destination Dalvik register number.
4111     * a1 is set up by fcvtHeader.S.
4112     *
4113     * For: int-to-float, int-to-double, long-to-float, long-to-double,
4114     *      float-to-int, float-to-long, float-to-double, double-to-int,
4115     *      double-to-long, double-to-float, neg-float, neg-double.
4116     *
4117     * Note that this file can't be included after a break in other files
4118     * and in those files its contents appear as a copy.
4119     * See: float-to-int, float-to-long, double-to-int, double-to-long.
4120     */
4121    GET_INST_OPCODE v0                  # extract opcode from rINST
4122    SET_VREG_FLOAT f0, a1
4123    GOTO_OPCODE v0                      # jump to next instruction
4124
4125
4126/* ------------------------------ */
4127    .balign 128
4128.L_op_int_to_byte: /* 0x8d */
4129/* File: mips64/op_int_to_byte.S */
4130/* File: mips64/unop.S */
4131    /*
4132     * Generic 32-bit unary operation.  Provide an "instr" line that
4133     * specifies an instruction that performs "a0 = op a0".
4134     *
4135     * for: int-to-byte, int-to-char, int-to-short,
4136     *      not-int, neg-int
4137     */
4138    /* unop vA, vB */
4139    ext     a3, rINST, 12, 4            # a3 <- B
4140    GET_VREG a0, a3                     # a0 <- vB
4141    ext     a2, rINST, 8, 4             # a2 <- A
4142                               # optional op
4143    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
4144    seb     a0, a0                              # a0 <- op, a0-a3 changed
4145    GET_INST_OPCODE v0                  # extract opcode from rINST
4146    SET_VREG a0, a2                     # vA <- a0
4147    GOTO_OPCODE v0                      # jump to next instruction
4148
4149
4150/* ------------------------------ */
4151    .balign 128
4152.L_op_int_to_char: /* 0x8e */
4153/* File: mips64/op_int_to_char.S */
4154/* File: mips64/unop.S */
4155    /*
4156     * Generic 32-bit unary operation.  Provide an "instr" line that
4157     * specifies an instruction that performs "a0 = op a0".
4158     *
4159     * for: int-to-byte, int-to-char, int-to-short,
4160     *      not-int, neg-int
4161     */
4162    /* unop vA, vB */
4163    ext     a3, rINST, 12, 4            # a3 <- B
4164    GET_VREG a0, a3                     # a0 <- vB
4165    ext     a2, rINST, 8, 4             # a2 <- A
4166                               # optional op
4167    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
4168    and     a0, a0, 0xffff                              # a0 <- op, a0-a3 changed
4169    GET_INST_OPCODE v0                  # extract opcode from rINST
4170    SET_VREG a0, a2                     # vA <- a0
4171    GOTO_OPCODE v0                      # jump to next instruction
4172
4173
4174/* ------------------------------ */
4175    .balign 128
4176.L_op_int_to_short: /* 0x8f */
4177/* File: mips64/op_int_to_short.S */
4178/* File: mips64/unop.S */
4179    /*
4180     * Generic 32-bit unary operation.  Provide an "instr" line that
4181     * specifies an instruction that performs "a0 = op a0".
4182     *
4183     * for: int-to-byte, int-to-char, int-to-short,
4184     *      not-int, neg-int
4185     */
4186    /* unop vA, vB */
4187    ext     a3, rINST, 12, 4            # a3 <- B
4188    GET_VREG a0, a3                     # a0 <- vB
4189    ext     a2, rINST, 8, 4             # a2 <- A
4190                               # optional op
4191    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
4192    seh     a0, a0                              # a0 <- op, a0-a3 changed
4193    GET_INST_OPCODE v0                  # extract opcode from rINST
4194    SET_VREG a0, a2                     # vA <- a0
4195    GOTO_OPCODE v0                      # jump to next instruction
4196
4197
4198/* ------------------------------ */
4199    .balign 128
4200.L_op_add_int: /* 0x90 */
4201/* File: mips64/op_add_int.S */
4202/* File: mips64/binop.S */
4203    /*
4204     * Generic 32-bit binary operation.  Provide an "instr" line that
4205     * specifies an instruction that performs "result = a0 op a1".
4206     * This could be a MIPS instruction or a function call.  (If the result
4207     * comes back in a register other than a0, you can override "result".)
4208     *
4209     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4210     * vCC (a1).  Useful for integer division and modulus.  Note that we
4211     * *don't* check for (INT_MIN / -1) here, because the CPU handles it
4212     * correctly.
4213     *
4214     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4215     *      xor-int, shl-int, shr-int, ushr-int
4216     */
4217    /* binop vAA, vBB, vCC */
4218    srl     a4, rINST, 8                # a4 <- AA
4219    lbu     a2, 2(rPC)                  # a2 <- BB
4220    lbu     a3, 3(rPC)                  # a3 <- CC
4221    GET_VREG a0, a2                     # a0 <- vBB
4222    GET_VREG a1, a3                     # a1 <- vCC
4223    .if 0
4224    beqz    a1, common_errDivideByZero  # is second operand zero?
4225    .endif
4226    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
4227                               # optional op
4228    addu a0, a0, a1                              # a0 <- op, a0-a3 changed
4229    GET_INST_OPCODE v0                  # extract opcode from rINST
4230    SET_VREG a0, a4                # vAA <- a0
4231    GOTO_OPCODE v0                      # jump to next instruction
4232
4233
4234/* ------------------------------ */
4235    .balign 128
4236.L_op_sub_int: /* 0x91 */
4237/* File: mips64/op_sub_int.S */
4238/* File: mips64/binop.S */
4239    /*
4240     * Generic 32-bit binary operation.  Provide an "instr" line that
4241     * specifies an instruction that performs "result = a0 op a1".
4242     * This could be a MIPS instruction or a function call.  (If the result
4243     * comes back in a register other than a0, you can override "result".)
4244     *
4245     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4246     * vCC (a1).  Useful for integer division and modulus.  Note that we
4247     * *don't* check for (INT_MIN / -1) here, because the CPU handles it
4248     * correctly.
4249     *
4250     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4251     *      xor-int, shl-int, shr-int, ushr-int
4252     */
4253    /* binop vAA, vBB, vCC */
4254    srl     a4, rINST, 8                # a4 <- AA
4255    lbu     a2, 2(rPC)                  # a2 <- BB
4256    lbu     a3, 3(rPC)                  # a3 <- CC
4257    GET_VREG a0, a2                     # a0 <- vBB
4258    GET_VREG a1, a3                     # a1 <- vCC
4259    .if 0
4260    beqz    a1, common_errDivideByZero  # is second operand zero?
4261    .endif
4262    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
4263                               # optional op
4264    subu a0, a0, a1                              # a0 <- op, a0-a3 changed
4265    GET_INST_OPCODE v0                  # extract opcode from rINST
4266    SET_VREG a0, a4                # vAA <- a0
4267    GOTO_OPCODE v0                      # jump to next instruction
4268
4269
4270/* ------------------------------ */
4271    .balign 128
4272.L_op_mul_int: /* 0x92 */
4273/* File: mips64/op_mul_int.S */
4274/* File: mips64/binop.S */
4275    /*
4276     * Generic 32-bit binary operation.  Provide an "instr" line that
4277     * specifies an instruction that performs "result = a0 op a1".
4278     * This could be a MIPS instruction or a function call.  (If the result
4279     * comes back in a register other than a0, you can override "result".)
4280     *
4281     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4282     * vCC (a1).  Useful for integer division and modulus.  Note that we
4283     * *don't* check for (INT_MIN / -1) here, because the CPU handles it
4284     * correctly.
4285     *
4286     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4287     *      xor-int, shl-int, shr-int, ushr-int
4288     */
4289    /* binop vAA, vBB, vCC */
4290    srl     a4, rINST, 8                # a4 <- AA
4291    lbu     a2, 2(rPC)                  # a2 <- BB
4292    lbu     a3, 3(rPC)                  # a3 <- CC
4293    GET_VREG a0, a2                     # a0 <- vBB
4294    GET_VREG a1, a3                     # a1 <- vCC
4295    .if 0
4296    beqz    a1, common_errDivideByZero  # is second operand zero?
4297    .endif
4298    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
4299                               # optional op
4300    mul a0, a0, a1                              # a0 <- op, a0-a3 changed
4301    GET_INST_OPCODE v0                  # extract opcode from rINST
4302    SET_VREG a0, a4                # vAA <- a0
4303    GOTO_OPCODE v0                      # jump to next instruction
4304
4305
4306/* ------------------------------ */
4307    .balign 128
4308.L_op_div_int: /* 0x93 */
4309/* File: mips64/op_div_int.S */
4310/* File: mips64/binop.S */
4311    /*
4312     * Generic 32-bit binary operation.  Provide an "instr" line that
4313     * specifies an instruction that performs "result = a0 op a1".
4314     * This could be a MIPS instruction or a function call.  (If the result
4315     * comes back in a register other than a0, you can override "result".)
4316     *
4317     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4318     * vCC (a1).  Useful for integer division and modulus.  Note that we
4319     * *don't* check for (INT_MIN / -1) here, because the CPU handles it
4320     * correctly.
4321     *
4322     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4323     *      xor-int, shl-int, shr-int, ushr-int
4324     */
4325    /* binop vAA, vBB, vCC */
4326    srl     a4, rINST, 8                # a4 <- AA
4327    lbu     a2, 2(rPC)                  # a2 <- BB
4328    lbu     a3, 3(rPC)                  # a3 <- CC
4329    GET_VREG a0, a2                     # a0 <- vBB
4330    GET_VREG a1, a3                     # a1 <- vCC
4331    .if 1
4332    beqz    a1, common_errDivideByZero  # is second operand zero?
4333    .endif
4334    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
4335                               # optional op
4336    div a0, a0, a1                              # a0 <- op, a0-a3 changed
4337    GET_INST_OPCODE v0                  # extract opcode from rINST
4338    SET_VREG a0, a4                # vAA <- a0
4339    GOTO_OPCODE v0                      # jump to next instruction
4340
4341
4342/* ------------------------------ */
4343    .balign 128
4344.L_op_rem_int: /* 0x94 */
4345/* File: mips64/op_rem_int.S */
4346/* File: mips64/binop.S */
4347    /*
4348     * Generic 32-bit binary operation.  Provide an "instr" line that
4349     * specifies an instruction that performs "result = a0 op a1".
4350     * This could be a MIPS instruction or a function call.  (If the result
4351     * comes back in a register other than a0, you can override "result".)
4352     *
4353     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4354     * vCC (a1).  Useful for integer division and modulus.  Note that we
4355     * *don't* check for (INT_MIN / -1) here, because the CPU handles it
4356     * correctly.
4357     *
4358     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4359     *      xor-int, shl-int, shr-int, ushr-int
4360     */
4361    /* binop vAA, vBB, vCC */
4362    srl     a4, rINST, 8                # a4 <- AA
4363    lbu     a2, 2(rPC)                  # a2 <- BB
4364    lbu     a3, 3(rPC)                  # a3 <- CC
4365    GET_VREG a0, a2                     # a0 <- vBB
4366    GET_VREG a1, a3                     # a1 <- vCC
4367    .if 1
4368    beqz    a1, common_errDivideByZero  # is second operand zero?
4369    .endif
4370    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
4371                               # optional op
4372    mod a0, a0, a1                              # a0 <- op, a0-a3 changed
4373    GET_INST_OPCODE v0                  # extract opcode from rINST
4374    SET_VREG a0, a4                # vAA <- a0
4375    GOTO_OPCODE v0                      # jump to next instruction
4376
4377
4378/* ------------------------------ */
4379    .balign 128
4380.L_op_and_int: /* 0x95 */
4381/* File: mips64/op_and_int.S */
4382/* File: mips64/binop.S */
4383    /*
4384     * Generic 32-bit binary operation.  Provide an "instr" line that
4385     * specifies an instruction that performs "result = a0 op a1".
4386     * This could be a MIPS instruction or a function call.  (If the result
4387     * comes back in a register other than a0, you can override "result".)
4388     *
4389     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4390     * vCC (a1).  Useful for integer division and modulus.  Note that we
4391     * *don't* check for (INT_MIN / -1) here, because the CPU handles it
4392     * correctly.
4393     *
4394     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4395     *      xor-int, shl-int, shr-int, ushr-int
4396     */
4397    /* binop vAA, vBB, vCC */
4398    srl     a4, rINST, 8                # a4 <- AA
4399    lbu     a2, 2(rPC)                  # a2 <- BB
4400    lbu     a3, 3(rPC)                  # a3 <- CC
4401    GET_VREG a0, a2                     # a0 <- vBB
4402    GET_VREG a1, a3                     # a1 <- vCC
4403    .if 0
4404    beqz    a1, common_errDivideByZero  # is second operand zero?
4405    .endif
4406    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
4407                               # optional op
4408    and a0, a0, a1                              # a0 <- op, a0-a3 changed
4409    GET_INST_OPCODE v0                  # extract opcode from rINST
4410    SET_VREG a0, a4                # vAA <- a0
4411    GOTO_OPCODE v0                      # jump to next instruction
4412
4413
4414/* ------------------------------ */
4415    .balign 128
4416.L_op_or_int: /* 0x96 */
4417/* File: mips64/op_or_int.S */
4418/* File: mips64/binop.S */
4419    /*
4420     * Generic 32-bit binary operation.  Provide an "instr" line that
4421     * specifies an instruction that performs "result = a0 op a1".
4422     * This could be a MIPS instruction or a function call.  (If the result
4423     * comes back in a register other than a0, you can override "result".)
4424     *
4425     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4426     * vCC (a1).  Useful for integer division and modulus.  Note that we
4427     * *don't* check for (INT_MIN / -1) here, because the CPU handles it
4428     * correctly.
4429     *
4430     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4431     *      xor-int, shl-int, shr-int, ushr-int
4432     */
4433    /* binop vAA, vBB, vCC */
4434    srl     a4, rINST, 8                # a4 <- AA
4435    lbu     a2, 2(rPC)                  # a2 <- BB
4436    lbu     a3, 3(rPC)                  # a3 <- CC
4437    GET_VREG a0, a2                     # a0 <- vBB
4438    GET_VREG a1, a3                     # a1 <- vCC
4439    .if 0
4440    beqz    a1, common_errDivideByZero  # is second operand zero?
4441    .endif
4442    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
4443                               # optional op
4444    or a0, a0, a1                              # a0 <- op, a0-a3 changed
4445    GET_INST_OPCODE v0                  # extract opcode from rINST
4446    SET_VREG a0, a4                # vAA <- a0
4447    GOTO_OPCODE v0                      # jump to next instruction
4448
4449
4450/* ------------------------------ */
4451    .balign 128
4452.L_op_xor_int: /* 0x97 */
4453/* File: mips64/op_xor_int.S */
4454/* File: mips64/binop.S */
4455    /*
4456     * Generic 32-bit binary operation.  Provide an "instr" line that
4457     * specifies an instruction that performs "result = a0 op a1".
4458     * This could be a MIPS instruction or a function call.  (If the result
4459     * comes back in a register other than a0, you can override "result".)
4460     *
4461     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4462     * vCC (a1).  Useful for integer division and modulus.  Note that we
4463     * *don't* check for (INT_MIN / -1) here, because the CPU handles it
4464     * correctly.
4465     *
4466     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4467     *      xor-int, shl-int, shr-int, ushr-int
4468     */
4469    /* binop vAA, vBB, vCC */
4470    srl     a4, rINST, 8                # a4 <- AA
4471    lbu     a2, 2(rPC)                  # a2 <- BB
4472    lbu     a3, 3(rPC)                  # a3 <- CC
4473    GET_VREG a0, a2                     # a0 <- vBB
4474    GET_VREG a1, a3                     # a1 <- vCC
4475    .if 0
4476    beqz    a1, common_errDivideByZero  # is second operand zero?
4477    .endif
4478    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
4479                               # optional op
4480    xor a0, a0, a1                              # a0 <- op, a0-a3 changed
4481    GET_INST_OPCODE v0                  # extract opcode from rINST
4482    SET_VREG a0, a4                # vAA <- a0
4483    GOTO_OPCODE v0                      # jump to next instruction
4484
4485
4486/* ------------------------------ */
4487    .balign 128
4488.L_op_shl_int: /* 0x98 */
4489/* File: mips64/op_shl_int.S */
4490/* File: mips64/binop.S */
4491    /*
4492     * Generic 32-bit binary operation.  Provide an "instr" line that
4493     * specifies an instruction that performs "result = a0 op a1".
4494     * This could be a MIPS instruction or a function call.  (If the result
4495     * comes back in a register other than a0, you can override "result".)
4496     *
4497     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4498     * vCC (a1).  Useful for integer division and modulus.  Note that we
4499     * *don't* check for (INT_MIN / -1) here, because the CPU handles it
4500     * correctly.
4501     *
4502     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4503     *      xor-int, shl-int, shr-int, ushr-int
4504     */
4505    /* binop vAA, vBB, vCC */
4506    srl     a4, rINST, 8                # a4 <- AA
4507    lbu     a2, 2(rPC)                  # a2 <- BB
4508    lbu     a3, 3(rPC)                  # a3 <- CC
4509    GET_VREG a0, a2                     # a0 <- vBB
4510    GET_VREG a1, a3                     # a1 <- vCC
4511    .if 0
4512    beqz    a1, common_errDivideByZero  # is second operand zero?
4513    .endif
4514    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
4515                               # optional op
4516    sll a0, a0, a1                              # a0 <- op, a0-a3 changed
4517    GET_INST_OPCODE v0                  # extract opcode from rINST
4518    SET_VREG a0, a4                # vAA <- a0
4519    GOTO_OPCODE v0                      # jump to next instruction
4520
4521
4522/* ------------------------------ */
4523    .balign 128
4524.L_op_shr_int: /* 0x99 */
4525/* File: mips64/op_shr_int.S */
4526/* File: mips64/binop.S */
4527    /*
4528     * Generic 32-bit binary operation.  Provide an "instr" line that
4529     * specifies an instruction that performs "result = a0 op a1".
4530     * This could be a MIPS instruction or a function call.  (If the result
4531     * comes back in a register other than a0, you can override "result".)
4532     *
4533     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4534     * vCC (a1).  Useful for integer division and modulus.  Note that we
4535     * *don't* check for (INT_MIN / -1) here, because the CPU handles it
4536     * correctly.
4537     *
4538     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4539     *      xor-int, shl-int, shr-int, ushr-int
4540     */
4541    /* binop vAA, vBB, vCC */
4542    srl     a4, rINST, 8                # a4 <- AA
4543    lbu     a2, 2(rPC)                  # a2 <- BB
4544    lbu     a3, 3(rPC)                  # a3 <- CC
4545    GET_VREG a0, a2                     # a0 <- vBB
4546    GET_VREG a1, a3                     # a1 <- vCC
4547    .if 0
4548    beqz    a1, common_errDivideByZero  # is second operand zero?
4549    .endif
4550    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
4551                               # optional op
4552    sra a0, a0, a1                              # a0 <- op, a0-a3 changed
4553    GET_INST_OPCODE v0                  # extract opcode from rINST
4554    SET_VREG a0, a4                # vAA <- a0
4555    GOTO_OPCODE v0                      # jump to next instruction
4556
4557
4558/* ------------------------------ */
4559    .balign 128
4560.L_op_ushr_int: /* 0x9a */
4561/* File: mips64/op_ushr_int.S */
4562/* File: mips64/binop.S */
4563    /*
4564     * Generic 32-bit binary operation.  Provide an "instr" line that
4565     * specifies an instruction that performs "result = a0 op a1".
4566     * This could be a MIPS instruction or a function call.  (If the result
4567     * comes back in a register other than a0, you can override "result".)
4568     *
4569     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4570     * vCC (a1).  Useful for integer division and modulus.  Note that we
4571     * *don't* check for (INT_MIN / -1) here, because the CPU handles it
4572     * correctly.
4573     *
4574     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4575     *      xor-int, shl-int, shr-int, ushr-int
4576     */
4577    /* binop vAA, vBB, vCC */
4578    srl     a4, rINST, 8                # a4 <- AA
4579    lbu     a2, 2(rPC)                  # a2 <- BB
4580    lbu     a3, 3(rPC)                  # a3 <- CC
4581    GET_VREG a0, a2                     # a0 <- vBB
4582    GET_VREG a1, a3                     # a1 <- vCC
4583    .if 0
4584    beqz    a1, common_errDivideByZero  # is second operand zero?
4585    .endif
4586    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
4587                               # optional op
4588    srl a0, a0, a1                              # a0 <- op, a0-a3 changed
4589    GET_INST_OPCODE v0                  # extract opcode from rINST
4590    SET_VREG a0, a4                # vAA <- a0
4591    GOTO_OPCODE v0                      # jump to next instruction
4592
4593
4594/* ------------------------------ */
4595    .balign 128
4596.L_op_add_long: /* 0x9b */
4597/* File: mips64/op_add_long.S */
4598/* File: mips64/binopWide.S */
4599    /*
4600     * Generic 64-bit binary operation.  Provide an "instr" line that
4601     * specifies an instruction that performs "result = a0 op a1".
4602     * This could be a MIPS instruction or a function call.  (If the result
4603     * comes back in a register other than a0, you can override "result".)
4604     *
4605     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4606     * vCC (a1).  Useful for integer division and modulus.  Note that we
4607     * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
4608     * correctly.
4609     *
4610     * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4611     *      xor-long, shl-long, shr-long, ushr-long
4612     */
4613    /* binop vAA, vBB, vCC */
4614    srl     a4, rINST, 8                # a4 <- AA
4615    lbu     a2, 2(rPC)                  # a2 <- BB
4616    lbu     a3, 3(rPC)                  # a3 <- CC
4617    GET_VREG_WIDE a0, a2                # a0 <- vBB
4618    GET_VREG_WIDE a1, a3                # a1 <- vCC
4619    .if 0
4620    beqz    a1, common_errDivideByZero  # is second operand zero?
4621    .endif
4622    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
4623                               # optional op
4624    daddu a0, a0, a1                              # a0 <- op, a0-a3 changed
4625    GET_INST_OPCODE v0                  # extract opcode from rINST
4626    SET_VREG_WIDE a0, a4           # vAA <- a0
4627    GOTO_OPCODE v0                      # jump to next instruction
4628
4629
4630/* ------------------------------ */
4631    .balign 128
4632.L_op_sub_long: /* 0x9c */
4633/* File: mips64/op_sub_long.S */
4634/* File: mips64/binopWide.S */
4635    /*
4636     * Generic 64-bit binary operation.  Provide an "instr" line that
4637     * specifies an instruction that performs "result = a0 op a1".
4638     * This could be a MIPS instruction or a function call.  (If the result
4639     * comes back in a register other than a0, you can override "result".)
4640     *
4641     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4642     * vCC (a1).  Useful for integer division and modulus.  Note that we
4643     * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
4644     * correctly.
4645     *
4646     * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4647     *      xor-long, shl-long, shr-long, ushr-long
4648     */
4649    /* binop vAA, vBB, vCC */
4650    srl     a4, rINST, 8                # a4 <- AA
4651    lbu     a2, 2(rPC)                  # a2 <- BB
4652    lbu     a3, 3(rPC)                  # a3 <- CC
4653    GET_VREG_WIDE a0, a2                # a0 <- vBB
4654    GET_VREG_WIDE a1, a3                # a1 <- vCC
4655    .if 0
4656    beqz    a1, common_errDivideByZero  # is second operand zero?
4657    .endif
4658    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
4659                               # optional op
4660    dsubu a0, a0, a1                              # a0 <- op, a0-a3 changed
4661    GET_INST_OPCODE v0                  # extract opcode from rINST
4662    SET_VREG_WIDE a0, a4           # vAA <- a0
4663    GOTO_OPCODE v0                      # jump to next instruction
4664
4665
4666/* ------------------------------ */
4667    .balign 128
4668.L_op_mul_long: /* 0x9d */
4669/* File: mips64/op_mul_long.S */
4670/* File: mips64/binopWide.S */
4671    /*
4672     * Generic 64-bit binary operation.  Provide an "instr" line that
4673     * specifies an instruction that performs "result = a0 op a1".
4674     * This could be a MIPS instruction or a function call.  (If the result
4675     * comes back in a register other than a0, you can override "result".)
4676     *
4677     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4678     * vCC (a1).  Useful for integer division and modulus.  Note that we
4679     * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
4680     * correctly.
4681     *
4682     * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4683     *      xor-long, shl-long, shr-long, ushr-long
4684     */
4685    /* binop vAA, vBB, vCC */
4686    srl     a4, rINST, 8                # a4 <- AA
4687    lbu     a2, 2(rPC)                  # a2 <- BB
4688    lbu     a3, 3(rPC)                  # a3 <- CC
4689    GET_VREG_WIDE a0, a2                # a0 <- vBB
4690    GET_VREG_WIDE a1, a3                # a1 <- vCC
4691    .if 0
4692    beqz    a1, common_errDivideByZero  # is second operand zero?
4693    .endif
4694    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
4695                               # optional op
4696    dmul a0, a0, a1                              # a0 <- op, a0-a3 changed
4697    GET_INST_OPCODE v0                  # extract opcode from rINST
4698    SET_VREG_WIDE a0, a4           # vAA <- a0
4699    GOTO_OPCODE v0                      # jump to next instruction
4700
4701
4702/* ------------------------------ */
4703    .balign 128
4704.L_op_div_long: /* 0x9e */
4705/* File: mips64/op_div_long.S */
4706/* File: mips64/binopWide.S */
4707    /*
4708     * Generic 64-bit binary operation.  Provide an "instr" line that
4709     * specifies an instruction that performs "result = a0 op a1".
4710     * This could be a MIPS instruction or a function call.  (If the result
4711     * comes back in a register other than a0, you can override "result".)
4712     *
4713     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4714     * vCC (a1).  Useful for integer division and modulus.  Note that we
4715     * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
4716     * correctly.
4717     *
4718     * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4719     *      xor-long, shl-long, shr-long, ushr-long
4720     */
4721    /* binop vAA, vBB, vCC */
4722    srl     a4, rINST, 8                # a4 <- AA
4723    lbu     a2, 2(rPC)                  # a2 <- BB
4724    lbu     a3, 3(rPC)                  # a3 <- CC
4725    GET_VREG_WIDE a0, a2                # a0 <- vBB
4726    GET_VREG_WIDE a1, a3                # a1 <- vCC
4727    .if 1
4728    beqz    a1, common_errDivideByZero  # is second operand zero?
4729    .endif
4730    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
4731                               # optional op
4732    ddiv a0, a0, a1                              # a0 <- op, a0-a3 changed
4733    GET_INST_OPCODE v0                  # extract opcode from rINST
4734    SET_VREG_WIDE a0, a4           # vAA <- a0
4735    GOTO_OPCODE v0                      # jump to next instruction
4736
4737
4738/* ------------------------------ */
4739    .balign 128
4740.L_op_rem_long: /* 0x9f */
4741/* File: mips64/op_rem_long.S */
4742/* File: mips64/binopWide.S */
4743    /*
4744     * Generic 64-bit binary operation.  Provide an "instr" line that
4745     * specifies an instruction that performs "result = a0 op a1".
4746     * This could be a MIPS instruction or a function call.  (If the result
4747     * comes back in a register other than a0, you can override "result".)
4748     *
4749     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4750     * vCC (a1).  Useful for integer division and modulus.  Note that we
4751     * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
4752     * correctly.
4753     *
4754     * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4755     *      xor-long, shl-long, shr-long, ushr-long
4756     */
4757    /* binop vAA, vBB, vCC */
4758    srl     a4, rINST, 8                # a4 <- AA
4759    lbu     a2, 2(rPC)                  # a2 <- BB
4760    lbu     a3, 3(rPC)                  # a3 <- CC
4761    GET_VREG_WIDE a0, a2                # a0 <- vBB
4762    GET_VREG_WIDE a1, a3                # a1 <- vCC
4763    .if 1
4764    beqz    a1, common_errDivideByZero  # is second operand zero?
4765    .endif
4766    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
4767                               # optional op
4768    dmod a0, a0, a1                              # a0 <- op, a0-a3 changed
4769    GET_INST_OPCODE v0                  # extract opcode from rINST
4770    SET_VREG_WIDE a0, a4           # vAA <- a0
4771    GOTO_OPCODE v0                      # jump to next instruction
4772
4773
4774/* ------------------------------ */
4775    .balign 128
4776.L_op_and_long: /* 0xa0 */
4777/* File: mips64/op_and_long.S */
4778/* File: mips64/binopWide.S */
4779    /*
4780     * Generic 64-bit binary operation.  Provide an "instr" line that
4781     * specifies an instruction that performs "result = a0 op a1".
4782     * This could be a MIPS instruction or a function call.  (If the result
4783     * comes back in a register other than a0, you can override "result".)
4784     *
4785     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4786     * vCC (a1).  Useful for integer division and modulus.  Note that we
4787     * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
4788     * correctly.
4789     *
4790     * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4791     *      xor-long, shl-long, shr-long, ushr-long
4792     */
4793    /* binop vAA, vBB, vCC */
4794    srl     a4, rINST, 8                # a4 <- AA
4795    lbu     a2, 2(rPC)                  # a2 <- BB
4796    lbu     a3, 3(rPC)                  # a3 <- CC
4797    GET_VREG_WIDE a0, a2                # a0 <- vBB
4798    GET_VREG_WIDE a1, a3                # a1 <- vCC
4799    .if 0
4800    beqz    a1, common_errDivideByZero  # is second operand zero?
4801    .endif
4802    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
4803                               # optional op
4804    and a0, a0, a1                              # a0 <- op, a0-a3 changed
4805    GET_INST_OPCODE v0                  # extract opcode from rINST
4806    SET_VREG_WIDE a0, a4           # vAA <- a0
4807    GOTO_OPCODE v0                      # jump to next instruction
4808
4809
4810/* ------------------------------ */
4811    .balign 128
4812.L_op_or_long: /* 0xa1 */
4813/* File: mips64/op_or_long.S */
4814/* File: mips64/binopWide.S */
4815    /*
4816     * Generic 64-bit binary operation.  Provide an "instr" line that
4817     * specifies an instruction that performs "result = a0 op a1".
4818     * This could be a MIPS instruction or a function call.  (If the result
4819     * comes back in a register other than a0, you can override "result".)
4820     *
4821     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4822     * vCC (a1).  Useful for integer division and modulus.  Note that we
4823     * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
4824     * correctly.
4825     *
4826     * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4827     *      xor-long, shl-long, shr-long, ushr-long
4828     */
4829    /* binop vAA, vBB, vCC */
4830    srl     a4, rINST, 8                # a4 <- AA
4831    lbu     a2, 2(rPC)                  # a2 <- BB
4832    lbu     a3, 3(rPC)                  # a3 <- CC
4833    GET_VREG_WIDE a0, a2                # a0 <- vBB
4834    GET_VREG_WIDE a1, a3                # a1 <- vCC
4835    .if 0
4836    beqz    a1, common_errDivideByZero  # is second operand zero?
4837    .endif
4838    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
4839                               # optional op
4840    or a0, a0, a1                              # a0 <- op, a0-a3 changed
4841    GET_INST_OPCODE v0                  # extract opcode from rINST
4842    SET_VREG_WIDE a0, a4           # vAA <- a0
4843    GOTO_OPCODE v0                      # jump to next instruction
4844
4845
4846/* ------------------------------ */
4847    .balign 128
4848.L_op_xor_long: /* 0xa2 */
4849/* File: mips64/op_xor_long.S */
4850/* File: mips64/binopWide.S */
4851    /*
4852     * Generic 64-bit binary operation.  Provide an "instr" line that
4853     * specifies an instruction that performs "result = a0 op a1".
4854     * This could be a MIPS instruction or a function call.  (If the result
4855     * comes back in a register other than a0, you can override "result".)
4856     *
4857     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4858     * vCC (a1).  Useful for integer division and modulus.  Note that we
4859     * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
4860     * correctly.
4861     *
4862     * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4863     *      xor-long, shl-long, shr-long, ushr-long
4864     */
4865    /* binop vAA, vBB, vCC */
4866    srl     a4, rINST, 8                # a4 <- AA
4867    lbu     a2, 2(rPC)                  # a2 <- BB
4868    lbu     a3, 3(rPC)                  # a3 <- CC
4869    GET_VREG_WIDE a0, a2                # a0 <- vBB
4870    GET_VREG_WIDE a1, a3                # a1 <- vCC
4871    .if 0
4872    beqz    a1, common_errDivideByZero  # is second operand zero?
4873    .endif
4874    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
4875                               # optional op
4876    xor a0, a0, a1                              # a0 <- op, a0-a3 changed
4877    GET_INST_OPCODE v0                  # extract opcode from rINST
4878    SET_VREG_WIDE a0, a4           # vAA <- a0
4879    GOTO_OPCODE v0                      # jump to next instruction
4880
4881
4882/* ------------------------------ */
4883    .balign 128
4884.L_op_shl_long: /* 0xa3 */
4885/* File: mips64/op_shl_long.S */
4886/* File: mips64/binopWide.S */
4887    /*
4888     * Generic 64-bit binary operation.  Provide an "instr" line that
4889     * specifies an instruction that performs "result = a0 op a1".
4890     * This could be a MIPS instruction or a function call.  (If the result
4891     * comes back in a register other than a0, you can override "result".)
4892     *
4893     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4894     * vCC (a1).  Useful for integer division and modulus.  Note that we
4895     * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
4896     * correctly.
4897     *
4898     * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4899     *      xor-long, shl-long, shr-long, ushr-long
4900     */
4901    /* binop vAA, vBB, vCC */
4902    srl     a4, rINST, 8                # a4 <- AA
4903    lbu     a2, 2(rPC)                  # a2 <- BB
4904    lbu     a3, 3(rPC)                  # a3 <- CC
4905    GET_VREG_WIDE a0, a2                # a0 <- vBB
4906    GET_VREG_WIDE a1, a3                # a1 <- vCC
4907    .if 0
4908    beqz    a1, common_errDivideByZero  # is second operand zero?
4909    .endif
4910    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
4911                               # optional op
4912    dsll a0, a0, a1                              # a0 <- op, a0-a3 changed
4913    GET_INST_OPCODE v0                  # extract opcode from rINST
4914    SET_VREG_WIDE a0, a4           # vAA <- a0
4915    GOTO_OPCODE v0                      # jump to next instruction
4916
4917
4918/* ------------------------------ */
4919    .balign 128
4920.L_op_shr_long: /* 0xa4 */
4921/* File: mips64/op_shr_long.S */
4922/* File: mips64/binopWide.S */
4923    /*
4924     * Generic 64-bit binary operation.  Provide an "instr" line that
4925     * specifies an instruction that performs "result = a0 op a1".
4926     * This could be a MIPS instruction or a function call.  (If the result
4927     * comes back in a register other than a0, you can override "result".)
4928     *
4929     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4930     * vCC (a1).  Useful for integer division and modulus.  Note that we
4931     * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
4932     * correctly.
4933     *
4934     * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4935     *      xor-long, shl-long, shr-long, ushr-long
4936     */
4937    /* binop vAA, vBB, vCC */
4938    srl     a4, rINST, 8                # a4 <- AA
4939    lbu     a2, 2(rPC)                  # a2 <- BB
4940    lbu     a3, 3(rPC)                  # a3 <- CC
4941    GET_VREG_WIDE a0, a2                # a0 <- vBB
4942    GET_VREG_WIDE a1, a3                # a1 <- vCC
4943    .if 0
4944    beqz    a1, common_errDivideByZero  # is second operand zero?
4945    .endif
4946    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
4947                               # optional op
4948    dsra a0, a0, a1                              # a0 <- op, a0-a3 changed
4949    GET_INST_OPCODE v0                  # extract opcode from rINST
4950    SET_VREG_WIDE a0, a4           # vAA <- a0
4951    GOTO_OPCODE v0                      # jump to next instruction
4952
4953
4954/* ------------------------------ */
4955    .balign 128
4956.L_op_ushr_long: /* 0xa5 */
4957/* File: mips64/op_ushr_long.S */
4958/* File: mips64/binopWide.S */
4959    /*
4960     * Generic 64-bit binary operation.  Provide an "instr" line that
4961     * specifies an instruction that performs "result = a0 op a1".
4962     * This could be a MIPS instruction or a function call.  (If the result
4963     * comes back in a register other than a0, you can override "result".)
4964     *
4965     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4966     * vCC (a1).  Useful for integer division and modulus.  Note that we
4967     * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
4968     * correctly.
4969     *
4970     * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4971     *      xor-long, shl-long, shr-long, ushr-long
4972     */
4973    /* binop vAA, vBB, vCC */
4974    srl     a4, rINST, 8                # a4 <- AA
4975    lbu     a2, 2(rPC)                  # a2 <- BB
4976    lbu     a3, 3(rPC)                  # a3 <- CC
4977    GET_VREG_WIDE a0, a2                # a0 <- vBB
4978    GET_VREG_WIDE a1, a3                # a1 <- vCC
4979    .if 0
4980    beqz    a1, common_errDivideByZero  # is second operand zero?
4981    .endif
4982    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
4983                               # optional op
4984    dsrl a0, a0, a1                              # a0 <- op, a0-a3 changed
4985    GET_INST_OPCODE v0                  # extract opcode from rINST
4986    SET_VREG_WIDE a0, a4           # vAA <- a0
4987    GOTO_OPCODE v0                      # jump to next instruction
4988
4989
4990/* ------------------------------ */
4991    .balign 128
4992.L_op_add_float: /* 0xa6 */
4993/* File: mips64/op_add_float.S */
4994/* File: mips64/fbinop.S */
4995    /*:
4996     * Generic 32-bit floating-point operation.
4997     *
4998     * For: add-float, sub-float, mul-float, div-float.
4999     * form: <op> f0, f0, f1
5000     */
5001    /* binop vAA, vBB, vCC */
5002    srl     a4, rINST, 8                # a4 <- AA
5003    lbu     a2, 2(rPC)                  # a2 <- BB
5004    lbu     a3, 3(rPC)                  # a3 <- CC
5005    GET_VREG_FLOAT f0, a2               # f0 <- vBB
5006    GET_VREG_FLOAT f1, a3               # f1 <- vCC
5007    add.s f0, f0, f1                              # f0 <- f0 op f1
5008    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
5009    GET_INST_OPCODE v0                  # extract opcode from rINST
5010    SET_VREG_FLOAT f0, a4               # vAA <- f0
5011    GOTO_OPCODE v0                      # jump to next instruction
5012
5013
5014/* ------------------------------ */
5015    .balign 128
5016.L_op_sub_float: /* 0xa7 */
5017/* File: mips64/op_sub_float.S */
5018/* File: mips64/fbinop.S */
5019    /*:
5020     * Generic 32-bit floating-point operation.
5021     *
5022     * For: add-float, sub-float, mul-float, div-float.
5023     * form: <op> f0, f0, f1
5024     */
5025    /* binop vAA, vBB, vCC */
5026    srl     a4, rINST, 8                # a4 <- AA
5027    lbu     a2, 2(rPC)                  # a2 <- BB
5028    lbu     a3, 3(rPC)                  # a3 <- CC
5029    GET_VREG_FLOAT f0, a2               # f0 <- vBB
5030    GET_VREG_FLOAT f1, a3               # f1 <- vCC
5031    sub.s f0, f0, f1                              # f0 <- f0 op f1
5032    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
5033    GET_INST_OPCODE v0                  # extract opcode from rINST
5034    SET_VREG_FLOAT f0, a4               # vAA <- f0
5035    GOTO_OPCODE v0                      # jump to next instruction
5036
5037
5038/* ------------------------------ */
5039    .balign 128
5040.L_op_mul_float: /* 0xa8 */
5041/* File: mips64/op_mul_float.S */
5042/* File: mips64/fbinop.S */
5043    /*:
5044     * Generic 32-bit floating-point operation.
5045     *
5046     * For: add-float, sub-float, mul-float, div-float.
5047     * form: <op> f0, f0, f1
5048     */
5049    /* binop vAA, vBB, vCC */
5050    srl     a4, rINST, 8                # a4 <- AA
5051    lbu     a2, 2(rPC)                  # a2 <- BB
5052    lbu     a3, 3(rPC)                  # a3 <- CC
5053    GET_VREG_FLOAT f0, a2               # f0 <- vBB
5054    GET_VREG_FLOAT f1, a3               # f1 <- vCC
5055    mul.s f0, f0, f1                              # f0 <- f0 op f1
5056    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
5057    GET_INST_OPCODE v0                  # extract opcode from rINST
5058    SET_VREG_FLOAT f0, a4               # vAA <- f0
5059    GOTO_OPCODE v0                      # jump to next instruction
5060
5061
5062/* ------------------------------ */
5063    .balign 128
5064.L_op_div_float: /* 0xa9 */
5065/* File: mips64/op_div_float.S */
5066/* File: mips64/fbinop.S */
5067    /*:
5068     * Generic 32-bit floating-point operation.
5069     *
5070     * For: add-float, sub-float, mul-float, div-float.
5071     * form: <op> f0, f0, f1
5072     */
5073    /* binop vAA, vBB, vCC */
5074    srl     a4, rINST, 8                # a4 <- AA
5075    lbu     a2, 2(rPC)                  # a2 <- BB
5076    lbu     a3, 3(rPC)                  # a3 <- CC
5077    GET_VREG_FLOAT f0, a2               # f0 <- vBB
5078    GET_VREG_FLOAT f1, a3               # f1 <- vCC
5079    div.s f0, f0, f1                              # f0 <- f0 op f1
5080    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
5081    GET_INST_OPCODE v0                  # extract opcode from rINST
5082    SET_VREG_FLOAT f0, a4               # vAA <- f0
5083    GOTO_OPCODE v0                      # jump to next instruction
5084
5085
5086/* ------------------------------ */
5087    .balign 128
5088.L_op_rem_float: /* 0xaa */
5089/* File: mips64/op_rem_float.S */
5090    /* rem-float vAA, vBB, vCC */
5091    .extern fmodf
5092    lbu     a2, 2(rPC)                  # a2 <- BB
5093    lbu     a3, 3(rPC)                  # a3 <- CC
5094    GET_VREG_FLOAT f12, a2              # f12 <- vBB
5095    GET_VREG_FLOAT f13, a3              # f13 <- vCC
5096    jal     fmodf                       # f0 <- f12 op f13
5097    srl     a4, rINST, 8                # a4 <- AA
5098    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
5099    GET_INST_OPCODE v0                  # extract opcode from rINST
5100    SET_VREG_FLOAT f0, a4               # vAA <- f0
5101    GOTO_OPCODE v0                      # jump to next instruction
5102
5103/* ------------------------------ */
5104    .balign 128
5105.L_op_add_double: /* 0xab */
5106/* File: mips64/op_add_double.S */
5107/* File: mips64/fbinopWide.S */
5108    /*:
5109     * Generic 64-bit floating-point operation.
5110     *
5111     * For: add-double, sub-double, mul-double, div-double.
5112     * form: <op> f0, f0, f1
5113     */
5114    /* binop vAA, vBB, vCC */
5115    srl     a4, rINST, 8                # a4 <- AA
5116    lbu     a2, 2(rPC)                  # a2 <- BB
5117    lbu     a3, 3(rPC)                  # a3 <- CC
5118    GET_VREG_DOUBLE f0, a2              # f0 <- vBB
5119    GET_VREG_DOUBLE f1, a3              # f1 <- vCC
5120    add.d f0, f0, f1                              # f0 <- f0 op f1
5121    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
5122    GET_INST_OPCODE v0                  # extract opcode from rINST
5123    SET_VREG_DOUBLE f0, a4              # vAA <- f0
5124    GOTO_OPCODE v0                      # jump to next instruction
5125
5126
5127/* ------------------------------ */
5128    .balign 128
5129.L_op_sub_double: /* 0xac */
5130/* File: mips64/op_sub_double.S */
5131/* File: mips64/fbinopWide.S */
5132    /*:
5133     * Generic 64-bit floating-point operation.
5134     *
5135     * For: add-double, sub-double, mul-double, div-double.
5136     * form: <op> f0, f0, f1
5137     */
5138    /* binop vAA, vBB, vCC */
5139    srl     a4, rINST, 8                # a4 <- AA
5140    lbu     a2, 2(rPC)                  # a2 <- BB
5141    lbu     a3, 3(rPC)                  # a3 <- CC
5142    GET_VREG_DOUBLE f0, a2              # f0 <- vBB
5143    GET_VREG_DOUBLE f1, a3              # f1 <- vCC
5144    sub.d f0, f0, f1                              # f0 <- f0 op f1
5145    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
5146    GET_INST_OPCODE v0                  # extract opcode from rINST
5147    SET_VREG_DOUBLE f0, a4              # vAA <- f0
5148    GOTO_OPCODE v0                      # jump to next instruction
5149
5150
5151/* ------------------------------ */
5152    .balign 128
5153.L_op_mul_double: /* 0xad */
5154/* File: mips64/op_mul_double.S */
5155/* File: mips64/fbinopWide.S */
5156    /*:
5157     * Generic 64-bit floating-point operation.
5158     *
5159     * For: add-double, sub-double, mul-double, div-double.
5160     * form: <op> f0, f0, f1
5161     */
5162    /* binop vAA, vBB, vCC */
5163    srl     a4, rINST, 8                # a4 <- AA
5164    lbu     a2, 2(rPC)                  # a2 <- BB
5165    lbu     a3, 3(rPC)                  # a3 <- CC
5166    GET_VREG_DOUBLE f0, a2              # f0 <- vBB
5167    GET_VREG_DOUBLE f1, a3              # f1 <- vCC
5168    mul.d f0, f0, f1                              # f0 <- f0 op f1
5169    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
5170    GET_INST_OPCODE v0                  # extract opcode from rINST
5171    SET_VREG_DOUBLE f0, a4              # vAA <- f0
5172    GOTO_OPCODE v0                      # jump to next instruction
5173
5174
5175/* ------------------------------ */
5176    .balign 128
5177.L_op_div_double: /* 0xae */
5178/* File: mips64/op_div_double.S */
5179/* File: mips64/fbinopWide.S */
5180    /*:
5181     * Generic 64-bit floating-point operation.
5182     *
5183     * For: add-double, sub-double, mul-double, div-double.
5184     * form: <op> f0, f0, f1
5185     */
5186    /* binop vAA, vBB, vCC */
5187    srl     a4, rINST, 8                # a4 <- AA
5188    lbu     a2, 2(rPC)                  # a2 <- BB
5189    lbu     a3, 3(rPC)                  # a3 <- CC
5190    GET_VREG_DOUBLE f0, a2              # f0 <- vBB
5191    GET_VREG_DOUBLE f1, a3              # f1 <- vCC
5192    div.d f0, f0, f1                              # f0 <- f0 op f1
5193    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
5194    GET_INST_OPCODE v0                  # extract opcode from rINST
5195    SET_VREG_DOUBLE f0, a4              # vAA <- f0
5196    GOTO_OPCODE v0                      # jump to next instruction
5197
5198
5199/* ------------------------------ */
5200    .balign 128
5201.L_op_rem_double: /* 0xaf */
5202/* File: mips64/op_rem_double.S */
5203    /* rem-double vAA, vBB, vCC */
5204    .extern fmod
5205    lbu     a2, 2(rPC)                  # a2 <- BB
5206    lbu     a3, 3(rPC)                  # a3 <- CC
5207    GET_VREG_DOUBLE f12, a2             # f12 <- vBB
5208    GET_VREG_DOUBLE f13, a3             # f13 <- vCC
5209    jal     fmod                        # f0 <- f12 op f13
5210    srl     a4, rINST, 8                # a4 <- AA
5211    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
5212    GET_INST_OPCODE v0                  # extract opcode from rINST
5213    SET_VREG_DOUBLE f0, a4              # vAA <- f0
5214    GOTO_OPCODE v0                      # jump to next instruction
5215
5216/* ------------------------------ */
5217    .balign 128
5218.L_op_add_int_2addr: /* 0xb0 */
5219/* File: mips64/op_add_int_2addr.S */
5220/* File: mips64/binop2addr.S */
5221    /*
5222     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5223     * that specifies an instruction that performs "result = a0 op a1".
5224     * This could be a MIPS instruction or a function call.  (If the result
5225     * comes back in a register other than a0, you can override "result".)
5226     *
5227     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5228     * vB (a1).  Useful for integer division and modulus.  Note that we
5229     * *don't* check for (INT_MIN / -1) here, because the CPU handles it
5230     * correctly.
5231     *
5232     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5233     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5234     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr
5235     */
5236    /* binop/2addr vA, vB */
5237    ext     a2, rINST, 8, 4             # a2 <- A
5238    ext     a3, rINST, 12, 4            # a3 <- B
5239    GET_VREG a0, a2                     # a0 <- vA
5240    GET_VREG a1, a3                     # a1 <- vB
5241    .if 0
5242    beqz    a1, common_errDivideByZero  # is second operand zero?
5243    .endif
5244    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
5245                               # optional op
5246    addu a0, a0, a1                              # a0 <- op, a0-a3 changed
5247    GET_INST_OPCODE v0                  # extract opcode from rINST
5248    SET_VREG a0, a2                # vA <- a0
5249    GOTO_OPCODE v0                      # jump to next instruction
5250
5251
5252/* ------------------------------ */
5253    .balign 128
5254.L_op_sub_int_2addr: /* 0xb1 */
5255/* File: mips64/op_sub_int_2addr.S */
5256/* File: mips64/binop2addr.S */
5257    /*
5258     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5259     * that specifies an instruction that performs "result = a0 op a1".
5260     * This could be a MIPS instruction or a function call.  (If the result
5261     * comes back in a register other than a0, you can override "result".)
5262     *
5263     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5264     * vB (a1).  Useful for integer division and modulus.  Note that we
5265     * *don't* check for (INT_MIN / -1) here, because the CPU handles it
5266     * correctly.
5267     *
5268     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5269     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5270     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr
5271     */
5272    /* binop/2addr vA, vB */
5273    ext     a2, rINST, 8, 4             # a2 <- A
5274    ext     a3, rINST, 12, 4            # a3 <- B
5275    GET_VREG a0, a2                     # a0 <- vA
5276    GET_VREG a1, a3                     # a1 <- vB
5277    .if 0
5278    beqz    a1, common_errDivideByZero  # is second operand zero?
5279    .endif
5280    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
5281                               # optional op
5282    subu a0, a0, a1                              # a0 <- op, a0-a3 changed
5283    GET_INST_OPCODE v0                  # extract opcode from rINST
5284    SET_VREG a0, a2                # vA <- a0
5285    GOTO_OPCODE v0                      # jump to next instruction
5286
5287
5288/* ------------------------------ */
5289    .balign 128
5290.L_op_mul_int_2addr: /* 0xb2 */
5291/* File: mips64/op_mul_int_2addr.S */
5292/* File: mips64/binop2addr.S */
5293    /*
5294     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5295     * that specifies an instruction that performs "result = a0 op a1".
5296     * This could be a MIPS instruction or a function call.  (If the result
5297     * comes back in a register other than a0, you can override "result".)
5298     *
5299     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5300     * vB (a1).  Useful for integer division and modulus.  Note that we
5301     * *don't* check for (INT_MIN / -1) here, because the CPU handles it
5302     * correctly.
5303     *
5304     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5305     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5306     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr
5307     */
5308    /* binop/2addr vA, vB */
5309    ext     a2, rINST, 8, 4             # a2 <- A
5310    ext     a3, rINST, 12, 4            # a3 <- B
5311    GET_VREG a0, a2                     # a0 <- vA
5312    GET_VREG a1, a3                     # a1 <- vB
5313    .if 0
5314    beqz    a1, common_errDivideByZero  # is second operand zero?
5315    .endif
5316    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
5317                               # optional op
5318    mul a0, a0, a1                              # a0 <- op, a0-a3 changed
5319    GET_INST_OPCODE v0                  # extract opcode from rINST
5320    SET_VREG a0, a2                # vA <- a0
5321    GOTO_OPCODE v0                      # jump to next instruction
5322
5323
5324/* ------------------------------ */
5325    .balign 128
5326.L_op_div_int_2addr: /* 0xb3 */
5327/* File: mips64/op_div_int_2addr.S */
5328/* File: mips64/binop2addr.S */
5329    /*
5330     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5331     * that specifies an instruction that performs "result = a0 op a1".
5332     * This could be a MIPS instruction or a function call.  (If the result
5333     * comes back in a register other than a0, you can override "result".)
5334     *
5335     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5336     * vB (a1).  Useful for integer division and modulus.  Note that we
5337     * *don't* check for (INT_MIN / -1) here, because the CPU handles it
5338     * correctly.
5339     *
5340     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5341     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5342     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr
5343     */
5344    /* binop/2addr vA, vB */
5345    ext     a2, rINST, 8, 4             # a2 <- A
5346    ext     a3, rINST, 12, 4            # a3 <- B
5347    GET_VREG a0, a2                     # a0 <- vA
5348    GET_VREG a1, a3                     # a1 <- vB
5349    .if 1
5350    beqz    a1, common_errDivideByZero  # is second operand zero?
5351    .endif
5352    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
5353                               # optional op
5354    div a0, a0, a1                              # a0 <- op, a0-a3 changed
5355    GET_INST_OPCODE v0                  # extract opcode from rINST
5356    SET_VREG a0, a2                # vA <- a0
5357    GOTO_OPCODE v0                      # jump to next instruction
5358
5359
5360/* ------------------------------ */
5361    .balign 128
5362.L_op_rem_int_2addr: /* 0xb4 */
5363/* File: mips64/op_rem_int_2addr.S */
5364/* File: mips64/binop2addr.S */
5365    /*
5366     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5367     * that specifies an instruction that performs "result = a0 op a1".
5368     * This could be a MIPS instruction or a function call.  (If the result
5369     * comes back in a register other than a0, you can override "result".)
5370     *
5371     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5372     * vB (a1).  Useful for integer division and modulus.  Note that we
5373     * *don't* check for (INT_MIN / -1) here, because the CPU handles it
5374     * correctly.
5375     *
5376     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5377     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5378     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr
5379     */
5380    /* binop/2addr vA, vB */
5381    ext     a2, rINST, 8, 4             # a2 <- A
5382    ext     a3, rINST, 12, 4            # a3 <- B
5383    GET_VREG a0, a2                     # a0 <- vA
5384    GET_VREG a1, a3                     # a1 <- vB
5385    .if 1
5386    beqz    a1, common_errDivideByZero  # is second operand zero?
5387    .endif
5388    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
5389                               # optional op
5390    mod a0, a0, a1                              # a0 <- op, a0-a3 changed
5391    GET_INST_OPCODE v0                  # extract opcode from rINST
5392    SET_VREG a0, a2                # vA <- a0
5393    GOTO_OPCODE v0                      # jump to next instruction
5394
5395
5396/* ------------------------------ */
5397    .balign 128
5398.L_op_and_int_2addr: /* 0xb5 */
5399/* File: mips64/op_and_int_2addr.S */
5400/* File: mips64/binop2addr.S */
5401    /*
5402     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5403     * that specifies an instruction that performs "result = a0 op a1".
5404     * This could be a MIPS instruction or a function call.  (If the result
5405     * comes back in a register other than a0, you can override "result".)
5406     *
5407     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5408     * vB (a1).  Useful for integer division and modulus.  Note that we
5409     * *don't* check for (INT_MIN / -1) here, because the CPU handles it
5410     * correctly.
5411     *
5412     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5413     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5414     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr
5415     */
5416    /* binop/2addr vA, vB */
5417    ext     a2, rINST, 8, 4             # a2 <- A
5418    ext     a3, rINST, 12, 4            # a3 <- B
5419    GET_VREG a0, a2                     # a0 <- vA
5420    GET_VREG a1, a3                     # a1 <- vB
5421    .if 0
5422    beqz    a1, common_errDivideByZero  # is second operand zero?
5423    .endif
5424    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
5425                               # optional op
5426    and a0, a0, a1                              # a0 <- op, a0-a3 changed
5427    GET_INST_OPCODE v0                  # extract opcode from rINST
5428    SET_VREG a0, a2                # vA <- a0
5429    GOTO_OPCODE v0                      # jump to next instruction
5430
5431
5432/* ------------------------------ */
5433    .balign 128
5434.L_op_or_int_2addr: /* 0xb6 */
5435/* File: mips64/op_or_int_2addr.S */
5436/* File: mips64/binop2addr.S */
5437    /*
5438     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5439     * that specifies an instruction that performs "result = a0 op a1".
5440     * This could be a MIPS instruction or a function call.  (If the result
5441     * comes back in a register other than a0, you can override "result".)
5442     *
5443     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5444     * vB (a1).  Useful for integer division and modulus.  Note that we
5445     * *don't* check for (INT_MIN / -1) here, because the CPU handles it
5446     * correctly.
5447     *
5448     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5449     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5450     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr
5451     */
5452    /* binop/2addr vA, vB */
5453    ext     a2, rINST, 8, 4             # a2 <- A
5454    ext     a3, rINST, 12, 4            # a3 <- B
5455    GET_VREG a0, a2                     # a0 <- vA
5456    GET_VREG a1, a3                     # a1 <- vB
5457    .if 0
5458    beqz    a1, common_errDivideByZero  # is second operand zero?
5459    .endif
5460    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
5461                               # optional op
5462    or a0, a0, a1                              # a0 <- op, a0-a3 changed
5463    GET_INST_OPCODE v0                  # extract opcode from rINST
5464    SET_VREG a0, a2                # vA <- a0
5465    GOTO_OPCODE v0                      # jump to next instruction
5466
5467
5468/* ------------------------------ */
5469    .balign 128
5470.L_op_xor_int_2addr: /* 0xb7 */
5471/* File: mips64/op_xor_int_2addr.S */
5472/* File: mips64/binop2addr.S */
5473    /*
5474     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5475     * that specifies an instruction that performs "result = a0 op a1".
5476     * This could be a MIPS instruction or a function call.  (If the result
5477     * comes back in a register other than a0, you can override "result".)
5478     *
5479     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5480     * vB (a1).  Useful for integer division and modulus.  Note that we
5481     * *don't* check for (INT_MIN / -1) here, because the CPU handles it
5482     * correctly.
5483     *
5484     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5485     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5486     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr
5487     */
5488    /* binop/2addr vA, vB */
5489    ext     a2, rINST, 8, 4             # a2 <- A
5490    ext     a3, rINST, 12, 4            # a3 <- B
5491    GET_VREG a0, a2                     # a0 <- vA
5492    GET_VREG a1, a3                     # a1 <- vB
5493    .if 0
5494    beqz    a1, common_errDivideByZero  # is second operand zero?
5495    .endif
5496    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
5497                               # optional op
5498    xor a0, a0, a1                              # a0 <- op, a0-a3 changed
5499    GET_INST_OPCODE v0                  # extract opcode from rINST
5500    SET_VREG a0, a2                # vA <- a0
5501    GOTO_OPCODE v0                      # jump to next instruction
5502
5503
5504/* ------------------------------ */
5505    .balign 128
5506.L_op_shl_int_2addr: /* 0xb8 */
5507/* File: mips64/op_shl_int_2addr.S */
5508/* File: mips64/binop2addr.S */
5509    /*
5510     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5511     * that specifies an instruction that performs "result = a0 op a1".
5512     * This could be a MIPS instruction or a function call.  (If the result
5513     * comes back in a register other than a0, you can override "result".)
5514     *
5515     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5516     * vB (a1).  Useful for integer division and modulus.  Note that we
5517     * *don't* check for (INT_MIN / -1) here, because the CPU handles it
5518     * correctly.
5519     *
5520     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5521     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5522     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr
5523     */
5524    /* binop/2addr vA, vB */
5525    ext     a2, rINST, 8, 4             # a2 <- A
5526    ext     a3, rINST, 12, 4            # a3 <- B
5527    GET_VREG a0, a2                     # a0 <- vA
5528    GET_VREG a1, a3                     # a1 <- vB
5529    .if 0
5530    beqz    a1, common_errDivideByZero  # is second operand zero?
5531    .endif
5532    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
5533                               # optional op
5534    sll a0, a0, a1                              # a0 <- op, a0-a3 changed
5535    GET_INST_OPCODE v0                  # extract opcode from rINST
5536    SET_VREG a0, a2                # vA <- a0
5537    GOTO_OPCODE v0                      # jump to next instruction
5538
5539
5540/* ------------------------------ */
5541    .balign 128
5542.L_op_shr_int_2addr: /* 0xb9 */
5543/* File: mips64/op_shr_int_2addr.S */
5544/* File: mips64/binop2addr.S */
5545    /*
5546     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5547     * that specifies an instruction that performs "result = a0 op a1".
5548     * This could be a MIPS instruction or a function call.  (If the result
5549     * comes back in a register other than a0, you can override "result".)
5550     *
5551     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5552     * vB (a1).  Useful for integer division and modulus.  Note that we
5553     * *don't* check for (INT_MIN / -1) here, because the CPU handles it
5554     * correctly.
5555     *
5556     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5557     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5558     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr
5559     */
5560    /* binop/2addr vA, vB */
5561    ext     a2, rINST, 8, 4             # a2 <- A
5562    ext     a3, rINST, 12, 4            # a3 <- B
5563    GET_VREG a0, a2                     # a0 <- vA
5564    GET_VREG a1, a3                     # a1 <- vB
5565    .if 0
5566    beqz    a1, common_errDivideByZero  # is second operand zero?
5567    .endif
5568    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
5569                               # optional op
5570    sra a0, a0, a1                              # a0 <- op, a0-a3 changed
5571    GET_INST_OPCODE v0                  # extract opcode from rINST
5572    SET_VREG a0, a2                # vA <- a0
5573    GOTO_OPCODE v0                      # jump to next instruction
5574
5575
5576/* ------------------------------ */
5577    .balign 128
5578.L_op_ushr_int_2addr: /* 0xba */
5579/* File: mips64/op_ushr_int_2addr.S */
5580/* File: mips64/binop2addr.S */
5581    /*
5582     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5583     * that specifies an instruction that performs "result = a0 op a1".
5584     * This could be a MIPS instruction or a function call.  (If the result
5585     * comes back in a register other than a0, you can override "result".)
5586     *
5587     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5588     * vB (a1).  Useful for integer division and modulus.  Note that we
5589     * *don't* check for (INT_MIN / -1) here, because the CPU handles it
5590     * correctly.
5591     *
5592     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5593     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5594     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr
5595     */
5596    /* binop/2addr vA, vB */
5597    ext     a2, rINST, 8, 4             # a2 <- A
5598    ext     a3, rINST, 12, 4            # a3 <- B
5599    GET_VREG a0, a2                     # a0 <- vA
5600    GET_VREG a1, a3                     # a1 <- vB
5601    .if 0
5602    beqz    a1, common_errDivideByZero  # is second operand zero?
5603    .endif
5604    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
5605                               # optional op
5606    srl a0, a0, a1                              # a0 <- op, a0-a3 changed
5607    GET_INST_OPCODE v0                  # extract opcode from rINST
5608    SET_VREG a0, a2                # vA <- a0
5609    GOTO_OPCODE v0                      # jump to next instruction
5610
5611
5612/* ------------------------------ */
5613    .balign 128
5614.L_op_add_long_2addr: /* 0xbb */
5615/* File: mips64/op_add_long_2addr.S */
5616/* File: mips64/binopWide2addr.S */
5617    /*
5618     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5619     * that specifies an instruction that performs "result = a0 op a1".
5620     * This could be a MIPS instruction or a function call.  (If the result
5621     * comes back in a register other than a0, you can override "result".)
5622     *
5623     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5624     * vB (a1).  Useful for integer division and modulus.  Note that we
5625     * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
5626     * correctly.
5627     *
5628     * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5629     *      rem-long/2addr, and-long/2addr, or-long/2addr, xor-long/2addr,
5630     *      shl-long/2addr, shr-long/2addr, ushr-long/2addr
5631     */
5632    /* binop/2addr vA, vB */
5633    ext     a2, rINST, 8, 4             # a2 <- A
5634    ext     a3, rINST, 12, 4            # a3 <- B
5635    GET_VREG_WIDE a0, a2                # a0 <- vA
5636    GET_VREG_WIDE a1, a3                # a1 <- vB
5637    .if 0
5638    beqz    a1, common_errDivideByZero  # is second operand zero?
5639    .endif
5640    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
5641                               # optional op
5642    daddu a0, a0, a1                              # a0 <- op, a0-a3 changed
5643    GET_INST_OPCODE v0                  # extract opcode from rINST
5644    SET_VREG_WIDE a0, a2           # vA <- a0
5645    GOTO_OPCODE v0                      # jump to next instruction
5646
5647
5648/* ------------------------------ */
5649    .balign 128
5650.L_op_sub_long_2addr: /* 0xbc */
5651/* File: mips64/op_sub_long_2addr.S */
5652/* File: mips64/binopWide2addr.S */
5653    /*
5654     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5655     * that specifies an instruction that performs "result = a0 op a1".
5656     * This could be a MIPS instruction or a function call.  (If the result
5657     * comes back in a register other than a0, you can override "result".)
5658     *
5659     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5660     * vB (a1).  Useful for integer division and modulus.  Note that we
5661     * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
5662     * correctly.
5663     *
5664     * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5665     *      rem-long/2addr, and-long/2addr, or-long/2addr, xor-long/2addr,
5666     *      shl-long/2addr, shr-long/2addr, ushr-long/2addr
5667     */
5668    /* binop/2addr vA, vB */
5669    ext     a2, rINST, 8, 4             # a2 <- A
5670    ext     a3, rINST, 12, 4            # a3 <- B
5671    GET_VREG_WIDE a0, a2                # a0 <- vA
5672    GET_VREG_WIDE a1, a3                # a1 <- vB
5673    .if 0
5674    beqz    a1, common_errDivideByZero  # is second operand zero?
5675    .endif
5676    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
5677                               # optional op
5678    dsubu a0, a0, a1                              # a0 <- op, a0-a3 changed
5679    GET_INST_OPCODE v0                  # extract opcode from rINST
5680    SET_VREG_WIDE a0, a2           # vA <- a0
5681    GOTO_OPCODE v0                      # jump to next instruction
5682
5683
5684/* ------------------------------ */
5685    .balign 128
5686.L_op_mul_long_2addr: /* 0xbd */
5687/* File: mips64/op_mul_long_2addr.S */
5688/* File: mips64/binopWide2addr.S */
5689    /*
5690     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5691     * that specifies an instruction that performs "result = a0 op a1".
5692     * This could be a MIPS instruction or a function call.  (If the result
5693     * comes back in a register other than a0, you can override "result".)
5694     *
5695     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5696     * vB (a1).  Useful for integer division and modulus.  Note that we
5697     * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
5698     * correctly.
5699     *
5700     * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5701     *      rem-long/2addr, and-long/2addr, or-long/2addr, xor-long/2addr,
5702     *      shl-long/2addr, shr-long/2addr, ushr-long/2addr
5703     */
5704    /* binop/2addr vA, vB */
5705    ext     a2, rINST, 8, 4             # a2 <- A
5706    ext     a3, rINST, 12, 4            # a3 <- B
5707    GET_VREG_WIDE a0, a2                # a0 <- vA
5708    GET_VREG_WIDE a1, a3                # a1 <- vB
5709    .if 0
5710    beqz    a1, common_errDivideByZero  # is second operand zero?
5711    .endif
5712    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
5713                               # optional op
5714    dmul a0, a0, a1                              # a0 <- op, a0-a3 changed
5715    GET_INST_OPCODE v0                  # extract opcode from rINST
5716    SET_VREG_WIDE a0, a2           # vA <- a0
5717    GOTO_OPCODE v0                      # jump to next instruction
5718
5719
5720/* ------------------------------ */
5721    .balign 128
5722.L_op_div_long_2addr: /* 0xbe */
5723/* File: mips64/op_div_long_2addr.S */
5724/* File: mips64/binopWide2addr.S */
5725    /*
5726     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5727     * that specifies an instruction that performs "result = a0 op a1".
5728     * This could be a MIPS instruction or a function call.  (If the result
5729     * comes back in a register other than a0, you can override "result".)
5730     *
5731     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5732     * vB (a1).  Useful for integer division and modulus.  Note that we
5733     * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
5734     * correctly.
5735     *
5736     * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5737     *      rem-long/2addr, and-long/2addr, or-long/2addr, xor-long/2addr,
5738     *      shl-long/2addr, shr-long/2addr, ushr-long/2addr
5739     */
5740    /* binop/2addr vA, vB */
5741    ext     a2, rINST, 8, 4             # a2 <- A
5742    ext     a3, rINST, 12, 4            # a3 <- B
5743    GET_VREG_WIDE a0, a2                # a0 <- vA
5744    GET_VREG_WIDE a1, a3                # a1 <- vB
5745    .if 1
5746    beqz    a1, common_errDivideByZero  # is second operand zero?
5747    .endif
5748    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
5749                               # optional op
5750    ddiv a0, a0, a1                              # a0 <- op, a0-a3 changed
5751    GET_INST_OPCODE v0                  # extract opcode from rINST
5752    SET_VREG_WIDE a0, a2           # vA <- a0
5753    GOTO_OPCODE v0                      # jump to next instruction
5754
5755
5756/* ------------------------------ */
5757    .balign 128
5758.L_op_rem_long_2addr: /* 0xbf */
5759/* File: mips64/op_rem_long_2addr.S */
5760/* File: mips64/binopWide2addr.S */
5761    /*
5762     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5763     * that specifies an instruction that performs "result = a0 op a1".
5764     * This could be a MIPS instruction or a function call.  (If the result
5765     * comes back in a register other than a0, you can override "result".)
5766     *
5767     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5768     * vB (a1).  Useful for integer division and modulus.  Note that we
5769     * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
5770     * correctly.
5771     *
5772     * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5773     *      rem-long/2addr, and-long/2addr, or-long/2addr, xor-long/2addr,
5774     *      shl-long/2addr, shr-long/2addr, ushr-long/2addr
5775     */
5776    /* binop/2addr vA, vB */
5777    ext     a2, rINST, 8, 4             # a2 <- A
5778    ext     a3, rINST, 12, 4            # a3 <- B
5779    GET_VREG_WIDE a0, a2                # a0 <- vA
5780    GET_VREG_WIDE a1, a3                # a1 <- vB
5781    .if 1
5782    beqz    a1, common_errDivideByZero  # is second operand zero?
5783    .endif
5784    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
5785                               # optional op
5786    dmod a0, a0, a1                              # a0 <- op, a0-a3 changed
5787    GET_INST_OPCODE v0                  # extract opcode from rINST
5788    SET_VREG_WIDE a0, a2           # vA <- a0
5789    GOTO_OPCODE v0                      # jump to next instruction
5790
5791
5792/* ------------------------------ */
5793    .balign 128
5794.L_op_and_long_2addr: /* 0xc0 */
5795/* File: mips64/op_and_long_2addr.S */
5796/* File: mips64/binopWide2addr.S */
5797    /*
5798     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5799     * that specifies an instruction that performs "result = a0 op a1".
5800     * This could be a MIPS instruction or a function call.  (If the result
5801     * comes back in a register other than a0, you can override "result".)
5802     *
5803     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5804     * vB (a1).  Useful for integer division and modulus.  Note that we
5805     * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
5806     * correctly.
5807     *
5808     * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5809     *      rem-long/2addr, and-long/2addr, or-long/2addr, xor-long/2addr,
5810     *      shl-long/2addr, shr-long/2addr, ushr-long/2addr
5811     */
5812    /* binop/2addr vA, vB */
5813    ext     a2, rINST, 8, 4             # a2 <- A
5814    ext     a3, rINST, 12, 4            # a3 <- B
5815    GET_VREG_WIDE a0, a2                # a0 <- vA
5816    GET_VREG_WIDE a1, a3                # a1 <- vB
5817    .if 0
5818    beqz    a1, common_errDivideByZero  # is second operand zero?
5819    .endif
5820    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
5821                               # optional op
5822    and a0, a0, a1                              # a0 <- op, a0-a3 changed
5823    GET_INST_OPCODE v0                  # extract opcode from rINST
5824    SET_VREG_WIDE a0, a2           # vA <- a0
5825    GOTO_OPCODE v0                      # jump to next instruction
5826
5827
5828/* ------------------------------ */
5829    .balign 128
5830.L_op_or_long_2addr: /* 0xc1 */
5831/* File: mips64/op_or_long_2addr.S */
5832/* File: mips64/binopWide2addr.S */
5833    /*
5834     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5835     * that specifies an instruction that performs "result = a0 op a1".
5836     * This could be a MIPS instruction or a function call.  (If the result
5837     * comes back in a register other than a0, you can override "result".)
5838     *
5839     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5840     * vB (a1).  Useful for integer division and modulus.  Note that we
5841     * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
5842     * correctly.
5843     *
5844     * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5845     *      rem-long/2addr, and-long/2addr, or-long/2addr, xor-long/2addr,
5846     *      shl-long/2addr, shr-long/2addr, ushr-long/2addr
5847     */
5848    /* binop/2addr vA, vB */
5849    ext     a2, rINST, 8, 4             # a2 <- A
5850    ext     a3, rINST, 12, 4            # a3 <- B
5851    GET_VREG_WIDE a0, a2                # a0 <- vA
5852    GET_VREG_WIDE a1, a3                # a1 <- vB
5853    .if 0
5854    beqz    a1, common_errDivideByZero  # is second operand zero?
5855    .endif
5856    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
5857                               # optional op
5858    or a0, a0, a1                              # a0 <- op, a0-a3 changed
5859    GET_INST_OPCODE v0                  # extract opcode from rINST
5860    SET_VREG_WIDE a0, a2           # vA <- a0
5861    GOTO_OPCODE v0                      # jump to next instruction
5862
5863
5864/* ------------------------------ */
5865    .balign 128
5866.L_op_xor_long_2addr: /* 0xc2 */
5867/* File: mips64/op_xor_long_2addr.S */
5868/* File: mips64/binopWide2addr.S */
5869    /*
5870     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5871     * that specifies an instruction that performs "result = a0 op a1".
5872     * This could be a MIPS instruction or a function call.  (If the result
5873     * comes back in a register other than a0, you can override "result".)
5874     *
5875     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5876     * vB (a1).  Useful for integer division and modulus.  Note that we
5877     * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
5878     * correctly.
5879     *
5880     * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5881     *      rem-long/2addr, and-long/2addr, or-long/2addr, xor-long/2addr,
5882     *      shl-long/2addr, shr-long/2addr, ushr-long/2addr
5883     */
5884    /* binop/2addr vA, vB */
5885    ext     a2, rINST, 8, 4             # a2 <- A
5886    ext     a3, rINST, 12, 4            # a3 <- B
5887    GET_VREG_WIDE a0, a2                # a0 <- vA
5888    GET_VREG_WIDE a1, a3                # a1 <- vB
5889    .if 0
5890    beqz    a1, common_errDivideByZero  # is second operand zero?
5891    .endif
5892    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
5893                               # optional op
5894    xor a0, a0, a1                              # a0 <- op, a0-a3 changed
5895    GET_INST_OPCODE v0                  # extract opcode from rINST
5896    SET_VREG_WIDE a0, a2           # vA <- a0
5897    GOTO_OPCODE v0                      # jump to next instruction
5898
5899
5900/* ------------------------------ */
5901    .balign 128
5902.L_op_shl_long_2addr: /* 0xc3 */
5903/* File: mips64/op_shl_long_2addr.S */
5904/* File: mips64/binopWide2addr.S */
5905    /*
5906     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5907     * that specifies an instruction that performs "result = a0 op a1".
5908     * This could be a MIPS instruction or a function call.  (If the result
5909     * comes back in a register other than a0, you can override "result".)
5910     *
5911     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5912     * vB (a1).  Useful for integer division and modulus.  Note that we
5913     * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
5914     * correctly.
5915     *
5916     * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5917     *      rem-long/2addr, and-long/2addr, or-long/2addr, xor-long/2addr,
5918     *      shl-long/2addr, shr-long/2addr, ushr-long/2addr
5919     */
5920    /* binop/2addr vA, vB */
5921    ext     a2, rINST, 8, 4             # a2 <- A
5922    ext     a3, rINST, 12, 4            # a3 <- B
5923    GET_VREG_WIDE a0, a2                # a0 <- vA
5924    GET_VREG_WIDE a1, a3                # a1 <- vB
5925    .if 0
5926    beqz    a1, common_errDivideByZero  # is second operand zero?
5927    .endif
5928    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
5929                               # optional op
5930    dsll a0, a0, a1                              # a0 <- op, a0-a3 changed
5931    GET_INST_OPCODE v0                  # extract opcode from rINST
5932    SET_VREG_WIDE a0, a2           # vA <- a0
5933    GOTO_OPCODE v0                      # jump to next instruction
5934
5935
5936/* ------------------------------ */
5937    .balign 128
5938.L_op_shr_long_2addr: /* 0xc4 */
5939/* File: mips64/op_shr_long_2addr.S */
5940/* File: mips64/binopWide2addr.S */
5941    /*
5942     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5943     * that specifies an instruction that performs "result = a0 op a1".
5944     * This could be a MIPS instruction or a function call.  (If the result
5945     * comes back in a register other than a0, you can override "result".)
5946     *
5947     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5948     * vB (a1).  Useful for integer division and modulus.  Note that we
5949     * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
5950     * correctly.
5951     *
5952     * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5953     *      rem-long/2addr, and-long/2addr, or-long/2addr, xor-long/2addr,
5954     *      shl-long/2addr, shr-long/2addr, ushr-long/2addr
5955     */
5956    /* binop/2addr vA, vB */
5957    ext     a2, rINST, 8, 4             # a2 <- A
5958    ext     a3, rINST, 12, 4            # a3 <- B
5959    GET_VREG_WIDE a0, a2                # a0 <- vA
5960    GET_VREG_WIDE a1, a3                # a1 <- vB
5961    .if 0
5962    beqz    a1, common_errDivideByZero  # is second operand zero?
5963    .endif
5964    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
5965                               # optional op
5966    dsra a0, a0, a1                              # a0 <- op, a0-a3 changed
5967    GET_INST_OPCODE v0                  # extract opcode from rINST
5968    SET_VREG_WIDE a0, a2           # vA <- a0
5969    GOTO_OPCODE v0                      # jump to next instruction
5970
5971
5972/* ------------------------------ */
5973    .balign 128
5974.L_op_ushr_long_2addr: /* 0xc5 */
5975/* File: mips64/op_ushr_long_2addr.S */
5976/* File: mips64/binopWide2addr.S */
5977    /*
5978     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5979     * that specifies an instruction that performs "result = a0 op a1".
5980     * This could be a MIPS instruction or a function call.  (If the result
5981     * comes back in a register other than a0, you can override "result".)
5982     *
5983     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5984     * vB (a1).  Useful for integer division and modulus.  Note that we
5985     * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
5986     * correctly.
5987     *
5988     * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5989     *      rem-long/2addr, and-long/2addr, or-long/2addr, xor-long/2addr,
5990     *      shl-long/2addr, shr-long/2addr, ushr-long/2addr
5991     */
5992    /* binop/2addr vA, vB */
5993    ext     a2, rINST, 8, 4             # a2 <- A
5994    ext     a3, rINST, 12, 4            # a3 <- B
5995    GET_VREG_WIDE a0, a2                # a0 <- vA
5996    GET_VREG_WIDE a1, a3                # a1 <- vB
5997    .if 0
5998    beqz    a1, common_errDivideByZero  # is second operand zero?
5999    .endif
6000    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
6001                               # optional op
6002    dsrl a0, a0, a1                              # a0 <- op, a0-a3 changed
6003    GET_INST_OPCODE v0                  # extract opcode from rINST
6004    SET_VREG_WIDE a0, a2           # vA <- a0
6005    GOTO_OPCODE v0                      # jump to next instruction
6006
6007
6008/* ------------------------------ */
6009    .balign 128
6010.L_op_add_float_2addr: /* 0xc6 */
6011/* File: mips64/op_add_float_2addr.S */
6012/* File: mips64/fbinop2addr.S */
6013    /*:
6014     * Generic 32-bit "/2addr" floating-point operation.
6015     *
6016     * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr.
6017     * form: <op> f0, f0, f1
6018     */
6019    /* binop/2addr vA, vB */
6020    ext     a2, rINST, 8, 4             # a2 <- A
6021    ext     a3, rINST, 12, 4            # a3 <- B
6022    GET_VREG_FLOAT f0, a2               # f0 <- vA
6023    GET_VREG_FLOAT f1, a3               # f1 <- vB
6024    add.s f0, f0, f1                              # f0 <- f0 op f1
6025    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
6026    GET_INST_OPCODE v0                  # extract opcode from rINST
6027    SET_VREG_FLOAT f0, a2               # vA <- f0
6028    GOTO_OPCODE v0                      # jump to next instruction
6029
6030
6031/* ------------------------------ */
6032    .balign 128
6033.L_op_sub_float_2addr: /* 0xc7 */
6034/* File: mips64/op_sub_float_2addr.S */
6035/* File: mips64/fbinop2addr.S */
6036    /*:
6037     * Generic 32-bit "/2addr" floating-point operation.
6038     *
6039     * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr.
6040     * form: <op> f0, f0, f1
6041     */
6042    /* binop/2addr vA, vB */
6043    ext     a2, rINST, 8, 4             # a2 <- A
6044    ext     a3, rINST, 12, 4            # a3 <- B
6045    GET_VREG_FLOAT f0, a2               # f0 <- vA
6046    GET_VREG_FLOAT f1, a3               # f1 <- vB
6047    sub.s f0, f0, f1                              # f0 <- f0 op f1
6048    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
6049    GET_INST_OPCODE v0                  # extract opcode from rINST
6050    SET_VREG_FLOAT f0, a2               # vA <- f0
6051    GOTO_OPCODE v0                      # jump to next instruction
6052
6053
6054/* ------------------------------ */
6055    .balign 128
6056.L_op_mul_float_2addr: /* 0xc8 */
6057/* File: mips64/op_mul_float_2addr.S */
6058/* File: mips64/fbinop2addr.S */
6059    /*:
6060     * Generic 32-bit "/2addr" floating-point operation.
6061     *
6062     * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr.
6063     * form: <op> f0, f0, f1
6064     */
6065    /* binop/2addr vA, vB */
6066    ext     a2, rINST, 8, 4             # a2 <- A
6067    ext     a3, rINST, 12, 4            # a3 <- B
6068    GET_VREG_FLOAT f0, a2               # f0 <- vA
6069    GET_VREG_FLOAT f1, a3               # f1 <- vB
6070    mul.s f0, f0, f1                              # f0 <- f0 op f1
6071    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
6072    GET_INST_OPCODE v0                  # extract opcode from rINST
6073    SET_VREG_FLOAT f0, a2               # vA <- f0
6074    GOTO_OPCODE v0                      # jump to next instruction
6075
6076
6077/* ------------------------------ */
6078    .balign 128
6079.L_op_div_float_2addr: /* 0xc9 */
6080/* File: mips64/op_div_float_2addr.S */
6081/* File: mips64/fbinop2addr.S */
6082    /*:
6083     * Generic 32-bit "/2addr" floating-point operation.
6084     *
6085     * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr.
6086     * form: <op> f0, f0, f1
6087     */
6088    /* binop/2addr vA, vB */
6089    ext     a2, rINST, 8, 4             # a2 <- A
6090    ext     a3, rINST, 12, 4            # a3 <- B
6091    GET_VREG_FLOAT f0, a2               # f0 <- vA
6092    GET_VREG_FLOAT f1, a3               # f1 <- vB
6093    div.s f0, f0, f1                              # f0 <- f0 op f1
6094    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
6095    GET_INST_OPCODE v0                  # extract opcode from rINST
6096    SET_VREG_FLOAT f0, a2               # vA <- f0
6097    GOTO_OPCODE v0                      # jump to next instruction
6098
6099
6100/* ------------------------------ */
6101    .balign 128
6102.L_op_rem_float_2addr: /* 0xca */
6103/* File: mips64/op_rem_float_2addr.S */
6104    /* rem-float/2addr vA, vB */
6105    .extern fmodf
6106    ext     a2, rINST, 8, 4             # a2 <- A
6107    ext     a3, rINST, 12, 4            # a3 <- B
6108    GET_VREG_FLOAT f12, a2              # f12 <- vA
6109    GET_VREG_FLOAT f13, a3              # f13 <- vB
6110    jal     fmodf                       # f0 <- f12 op f13
6111    ext     a2, rINST, 8, 4             # a2 <- A
6112    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
6113    GET_INST_OPCODE v0                  # extract opcode from rINST
6114    SET_VREG_FLOAT f0, a2               # vA <- f0
6115    GOTO_OPCODE v0                      # jump to next instruction
6116
6117/* ------------------------------ */
6118    .balign 128
6119.L_op_add_double_2addr: /* 0xcb */
6120/* File: mips64/op_add_double_2addr.S */
6121/* File: mips64/fbinopWide2addr.S */
6122    /*:
6123     * Generic 64-bit "/2addr" floating-point operation.
6124     *
6125     * For: add-double/2addr, sub-double/2addr, mul-double/2addr, div-double/2addr.
6126     * form: <op> f0, f0, f1
6127     */
6128    /* binop/2addr vA, vB */
6129    ext     a2, rINST, 8, 4             # a2 <- A
6130    ext     a3, rINST, 12, 4            # a3 <- B
6131    GET_VREG_DOUBLE f0, a2              # f0 <- vA
6132    GET_VREG_DOUBLE f1, a3              # f1 <- vB
6133    add.d f0, f0, f1                              # f0 <- f0 op f1
6134    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
6135    GET_INST_OPCODE v0                  # extract opcode from rINST
6136    SET_VREG_DOUBLE f0, a2              # vA <- f0
6137    GOTO_OPCODE v0                      # jump to next instruction
6138
6139
6140/* ------------------------------ */
6141    .balign 128
6142.L_op_sub_double_2addr: /* 0xcc */
6143/* File: mips64/op_sub_double_2addr.S */
6144/* File: mips64/fbinopWide2addr.S */
6145    /*:
6146     * Generic 64-bit "/2addr" floating-point operation.
6147     *
6148     * For: add-double/2addr, sub-double/2addr, mul-double/2addr, div-double/2addr.
6149     * form: <op> f0, f0, f1
6150     */
6151    /* binop/2addr vA, vB */
6152    ext     a2, rINST, 8, 4             # a2 <- A
6153    ext     a3, rINST, 12, 4            # a3 <- B
6154    GET_VREG_DOUBLE f0, a2              # f0 <- vA
6155    GET_VREG_DOUBLE f1, a3              # f1 <- vB
6156    sub.d f0, f0, f1                              # f0 <- f0 op f1
6157    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
6158    GET_INST_OPCODE v0                  # extract opcode from rINST
6159    SET_VREG_DOUBLE f0, a2              # vA <- f0
6160    GOTO_OPCODE v0                      # jump to next instruction
6161
6162
6163/* ------------------------------ */
6164    .balign 128
6165.L_op_mul_double_2addr: /* 0xcd */
6166/* File: mips64/op_mul_double_2addr.S */
6167/* File: mips64/fbinopWide2addr.S */
6168    /*:
6169     * Generic 64-bit "/2addr" floating-point operation.
6170     *
6171     * For: add-double/2addr, sub-double/2addr, mul-double/2addr, div-double/2addr.
6172     * form: <op> f0, f0, f1
6173     */
6174    /* binop/2addr vA, vB */
6175    ext     a2, rINST, 8, 4             # a2 <- A
6176    ext     a3, rINST, 12, 4            # a3 <- B
6177    GET_VREG_DOUBLE f0, a2              # f0 <- vA
6178    GET_VREG_DOUBLE f1, a3              # f1 <- vB
6179    mul.d f0, f0, f1                              # f0 <- f0 op f1
6180    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
6181    GET_INST_OPCODE v0                  # extract opcode from rINST
6182    SET_VREG_DOUBLE f0, a2              # vA <- f0
6183    GOTO_OPCODE v0                      # jump to next instruction
6184
6185
6186/* ------------------------------ */
6187    .balign 128
6188.L_op_div_double_2addr: /* 0xce */
6189/* File: mips64/op_div_double_2addr.S */
6190/* File: mips64/fbinopWide2addr.S */
6191    /*:
6192     * Generic 64-bit "/2addr" floating-point operation.
6193     *
6194     * For: add-double/2addr, sub-double/2addr, mul-double/2addr, div-double/2addr.
6195     * form: <op> f0, f0, f1
6196     */
6197    /* binop/2addr vA, vB */
6198    ext     a2, rINST, 8, 4             # a2 <- A
6199    ext     a3, rINST, 12, 4            # a3 <- B
6200    GET_VREG_DOUBLE f0, a2              # f0 <- vA
6201    GET_VREG_DOUBLE f1, a3              # f1 <- vB
6202    div.d f0, f0, f1                              # f0 <- f0 op f1
6203    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
6204    GET_INST_OPCODE v0                  # extract opcode from rINST
6205    SET_VREG_DOUBLE f0, a2              # vA <- f0
6206    GOTO_OPCODE v0                      # jump to next instruction
6207
6208
6209/* ------------------------------ */
6210    .balign 128
6211.L_op_rem_double_2addr: /* 0xcf */
6212/* File: mips64/op_rem_double_2addr.S */
6213    /* rem-double/2addr vA, vB */
6214    .extern fmod
6215    ext     a2, rINST, 8, 4             # a2 <- A
6216    ext     a3, rINST, 12, 4            # a3 <- B
6217    GET_VREG_DOUBLE f12, a2             # f12 <- vA
6218    GET_VREG_DOUBLE f13, a3             # f13 <- vB
6219    jal     fmod                        # f0 <- f12 op f13
6220    ext     a2, rINST, 8, 4             # a2 <- A
6221    FETCH_ADVANCE_INST 1                # advance rPC, load rINST
6222    GET_INST_OPCODE v0                  # extract opcode from rINST
6223    SET_VREG_DOUBLE f0, a2              # vA <- f0
6224    GOTO_OPCODE v0                      # jump to next instruction
6225
6226/* ------------------------------ */
6227    .balign 128
6228.L_op_add_int_lit16: /* 0xd0 */
6229/* File: mips64/op_add_int_lit16.S */
6230/* File: mips64/binopLit16.S */
6231    /*
6232     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6233     * that specifies an instruction that performs "result = a0 op a1".
6234     * This could be an MIPS instruction or a function call.  (If the result
6235     * comes back in a register other than a0, you can override "result".)
6236     *
6237     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6238     * CCCC (a1).  Useful for integer division and modulus.
6239     *
6240     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6241     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6242     */
6243    /* binop/lit16 vA, vB, #+CCCC */
6244    lh      a1, 2(rPC)                  # a1 <- sign-extended CCCC
6245    ext     a2, rINST, 8, 4             # a2 <- A
6246    ext     a3, rINST, 12, 4            # a3 <- B
6247    GET_VREG a0, a3                     # a0 <- vB
6248    .if 0
6249    beqz    a1, common_errDivideByZero  # is second operand zero?
6250    .endif
6251    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
6252                               # optional op
6253    addu a0, a0, a1                              # a0 <- op, a0-a3 changed
6254    GET_INST_OPCODE v0                  # extract opcode from rINST
6255    SET_VREG a0, a2                # vA <- a0
6256    GOTO_OPCODE v0                      # jump to next instruction
6257
6258
6259
6260/* ------------------------------ */
6261    .balign 128
6262.L_op_rsub_int: /* 0xd1 */
6263/* File: mips64/op_rsub_int.S */
6264/* File: mips64/binopLit16.S */
6265    /*
6266     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6267     * that specifies an instruction that performs "result = a0 op a1".
6268     * This could be an MIPS instruction or a function call.  (If the result
6269     * comes back in a register other than a0, you can override "result".)
6270     *
6271     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6272     * CCCC (a1).  Useful for integer division and modulus.
6273     *
6274     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6275     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6276     */
6277    /* binop/lit16 vA, vB, #+CCCC */
6278    lh      a1, 2(rPC)                  # a1 <- sign-extended CCCC
6279    ext     a2, rINST, 8, 4             # a2 <- A
6280    ext     a3, rINST, 12, 4            # a3 <- B
6281    GET_VREG a0, a3                     # a0 <- vB
6282    .if 0
6283    beqz    a1, common_errDivideByZero  # is second operand zero?
6284    .endif
6285    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
6286                               # optional op
6287    subu a0, a1, a0                              # a0 <- op, a0-a3 changed
6288    GET_INST_OPCODE v0                  # extract opcode from rINST
6289    SET_VREG a0, a2                # vA <- a0
6290    GOTO_OPCODE v0                      # jump to next instruction
6291
6292
6293
6294/* ------------------------------ */
6295    .balign 128
6296.L_op_mul_int_lit16: /* 0xd2 */
6297/* File: mips64/op_mul_int_lit16.S */
6298/* File: mips64/binopLit16.S */
6299    /*
6300     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6301     * that specifies an instruction that performs "result = a0 op a1".
6302     * This could be an MIPS instruction or a function call.  (If the result
6303     * comes back in a register other than a0, you can override "result".)
6304     *
6305     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6306     * CCCC (a1).  Useful for integer division and modulus.
6307     *
6308     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6309     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6310     */
6311    /* binop/lit16 vA, vB, #+CCCC */
6312    lh      a1, 2(rPC)                  # a1 <- sign-extended CCCC
6313    ext     a2, rINST, 8, 4             # a2 <- A
6314    ext     a3, rINST, 12, 4            # a3 <- B
6315    GET_VREG a0, a3                     # a0 <- vB
6316    .if 0
6317    beqz    a1, common_errDivideByZero  # is second operand zero?
6318    .endif
6319    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
6320                               # optional op
6321    mul a0, a0, a1                              # a0 <- op, a0-a3 changed
6322    GET_INST_OPCODE v0                  # extract opcode from rINST
6323    SET_VREG a0, a2                # vA <- a0
6324    GOTO_OPCODE v0                      # jump to next instruction
6325
6326
6327
6328/* ------------------------------ */
6329    .balign 128
6330.L_op_div_int_lit16: /* 0xd3 */
6331/* File: mips64/op_div_int_lit16.S */
6332/* File: mips64/binopLit16.S */
6333    /*
6334     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6335     * that specifies an instruction that performs "result = a0 op a1".
6336     * This could be an MIPS instruction or a function call.  (If the result
6337     * comes back in a register other than a0, you can override "result".)
6338     *
6339     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6340     * CCCC (a1).  Useful for integer division and modulus.
6341     *
6342     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6343     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6344     */
6345    /* binop/lit16 vA, vB, #+CCCC */
6346    lh      a1, 2(rPC)                  # a1 <- sign-extended CCCC
6347    ext     a2, rINST, 8, 4             # a2 <- A
6348    ext     a3, rINST, 12, 4            # a3 <- B
6349    GET_VREG a0, a3                     # a0 <- vB
6350    .if 1
6351    beqz    a1, common_errDivideByZero  # is second operand zero?
6352    .endif
6353    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
6354                               # optional op
6355    div a0, a0, a1                              # a0 <- op, a0-a3 changed
6356    GET_INST_OPCODE v0                  # extract opcode from rINST
6357    SET_VREG a0, a2                # vA <- a0
6358    GOTO_OPCODE v0                      # jump to next instruction
6359
6360
6361
6362/* ------------------------------ */
6363    .balign 128
6364.L_op_rem_int_lit16: /* 0xd4 */
6365/* File: mips64/op_rem_int_lit16.S */
6366/* File: mips64/binopLit16.S */
6367    /*
6368     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6369     * that specifies an instruction that performs "result = a0 op a1".
6370     * This could be an MIPS instruction or a function call.  (If the result
6371     * comes back in a register other than a0, you can override "result".)
6372     *
6373     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6374     * CCCC (a1).  Useful for integer division and modulus.
6375     *
6376     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6377     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6378     */
6379    /* binop/lit16 vA, vB, #+CCCC */
6380    lh      a1, 2(rPC)                  # a1 <- sign-extended CCCC
6381    ext     a2, rINST, 8, 4             # a2 <- A
6382    ext     a3, rINST, 12, 4            # a3 <- B
6383    GET_VREG a0, a3                     # a0 <- vB
6384    .if 1
6385    beqz    a1, common_errDivideByZero  # is second operand zero?
6386    .endif
6387    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
6388                               # optional op
6389    mod a0, a0, a1                              # a0 <- op, a0-a3 changed
6390    GET_INST_OPCODE v0                  # extract opcode from rINST
6391    SET_VREG a0, a2                # vA <- a0
6392    GOTO_OPCODE v0                      # jump to next instruction
6393
6394
6395
6396/* ------------------------------ */
6397    .balign 128
6398.L_op_and_int_lit16: /* 0xd5 */
6399/* File: mips64/op_and_int_lit16.S */
6400/* File: mips64/binopLit16.S */
6401    /*
6402     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6403     * that specifies an instruction that performs "result = a0 op a1".
6404     * This could be an MIPS instruction or a function call.  (If the result
6405     * comes back in a register other than a0, you can override "result".)
6406     *
6407     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6408     * CCCC (a1).  Useful for integer division and modulus.
6409     *
6410     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6411     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6412     */
6413    /* binop/lit16 vA, vB, #+CCCC */
6414    lh      a1, 2(rPC)                  # a1 <- sign-extended CCCC
6415    ext     a2, rINST, 8, 4             # a2 <- A
6416    ext     a3, rINST, 12, 4            # a3 <- B
6417    GET_VREG a0, a3                     # a0 <- vB
6418    .if 0
6419    beqz    a1, common_errDivideByZero  # is second operand zero?
6420    .endif
6421    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
6422                               # optional op
6423    and a0, a0, a1                              # a0 <- op, a0-a3 changed
6424    GET_INST_OPCODE v0                  # extract opcode from rINST
6425    SET_VREG a0, a2                # vA <- a0
6426    GOTO_OPCODE v0                      # jump to next instruction
6427
6428
6429
6430/* ------------------------------ */
6431    .balign 128
6432.L_op_or_int_lit16: /* 0xd6 */
6433/* File: mips64/op_or_int_lit16.S */
6434/* File: mips64/binopLit16.S */
6435    /*
6436     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6437     * that specifies an instruction that performs "result = a0 op a1".
6438     * This could be an MIPS instruction or a function call.  (If the result
6439     * comes back in a register other than a0, you can override "result".)
6440     *
6441     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6442     * CCCC (a1).  Useful for integer division and modulus.
6443     *
6444     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6445     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6446     */
6447    /* binop/lit16 vA, vB, #+CCCC */
6448    lh      a1, 2(rPC)                  # a1 <- sign-extended CCCC
6449    ext     a2, rINST, 8, 4             # a2 <- A
6450    ext     a3, rINST, 12, 4            # a3 <- B
6451    GET_VREG a0, a3                     # a0 <- vB
6452    .if 0
6453    beqz    a1, common_errDivideByZero  # is second operand zero?
6454    .endif
6455    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
6456                               # optional op
6457    or a0, a0, a1                              # a0 <- op, a0-a3 changed
6458    GET_INST_OPCODE v0                  # extract opcode from rINST
6459    SET_VREG a0, a2                # vA <- a0
6460    GOTO_OPCODE v0                      # jump to next instruction
6461
6462
6463
6464/* ------------------------------ */
6465    .balign 128
6466.L_op_xor_int_lit16: /* 0xd7 */
6467/* File: mips64/op_xor_int_lit16.S */
6468/* File: mips64/binopLit16.S */
6469    /*
6470     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6471     * that specifies an instruction that performs "result = a0 op a1".
6472     * This could be an MIPS instruction or a function call.  (If the result
6473     * comes back in a register other than a0, you can override "result".)
6474     *
6475     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6476     * CCCC (a1).  Useful for integer division and modulus.
6477     *
6478     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6479     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6480     */
6481    /* binop/lit16 vA, vB, #+CCCC */
6482    lh      a1, 2(rPC)                  # a1 <- sign-extended CCCC
6483    ext     a2, rINST, 8, 4             # a2 <- A
6484    ext     a3, rINST, 12, 4            # a3 <- B
6485    GET_VREG a0, a3                     # a0 <- vB
6486    .if 0
6487    beqz    a1, common_errDivideByZero  # is second operand zero?
6488    .endif
6489    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
6490                               # optional op
6491    xor a0, a0, a1                              # a0 <- op, a0-a3 changed
6492    GET_INST_OPCODE v0                  # extract opcode from rINST
6493    SET_VREG a0, a2                # vA <- a0
6494    GOTO_OPCODE v0                      # jump to next instruction
6495
6496
6497
6498/* ------------------------------ */
6499    .balign 128
6500.L_op_add_int_lit8: /* 0xd8 */
6501/* File: mips64/op_add_int_lit8.S */
6502/* File: mips64/binopLit8.S */
6503    /*
6504     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6505     * that specifies an instruction that performs "result = a0 op a1".
6506     * This could be an MIPS instruction or a function call.  (If the result
6507     * comes back in a register other than a0, you can override "result".)
6508     *
6509     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6510     * CC (a1).  Useful for integer division and modulus.
6511     *
6512     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6513     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6514     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6515     */
6516    /* binop/lit8 vAA, vBB, #+CC */
6517    lbu     a3, 2(rPC)                  # a3 <- BB
6518    lb      a1, 3(rPC)                  # a1 <- sign-extended CC
6519    srl     a2, rINST, 8                # a2 <- AA
6520    GET_VREG a0, a3                     # a0 <- vBB
6521    .if 0
6522    beqz    a1, common_errDivideByZero  # is second operand zero?
6523    .endif
6524    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
6525                               # optional op
6526    addu a0, a0, a1                              # a0 <- op, a0-a3 changed
6527    GET_INST_OPCODE v0                  # extract opcode from rINST
6528    SET_VREG a0, a2                # vAA <- a0
6529    GOTO_OPCODE v0                      # jump to next instruction
6530
6531
6532
6533/* ------------------------------ */
6534    .balign 128
6535.L_op_rsub_int_lit8: /* 0xd9 */
6536/* File: mips64/op_rsub_int_lit8.S */
6537/* File: mips64/binopLit8.S */
6538    /*
6539     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6540     * that specifies an instruction that performs "result = a0 op a1".
6541     * This could be an MIPS instruction or a function call.  (If the result
6542     * comes back in a register other than a0, you can override "result".)
6543     *
6544     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6545     * CC (a1).  Useful for integer division and modulus.
6546     *
6547     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6548     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6549     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6550     */
6551    /* binop/lit8 vAA, vBB, #+CC */
6552    lbu     a3, 2(rPC)                  # a3 <- BB
6553    lb      a1, 3(rPC)                  # a1 <- sign-extended CC
6554    srl     a2, rINST, 8                # a2 <- AA
6555    GET_VREG a0, a3                     # a0 <- vBB
6556    .if 0
6557    beqz    a1, common_errDivideByZero  # is second operand zero?
6558    .endif
6559    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
6560                               # optional op
6561    subu a0, a1, a0                              # a0 <- op, a0-a3 changed
6562    GET_INST_OPCODE v0                  # extract opcode from rINST
6563    SET_VREG a0, a2                # vAA <- a0
6564    GOTO_OPCODE v0                      # jump to next instruction
6565
6566
6567
6568/* ------------------------------ */
6569    .balign 128
6570.L_op_mul_int_lit8: /* 0xda */
6571/* File: mips64/op_mul_int_lit8.S */
6572/* File: mips64/binopLit8.S */
6573    /*
6574     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6575     * that specifies an instruction that performs "result = a0 op a1".
6576     * This could be an MIPS instruction or a function call.  (If the result
6577     * comes back in a register other than a0, you can override "result".)
6578     *
6579     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6580     * CC (a1).  Useful for integer division and modulus.
6581     *
6582     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6583     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6584     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6585     */
6586    /* binop/lit8 vAA, vBB, #+CC */
6587    lbu     a3, 2(rPC)                  # a3 <- BB
6588    lb      a1, 3(rPC)                  # a1 <- sign-extended CC
6589    srl     a2, rINST, 8                # a2 <- AA
6590    GET_VREG a0, a3                     # a0 <- vBB
6591    .if 0
6592    beqz    a1, common_errDivideByZero  # is second operand zero?
6593    .endif
6594    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
6595                               # optional op
6596    mul a0, a0, a1                              # a0 <- op, a0-a3 changed
6597    GET_INST_OPCODE v0                  # extract opcode from rINST
6598    SET_VREG a0, a2                # vAA <- a0
6599    GOTO_OPCODE v0                      # jump to next instruction
6600
6601
6602
6603/* ------------------------------ */
6604    .balign 128
6605.L_op_div_int_lit8: /* 0xdb */
6606/* File: mips64/op_div_int_lit8.S */
6607/* File: mips64/binopLit8.S */
6608    /*
6609     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6610     * that specifies an instruction that performs "result = a0 op a1".
6611     * This could be an MIPS instruction or a function call.  (If the result
6612     * comes back in a register other than a0, you can override "result".)
6613     *
6614     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6615     * CC (a1).  Useful for integer division and modulus.
6616     *
6617     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6618     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6619     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6620     */
6621    /* binop/lit8 vAA, vBB, #+CC */
6622    lbu     a3, 2(rPC)                  # a3 <- BB
6623    lb      a1, 3(rPC)                  # a1 <- sign-extended CC
6624    srl     a2, rINST, 8                # a2 <- AA
6625    GET_VREG a0, a3                     # a0 <- vBB
6626    .if 1
6627    beqz    a1, common_errDivideByZero  # is second operand zero?
6628    .endif
6629    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
6630                               # optional op
6631    div a0, a0, a1                              # a0 <- op, a0-a3 changed
6632    GET_INST_OPCODE v0                  # extract opcode from rINST
6633    SET_VREG a0, a2                # vAA <- a0
6634    GOTO_OPCODE v0                      # jump to next instruction
6635
6636
6637
6638/* ------------------------------ */
6639    .balign 128
6640.L_op_rem_int_lit8: /* 0xdc */
6641/* File: mips64/op_rem_int_lit8.S */
6642/* File: mips64/binopLit8.S */
6643    /*
6644     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6645     * that specifies an instruction that performs "result = a0 op a1".
6646     * This could be an MIPS instruction or a function call.  (If the result
6647     * comes back in a register other than a0, you can override "result".)
6648     *
6649     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6650     * CC (a1).  Useful for integer division and modulus.
6651     *
6652     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6653     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6654     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6655     */
6656    /* binop/lit8 vAA, vBB, #+CC */
6657    lbu     a3, 2(rPC)                  # a3 <- BB
6658    lb      a1, 3(rPC)                  # a1 <- sign-extended CC
6659    srl     a2, rINST, 8                # a2 <- AA
6660    GET_VREG a0, a3                     # a0 <- vBB
6661    .if 1
6662    beqz    a1, common_errDivideByZero  # is second operand zero?
6663    .endif
6664    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
6665                               # optional op
6666    mod a0, a0, a1                              # a0 <- op, a0-a3 changed
6667    GET_INST_OPCODE v0                  # extract opcode from rINST
6668    SET_VREG a0, a2                # vAA <- a0
6669    GOTO_OPCODE v0                      # jump to next instruction
6670
6671
6672
6673/* ------------------------------ */
6674    .balign 128
6675.L_op_and_int_lit8: /* 0xdd */
6676/* File: mips64/op_and_int_lit8.S */
6677/* File: mips64/binopLit8.S */
6678    /*
6679     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6680     * that specifies an instruction that performs "result = a0 op a1".
6681     * This could be an MIPS instruction or a function call.  (If the result
6682     * comes back in a register other than a0, you can override "result".)
6683     *
6684     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6685     * CC (a1).  Useful for integer division and modulus.
6686     *
6687     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6688     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6689     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6690     */
6691    /* binop/lit8 vAA, vBB, #+CC */
6692    lbu     a3, 2(rPC)                  # a3 <- BB
6693    lb      a1, 3(rPC)                  # a1 <- sign-extended CC
6694    srl     a2, rINST, 8                # a2 <- AA
6695    GET_VREG a0, a3                     # a0 <- vBB
6696    .if 0
6697    beqz    a1, common_errDivideByZero  # is second operand zero?
6698    .endif
6699    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
6700                               # optional op
6701    and a0, a0, a1                              # a0 <- op, a0-a3 changed
6702    GET_INST_OPCODE v0                  # extract opcode from rINST
6703    SET_VREG a0, a2                # vAA <- a0
6704    GOTO_OPCODE v0                      # jump to next instruction
6705
6706
6707
6708/* ------------------------------ */
6709    .balign 128
6710.L_op_or_int_lit8: /* 0xde */
6711/* File: mips64/op_or_int_lit8.S */
6712/* File: mips64/binopLit8.S */
6713    /*
6714     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6715     * that specifies an instruction that performs "result = a0 op a1".
6716     * This could be an MIPS instruction or a function call.  (If the result
6717     * comes back in a register other than a0, you can override "result".)
6718     *
6719     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6720     * CC (a1).  Useful for integer division and modulus.
6721     *
6722     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6723     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6724     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6725     */
6726    /* binop/lit8 vAA, vBB, #+CC */
6727    lbu     a3, 2(rPC)                  # a3 <- BB
6728    lb      a1, 3(rPC)                  # a1 <- sign-extended CC
6729    srl     a2, rINST, 8                # a2 <- AA
6730    GET_VREG a0, a3                     # a0 <- vBB
6731    .if 0
6732    beqz    a1, common_errDivideByZero  # is second operand zero?
6733    .endif
6734    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
6735                               # optional op
6736    or a0, a0, a1                              # a0 <- op, a0-a3 changed
6737    GET_INST_OPCODE v0                  # extract opcode from rINST
6738    SET_VREG a0, a2                # vAA <- a0
6739    GOTO_OPCODE v0                      # jump to next instruction
6740
6741
6742
6743/* ------------------------------ */
6744    .balign 128
6745.L_op_xor_int_lit8: /* 0xdf */
6746/* File: mips64/op_xor_int_lit8.S */
6747/* File: mips64/binopLit8.S */
6748    /*
6749     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6750     * that specifies an instruction that performs "result = a0 op a1".
6751     * This could be an MIPS instruction or a function call.  (If the result
6752     * comes back in a register other than a0, you can override "result".)
6753     *
6754     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6755     * CC (a1).  Useful for integer division and modulus.
6756     *
6757     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6758     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6759     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6760     */
6761    /* binop/lit8 vAA, vBB, #+CC */
6762    lbu     a3, 2(rPC)                  # a3 <- BB
6763    lb      a1, 3(rPC)                  # a1 <- sign-extended CC
6764    srl     a2, rINST, 8                # a2 <- AA
6765    GET_VREG a0, a3                     # a0 <- vBB
6766    .if 0
6767    beqz    a1, common_errDivideByZero  # is second operand zero?
6768    .endif
6769    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
6770                               # optional op
6771    xor a0, a0, a1                              # a0 <- op, a0-a3 changed
6772    GET_INST_OPCODE v0                  # extract opcode from rINST
6773    SET_VREG a0, a2                # vAA <- a0
6774    GOTO_OPCODE v0                      # jump to next instruction
6775
6776
6777
6778/* ------------------------------ */
6779    .balign 128
6780.L_op_shl_int_lit8: /* 0xe0 */
6781/* File: mips64/op_shl_int_lit8.S */
6782/* File: mips64/binopLit8.S */
6783    /*
6784     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6785     * that specifies an instruction that performs "result = a0 op a1".
6786     * This could be an MIPS instruction or a function call.  (If the result
6787     * comes back in a register other than a0, you can override "result".)
6788     *
6789     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6790     * CC (a1).  Useful for integer division and modulus.
6791     *
6792     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6793     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6794     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6795     */
6796    /* binop/lit8 vAA, vBB, #+CC */
6797    lbu     a3, 2(rPC)                  # a3 <- BB
6798    lb      a1, 3(rPC)                  # a1 <- sign-extended CC
6799    srl     a2, rINST, 8                # a2 <- AA
6800    GET_VREG a0, a3                     # a0 <- vBB
6801    .if 0
6802    beqz    a1, common_errDivideByZero  # is second operand zero?
6803    .endif
6804    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
6805                               # optional op
6806    sll a0, a0, a1                              # a0 <- op, a0-a3 changed
6807    GET_INST_OPCODE v0                  # extract opcode from rINST
6808    SET_VREG a0, a2                # vAA <- a0
6809    GOTO_OPCODE v0                      # jump to next instruction
6810
6811
6812
6813/* ------------------------------ */
6814    .balign 128
6815.L_op_shr_int_lit8: /* 0xe1 */
6816/* File: mips64/op_shr_int_lit8.S */
6817/* File: mips64/binopLit8.S */
6818    /*
6819     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6820     * that specifies an instruction that performs "result = a0 op a1".
6821     * This could be an MIPS instruction or a function call.  (If the result
6822     * comes back in a register other than a0, you can override "result".)
6823     *
6824     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6825     * CC (a1).  Useful for integer division and modulus.
6826     *
6827     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6828     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6829     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6830     */
6831    /* binop/lit8 vAA, vBB, #+CC */
6832    lbu     a3, 2(rPC)                  # a3 <- BB
6833    lb      a1, 3(rPC)                  # a1 <- sign-extended CC
6834    srl     a2, rINST, 8                # a2 <- AA
6835    GET_VREG a0, a3                     # a0 <- vBB
6836    .if 0
6837    beqz    a1, common_errDivideByZero  # is second operand zero?
6838    .endif
6839    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
6840                               # optional op
6841    sra a0, a0, a1                              # a0 <- op, a0-a3 changed
6842    GET_INST_OPCODE v0                  # extract opcode from rINST
6843    SET_VREG a0, a2                # vAA <- a0
6844    GOTO_OPCODE v0                      # jump to next instruction
6845
6846
6847
6848/* ------------------------------ */
6849    .balign 128
6850.L_op_ushr_int_lit8: /* 0xe2 */
6851/* File: mips64/op_ushr_int_lit8.S */
6852/* File: mips64/binopLit8.S */
6853    /*
6854     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6855     * that specifies an instruction that performs "result = a0 op a1".
6856     * This could be an MIPS instruction or a function call.  (If the result
6857     * comes back in a register other than a0, you can override "result".)
6858     *
6859     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6860     * CC (a1).  Useful for integer division and modulus.
6861     *
6862     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6863     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6864     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6865     */
6866    /* binop/lit8 vAA, vBB, #+CC */
6867    lbu     a3, 2(rPC)                  # a3 <- BB
6868    lb      a1, 3(rPC)                  # a1 <- sign-extended CC
6869    srl     a2, rINST, 8                # a2 <- AA
6870    GET_VREG a0, a3                     # a0 <- vBB
6871    .if 0
6872    beqz    a1, common_errDivideByZero  # is second operand zero?
6873    .endif
6874    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
6875                               # optional op
6876    srl a0, a0, a1                              # a0 <- op, a0-a3 changed
6877    GET_INST_OPCODE v0                  # extract opcode from rINST
6878    SET_VREG a0, a2                # vAA <- a0
6879    GOTO_OPCODE v0                      # jump to next instruction
6880
6881
6882
6883/* ------------------------------ */
6884    .balign 128
6885.L_op_iget_quick: /* 0xe3 */
6886/* File: mips64/op_iget_quick.S */
6887    /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6888    /* op vA, vB, offset//CCCC */
6889    srl     a2, rINST, 12               # a2 <- B
6890    lhu     a1, 2(rPC)                  # a1 <- field byte offset
6891    GET_VREG_U a3, a2                   # a3 <- object we're operating on
6892    ext     a4, rINST, 8, 4             # a4 <- A
6893    daddu   a1, a1, a3
6894    beqz    a3, common_errNullObject    # object was null
6895    lw   a0, 0(a1)                   # a0 <- obj.field
6896    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
6897    SET_VREG a0, a4                     # fp[A] <- a0
6898    GET_INST_OPCODE v0                  # extract opcode from rINST
6899    GOTO_OPCODE v0                      # jump to next instruction
6900
6901/* ------------------------------ */
6902    .balign 128
6903.L_op_iget_wide_quick: /* 0xe4 */
6904/* File: mips64/op_iget_wide_quick.S */
6905    /* iget-wide-quick vA, vB, offset//CCCC */
6906    srl     a2, rINST, 12               # a2 <- B
6907    lhu     a4, 2(rPC)                  # a4 <- field byte offset
6908    GET_VREG_U a3, a2                   # a3 <- object we're operating on
6909    ext     a2, rINST, 8, 4             # a2 <- A
6910    beqz    a3, common_errNullObject    # object was null
6911    daddu   a4, a3, a4                  # create direct pointer
6912    lw      a0, 0(a4)
6913    lw      a1, 4(a4)
6914    dinsu   a0, a1, 32, 32
6915    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
6916    SET_VREG_WIDE a0, a2
6917    GET_INST_OPCODE v0                  # extract opcode from rINST
6918    GOTO_OPCODE v0                      # jump to next instruction
6919
6920/* ------------------------------ */
6921    .balign 128
6922.L_op_iget_object_quick: /* 0xe5 */
6923/* File: mips64/op_iget_object_quick.S */
6924    /* For: iget-object-quick */
6925    /* op vA, vB, offset//CCCC */
6926    .extern artIGetObjectFromMterp
6927    srl     a2, rINST, 12               # a2 <- B
6928    lhu     a1, 2(rPC)                  # a1 <- field byte offset
6929    EXPORT_PC
6930    GET_VREG_U a0, a2                   # a0 <- object we're operating on
6931    jal     artIGetObjectFromMterp      # (obj, offset)
6932    ld      a3, THREAD_EXCEPTION_OFFSET(rSELF)
6933    ext     a2, rINST, 8, 4             # a2 <- A
6934    PREFETCH_INST 2
6935    bnez    a3, MterpPossibleException  # bail out
6936    SET_VREG_OBJECT v0, a2              # fp[A] <- v0
6937    ADVANCE 2                           # advance rPC
6938    GET_INST_OPCODE v0                  # extract opcode from rINST
6939    GOTO_OPCODE v0                      # jump to next instruction
6940
6941/* ------------------------------ */
6942    .balign 128
6943.L_op_iput_quick: /* 0xe6 */
6944/* File: mips64/op_iput_quick.S */
6945    /* For: iput-quick, iput-boolean-quick, iput-byte-quick, iput-char-quick, iput-short-quick */
6946    /* op vA, vB, offset//CCCC */
6947    srl     a2, rINST, 12               # a2 <- B
6948    lhu     a1, 2(rPC)                  # a1 <- field byte offset
6949    GET_VREG_U a3, a2                   # a3 <- fp[B], the object pointer
6950    ext     a2, rINST, 8, 4             # a2 <- A
6951    beqz    a3, common_errNullObject    # object was null
6952    GET_VREG a0, a2                     # a0 <- fp[A]
6953    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
6954    daddu   a1, a1, a3
6955    sw  a0, 0(a1)                   # obj.field <- a0
6956    GET_INST_OPCODE v0                  # extract opcode from rINST
6957    GOTO_OPCODE v0                      # jump to next instruction
6958
6959/* ------------------------------ */
6960    .balign 128
6961.L_op_iput_wide_quick: /* 0xe7 */
6962/* File: mips64/op_iput_wide_quick.S */
6963    /* iput-wide-quick vA, vB, offset//CCCC */
6964    srl     a2, rINST, 12               # a2 <- B
6965    lhu     a3, 2(rPC)                  # a3 <- field byte offset
6966    GET_VREG_U a2, a2                   # a2 <- fp[B], the object pointer
6967    ext     a0, rINST, 8, 4             # a0 <- A
6968    beqz    a2, common_errNullObject    # object was null
6969    GET_VREG_WIDE a0, a0                # a0 <- fp[A]
6970    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
6971    daddu   a1, a2, a3                  # create a direct pointer
6972    sw      a0, 0(a1)
6973    dsrl32  a0, a0, 0
6974    sw      a0, 4(a1)
6975    GET_INST_OPCODE v0                  # extract opcode from rINST
6976    GOTO_OPCODE v0                      # jump to next instruction
6977
6978/* ------------------------------ */
6979    .balign 128
6980.L_op_iput_object_quick: /* 0xe8 */
6981/* File: mips64/op_iput_object_quick.S */
6982    .extern MterpIputObjectQuick
6983    EXPORT_PC
6984    daddu   a0, rFP, OFF_FP_SHADOWFRAME
6985    move    a1, rPC
6986    move    a2, rINST
6987    jal     MterpIputObjectQuick
6988    beqzc   v0, MterpException
6989    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
6990    GET_INST_OPCODE v0                  # extract opcode from rINST
6991    GOTO_OPCODE v0                      # jump to next instruction
6992
6993/* ------------------------------ */
6994    .balign 128
6995.L_op_invoke_virtual_quick: /* 0xe9 */
6996/* File: mips64/op_invoke_virtual_quick.S */
6997/* File: mips64/invoke.S */
6998    /*
6999     * Generic invoke handler wrapper.
7000     */
7001    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7002    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7003    .extern MterpInvokeVirtualQuick
7004    .extern MterpShouldSwitchInterpreters
7005    EXPORT_PC
7006    move    a0, rSELF
7007    daddu   a1, rFP, OFF_FP_SHADOWFRAME
7008    move    a2, rPC
7009    move    a3, rINST
7010    jal     MterpInvokeVirtualQuick
7011    beqzc   v0, MterpException
7012    FETCH_ADVANCE_INST 3
7013    jal     MterpShouldSwitchInterpreters
7014    bnezc   v0, MterpFallback
7015    GET_INST_OPCODE v0
7016    GOTO_OPCODE v0
7017
7018
7019/* ------------------------------ */
7020    .balign 128
7021.L_op_invoke_virtual_range_quick: /* 0xea */
7022/* File: mips64/op_invoke_virtual_range_quick.S */
7023/* File: mips64/invoke.S */
7024    /*
7025     * Generic invoke handler wrapper.
7026     */
7027    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7028    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7029    .extern MterpInvokeVirtualQuickRange
7030    .extern MterpShouldSwitchInterpreters
7031    EXPORT_PC
7032    move    a0, rSELF
7033    daddu   a1, rFP, OFF_FP_SHADOWFRAME
7034    move    a2, rPC
7035    move    a3, rINST
7036    jal     MterpInvokeVirtualQuickRange
7037    beqzc   v0, MterpException
7038    FETCH_ADVANCE_INST 3
7039    jal     MterpShouldSwitchInterpreters
7040    bnezc   v0, MterpFallback
7041    GET_INST_OPCODE v0
7042    GOTO_OPCODE v0
7043
7044
7045/* ------------------------------ */
7046    .balign 128
7047.L_op_iput_boolean_quick: /* 0xeb */
7048/* File: mips64/op_iput_boolean_quick.S */
7049/* File: mips64/op_iput_quick.S */
7050    /* For: iput-quick, iput-boolean-quick, iput-byte-quick, iput-char-quick, iput-short-quick */
7051    /* op vA, vB, offset//CCCC */
7052    srl     a2, rINST, 12               # a2 <- B
7053    lhu     a1, 2(rPC)                  # a1 <- field byte offset
7054    GET_VREG_U a3, a2                   # a3 <- fp[B], the object pointer
7055    ext     a2, rINST, 8, 4             # a2 <- A
7056    beqz    a3, common_errNullObject    # object was null
7057    GET_VREG a0, a2                     # a0 <- fp[A]
7058    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
7059    daddu   a1, a1, a3
7060    sb  a0, 0(a1)                   # obj.field <- a0
7061    GET_INST_OPCODE v0                  # extract opcode from rINST
7062    GOTO_OPCODE v0                      # jump to next instruction
7063
7064
7065/* ------------------------------ */
7066    .balign 128
7067.L_op_iput_byte_quick: /* 0xec */
7068/* File: mips64/op_iput_byte_quick.S */
7069/* File: mips64/op_iput_quick.S */
7070    /* For: iput-quick, iput-boolean-quick, iput-byte-quick, iput-char-quick, iput-short-quick */
7071    /* op vA, vB, offset//CCCC */
7072    srl     a2, rINST, 12               # a2 <- B
7073    lhu     a1, 2(rPC)                  # a1 <- field byte offset
7074    GET_VREG_U a3, a2                   # a3 <- fp[B], the object pointer
7075    ext     a2, rINST, 8, 4             # a2 <- A
7076    beqz    a3, common_errNullObject    # object was null
7077    GET_VREG a0, a2                     # a0 <- fp[A]
7078    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
7079    daddu   a1, a1, a3
7080    sb  a0, 0(a1)                   # obj.field <- a0
7081    GET_INST_OPCODE v0                  # extract opcode from rINST
7082    GOTO_OPCODE v0                      # jump to next instruction
7083
7084
7085/* ------------------------------ */
7086    .balign 128
7087.L_op_iput_char_quick: /* 0xed */
7088/* File: mips64/op_iput_char_quick.S */
7089/* File: mips64/op_iput_quick.S */
7090    /* For: iput-quick, iput-boolean-quick, iput-byte-quick, iput-char-quick, iput-short-quick */
7091    /* op vA, vB, offset//CCCC */
7092    srl     a2, rINST, 12               # a2 <- B
7093    lhu     a1, 2(rPC)                  # a1 <- field byte offset
7094    GET_VREG_U a3, a2                   # a3 <- fp[B], the object pointer
7095    ext     a2, rINST, 8, 4             # a2 <- A
7096    beqz    a3, common_errNullObject    # object was null
7097    GET_VREG a0, a2                     # a0 <- fp[A]
7098    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
7099    daddu   a1, a1, a3
7100    sh  a0, 0(a1)                   # obj.field <- a0
7101    GET_INST_OPCODE v0                  # extract opcode from rINST
7102    GOTO_OPCODE v0                      # jump to next instruction
7103
7104
7105/* ------------------------------ */
7106    .balign 128
7107.L_op_iput_short_quick: /* 0xee */
7108/* File: mips64/op_iput_short_quick.S */
7109/* File: mips64/op_iput_quick.S */
7110    /* For: iput-quick, iput-boolean-quick, iput-byte-quick, iput-char-quick, iput-short-quick */
7111    /* op vA, vB, offset//CCCC */
7112    srl     a2, rINST, 12               # a2 <- B
7113    lhu     a1, 2(rPC)                  # a1 <- field byte offset
7114    GET_VREG_U a3, a2                   # a3 <- fp[B], the object pointer
7115    ext     a2, rINST, 8, 4             # a2 <- A
7116    beqz    a3, common_errNullObject    # object was null
7117    GET_VREG a0, a2                     # a0 <- fp[A]
7118    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
7119    daddu   a1, a1, a3
7120    sh  a0, 0(a1)                   # obj.field <- a0
7121    GET_INST_OPCODE v0                  # extract opcode from rINST
7122    GOTO_OPCODE v0                      # jump to next instruction
7123
7124
7125/* ------------------------------ */
7126    .balign 128
7127.L_op_iget_boolean_quick: /* 0xef */
7128/* File: mips64/op_iget_boolean_quick.S */
7129/* File: mips64/op_iget_quick.S */
7130    /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
7131    /* op vA, vB, offset//CCCC */
7132    srl     a2, rINST, 12               # a2 <- B
7133    lhu     a1, 2(rPC)                  # a1 <- field byte offset
7134    GET_VREG_U a3, a2                   # a3 <- object we're operating on
7135    ext     a4, rINST, 8, 4             # a4 <- A
7136    daddu   a1, a1, a3
7137    beqz    a3, common_errNullObject    # object was null
7138    lbu   a0, 0(a1)                   # a0 <- obj.field
7139    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
7140    SET_VREG a0, a4                     # fp[A] <- a0
7141    GET_INST_OPCODE v0                  # extract opcode from rINST
7142    GOTO_OPCODE v0                      # jump to next instruction
7143
7144
7145/* ------------------------------ */
7146    .balign 128
7147.L_op_iget_byte_quick: /* 0xf0 */
7148/* File: mips64/op_iget_byte_quick.S */
7149/* File: mips64/op_iget_quick.S */
7150    /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
7151    /* op vA, vB, offset//CCCC */
7152    srl     a2, rINST, 12               # a2 <- B
7153    lhu     a1, 2(rPC)                  # a1 <- field byte offset
7154    GET_VREG_U a3, a2                   # a3 <- object we're operating on
7155    ext     a4, rINST, 8, 4             # a4 <- A
7156    daddu   a1, a1, a3
7157    beqz    a3, common_errNullObject    # object was null
7158    lb   a0, 0(a1)                   # a0 <- obj.field
7159    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
7160    SET_VREG a0, a4                     # fp[A] <- a0
7161    GET_INST_OPCODE v0                  # extract opcode from rINST
7162    GOTO_OPCODE v0                      # jump to next instruction
7163
7164
7165/* ------------------------------ */
7166    .balign 128
7167.L_op_iget_char_quick: /* 0xf1 */
7168/* File: mips64/op_iget_char_quick.S */
7169/* File: mips64/op_iget_quick.S */
7170    /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
7171    /* op vA, vB, offset//CCCC */
7172    srl     a2, rINST, 12               # a2 <- B
7173    lhu     a1, 2(rPC)                  # a1 <- field byte offset
7174    GET_VREG_U a3, a2                   # a3 <- object we're operating on
7175    ext     a4, rINST, 8, 4             # a4 <- A
7176    daddu   a1, a1, a3
7177    beqz    a3, common_errNullObject    # object was null
7178    lhu   a0, 0(a1)                   # a0 <- obj.field
7179    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
7180    SET_VREG a0, a4                     # fp[A] <- a0
7181    GET_INST_OPCODE v0                  # extract opcode from rINST
7182    GOTO_OPCODE v0                      # jump to next instruction
7183
7184
7185/* ------------------------------ */
7186    .balign 128
7187.L_op_iget_short_quick: /* 0xf2 */
7188/* File: mips64/op_iget_short_quick.S */
7189/* File: mips64/op_iget_quick.S */
7190    /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
7191    /* op vA, vB, offset//CCCC */
7192    srl     a2, rINST, 12               # a2 <- B
7193    lhu     a1, 2(rPC)                  # a1 <- field byte offset
7194    GET_VREG_U a3, a2                   # a3 <- object we're operating on
7195    ext     a4, rINST, 8, 4             # a4 <- A
7196    daddu   a1, a1, a3
7197    beqz    a3, common_errNullObject    # object was null
7198    lh   a0, 0(a1)                   # a0 <- obj.field
7199    FETCH_ADVANCE_INST 2                # advance rPC, load rINST
7200    SET_VREG a0, a4                     # fp[A] <- a0
7201    GET_INST_OPCODE v0                  # extract opcode from rINST
7202    GOTO_OPCODE v0                      # jump to next instruction
7203
7204
7205/* ------------------------------ */
7206    .balign 128
7207.L_op_invoke_lambda: /* 0xf3 */
7208/* Transfer stub to alternate interpreter */
7209    b       MterpFallback
7210
7211/* ------------------------------ */
7212    .balign 128
7213.L_op_unused_f4: /* 0xf4 */
7214/* File: mips64/op_unused_f4.S */
7215/* File: mips64/unused.S */
7216/*
7217 * Bail to reference interpreter to throw.
7218 */
7219    b       MterpFallback
7220
7221
7222/* ------------------------------ */
7223    .balign 128
7224.L_op_capture_variable: /* 0xf5 */
7225/* Transfer stub to alternate interpreter */
7226    b       MterpFallback
7227
7228/* ------------------------------ */
7229    .balign 128
7230.L_op_create_lambda: /* 0xf6 */
7231/* Transfer stub to alternate interpreter */
7232    b       MterpFallback
7233
7234/* ------------------------------ */
7235    .balign 128
7236.L_op_liberate_variable: /* 0xf7 */
7237/* Transfer stub to alternate interpreter */
7238    b       MterpFallback
7239
7240/* ------------------------------ */
7241    .balign 128
7242.L_op_box_lambda: /* 0xf8 */
7243/* Transfer stub to alternate interpreter */
7244    b       MterpFallback
7245
7246/* ------------------------------ */
7247    .balign 128
7248.L_op_unbox_lambda: /* 0xf9 */
7249/* Transfer stub to alternate interpreter */
7250    b       MterpFallback
7251
7252/* ------------------------------ */
7253    .balign 128
7254.L_op_unused_fa: /* 0xfa */
7255/* File: mips64/op_unused_fa.S */
7256/* File: mips64/unused.S */
7257/*
7258 * Bail to reference interpreter to throw.
7259 */
7260    b       MterpFallback
7261
7262
7263/* ------------------------------ */
7264    .balign 128
7265.L_op_unused_fb: /* 0xfb */
7266/* File: mips64/op_unused_fb.S */
7267/* File: mips64/unused.S */
7268/*
7269 * Bail to reference interpreter to throw.
7270 */
7271    b       MterpFallback
7272
7273
7274/* ------------------------------ */
7275    .balign 128
7276.L_op_unused_fc: /* 0xfc */
7277/* File: mips64/op_unused_fc.S */
7278/* File: mips64/unused.S */
7279/*
7280 * Bail to reference interpreter to throw.
7281 */
7282    b       MterpFallback
7283
7284
7285/* ------------------------------ */
7286    .balign 128
7287.L_op_unused_fd: /* 0xfd */
7288/* File: mips64/op_unused_fd.S */
7289/* File: mips64/unused.S */
7290/*
7291 * Bail to reference interpreter to throw.
7292 */
7293    b       MterpFallback
7294
7295
7296/* ------------------------------ */
7297    .balign 128
7298.L_op_unused_fe: /* 0xfe */
7299/* File: mips64/op_unused_fe.S */
7300/* File: mips64/unused.S */
7301/*
7302 * Bail to reference interpreter to throw.
7303 */
7304    b       MterpFallback
7305
7306
7307/* ------------------------------ */
7308    .balign 128
7309.L_op_unused_ff: /* 0xff */
7310/* File: mips64/op_unused_ff.S */
7311/* File: mips64/unused.S */
7312/*
7313 * Bail to reference interpreter to throw.
7314 */
7315    b       MterpFallback
7316
7317
7318    .balign 128
7319    .size   artMterpAsmInstructionStart, .-artMterpAsmInstructionStart
7320    .global artMterpAsmInstructionEnd
7321artMterpAsmInstructionEnd:
7322
7323/*
7324 * ===========================================================================
7325 *  Sister implementations
7326 * ===========================================================================
7327 */
7328    .global artMterpAsmSisterStart
7329    .type   artMterpAsmSisterStart, %function
7330    .text
7331    .balign 4
7332artMterpAsmSisterStart:
7333
7334/* continuation for op_float_to_int */
7335.Lop_float_to_int_trunc:
7336    trunc.w.s f0, f0
7337    mfc1    t0, f0
7338.Lop_float_to_int_done:
7339    /* Can't include fcvtFooter.S after break */
7340    GET_INST_OPCODE v0                  # extract opcode from rINST
7341    SET_VREG t0, a1
7342    GOTO_OPCODE v0                      # jump to next instruction
7343
7344/* continuation for op_float_to_long */
7345.Lop_float_to_long_trunc:
7346    trunc.l.s f0, f0
7347    dmfc1   t0, f0
7348.Lop_float_to_long_done:
7349    /* Can't include fcvtFooter.S after break */
7350    GET_INST_OPCODE v0                  # extract opcode from rINST
7351    SET_VREG_WIDE t0, a1
7352    GOTO_OPCODE v0                      # jump to next instruction
7353
7354/* continuation for op_double_to_int */
7355.Lop_double_to_int_trunc:
7356    trunc.w.d f0, f0
7357    mfc1    t0, f0
7358.Lop_double_to_int_done:
7359    /* Can't include fcvtFooter.S after break */
7360    GET_INST_OPCODE v0                  # extract opcode from rINST
7361    SET_VREG t0, a1
7362    GOTO_OPCODE v0                      # jump to next instruction
7363
7364/* continuation for op_double_to_long */
7365.Lop_double_to_long_trunc:
7366    trunc.l.d f0, f0
7367    dmfc1   t0, f0
7368.Lop_double_to_long_done:
7369    /* Can't include fcvtFooter.S after break */
7370    GET_INST_OPCODE v0                  # extract opcode from rINST
7371    SET_VREG_WIDE t0, a1
7372    GOTO_OPCODE v0                      # jump to next instruction
7373
7374    .size   artMterpAsmSisterStart, .-artMterpAsmSisterStart
7375    .global artMterpAsmSisterEnd
7376artMterpAsmSisterEnd:
7377
7378
7379    .global artMterpAsmAltInstructionStart
7380    .type   artMterpAsmAltInstructionStart, %function
7381    .text
7382
7383artMterpAsmAltInstructionStart = .L_ALT_op_nop
7384/* ------------------------------ */
7385    .balign 128
7386.L_ALT_op_nop: /* 0x00 */
7387/* File: mips64/alt_stub.S */
7388/*
7389 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7390 * any interesting requests and then jump to the real instruction
7391 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7392 */
7393    .extern MterpCheckBefore
7394    EXPORT_PC
7395    REFRESH_IBASE
7396    dla     ra, artMterpAsmInstructionStart
7397    dla     t9, MterpCheckBefore
7398    move    a0, rSELF
7399    daddu   a1, rFP, OFF_FP_SHADOWFRAME
7400    daddu   ra, ra, (0 * 128)            # Addr of primary handler.
7401    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
7402
7403/* ------------------------------ */
7404    .balign 128
7405.L_ALT_op_move: /* 0x01 */
7406/* File: mips64/alt_stub.S */
7407/*
7408 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7409 * any interesting requests and then jump to the real instruction
7410 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7411 */
7412    .extern MterpCheckBefore
7413    EXPORT_PC
7414    REFRESH_IBASE
7415    dla     ra, artMterpAsmInstructionStart
7416    dla     t9, MterpCheckBefore
7417    move    a0, rSELF
7418    daddu   a1, rFP, OFF_FP_SHADOWFRAME
7419    daddu   ra, ra, (1 * 128)            # Addr of primary handler.
7420    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
7421
7422/* ------------------------------ */
7423    .balign 128
7424.L_ALT_op_move_from16: /* 0x02 */
7425/* File: mips64/alt_stub.S */
7426/*
7427 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7428 * any interesting requests and then jump to the real instruction
7429 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7430 */
7431    .extern MterpCheckBefore
7432    EXPORT_PC
7433    REFRESH_IBASE
7434    dla     ra, artMterpAsmInstructionStart
7435    dla     t9, MterpCheckBefore
7436    move    a0, rSELF
7437    daddu   a1, rFP, OFF_FP_SHADOWFRAME
7438    daddu   ra, ra, (2 * 128)            # Addr of primary handler.
7439    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
7440
7441/* ------------------------------ */
7442    .balign 128
7443.L_ALT_op_move_16: /* 0x03 */
7444/* File: mips64/alt_stub.S */
7445/*
7446 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7447 * any interesting requests and then jump to the real instruction
7448 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7449 */
7450    .extern MterpCheckBefore
7451    EXPORT_PC
7452    REFRESH_IBASE
7453    dla     ra, artMterpAsmInstructionStart
7454    dla     t9, MterpCheckBefore
7455    move    a0, rSELF
7456    daddu   a1, rFP, OFF_FP_SHADOWFRAME
7457    daddu   ra, ra, (3 * 128)            # Addr of primary handler.
7458    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
7459
7460/* ------------------------------ */
7461    .balign 128
7462.L_ALT_op_move_wide: /* 0x04 */
7463/* File: mips64/alt_stub.S */
7464/*
7465 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7466 * any interesting requests and then jump to the real instruction
7467 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7468 */
7469    .extern MterpCheckBefore
7470    EXPORT_PC
7471    REFRESH_IBASE
7472    dla     ra, artMterpAsmInstructionStart
7473    dla     t9, MterpCheckBefore
7474    move    a0, rSELF
7475    daddu   a1, rFP, OFF_FP_SHADOWFRAME
7476    daddu   ra, ra, (4 * 128)            # Addr of primary handler.
7477    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
7478
7479/* ------------------------------ */
7480    .balign 128
7481.L_ALT_op_move_wide_from16: /* 0x05 */
7482/* File: mips64/alt_stub.S */
7483/*
7484 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7485 * any interesting requests and then jump to the real instruction
7486 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7487 */
7488    .extern MterpCheckBefore
7489    EXPORT_PC
7490    REFRESH_IBASE
7491    dla     ra, artMterpAsmInstructionStart
7492    dla     t9, MterpCheckBefore
7493    move    a0, rSELF
7494    daddu   a1, rFP, OFF_FP_SHADOWFRAME
7495    daddu   ra, ra, (5 * 128)            # Addr of primary handler.
7496    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
7497
7498/* ------------------------------ */
7499    .balign 128
7500.L_ALT_op_move_wide_16: /* 0x06 */
7501/* File: mips64/alt_stub.S */
7502/*
7503 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7504 * any interesting requests and then jump to the real instruction
7505 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7506 */
7507    .extern MterpCheckBefore
7508    EXPORT_PC
7509    REFRESH_IBASE
7510    dla     ra, artMterpAsmInstructionStart
7511    dla     t9, MterpCheckBefore
7512    move    a0, rSELF
7513    daddu   a1, rFP, OFF_FP_SHADOWFRAME
7514    daddu   ra, ra, (6 * 128)            # Addr of primary handler.
7515    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
7516
7517/* ------------------------------ */
7518    .balign 128
7519.L_ALT_op_move_object: /* 0x07 */
7520/* File: mips64/alt_stub.S */
7521/*
7522 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7523 * any interesting requests and then jump to the real instruction
7524 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7525 */
7526    .extern MterpCheckBefore
7527    EXPORT_PC
7528    REFRESH_IBASE
7529    dla     ra, artMterpAsmInstructionStart
7530    dla     t9, MterpCheckBefore
7531    move    a0, rSELF
7532    daddu   a1, rFP, OFF_FP_SHADOWFRAME
7533    daddu   ra, ra, (7 * 128)            # Addr of primary handler.
7534    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
7535
7536/* ------------------------------ */
7537    .balign 128
7538.L_ALT_op_move_object_from16: /* 0x08 */
7539/* File: mips64/alt_stub.S */
7540/*
7541 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7542 * any interesting requests and then jump to the real instruction
7543 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7544 */
7545    .extern MterpCheckBefore
7546    EXPORT_PC
7547    REFRESH_IBASE
7548    dla     ra, artMterpAsmInstructionStart
7549    dla     t9, MterpCheckBefore
7550    move    a0, rSELF
7551    daddu   a1, rFP, OFF_FP_SHADOWFRAME
7552    daddu   ra, ra, (8 * 128)            # Addr of primary handler.
7553    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
7554
7555/* ------------------------------ */
7556    .balign 128
7557.L_ALT_op_move_object_16: /* 0x09 */
7558/* File: mips64/alt_stub.S */
7559/*
7560 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7561 * any interesting requests and then jump to the real instruction
7562 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7563 */
7564    .extern MterpCheckBefore
7565    EXPORT_PC
7566    REFRESH_IBASE
7567    dla     ra, artMterpAsmInstructionStart
7568    dla     t9, MterpCheckBefore
7569    move    a0, rSELF
7570    daddu   a1, rFP, OFF_FP_SHADOWFRAME
7571    daddu   ra, ra, (9 * 128)            # Addr of primary handler.
7572    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
7573
7574/* ------------------------------ */
7575    .balign 128
7576.L_ALT_op_move_result: /* 0x0a */
7577/* File: mips64/alt_stub.S */
7578/*
7579 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7580 * any interesting requests and then jump to the real instruction
7581 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7582 */
7583    .extern MterpCheckBefore
7584    EXPORT_PC
7585    REFRESH_IBASE
7586    dla     ra, artMterpAsmInstructionStart
7587    dla     t9, MterpCheckBefore
7588    move    a0, rSELF
7589    daddu   a1, rFP, OFF_FP_SHADOWFRAME
7590    daddu   ra, ra, (10 * 128)            # Addr of primary handler.
7591    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
7592
7593/* ------------------------------ */
7594    .balign 128
7595.L_ALT_op_move_result_wide: /* 0x0b */
7596/* File: mips64/alt_stub.S */
7597/*
7598 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7599 * any interesting requests and then jump to the real instruction
7600 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7601 */
7602    .extern MterpCheckBefore
7603    EXPORT_PC
7604    REFRESH_IBASE
7605    dla     ra, artMterpAsmInstructionStart
7606    dla     t9, MterpCheckBefore
7607    move    a0, rSELF
7608    daddu   a1, rFP, OFF_FP_SHADOWFRAME
7609    daddu   ra, ra, (11 * 128)            # Addr of primary handler.
7610    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
7611
7612/* ------------------------------ */
7613    .balign 128
7614.L_ALT_op_move_result_object: /* 0x0c */
7615/* File: mips64/alt_stub.S */
7616/*
7617 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7618 * any interesting requests and then jump to the real instruction
7619 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7620 */
7621    .extern MterpCheckBefore
7622    EXPORT_PC
7623    REFRESH_IBASE
7624    dla     ra, artMterpAsmInstructionStart
7625    dla     t9, MterpCheckBefore
7626    move    a0, rSELF
7627    daddu   a1, rFP, OFF_FP_SHADOWFRAME
7628    daddu   ra, ra, (12 * 128)            # Addr of primary handler.
7629    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
7630
7631/* ------------------------------ */
7632    .balign 128
7633.L_ALT_op_move_exception: /* 0x0d */
7634/* File: mips64/alt_stub.S */
7635/*
7636 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7637 * any interesting requests and then jump to the real instruction
7638 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7639 */
7640    .extern MterpCheckBefore
7641    EXPORT_PC
7642    REFRESH_IBASE
7643    dla     ra, artMterpAsmInstructionStart
7644    dla     t9, MterpCheckBefore
7645    move    a0, rSELF
7646    daddu   a1, rFP, OFF_FP_SHADOWFRAME
7647    daddu   ra, ra, (13 * 128)            # Addr of primary handler.
7648    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
7649
7650/* ------------------------------ */
7651    .balign 128
7652.L_ALT_op_return_void: /* 0x0e */
7653/* File: mips64/alt_stub.S */
7654/*
7655 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7656 * any interesting requests and then jump to the real instruction
7657 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7658 */
7659    .extern MterpCheckBefore
7660    EXPORT_PC
7661    REFRESH_IBASE
7662    dla     ra, artMterpAsmInstructionStart
7663    dla     t9, MterpCheckBefore
7664    move    a0, rSELF
7665    daddu   a1, rFP, OFF_FP_SHADOWFRAME
7666    daddu   ra, ra, (14 * 128)            # Addr of primary handler.
7667    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
7668
7669/* ------------------------------ */
7670    .balign 128
7671.L_ALT_op_return: /* 0x0f */
7672/* File: mips64/alt_stub.S */
7673/*
7674 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7675 * any interesting requests and then jump to the real instruction
7676 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7677 */
7678    .extern MterpCheckBefore
7679    EXPORT_PC
7680    REFRESH_IBASE
7681    dla     ra, artMterpAsmInstructionStart
7682    dla     t9, MterpCheckBefore
7683    move    a0, rSELF
7684    daddu   a1, rFP, OFF_FP_SHADOWFRAME
7685    daddu   ra, ra, (15 * 128)            # Addr of primary handler.
7686    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
7687
7688/* ------------------------------ */
7689    .balign 128
7690.L_ALT_op_return_wide: /* 0x10 */
7691/* File: mips64/alt_stub.S */
7692/*
7693 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7694 * any interesting requests and then jump to the real instruction
7695 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7696 */
7697    .extern MterpCheckBefore
7698    EXPORT_PC
7699    REFRESH_IBASE
7700    dla     ra, artMterpAsmInstructionStart
7701    dla     t9, MterpCheckBefore
7702    move    a0, rSELF
7703    daddu   a1, rFP, OFF_FP_SHADOWFRAME
7704    daddu   ra, ra, (16 * 128)            # Addr of primary handler.
7705    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
7706
7707/* ------------------------------ */
7708    .balign 128
7709.L_ALT_op_return_object: /* 0x11 */
7710/* File: mips64/alt_stub.S */
7711/*
7712 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7713 * any interesting requests and then jump to the real instruction
7714 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7715 */
7716    .extern MterpCheckBefore
7717    EXPORT_PC
7718    REFRESH_IBASE
7719    dla     ra, artMterpAsmInstructionStart
7720    dla     t9, MterpCheckBefore
7721    move    a0, rSELF
7722    daddu   a1, rFP, OFF_FP_SHADOWFRAME
7723    daddu   ra, ra, (17 * 128)            # Addr of primary handler.
7724    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
7725
7726/* ------------------------------ */
7727    .balign 128
7728.L_ALT_op_const_4: /* 0x12 */
7729/* File: mips64/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.  Note that the call to MterpCheckBefore is done as a tail call.
7734 */
7735    .extern MterpCheckBefore
7736    EXPORT_PC
7737    REFRESH_IBASE
7738    dla     ra, artMterpAsmInstructionStart
7739    dla     t9, MterpCheckBefore
7740    move    a0, rSELF
7741    daddu   a1, rFP, OFF_FP_SHADOWFRAME
7742    daddu   ra, ra, (18 * 128)            # Addr of primary handler.
7743    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
7744
7745/* ------------------------------ */
7746    .balign 128
7747.L_ALT_op_const_16: /* 0x13 */
7748/* File: mips64/alt_stub.S */
7749/*
7750 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7751 * any interesting requests and then jump to the real instruction
7752 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7753 */
7754    .extern MterpCheckBefore
7755    EXPORT_PC
7756    REFRESH_IBASE
7757    dla     ra, artMterpAsmInstructionStart
7758    dla     t9, MterpCheckBefore
7759    move    a0, rSELF
7760    daddu   a1, rFP, OFF_FP_SHADOWFRAME
7761    daddu   ra, ra, (19 * 128)            # Addr of primary handler.
7762    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
7763
7764/* ------------------------------ */
7765    .balign 128
7766.L_ALT_op_const: /* 0x14 */
7767/* File: mips64/alt_stub.S */
7768/*
7769 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7770 * any interesting requests and then jump to the real instruction
7771 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7772 */
7773    .extern MterpCheckBefore
7774    EXPORT_PC
7775    REFRESH_IBASE
7776    dla     ra, artMterpAsmInstructionStart
7777    dla     t9, MterpCheckBefore
7778    move    a0, rSELF
7779    daddu   a1, rFP, OFF_FP_SHADOWFRAME
7780    daddu   ra, ra, (20 * 128)            # Addr of primary handler.
7781    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
7782
7783/* ------------------------------ */
7784    .balign 128
7785.L_ALT_op_const_high16: /* 0x15 */
7786/* File: mips64/alt_stub.S */
7787/*
7788 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7789 * any interesting requests and then jump to the real instruction
7790 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7791 */
7792    .extern MterpCheckBefore
7793    EXPORT_PC
7794    REFRESH_IBASE
7795    dla     ra, artMterpAsmInstructionStart
7796    dla     t9, MterpCheckBefore
7797    move    a0, rSELF
7798    daddu   a1, rFP, OFF_FP_SHADOWFRAME
7799    daddu   ra, ra, (21 * 128)            # Addr of primary handler.
7800    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
7801
7802/* ------------------------------ */
7803    .balign 128
7804.L_ALT_op_const_wide_16: /* 0x16 */
7805/* File: mips64/alt_stub.S */
7806/*
7807 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7808 * any interesting requests and then jump to the real instruction
7809 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7810 */
7811    .extern MterpCheckBefore
7812    EXPORT_PC
7813    REFRESH_IBASE
7814    dla     ra, artMterpAsmInstructionStart
7815    dla     t9, MterpCheckBefore
7816    move    a0, rSELF
7817    daddu   a1, rFP, OFF_FP_SHADOWFRAME
7818    daddu   ra, ra, (22 * 128)            # Addr of primary handler.
7819    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
7820
7821/* ------------------------------ */
7822    .balign 128
7823.L_ALT_op_const_wide_32: /* 0x17 */
7824/* File: mips64/alt_stub.S */
7825/*
7826 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7827 * any interesting requests and then jump to the real instruction
7828 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7829 */
7830    .extern MterpCheckBefore
7831    EXPORT_PC
7832    REFRESH_IBASE
7833    dla     ra, artMterpAsmInstructionStart
7834    dla     t9, MterpCheckBefore
7835    move    a0, rSELF
7836    daddu   a1, rFP, OFF_FP_SHADOWFRAME
7837    daddu   ra, ra, (23 * 128)            # Addr of primary handler.
7838    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
7839
7840/* ------------------------------ */
7841    .balign 128
7842.L_ALT_op_const_wide: /* 0x18 */
7843/* File: mips64/alt_stub.S */
7844/*
7845 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7846 * any interesting requests and then jump to the real instruction
7847 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7848 */
7849    .extern MterpCheckBefore
7850    EXPORT_PC
7851    REFRESH_IBASE
7852    dla     ra, artMterpAsmInstructionStart
7853    dla     t9, MterpCheckBefore
7854    move    a0, rSELF
7855    daddu   a1, rFP, OFF_FP_SHADOWFRAME
7856    daddu   ra, ra, (24 * 128)            # Addr of primary handler.
7857    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
7858
7859/* ------------------------------ */
7860    .balign 128
7861.L_ALT_op_const_wide_high16: /* 0x19 */
7862/* File: mips64/alt_stub.S */
7863/*
7864 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7865 * any interesting requests and then jump to the real instruction
7866 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7867 */
7868    .extern MterpCheckBefore
7869    EXPORT_PC
7870    REFRESH_IBASE
7871    dla     ra, artMterpAsmInstructionStart
7872    dla     t9, MterpCheckBefore
7873    move    a0, rSELF
7874    daddu   a1, rFP, OFF_FP_SHADOWFRAME
7875    daddu   ra, ra, (25 * 128)            # Addr of primary handler.
7876    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
7877
7878/* ------------------------------ */
7879    .balign 128
7880.L_ALT_op_const_string: /* 0x1a */
7881/* File: mips64/alt_stub.S */
7882/*
7883 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7884 * any interesting requests and then jump to the real instruction
7885 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7886 */
7887    .extern MterpCheckBefore
7888    EXPORT_PC
7889    REFRESH_IBASE
7890    dla     ra, artMterpAsmInstructionStart
7891    dla     t9, MterpCheckBefore
7892    move    a0, rSELF
7893    daddu   a1, rFP, OFF_FP_SHADOWFRAME
7894    daddu   ra, ra, (26 * 128)            # Addr of primary handler.
7895    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
7896
7897/* ------------------------------ */
7898    .balign 128
7899.L_ALT_op_const_string_jumbo: /* 0x1b */
7900/* File: mips64/alt_stub.S */
7901/*
7902 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7903 * any interesting requests and then jump to the real instruction
7904 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7905 */
7906    .extern MterpCheckBefore
7907    EXPORT_PC
7908    REFRESH_IBASE
7909    dla     ra, artMterpAsmInstructionStart
7910    dla     t9, MterpCheckBefore
7911    move    a0, rSELF
7912    daddu   a1, rFP, OFF_FP_SHADOWFRAME
7913    daddu   ra, ra, (27 * 128)            # Addr of primary handler.
7914    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
7915
7916/* ------------------------------ */
7917    .balign 128
7918.L_ALT_op_const_class: /* 0x1c */
7919/* File: mips64/alt_stub.S */
7920/*
7921 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7922 * any interesting requests and then jump to the real instruction
7923 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7924 */
7925    .extern MterpCheckBefore
7926    EXPORT_PC
7927    REFRESH_IBASE
7928    dla     ra, artMterpAsmInstructionStart
7929    dla     t9, MterpCheckBefore
7930    move    a0, rSELF
7931    daddu   a1, rFP, OFF_FP_SHADOWFRAME
7932    daddu   ra, ra, (28 * 128)            # Addr of primary handler.
7933    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
7934
7935/* ------------------------------ */
7936    .balign 128
7937.L_ALT_op_monitor_enter: /* 0x1d */
7938/* File: mips64/alt_stub.S */
7939/*
7940 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7941 * any interesting requests and then jump to the real instruction
7942 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7943 */
7944    .extern MterpCheckBefore
7945    EXPORT_PC
7946    REFRESH_IBASE
7947    dla     ra, artMterpAsmInstructionStart
7948    dla     t9, MterpCheckBefore
7949    move    a0, rSELF
7950    daddu   a1, rFP, OFF_FP_SHADOWFRAME
7951    daddu   ra, ra, (29 * 128)            # Addr of primary handler.
7952    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
7953
7954/* ------------------------------ */
7955    .balign 128
7956.L_ALT_op_monitor_exit: /* 0x1e */
7957/* File: mips64/alt_stub.S */
7958/*
7959 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7960 * any interesting requests and then jump to the real instruction
7961 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7962 */
7963    .extern MterpCheckBefore
7964    EXPORT_PC
7965    REFRESH_IBASE
7966    dla     ra, artMterpAsmInstructionStart
7967    dla     t9, MterpCheckBefore
7968    move    a0, rSELF
7969    daddu   a1, rFP, OFF_FP_SHADOWFRAME
7970    daddu   ra, ra, (30 * 128)            # Addr of primary handler.
7971    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
7972
7973/* ------------------------------ */
7974    .balign 128
7975.L_ALT_op_check_cast: /* 0x1f */
7976/* File: mips64/alt_stub.S */
7977/*
7978 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7979 * any interesting requests and then jump to the real instruction
7980 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7981 */
7982    .extern MterpCheckBefore
7983    EXPORT_PC
7984    REFRESH_IBASE
7985    dla     ra, artMterpAsmInstructionStart
7986    dla     t9, MterpCheckBefore
7987    move    a0, rSELF
7988    daddu   a1, rFP, OFF_FP_SHADOWFRAME
7989    daddu   ra, ra, (31 * 128)            # Addr of primary handler.
7990    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
7991
7992/* ------------------------------ */
7993    .balign 128
7994.L_ALT_op_instance_of: /* 0x20 */
7995/* File: mips64/alt_stub.S */
7996/*
7997 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7998 * any interesting requests and then jump to the real instruction
7999 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8000 */
8001    .extern MterpCheckBefore
8002    EXPORT_PC
8003    REFRESH_IBASE
8004    dla     ra, artMterpAsmInstructionStart
8005    dla     t9, MterpCheckBefore
8006    move    a0, rSELF
8007    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8008    daddu   ra, ra, (32 * 128)            # Addr of primary handler.
8009    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8010
8011/* ------------------------------ */
8012    .balign 128
8013.L_ALT_op_array_length: /* 0x21 */
8014/* File: mips64/alt_stub.S */
8015/*
8016 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8017 * any interesting requests and then jump to the real instruction
8018 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8019 */
8020    .extern MterpCheckBefore
8021    EXPORT_PC
8022    REFRESH_IBASE
8023    dla     ra, artMterpAsmInstructionStart
8024    dla     t9, MterpCheckBefore
8025    move    a0, rSELF
8026    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8027    daddu   ra, ra, (33 * 128)            # Addr of primary handler.
8028    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8029
8030/* ------------------------------ */
8031    .balign 128
8032.L_ALT_op_new_instance: /* 0x22 */
8033/* File: mips64/alt_stub.S */
8034/*
8035 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8036 * any interesting requests and then jump to the real instruction
8037 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8038 */
8039    .extern MterpCheckBefore
8040    EXPORT_PC
8041    REFRESH_IBASE
8042    dla     ra, artMterpAsmInstructionStart
8043    dla     t9, MterpCheckBefore
8044    move    a0, rSELF
8045    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8046    daddu   ra, ra, (34 * 128)            # Addr of primary handler.
8047    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8048
8049/* ------------------------------ */
8050    .balign 128
8051.L_ALT_op_new_array: /* 0x23 */
8052/* File: mips64/alt_stub.S */
8053/*
8054 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8055 * any interesting requests and then jump to the real instruction
8056 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8057 */
8058    .extern MterpCheckBefore
8059    EXPORT_PC
8060    REFRESH_IBASE
8061    dla     ra, artMterpAsmInstructionStart
8062    dla     t9, MterpCheckBefore
8063    move    a0, rSELF
8064    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8065    daddu   ra, ra, (35 * 128)            # Addr of primary handler.
8066    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8067
8068/* ------------------------------ */
8069    .balign 128
8070.L_ALT_op_filled_new_array: /* 0x24 */
8071/* File: mips64/alt_stub.S */
8072/*
8073 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8074 * any interesting requests and then jump to the real instruction
8075 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8076 */
8077    .extern MterpCheckBefore
8078    EXPORT_PC
8079    REFRESH_IBASE
8080    dla     ra, artMterpAsmInstructionStart
8081    dla     t9, MterpCheckBefore
8082    move    a0, rSELF
8083    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8084    daddu   ra, ra, (36 * 128)            # Addr of primary handler.
8085    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8086
8087/* ------------------------------ */
8088    .balign 128
8089.L_ALT_op_filled_new_array_range: /* 0x25 */
8090/* File: mips64/alt_stub.S */
8091/*
8092 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8093 * any interesting requests and then jump to the real instruction
8094 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8095 */
8096    .extern MterpCheckBefore
8097    EXPORT_PC
8098    REFRESH_IBASE
8099    dla     ra, artMterpAsmInstructionStart
8100    dla     t9, MterpCheckBefore
8101    move    a0, rSELF
8102    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8103    daddu   ra, ra, (37 * 128)            # Addr of primary handler.
8104    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8105
8106/* ------------------------------ */
8107    .balign 128
8108.L_ALT_op_fill_array_data: /* 0x26 */
8109/* File: mips64/alt_stub.S */
8110/*
8111 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8112 * any interesting requests and then jump to the real instruction
8113 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8114 */
8115    .extern MterpCheckBefore
8116    EXPORT_PC
8117    REFRESH_IBASE
8118    dla     ra, artMterpAsmInstructionStart
8119    dla     t9, MterpCheckBefore
8120    move    a0, rSELF
8121    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8122    daddu   ra, ra, (38 * 128)            # Addr of primary handler.
8123    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8124
8125/* ------------------------------ */
8126    .balign 128
8127.L_ALT_op_throw: /* 0x27 */
8128/* File: mips64/alt_stub.S */
8129/*
8130 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8131 * any interesting requests and then jump to the real instruction
8132 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8133 */
8134    .extern MterpCheckBefore
8135    EXPORT_PC
8136    REFRESH_IBASE
8137    dla     ra, artMterpAsmInstructionStart
8138    dla     t9, MterpCheckBefore
8139    move    a0, rSELF
8140    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8141    daddu   ra, ra, (39 * 128)            # Addr of primary handler.
8142    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8143
8144/* ------------------------------ */
8145    .balign 128
8146.L_ALT_op_goto: /* 0x28 */
8147/* File: mips64/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.  Note that the call to MterpCheckBefore is done as a tail call.
8152 */
8153    .extern MterpCheckBefore
8154    EXPORT_PC
8155    REFRESH_IBASE
8156    dla     ra, artMterpAsmInstructionStart
8157    dla     t9, MterpCheckBefore
8158    move    a0, rSELF
8159    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8160    daddu   ra, ra, (40 * 128)            # Addr of primary handler.
8161    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8162
8163/* ------------------------------ */
8164    .balign 128
8165.L_ALT_op_goto_16: /* 0x29 */
8166/* File: mips64/alt_stub.S */
8167/*
8168 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8169 * any interesting requests and then jump to the real instruction
8170 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8171 */
8172    .extern MterpCheckBefore
8173    EXPORT_PC
8174    REFRESH_IBASE
8175    dla     ra, artMterpAsmInstructionStart
8176    dla     t9, MterpCheckBefore
8177    move    a0, rSELF
8178    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8179    daddu   ra, ra, (41 * 128)            # Addr of primary handler.
8180    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8181
8182/* ------------------------------ */
8183    .balign 128
8184.L_ALT_op_goto_32: /* 0x2a */
8185/* File: mips64/alt_stub.S */
8186/*
8187 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8188 * any interesting requests and then jump to the real instruction
8189 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8190 */
8191    .extern MterpCheckBefore
8192    EXPORT_PC
8193    REFRESH_IBASE
8194    dla     ra, artMterpAsmInstructionStart
8195    dla     t9, MterpCheckBefore
8196    move    a0, rSELF
8197    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8198    daddu   ra, ra, (42 * 128)            # Addr of primary handler.
8199    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8200
8201/* ------------------------------ */
8202    .balign 128
8203.L_ALT_op_packed_switch: /* 0x2b */
8204/* File: mips64/alt_stub.S */
8205/*
8206 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8207 * any interesting requests and then jump to the real instruction
8208 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8209 */
8210    .extern MterpCheckBefore
8211    EXPORT_PC
8212    REFRESH_IBASE
8213    dla     ra, artMterpAsmInstructionStart
8214    dla     t9, MterpCheckBefore
8215    move    a0, rSELF
8216    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8217    daddu   ra, ra, (43 * 128)            # Addr of primary handler.
8218    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8219
8220/* ------------------------------ */
8221    .balign 128
8222.L_ALT_op_sparse_switch: /* 0x2c */
8223/* File: mips64/alt_stub.S */
8224/*
8225 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8226 * any interesting requests and then jump to the real instruction
8227 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8228 */
8229    .extern MterpCheckBefore
8230    EXPORT_PC
8231    REFRESH_IBASE
8232    dla     ra, artMterpAsmInstructionStart
8233    dla     t9, MterpCheckBefore
8234    move    a0, rSELF
8235    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8236    daddu   ra, ra, (44 * 128)            # Addr of primary handler.
8237    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8238
8239/* ------------------------------ */
8240    .balign 128
8241.L_ALT_op_cmpl_float: /* 0x2d */
8242/* File: mips64/alt_stub.S */
8243/*
8244 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8245 * any interesting requests and then jump to the real instruction
8246 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8247 */
8248    .extern MterpCheckBefore
8249    EXPORT_PC
8250    REFRESH_IBASE
8251    dla     ra, artMterpAsmInstructionStart
8252    dla     t9, MterpCheckBefore
8253    move    a0, rSELF
8254    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8255    daddu   ra, ra, (45 * 128)            # Addr of primary handler.
8256    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8257
8258/* ------------------------------ */
8259    .balign 128
8260.L_ALT_op_cmpg_float: /* 0x2e */
8261/* File: mips64/alt_stub.S */
8262/*
8263 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8264 * any interesting requests and then jump to the real instruction
8265 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8266 */
8267    .extern MterpCheckBefore
8268    EXPORT_PC
8269    REFRESH_IBASE
8270    dla     ra, artMterpAsmInstructionStart
8271    dla     t9, MterpCheckBefore
8272    move    a0, rSELF
8273    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8274    daddu   ra, ra, (46 * 128)            # Addr of primary handler.
8275    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8276
8277/* ------------------------------ */
8278    .balign 128
8279.L_ALT_op_cmpl_double: /* 0x2f */
8280/* File: mips64/alt_stub.S */
8281/*
8282 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8283 * any interesting requests and then jump to the real instruction
8284 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8285 */
8286    .extern MterpCheckBefore
8287    EXPORT_PC
8288    REFRESH_IBASE
8289    dla     ra, artMterpAsmInstructionStart
8290    dla     t9, MterpCheckBefore
8291    move    a0, rSELF
8292    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8293    daddu   ra, ra, (47 * 128)            # Addr of primary handler.
8294    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8295
8296/* ------------------------------ */
8297    .balign 128
8298.L_ALT_op_cmpg_double: /* 0x30 */
8299/* File: mips64/alt_stub.S */
8300/*
8301 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8302 * any interesting requests and then jump to the real instruction
8303 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8304 */
8305    .extern MterpCheckBefore
8306    EXPORT_PC
8307    REFRESH_IBASE
8308    dla     ra, artMterpAsmInstructionStart
8309    dla     t9, MterpCheckBefore
8310    move    a0, rSELF
8311    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8312    daddu   ra, ra, (48 * 128)            # Addr of primary handler.
8313    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8314
8315/* ------------------------------ */
8316    .balign 128
8317.L_ALT_op_cmp_long: /* 0x31 */
8318/* File: mips64/alt_stub.S */
8319/*
8320 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8321 * any interesting requests and then jump to the real instruction
8322 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8323 */
8324    .extern MterpCheckBefore
8325    EXPORT_PC
8326    REFRESH_IBASE
8327    dla     ra, artMterpAsmInstructionStart
8328    dla     t9, MterpCheckBefore
8329    move    a0, rSELF
8330    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8331    daddu   ra, ra, (49 * 128)            # Addr of primary handler.
8332    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8333
8334/* ------------------------------ */
8335    .balign 128
8336.L_ALT_op_if_eq: /* 0x32 */
8337/* File: mips64/alt_stub.S */
8338/*
8339 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8340 * any interesting requests and then jump to the real instruction
8341 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8342 */
8343    .extern MterpCheckBefore
8344    EXPORT_PC
8345    REFRESH_IBASE
8346    dla     ra, artMterpAsmInstructionStart
8347    dla     t9, MterpCheckBefore
8348    move    a0, rSELF
8349    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8350    daddu   ra, ra, (50 * 128)            # Addr of primary handler.
8351    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8352
8353/* ------------------------------ */
8354    .balign 128
8355.L_ALT_op_if_ne: /* 0x33 */
8356/* File: mips64/alt_stub.S */
8357/*
8358 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8359 * any interesting requests and then jump to the real instruction
8360 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8361 */
8362    .extern MterpCheckBefore
8363    EXPORT_PC
8364    REFRESH_IBASE
8365    dla     ra, artMterpAsmInstructionStart
8366    dla     t9, MterpCheckBefore
8367    move    a0, rSELF
8368    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8369    daddu   ra, ra, (51 * 128)            # Addr of primary handler.
8370    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8371
8372/* ------------------------------ */
8373    .balign 128
8374.L_ALT_op_if_lt: /* 0x34 */
8375/* File: mips64/alt_stub.S */
8376/*
8377 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8378 * any interesting requests and then jump to the real instruction
8379 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8380 */
8381    .extern MterpCheckBefore
8382    EXPORT_PC
8383    REFRESH_IBASE
8384    dla     ra, artMterpAsmInstructionStart
8385    dla     t9, MterpCheckBefore
8386    move    a0, rSELF
8387    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8388    daddu   ra, ra, (52 * 128)            # Addr of primary handler.
8389    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8390
8391/* ------------------------------ */
8392    .balign 128
8393.L_ALT_op_if_ge: /* 0x35 */
8394/* File: mips64/alt_stub.S */
8395/*
8396 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8397 * any interesting requests and then jump to the real instruction
8398 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8399 */
8400    .extern MterpCheckBefore
8401    EXPORT_PC
8402    REFRESH_IBASE
8403    dla     ra, artMterpAsmInstructionStart
8404    dla     t9, MterpCheckBefore
8405    move    a0, rSELF
8406    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8407    daddu   ra, ra, (53 * 128)            # Addr of primary handler.
8408    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8409
8410/* ------------------------------ */
8411    .balign 128
8412.L_ALT_op_if_gt: /* 0x36 */
8413/* File: mips64/alt_stub.S */
8414/*
8415 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8416 * any interesting requests and then jump to the real instruction
8417 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8418 */
8419    .extern MterpCheckBefore
8420    EXPORT_PC
8421    REFRESH_IBASE
8422    dla     ra, artMterpAsmInstructionStart
8423    dla     t9, MterpCheckBefore
8424    move    a0, rSELF
8425    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8426    daddu   ra, ra, (54 * 128)            # Addr of primary handler.
8427    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8428
8429/* ------------------------------ */
8430    .balign 128
8431.L_ALT_op_if_le: /* 0x37 */
8432/* File: mips64/alt_stub.S */
8433/*
8434 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8435 * any interesting requests and then jump to the real instruction
8436 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8437 */
8438    .extern MterpCheckBefore
8439    EXPORT_PC
8440    REFRESH_IBASE
8441    dla     ra, artMterpAsmInstructionStart
8442    dla     t9, MterpCheckBefore
8443    move    a0, rSELF
8444    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8445    daddu   ra, ra, (55 * 128)            # Addr of primary handler.
8446    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8447
8448/* ------------------------------ */
8449    .balign 128
8450.L_ALT_op_if_eqz: /* 0x38 */
8451/* File: mips64/alt_stub.S */
8452/*
8453 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8454 * any interesting requests and then jump to the real instruction
8455 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8456 */
8457    .extern MterpCheckBefore
8458    EXPORT_PC
8459    REFRESH_IBASE
8460    dla     ra, artMterpAsmInstructionStart
8461    dla     t9, MterpCheckBefore
8462    move    a0, rSELF
8463    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8464    daddu   ra, ra, (56 * 128)            # Addr of primary handler.
8465    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8466
8467/* ------------------------------ */
8468    .balign 128
8469.L_ALT_op_if_nez: /* 0x39 */
8470/* File: mips64/alt_stub.S */
8471/*
8472 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8473 * any interesting requests and then jump to the real instruction
8474 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8475 */
8476    .extern MterpCheckBefore
8477    EXPORT_PC
8478    REFRESH_IBASE
8479    dla     ra, artMterpAsmInstructionStart
8480    dla     t9, MterpCheckBefore
8481    move    a0, rSELF
8482    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8483    daddu   ra, ra, (57 * 128)            # Addr of primary handler.
8484    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8485
8486/* ------------------------------ */
8487    .balign 128
8488.L_ALT_op_if_ltz: /* 0x3a */
8489/* File: mips64/alt_stub.S */
8490/*
8491 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8492 * any interesting requests and then jump to the real instruction
8493 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8494 */
8495    .extern MterpCheckBefore
8496    EXPORT_PC
8497    REFRESH_IBASE
8498    dla     ra, artMterpAsmInstructionStart
8499    dla     t9, MterpCheckBefore
8500    move    a0, rSELF
8501    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8502    daddu   ra, ra, (58 * 128)            # Addr of primary handler.
8503    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8504
8505/* ------------------------------ */
8506    .balign 128
8507.L_ALT_op_if_gez: /* 0x3b */
8508/* File: mips64/alt_stub.S */
8509/*
8510 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8511 * any interesting requests and then jump to the real instruction
8512 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8513 */
8514    .extern MterpCheckBefore
8515    EXPORT_PC
8516    REFRESH_IBASE
8517    dla     ra, artMterpAsmInstructionStart
8518    dla     t9, MterpCheckBefore
8519    move    a0, rSELF
8520    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8521    daddu   ra, ra, (59 * 128)            # Addr of primary handler.
8522    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8523
8524/* ------------------------------ */
8525    .balign 128
8526.L_ALT_op_if_gtz: /* 0x3c */
8527/* File: mips64/alt_stub.S */
8528/*
8529 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8530 * any interesting requests and then jump to the real instruction
8531 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8532 */
8533    .extern MterpCheckBefore
8534    EXPORT_PC
8535    REFRESH_IBASE
8536    dla     ra, artMterpAsmInstructionStart
8537    dla     t9, MterpCheckBefore
8538    move    a0, rSELF
8539    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8540    daddu   ra, ra, (60 * 128)            # Addr of primary handler.
8541    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8542
8543/* ------------------------------ */
8544    .balign 128
8545.L_ALT_op_if_lez: /* 0x3d */
8546/* File: mips64/alt_stub.S */
8547/*
8548 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8549 * any interesting requests and then jump to the real instruction
8550 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8551 */
8552    .extern MterpCheckBefore
8553    EXPORT_PC
8554    REFRESH_IBASE
8555    dla     ra, artMterpAsmInstructionStart
8556    dla     t9, MterpCheckBefore
8557    move    a0, rSELF
8558    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8559    daddu   ra, ra, (61 * 128)            # Addr of primary handler.
8560    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8561
8562/* ------------------------------ */
8563    .balign 128
8564.L_ALT_op_unused_3e: /* 0x3e */
8565/* File: mips64/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.  Note that the call to MterpCheckBefore is done as a tail call.
8570 */
8571    .extern MterpCheckBefore
8572    EXPORT_PC
8573    REFRESH_IBASE
8574    dla     ra, artMterpAsmInstructionStart
8575    dla     t9, MterpCheckBefore
8576    move    a0, rSELF
8577    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8578    daddu   ra, ra, (62 * 128)            # Addr of primary handler.
8579    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8580
8581/* ------------------------------ */
8582    .balign 128
8583.L_ALT_op_unused_3f: /* 0x3f */
8584/* File: mips64/alt_stub.S */
8585/*
8586 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8587 * any interesting requests and then jump to the real instruction
8588 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8589 */
8590    .extern MterpCheckBefore
8591    EXPORT_PC
8592    REFRESH_IBASE
8593    dla     ra, artMterpAsmInstructionStart
8594    dla     t9, MterpCheckBefore
8595    move    a0, rSELF
8596    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8597    daddu   ra, ra, (63 * 128)            # Addr of primary handler.
8598    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8599
8600/* ------------------------------ */
8601    .balign 128
8602.L_ALT_op_unused_40: /* 0x40 */
8603/* File: mips64/alt_stub.S */
8604/*
8605 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8606 * any interesting requests and then jump to the real instruction
8607 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8608 */
8609    .extern MterpCheckBefore
8610    EXPORT_PC
8611    REFRESH_IBASE
8612    dla     ra, artMterpAsmInstructionStart
8613    dla     t9, MterpCheckBefore
8614    move    a0, rSELF
8615    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8616    daddu   ra, ra, (64 * 128)            # Addr of primary handler.
8617    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8618
8619/* ------------------------------ */
8620    .balign 128
8621.L_ALT_op_unused_41: /* 0x41 */
8622/* File: mips64/alt_stub.S */
8623/*
8624 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8625 * any interesting requests and then jump to the real instruction
8626 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8627 */
8628    .extern MterpCheckBefore
8629    EXPORT_PC
8630    REFRESH_IBASE
8631    dla     ra, artMterpAsmInstructionStart
8632    dla     t9, MterpCheckBefore
8633    move    a0, rSELF
8634    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8635    daddu   ra, ra, (65 * 128)            # Addr of primary handler.
8636    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8637
8638/* ------------------------------ */
8639    .balign 128
8640.L_ALT_op_unused_42: /* 0x42 */
8641/* File: mips64/alt_stub.S */
8642/*
8643 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8644 * any interesting requests and then jump to the real instruction
8645 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8646 */
8647    .extern MterpCheckBefore
8648    EXPORT_PC
8649    REFRESH_IBASE
8650    dla     ra, artMterpAsmInstructionStart
8651    dla     t9, MterpCheckBefore
8652    move    a0, rSELF
8653    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8654    daddu   ra, ra, (66 * 128)            # Addr of primary handler.
8655    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8656
8657/* ------------------------------ */
8658    .balign 128
8659.L_ALT_op_unused_43: /* 0x43 */
8660/* File: mips64/alt_stub.S */
8661/*
8662 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8663 * any interesting requests and then jump to the real instruction
8664 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8665 */
8666    .extern MterpCheckBefore
8667    EXPORT_PC
8668    REFRESH_IBASE
8669    dla     ra, artMterpAsmInstructionStart
8670    dla     t9, MterpCheckBefore
8671    move    a0, rSELF
8672    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8673    daddu   ra, ra, (67 * 128)            # Addr of primary handler.
8674    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8675
8676/* ------------------------------ */
8677    .balign 128
8678.L_ALT_op_aget: /* 0x44 */
8679/* File: mips64/alt_stub.S */
8680/*
8681 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8682 * any interesting requests and then jump to the real instruction
8683 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8684 */
8685    .extern MterpCheckBefore
8686    EXPORT_PC
8687    REFRESH_IBASE
8688    dla     ra, artMterpAsmInstructionStart
8689    dla     t9, MterpCheckBefore
8690    move    a0, rSELF
8691    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8692    daddu   ra, ra, (68 * 128)            # Addr of primary handler.
8693    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8694
8695/* ------------------------------ */
8696    .balign 128
8697.L_ALT_op_aget_wide: /* 0x45 */
8698/* File: mips64/alt_stub.S */
8699/*
8700 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8701 * any interesting requests and then jump to the real instruction
8702 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8703 */
8704    .extern MterpCheckBefore
8705    EXPORT_PC
8706    REFRESH_IBASE
8707    dla     ra, artMterpAsmInstructionStart
8708    dla     t9, MterpCheckBefore
8709    move    a0, rSELF
8710    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8711    daddu   ra, ra, (69 * 128)            # Addr of primary handler.
8712    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8713
8714/* ------------------------------ */
8715    .balign 128
8716.L_ALT_op_aget_object: /* 0x46 */
8717/* File: mips64/alt_stub.S */
8718/*
8719 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8720 * any interesting requests and then jump to the real instruction
8721 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8722 */
8723    .extern MterpCheckBefore
8724    EXPORT_PC
8725    REFRESH_IBASE
8726    dla     ra, artMterpAsmInstructionStart
8727    dla     t9, MterpCheckBefore
8728    move    a0, rSELF
8729    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8730    daddu   ra, ra, (70 * 128)            # Addr of primary handler.
8731    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8732
8733/* ------------------------------ */
8734    .balign 128
8735.L_ALT_op_aget_boolean: /* 0x47 */
8736/* File: mips64/alt_stub.S */
8737/*
8738 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8739 * any interesting requests and then jump to the real instruction
8740 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8741 */
8742    .extern MterpCheckBefore
8743    EXPORT_PC
8744    REFRESH_IBASE
8745    dla     ra, artMterpAsmInstructionStart
8746    dla     t9, MterpCheckBefore
8747    move    a0, rSELF
8748    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8749    daddu   ra, ra, (71 * 128)            # Addr of primary handler.
8750    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8751
8752/* ------------------------------ */
8753    .balign 128
8754.L_ALT_op_aget_byte: /* 0x48 */
8755/* File: mips64/alt_stub.S */
8756/*
8757 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8758 * any interesting requests and then jump to the real instruction
8759 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8760 */
8761    .extern MterpCheckBefore
8762    EXPORT_PC
8763    REFRESH_IBASE
8764    dla     ra, artMterpAsmInstructionStart
8765    dla     t9, MterpCheckBefore
8766    move    a0, rSELF
8767    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8768    daddu   ra, ra, (72 * 128)            # Addr of primary handler.
8769    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8770
8771/* ------------------------------ */
8772    .balign 128
8773.L_ALT_op_aget_char: /* 0x49 */
8774/* File: mips64/alt_stub.S */
8775/*
8776 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8777 * any interesting requests and then jump to the real instruction
8778 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8779 */
8780    .extern MterpCheckBefore
8781    EXPORT_PC
8782    REFRESH_IBASE
8783    dla     ra, artMterpAsmInstructionStart
8784    dla     t9, MterpCheckBefore
8785    move    a0, rSELF
8786    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8787    daddu   ra, ra, (73 * 128)            # Addr of primary handler.
8788    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8789
8790/* ------------------------------ */
8791    .balign 128
8792.L_ALT_op_aget_short: /* 0x4a */
8793/* File: mips64/alt_stub.S */
8794/*
8795 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8796 * any interesting requests and then jump to the real instruction
8797 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8798 */
8799    .extern MterpCheckBefore
8800    EXPORT_PC
8801    REFRESH_IBASE
8802    dla     ra, artMterpAsmInstructionStart
8803    dla     t9, MterpCheckBefore
8804    move    a0, rSELF
8805    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8806    daddu   ra, ra, (74 * 128)            # Addr of primary handler.
8807    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8808
8809/* ------------------------------ */
8810    .balign 128
8811.L_ALT_op_aput: /* 0x4b */
8812/* File: mips64/alt_stub.S */
8813/*
8814 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8815 * any interesting requests and then jump to the real instruction
8816 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8817 */
8818    .extern MterpCheckBefore
8819    EXPORT_PC
8820    REFRESH_IBASE
8821    dla     ra, artMterpAsmInstructionStart
8822    dla     t9, MterpCheckBefore
8823    move    a0, rSELF
8824    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8825    daddu   ra, ra, (75 * 128)            # Addr of primary handler.
8826    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8827
8828/* ------------------------------ */
8829    .balign 128
8830.L_ALT_op_aput_wide: /* 0x4c */
8831/* File: mips64/alt_stub.S */
8832/*
8833 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8834 * any interesting requests and then jump to the real instruction
8835 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8836 */
8837    .extern MterpCheckBefore
8838    EXPORT_PC
8839    REFRESH_IBASE
8840    dla     ra, artMterpAsmInstructionStart
8841    dla     t9, MterpCheckBefore
8842    move    a0, rSELF
8843    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8844    daddu   ra, ra, (76 * 128)            # Addr of primary handler.
8845    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8846
8847/* ------------------------------ */
8848    .balign 128
8849.L_ALT_op_aput_object: /* 0x4d */
8850/* File: mips64/alt_stub.S */
8851/*
8852 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8853 * any interesting requests and then jump to the real instruction
8854 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8855 */
8856    .extern MterpCheckBefore
8857    EXPORT_PC
8858    REFRESH_IBASE
8859    dla     ra, artMterpAsmInstructionStart
8860    dla     t9, MterpCheckBefore
8861    move    a0, rSELF
8862    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8863    daddu   ra, ra, (77 * 128)            # Addr of primary handler.
8864    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8865
8866/* ------------------------------ */
8867    .balign 128
8868.L_ALT_op_aput_boolean: /* 0x4e */
8869/* File: mips64/alt_stub.S */
8870/*
8871 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8872 * any interesting requests and then jump to the real instruction
8873 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8874 */
8875    .extern MterpCheckBefore
8876    EXPORT_PC
8877    REFRESH_IBASE
8878    dla     ra, artMterpAsmInstructionStart
8879    dla     t9, MterpCheckBefore
8880    move    a0, rSELF
8881    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8882    daddu   ra, ra, (78 * 128)            # Addr of primary handler.
8883    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8884
8885/* ------------------------------ */
8886    .balign 128
8887.L_ALT_op_aput_byte: /* 0x4f */
8888/* File: mips64/alt_stub.S */
8889/*
8890 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8891 * any interesting requests and then jump to the real instruction
8892 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8893 */
8894    .extern MterpCheckBefore
8895    EXPORT_PC
8896    REFRESH_IBASE
8897    dla     ra, artMterpAsmInstructionStart
8898    dla     t9, MterpCheckBefore
8899    move    a0, rSELF
8900    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8901    daddu   ra, ra, (79 * 128)            # Addr of primary handler.
8902    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8903
8904/* ------------------------------ */
8905    .balign 128
8906.L_ALT_op_aput_char: /* 0x50 */
8907/* File: mips64/alt_stub.S */
8908/*
8909 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8910 * any interesting requests and then jump to the real instruction
8911 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8912 */
8913    .extern MterpCheckBefore
8914    EXPORT_PC
8915    REFRESH_IBASE
8916    dla     ra, artMterpAsmInstructionStart
8917    dla     t9, MterpCheckBefore
8918    move    a0, rSELF
8919    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8920    daddu   ra, ra, (80 * 128)            # Addr of primary handler.
8921    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8922
8923/* ------------------------------ */
8924    .balign 128
8925.L_ALT_op_aput_short: /* 0x51 */
8926/* File: mips64/alt_stub.S */
8927/*
8928 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8929 * any interesting requests and then jump to the real instruction
8930 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8931 */
8932    .extern MterpCheckBefore
8933    EXPORT_PC
8934    REFRESH_IBASE
8935    dla     ra, artMterpAsmInstructionStart
8936    dla     t9, MterpCheckBefore
8937    move    a0, rSELF
8938    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8939    daddu   ra, ra, (81 * 128)            # Addr of primary handler.
8940    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8941
8942/* ------------------------------ */
8943    .balign 128
8944.L_ALT_op_iget: /* 0x52 */
8945/* File: mips64/alt_stub.S */
8946/*
8947 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8948 * any interesting requests and then jump to the real instruction
8949 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8950 */
8951    .extern MterpCheckBefore
8952    EXPORT_PC
8953    REFRESH_IBASE
8954    dla     ra, artMterpAsmInstructionStart
8955    dla     t9, MterpCheckBefore
8956    move    a0, rSELF
8957    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8958    daddu   ra, ra, (82 * 128)            # Addr of primary handler.
8959    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8960
8961/* ------------------------------ */
8962    .balign 128
8963.L_ALT_op_iget_wide: /* 0x53 */
8964/* File: mips64/alt_stub.S */
8965/*
8966 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8967 * any interesting requests and then jump to the real instruction
8968 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8969 */
8970    .extern MterpCheckBefore
8971    EXPORT_PC
8972    REFRESH_IBASE
8973    dla     ra, artMterpAsmInstructionStart
8974    dla     t9, MterpCheckBefore
8975    move    a0, rSELF
8976    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8977    daddu   ra, ra, (83 * 128)            # Addr of primary handler.
8978    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8979
8980/* ------------------------------ */
8981    .balign 128
8982.L_ALT_op_iget_object: /* 0x54 */
8983/* File: mips64/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.  Note that the call to MterpCheckBefore is done as a tail call.
8988 */
8989    .extern MterpCheckBefore
8990    EXPORT_PC
8991    REFRESH_IBASE
8992    dla     ra, artMterpAsmInstructionStart
8993    dla     t9, MterpCheckBefore
8994    move    a0, rSELF
8995    daddu   a1, rFP, OFF_FP_SHADOWFRAME
8996    daddu   ra, ra, (84 * 128)            # Addr of primary handler.
8997    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
8998
8999/* ------------------------------ */
9000    .balign 128
9001.L_ALT_op_iget_boolean: /* 0x55 */
9002/* File: mips64/alt_stub.S */
9003/*
9004 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9005 * any interesting requests and then jump to the real instruction
9006 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9007 */
9008    .extern MterpCheckBefore
9009    EXPORT_PC
9010    REFRESH_IBASE
9011    dla     ra, artMterpAsmInstructionStart
9012    dla     t9, MterpCheckBefore
9013    move    a0, rSELF
9014    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9015    daddu   ra, ra, (85 * 128)            # Addr of primary handler.
9016    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9017
9018/* ------------------------------ */
9019    .balign 128
9020.L_ALT_op_iget_byte: /* 0x56 */
9021/* File: mips64/alt_stub.S */
9022/*
9023 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9024 * any interesting requests and then jump to the real instruction
9025 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9026 */
9027    .extern MterpCheckBefore
9028    EXPORT_PC
9029    REFRESH_IBASE
9030    dla     ra, artMterpAsmInstructionStart
9031    dla     t9, MterpCheckBefore
9032    move    a0, rSELF
9033    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9034    daddu   ra, ra, (86 * 128)            # Addr of primary handler.
9035    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9036
9037/* ------------------------------ */
9038    .balign 128
9039.L_ALT_op_iget_char: /* 0x57 */
9040/* File: mips64/alt_stub.S */
9041/*
9042 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9043 * any interesting requests and then jump to the real instruction
9044 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9045 */
9046    .extern MterpCheckBefore
9047    EXPORT_PC
9048    REFRESH_IBASE
9049    dla     ra, artMterpAsmInstructionStart
9050    dla     t9, MterpCheckBefore
9051    move    a0, rSELF
9052    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9053    daddu   ra, ra, (87 * 128)            # Addr of primary handler.
9054    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9055
9056/* ------------------------------ */
9057    .balign 128
9058.L_ALT_op_iget_short: /* 0x58 */
9059/* File: mips64/alt_stub.S */
9060/*
9061 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9062 * any interesting requests and then jump to the real instruction
9063 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9064 */
9065    .extern MterpCheckBefore
9066    EXPORT_PC
9067    REFRESH_IBASE
9068    dla     ra, artMterpAsmInstructionStart
9069    dla     t9, MterpCheckBefore
9070    move    a0, rSELF
9071    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9072    daddu   ra, ra, (88 * 128)            # Addr of primary handler.
9073    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9074
9075/* ------------------------------ */
9076    .balign 128
9077.L_ALT_op_iput: /* 0x59 */
9078/* File: mips64/alt_stub.S */
9079/*
9080 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9081 * any interesting requests and then jump to the real instruction
9082 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9083 */
9084    .extern MterpCheckBefore
9085    EXPORT_PC
9086    REFRESH_IBASE
9087    dla     ra, artMterpAsmInstructionStart
9088    dla     t9, MterpCheckBefore
9089    move    a0, rSELF
9090    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9091    daddu   ra, ra, (89 * 128)            # Addr of primary handler.
9092    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9093
9094/* ------------------------------ */
9095    .balign 128
9096.L_ALT_op_iput_wide: /* 0x5a */
9097/* File: mips64/alt_stub.S */
9098/*
9099 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9100 * any interesting requests and then jump to the real instruction
9101 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9102 */
9103    .extern MterpCheckBefore
9104    EXPORT_PC
9105    REFRESH_IBASE
9106    dla     ra, artMterpAsmInstructionStart
9107    dla     t9, MterpCheckBefore
9108    move    a0, rSELF
9109    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9110    daddu   ra, ra, (90 * 128)            # Addr of primary handler.
9111    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9112
9113/* ------------------------------ */
9114    .balign 128
9115.L_ALT_op_iput_object: /* 0x5b */
9116/* File: mips64/alt_stub.S */
9117/*
9118 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9119 * any interesting requests and then jump to the real instruction
9120 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9121 */
9122    .extern MterpCheckBefore
9123    EXPORT_PC
9124    REFRESH_IBASE
9125    dla     ra, artMterpAsmInstructionStart
9126    dla     t9, MterpCheckBefore
9127    move    a0, rSELF
9128    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9129    daddu   ra, ra, (91 * 128)            # Addr of primary handler.
9130    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9131
9132/* ------------------------------ */
9133    .balign 128
9134.L_ALT_op_iput_boolean: /* 0x5c */
9135/* File: mips64/alt_stub.S */
9136/*
9137 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9138 * any interesting requests and then jump to the real instruction
9139 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9140 */
9141    .extern MterpCheckBefore
9142    EXPORT_PC
9143    REFRESH_IBASE
9144    dla     ra, artMterpAsmInstructionStart
9145    dla     t9, MterpCheckBefore
9146    move    a0, rSELF
9147    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9148    daddu   ra, ra, (92 * 128)            # Addr of primary handler.
9149    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9150
9151/* ------------------------------ */
9152    .balign 128
9153.L_ALT_op_iput_byte: /* 0x5d */
9154/* File: mips64/alt_stub.S */
9155/*
9156 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9157 * any interesting requests and then jump to the real instruction
9158 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9159 */
9160    .extern MterpCheckBefore
9161    EXPORT_PC
9162    REFRESH_IBASE
9163    dla     ra, artMterpAsmInstructionStart
9164    dla     t9, MterpCheckBefore
9165    move    a0, rSELF
9166    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9167    daddu   ra, ra, (93 * 128)            # Addr of primary handler.
9168    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9169
9170/* ------------------------------ */
9171    .balign 128
9172.L_ALT_op_iput_char: /* 0x5e */
9173/* File: mips64/alt_stub.S */
9174/*
9175 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9176 * any interesting requests and then jump to the real instruction
9177 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9178 */
9179    .extern MterpCheckBefore
9180    EXPORT_PC
9181    REFRESH_IBASE
9182    dla     ra, artMterpAsmInstructionStart
9183    dla     t9, MterpCheckBefore
9184    move    a0, rSELF
9185    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9186    daddu   ra, ra, (94 * 128)            # Addr of primary handler.
9187    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9188
9189/* ------------------------------ */
9190    .balign 128
9191.L_ALT_op_iput_short: /* 0x5f */
9192/* File: mips64/alt_stub.S */
9193/*
9194 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9195 * any interesting requests and then jump to the real instruction
9196 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9197 */
9198    .extern MterpCheckBefore
9199    EXPORT_PC
9200    REFRESH_IBASE
9201    dla     ra, artMterpAsmInstructionStart
9202    dla     t9, MterpCheckBefore
9203    move    a0, rSELF
9204    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9205    daddu   ra, ra, (95 * 128)            # Addr of primary handler.
9206    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9207
9208/* ------------------------------ */
9209    .balign 128
9210.L_ALT_op_sget: /* 0x60 */
9211/* File: mips64/alt_stub.S */
9212/*
9213 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9214 * any interesting requests and then jump to the real instruction
9215 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9216 */
9217    .extern MterpCheckBefore
9218    EXPORT_PC
9219    REFRESH_IBASE
9220    dla     ra, artMterpAsmInstructionStart
9221    dla     t9, MterpCheckBefore
9222    move    a0, rSELF
9223    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9224    daddu   ra, ra, (96 * 128)            # Addr of primary handler.
9225    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9226
9227/* ------------------------------ */
9228    .balign 128
9229.L_ALT_op_sget_wide: /* 0x61 */
9230/* File: mips64/alt_stub.S */
9231/*
9232 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9233 * any interesting requests and then jump to the real instruction
9234 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9235 */
9236    .extern MterpCheckBefore
9237    EXPORT_PC
9238    REFRESH_IBASE
9239    dla     ra, artMterpAsmInstructionStart
9240    dla     t9, MterpCheckBefore
9241    move    a0, rSELF
9242    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9243    daddu   ra, ra, (97 * 128)            # Addr of primary handler.
9244    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9245
9246/* ------------------------------ */
9247    .balign 128
9248.L_ALT_op_sget_object: /* 0x62 */
9249/* File: mips64/alt_stub.S */
9250/*
9251 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9252 * any interesting requests and then jump to the real instruction
9253 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9254 */
9255    .extern MterpCheckBefore
9256    EXPORT_PC
9257    REFRESH_IBASE
9258    dla     ra, artMterpAsmInstructionStart
9259    dla     t9, MterpCheckBefore
9260    move    a0, rSELF
9261    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9262    daddu   ra, ra, (98 * 128)            # Addr of primary handler.
9263    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9264
9265/* ------------------------------ */
9266    .balign 128
9267.L_ALT_op_sget_boolean: /* 0x63 */
9268/* File: mips64/alt_stub.S */
9269/*
9270 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9271 * any interesting requests and then jump to the real instruction
9272 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9273 */
9274    .extern MterpCheckBefore
9275    EXPORT_PC
9276    REFRESH_IBASE
9277    dla     ra, artMterpAsmInstructionStart
9278    dla     t9, MterpCheckBefore
9279    move    a0, rSELF
9280    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9281    daddu   ra, ra, (99 * 128)            # Addr of primary handler.
9282    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9283
9284/* ------------------------------ */
9285    .balign 128
9286.L_ALT_op_sget_byte: /* 0x64 */
9287/* File: mips64/alt_stub.S */
9288/*
9289 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9290 * any interesting requests and then jump to the real instruction
9291 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9292 */
9293    .extern MterpCheckBefore
9294    EXPORT_PC
9295    REFRESH_IBASE
9296    dla     ra, artMterpAsmInstructionStart
9297    dla     t9, MterpCheckBefore
9298    move    a0, rSELF
9299    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9300    daddu   ra, ra, (100 * 128)            # Addr of primary handler.
9301    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9302
9303/* ------------------------------ */
9304    .balign 128
9305.L_ALT_op_sget_char: /* 0x65 */
9306/* File: mips64/alt_stub.S */
9307/*
9308 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9309 * any interesting requests and then jump to the real instruction
9310 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9311 */
9312    .extern MterpCheckBefore
9313    EXPORT_PC
9314    REFRESH_IBASE
9315    dla     ra, artMterpAsmInstructionStart
9316    dla     t9, MterpCheckBefore
9317    move    a0, rSELF
9318    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9319    daddu   ra, ra, (101 * 128)            # Addr of primary handler.
9320    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9321
9322/* ------------------------------ */
9323    .balign 128
9324.L_ALT_op_sget_short: /* 0x66 */
9325/* File: mips64/alt_stub.S */
9326/*
9327 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9328 * any interesting requests and then jump to the real instruction
9329 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9330 */
9331    .extern MterpCheckBefore
9332    EXPORT_PC
9333    REFRESH_IBASE
9334    dla     ra, artMterpAsmInstructionStart
9335    dla     t9, MterpCheckBefore
9336    move    a0, rSELF
9337    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9338    daddu   ra, ra, (102 * 128)            # Addr of primary handler.
9339    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9340
9341/* ------------------------------ */
9342    .balign 128
9343.L_ALT_op_sput: /* 0x67 */
9344/* File: mips64/alt_stub.S */
9345/*
9346 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9347 * any interesting requests and then jump to the real instruction
9348 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9349 */
9350    .extern MterpCheckBefore
9351    EXPORT_PC
9352    REFRESH_IBASE
9353    dla     ra, artMterpAsmInstructionStart
9354    dla     t9, MterpCheckBefore
9355    move    a0, rSELF
9356    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9357    daddu   ra, ra, (103 * 128)            # Addr of primary handler.
9358    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9359
9360/* ------------------------------ */
9361    .balign 128
9362.L_ALT_op_sput_wide: /* 0x68 */
9363/* File: mips64/alt_stub.S */
9364/*
9365 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9366 * any interesting requests and then jump to the real instruction
9367 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9368 */
9369    .extern MterpCheckBefore
9370    EXPORT_PC
9371    REFRESH_IBASE
9372    dla     ra, artMterpAsmInstructionStart
9373    dla     t9, MterpCheckBefore
9374    move    a0, rSELF
9375    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9376    daddu   ra, ra, (104 * 128)            # Addr of primary handler.
9377    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9378
9379/* ------------------------------ */
9380    .balign 128
9381.L_ALT_op_sput_object: /* 0x69 */
9382/* File: mips64/alt_stub.S */
9383/*
9384 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9385 * any interesting requests and then jump to the real instruction
9386 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9387 */
9388    .extern MterpCheckBefore
9389    EXPORT_PC
9390    REFRESH_IBASE
9391    dla     ra, artMterpAsmInstructionStart
9392    dla     t9, MterpCheckBefore
9393    move    a0, rSELF
9394    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9395    daddu   ra, ra, (105 * 128)            # Addr of primary handler.
9396    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9397
9398/* ------------------------------ */
9399    .balign 128
9400.L_ALT_op_sput_boolean: /* 0x6a */
9401/* File: mips64/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.  Note that the call to MterpCheckBefore is done as a tail call.
9406 */
9407    .extern MterpCheckBefore
9408    EXPORT_PC
9409    REFRESH_IBASE
9410    dla     ra, artMterpAsmInstructionStart
9411    dla     t9, MterpCheckBefore
9412    move    a0, rSELF
9413    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9414    daddu   ra, ra, (106 * 128)            # Addr of primary handler.
9415    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9416
9417/* ------------------------------ */
9418    .balign 128
9419.L_ALT_op_sput_byte: /* 0x6b */
9420/* File: mips64/alt_stub.S */
9421/*
9422 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9423 * any interesting requests and then jump to the real instruction
9424 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9425 */
9426    .extern MterpCheckBefore
9427    EXPORT_PC
9428    REFRESH_IBASE
9429    dla     ra, artMterpAsmInstructionStart
9430    dla     t9, MterpCheckBefore
9431    move    a0, rSELF
9432    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9433    daddu   ra, ra, (107 * 128)            # Addr of primary handler.
9434    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9435
9436/* ------------------------------ */
9437    .balign 128
9438.L_ALT_op_sput_char: /* 0x6c */
9439/* File: mips64/alt_stub.S */
9440/*
9441 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9442 * any interesting requests and then jump to the real instruction
9443 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9444 */
9445    .extern MterpCheckBefore
9446    EXPORT_PC
9447    REFRESH_IBASE
9448    dla     ra, artMterpAsmInstructionStart
9449    dla     t9, MterpCheckBefore
9450    move    a0, rSELF
9451    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9452    daddu   ra, ra, (108 * 128)            # Addr of primary handler.
9453    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9454
9455/* ------------------------------ */
9456    .balign 128
9457.L_ALT_op_sput_short: /* 0x6d */
9458/* File: mips64/alt_stub.S */
9459/*
9460 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9461 * any interesting requests and then jump to the real instruction
9462 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9463 */
9464    .extern MterpCheckBefore
9465    EXPORT_PC
9466    REFRESH_IBASE
9467    dla     ra, artMterpAsmInstructionStart
9468    dla     t9, MterpCheckBefore
9469    move    a0, rSELF
9470    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9471    daddu   ra, ra, (109 * 128)            # Addr of primary handler.
9472    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9473
9474/* ------------------------------ */
9475    .balign 128
9476.L_ALT_op_invoke_virtual: /* 0x6e */
9477/* File: mips64/alt_stub.S */
9478/*
9479 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9480 * any interesting requests and then jump to the real instruction
9481 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9482 */
9483    .extern MterpCheckBefore
9484    EXPORT_PC
9485    REFRESH_IBASE
9486    dla     ra, artMterpAsmInstructionStart
9487    dla     t9, MterpCheckBefore
9488    move    a0, rSELF
9489    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9490    daddu   ra, ra, (110 * 128)            # Addr of primary handler.
9491    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9492
9493/* ------------------------------ */
9494    .balign 128
9495.L_ALT_op_invoke_super: /* 0x6f */
9496/* File: mips64/alt_stub.S */
9497/*
9498 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9499 * any interesting requests and then jump to the real instruction
9500 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9501 */
9502    .extern MterpCheckBefore
9503    EXPORT_PC
9504    REFRESH_IBASE
9505    dla     ra, artMterpAsmInstructionStart
9506    dla     t9, MterpCheckBefore
9507    move    a0, rSELF
9508    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9509    daddu   ra, ra, (111 * 128)            # Addr of primary handler.
9510    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9511
9512/* ------------------------------ */
9513    .balign 128
9514.L_ALT_op_invoke_direct: /* 0x70 */
9515/* File: mips64/alt_stub.S */
9516/*
9517 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9518 * any interesting requests and then jump to the real instruction
9519 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9520 */
9521    .extern MterpCheckBefore
9522    EXPORT_PC
9523    REFRESH_IBASE
9524    dla     ra, artMterpAsmInstructionStart
9525    dla     t9, MterpCheckBefore
9526    move    a0, rSELF
9527    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9528    daddu   ra, ra, (112 * 128)            # Addr of primary handler.
9529    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9530
9531/* ------------------------------ */
9532    .balign 128
9533.L_ALT_op_invoke_static: /* 0x71 */
9534/* File: mips64/alt_stub.S */
9535/*
9536 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9537 * any interesting requests and then jump to the real instruction
9538 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9539 */
9540    .extern MterpCheckBefore
9541    EXPORT_PC
9542    REFRESH_IBASE
9543    dla     ra, artMterpAsmInstructionStart
9544    dla     t9, MterpCheckBefore
9545    move    a0, rSELF
9546    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9547    daddu   ra, ra, (113 * 128)            # Addr of primary handler.
9548    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9549
9550/* ------------------------------ */
9551    .balign 128
9552.L_ALT_op_invoke_interface: /* 0x72 */
9553/* File: mips64/alt_stub.S */
9554/*
9555 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9556 * any interesting requests and then jump to the real instruction
9557 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9558 */
9559    .extern MterpCheckBefore
9560    EXPORT_PC
9561    REFRESH_IBASE
9562    dla     ra, artMterpAsmInstructionStart
9563    dla     t9, MterpCheckBefore
9564    move    a0, rSELF
9565    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9566    daddu   ra, ra, (114 * 128)            # Addr of primary handler.
9567    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9568
9569/* ------------------------------ */
9570    .balign 128
9571.L_ALT_op_return_void_no_barrier: /* 0x73 */
9572/* File: mips64/alt_stub.S */
9573/*
9574 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9575 * any interesting requests and then jump to the real instruction
9576 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9577 */
9578    .extern MterpCheckBefore
9579    EXPORT_PC
9580    REFRESH_IBASE
9581    dla     ra, artMterpAsmInstructionStart
9582    dla     t9, MterpCheckBefore
9583    move    a0, rSELF
9584    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9585    daddu   ra, ra, (115 * 128)            # Addr of primary handler.
9586    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9587
9588/* ------------------------------ */
9589    .balign 128
9590.L_ALT_op_invoke_virtual_range: /* 0x74 */
9591/* File: mips64/alt_stub.S */
9592/*
9593 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9594 * any interesting requests and then jump to the real instruction
9595 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9596 */
9597    .extern MterpCheckBefore
9598    EXPORT_PC
9599    REFRESH_IBASE
9600    dla     ra, artMterpAsmInstructionStart
9601    dla     t9, MterpCheckBefore
9602    move    a0, rSELF
9603    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9604    daddu   ra, ra, (116 * 128)            # Addr of primary handler.
9605    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9606
9607/* ------------------------------ */
9608    .balign 128
9609.L_ALT_op_invoke_super_range: /* 0x75 */
9610/* File: mips64/alt_stub.S */
9611/*
9612 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9613 * any interesting requests and then jump to the real instruction
9614 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9615 */
9616    .extern MterpCheckBefore
9617    EXPORT_PC
9618    REFRESH_IBASE
9619    dla     ra, artMterpAsmInstructionStart
9620    dla     t9, MterpCheckBefore
9621    move    a0, rSELF
9622    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9623    daddu   ra, ra, (117 * 128)            # Addr of primary handler.
9624    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9625
9626/* ------------------------------ */
9627    .balign 128
9628.L_ALT_op_invoke_direct_range: /* 0x76 */
9629/* File: mips64/alt_stub.S */
9630/*
9631 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9632 * any interesting requests and then jump to the real instruction
9633 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9634 */
9635    .extern MterpCheckBefore
9636    EXPORT_PC
9637    REFRESH_IBASE
9638    dla     ra, artMterpAsmInstructionStart
9639    dla     t9, MterpCheckBefore
9640    move    a0, rSELF
9641    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9642    daddu   ra, ra, (118 * 128)            # Addr of primary handler.
9643    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9644
9645/* ------------------------------ */
9646    .balign 128
9647.L_ALT_op_invoke_static_range: /* 0x77 */
9648/* File: mips64/alt_stub.S */
9649/*
9650 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9651 * any interesting requests and then jump to the real instruction
9652 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9653 */
9654    .extern MterpCheckBefore
9655    EXPORT_PC
9656    REFRESH_IBASE
9657    dla     ra, artMterpAsmInstructionStart
9658    dla     t9, MterpCheckBefore
9659    move    a0, rSELF
9660    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9661    daddu   ra, ra, (119 * 128)            # Addr of primary handler.
9662    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9663
9664/* ------------------------------ */
9665    .balign 128
9666.L_ALT_op_invoke_interface_range: /* 0x78 */
9667/* File: mips64/alt_stub.S */
9668/*
9669 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9670 * any interesting requests and then jump to the real instruction
9671 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9672 */
9673    .extern MterpCheckBefore
9674    EXPORT_PC
9675    REFRESH_IBASE
9676    dla     ra, artMterpAsmInstructionStart
9677    dla     t9, MterpCheckBefore
9678    move    a0, rSELF
9679    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9680    daddu   ra, ra, (120 * 128)            # Addr of primary handler.
9681    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9682
9683/* ------------------------------ */
9684    .balign 128
9685.L_ALT_op_unused_79: /* 0x79 */
9686/* File: mips64/alt_stub.S */
9687/*
9688 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9689 * any interesting requests and then jump to the real instruction
9690 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9691 */
9692    .extern MterpCheckBefore
9693    EXPORT_PC
9694    REFRESH_IBASE
9695    dla     ra, artMterpAsmInstructionStart
9696    dla     t9, MterpCheckBefore
9697    move    a0, rSELF
9698    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9699    daddu   ra, ra, (121 * 128)            # Addr of primary handler.
9700    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9701
9702/* ------------------------------ */
9703    .balign 128
9704.L_ALT_op_unused_7a: /* 0x7a */
9705/* File: mips64/alt_stub.S */
9706/*
9707 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9708 * any interesting requests and then jump to the real instruction
9709 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9710 */
9711    .extern MterpCheckBefore
9712    EXPORT_PC
9713    REFRESH_IBASE
9714    dla     ra, artMterpAsmInstructionStart
9715    dla     t9, MterpCheckBefore
9716    move    a0, rSELF
9717    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9718    daddu   ra, ra, (122 * 128)            # Addr of primary handler.
9719    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9720
9721/* ------------------------------ */
9722    .balign 128
9723.L_ALT_op_neg_int: /* 0x7b */
9724/* File: mips64/alt_stub.S */
9725/*
9726 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9727 * any interesting requests and then jump to the real instruction
9728 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9729 */
9730    .extern MterpCheckBefore
9731    EXPORT_PC
9732    REFRESH_IBASE
9733    dla     ra, artMterpAsmInstructionStart
9734    dla     t9, MterpCheckBefore
9735    move    a0, rSELF
9736    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9737    daddu   ra, ra, (123 * 128)            # Addr of primary handler.
9738    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9739
9740/* ------------------------------ */
9741    .balign 128
9742.L_ALT_op_not_int: /* 0x7c */
9743/* File: mips64/alt_stub.S */
9744/*
9745 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9746 * any interesting requests and then jump to the real instruction
9747 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9748 */
9749    .extern MterpCheckBefore
9750    EXPORT_PC
9751    REFRESH_IBASE
9752    dla     ra, artMterpAsmInstructionStart
9753    dla     t9, MterpCheckBefore
9754    move    a0, rSELF
9755    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9756    daddu   ra, ra, (124 * 128)            # Addr of primary handler.
9757    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9758
9759/* ------------------------------ */
9760    .balign 128
9761.L_ALT_op_neg_long: /* 0x7d */
9762/* File: mips64/alt_stub.S */
9763/*
9764 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9765 * any interesting requests and then jump to the real instruction
9766 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9767 */
9768    .extern MterpCheckBefore
9769    EXPORT_PC
9770    REFRESH_IBASE
9771    dla     ra, artMterpAsmInstructionStart
9772    dla     t9, MterpCheckBefore
9773    move    a0, rSELF
9774    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9775    daddu   ra, ra, (125 * 128)            # Addr of primary handler.
9776    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9777
9778/* ------------------------------ */
9779    .balign 128
9780.L_ALT_op_not_long: /* 0x7e */
9781/* File: mips64/alt_stub.S */
9782/*
9783 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9784 * any interesting requests and then jump to the real instruction
9785 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9786 */
9787    .extern MterpCheckBefore
9788    EXPORT_PC
9789    REFRESH_IBASE
9790    dla     ra, artMterpAsmInstructionStart
9791    dla     t9, MterpCheckBefore
9792    move    a0, rSELF
9793    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9794    daddu   ra, ra, (126 * 128)            # Addr of primary handler.
9795    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9796
9797/* ------------------------------ */
9798    .balign 128
9799.L_ALT_op_neg_float: /* 0x7f */
9800/* File: mips64/alt_stub.S */
9801/*
9802 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9803 * any interesting requests and then jump to the real instruction
9804 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9805 */
9806    .extern MterpCheckBefore
9807    EXPORT_PC
9808    REFRESH_IBASE
9809    dla     ra, artMterpAsmInstructionStart
9810    dla     t9, MterpCheckBefore
9811    move    a0, rSELF
9812    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9813    daddu   ra, ra, (127 * 128)            # Addr of primary handler.
9814    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9815
9816/* ------------------------------ */
9817    .balign 128
9818.L_ALT_op_neg_double: /* 0x80 */
9819/* File: mips64/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.  Note that the call to MterpCheckBefore is done as a tail call.
9824 */
9825    .extern MterpCheckBefore
9826    EXPORT_PC
9827    REFRESH_IBASE
9828    dla     ra, artMterpAsmInstructionStart
9829    dla     t9, MterpCheckBefore
9830    move    a0, rSELF
9831    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9832    daddu   ra, ra, (128 * 128)            # Addr of primary handler.
9833    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9834
9835/* ------------------------------ */
9836    .balign 128
9837.L_ALT_op_int_to_long: /* 0x81 */
9838/* File: mips64/alt_stub.S */
9839/*
9840 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9841 * any interesting requests and then jump to the real instruction
9842 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9843 */
9844    .extern MterpCheckBefore
9845    EXPORT_PC
9846    REFRESH_IBASE
9847    dla     ra, artMterpAsmInstructionStart
9848    dla     t9, MterpCheckBefore
9849    move    a0, rSELF
9850    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9851    daddu   ra, ra, (129 * 128)            # Addr of primary handler.
9852    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9853
9854/* ------------------------------ */
9855    .balign 128
9856.L_ALT_op_int_to_float: /* 0x82 */
9857/* File: mips64/alt_stub.S */
9858/*
9859 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9860 * any interesting requests and then jump to the real instruction
9861 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9862 */
9863    .extern MterpCheckBefore
9864    EXPORT_PC
9865    REFRESH_IBASE
9866    dla     ra, artMterpAsmInstructionStart
9867    dla     t9, MterpCheckBefore
9868    move    a0, rSELF
9869    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9870    daddu   ra, ra, (130 * 128)            # Addr of primary handler.
9871    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9872
9873/* ------------------------------ */
9874    .balign 128
9875.L_ALT_op_int_to_double: /* 0x83 */
9876/* File: mips64/alt_stub.S */
9877/*
9878 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9879 * any interesting requests and then jump to the real instruction
9880 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9881 */
9882    .extern MterpCheckBefore
9883    EXPORT_PC
9884    REFRESH_IBASE
9885    dla     ra, artMterpAsmInstructionStart
9886    dla     t9, MterpCheckBefore
9887    move    a0, rSELF
9888    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9889    daddu   ra, ra, (131 * 128)            # Addr of primary handler.
9890    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9891
9892/* ------------------------------ */
9893    .balign 128
9894.L_ALT_op_long_to_int: /* 0x84 */
9895/* File: mips64/alt_stub.S */
9896/*
9897 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9898 * any interesting requests and then jump to the real instruction
9899 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9900 */
9901    .extern MterpCheckBefore
9902    EXPORT_PC
9903    REFRESH_IBASE
9904    dla     ra, artMterpAsmInstructionStart
9905    dla     t9, MterpCheckBefore
9906    move    a0, rSELF
9907    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9908    daddu   ra, ra, (132 * 128)            # Addr of primary handler.
9909    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9910
9911/* ------------------------------ */
9912    .balign 128
9913.L_ALT_op_long_to_float: /* 0x85 */
9914/* File: mips64/alt_stub.S */
9915/*
9916 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9917 * any interesting requests and then jump to the real instruction
9918 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9919 */
9920    .extern MterpCheckBefore
9921    EXPORT_PC
9922    REFRESH_IBASE
9923    dla     ra, artMterpAsmInstructionStart
9924    dla     t9, MterpCheckBefore
9925    move    a0, rSELF
9926    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9927    daddu   ra, ra, (133 * 128)            # Addr of primary handler.
9928    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9929
9930/* ------------------------------ */
9931    .balign 128
9932.L_ALT_op_long_to_double: /* 0x86 */
9933/* File: mips64/alt_stub.S */
9934/*
9935 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9936 * any interesting requests and then jump to the real instruction
9937 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9938 */
9939    .extern MterpCheckBefore
9940    EXPORT_PC
9941    REFRESH_IBASE
9942    dla     ra, artMterpAsmInstructionStart
9943    dla     t9, MterpCheckBefore
9944    move    a0, rSELF
9945    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9946    daddu   ra, ra, (134 * 128)            # Addr of primary handler.
9947    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9948
9949/* ------------------------------ */
9950    .balign 128
9951.L_ALT_op_float_to_int: /* 0x87 */
9952/* File: mips64/alt_stub.S */
9953/*
9954 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9955 * any interesting requests and then jump to the real instruction
9956 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9957 */
9958    .extern MterpCheckBefore
9959    EXPORT_PC
9960    REFRESH_IBASE
9961    dla     ra, artMterpAsmInstructionStart
9962    dla     t9, MterpCheckBefore
9963    move    a0, rSELF
9964    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9965    daddu   ra, ra, (135 * 128)            # Addr of primary handler.
9966    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9967
9968/* ------------------------------ */
9969    .balign 128
9970.L_ALT_op_float_to_long: /* 0x88 */
9971/* File: mips64/alt_stub.S */
9972/*
9973 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9974 * any interesting requests and then jump to the real instruction
9975 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9976 */
9977    .extern MterpCheckBefore
9978    EXPORT_PC
9979    REFRESH_IBASE
9980    dla     ra, artMterpAsmInstructionStart
9981    dla     t9, MterpCheckBefore
9982    move    a0, rSELF
9983    daddu   a1, rFP, OFF_FP_SHADOWFRAME
9984    daddu   ra, ra, (136 * 128)            # Addr of primary handler.
9985    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
9986
9987/* ------------------------------ */
9988    .balign 128
9989.L_ALT_op_float_to_double: /* 0x89 */
9990/* File: mips64/alt_stub.S */
9991/*
9992 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9993 * any interesting requests and then jump to the real instruction
9994 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9995 */
9996    .extern MterpCheckBefore
9997    EXPORT_PC
9998    REFRESH_IBASE
9999    dla     ra, artMterpAsmInstructionStart
10000    dla     t9, MterpCheckBefore
10001    move    a0, rSELF
10002    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10003    daddu   ra, ra, (137 * 128)            # Addr of primary handler.
10004    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10005
10006/* ------------------------------ */
10007    .balign 128
10008.L_ALT_op_double_to_int: /* 0x8a */
10009/* File: mips64/alt_stub.S */
10010/*
10011 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10012 * any interesting requests and then jump to the real instruction
10013 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10014 */
10015    .extern MterpCheckBefore
10016    EXPORT_PC
10017    REFRESH_IBASE
10018    dla     ra, artMterpAsmInstructionStart
10019    dla     t9, MterpCheckBefore
10020    move    a0, rSELF
10021    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10022    daddu   ra, ra, (138 * 128)            # Addr of primary handler.
10023    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10024
10025/* ------------------------------ */
10026    .balign 128
10027.L_ALT_op_double_to_long: /* 0x8b */
10028/* File: mips64/alt_stub.S */
10029/*
10030 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10031 * any interesting requests and then jump to the real instruction
10032 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10033 */
10034    .extern MterpCheckBefore
10035    EXPORT_PC
10036    REFRESH_IBASE
10037    dla     ra, artMterpAsmInstructionStart
10038    dla     t9, MterpCheckBefore
10039    move    a0, rSELF
10040    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10041    daddu   ra, ra, (139 * 128)            # Addr of primary handler.
10042    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10043
10044/* ------------------------------ */
10045    .balign 128
10046.L_ALT_op_double_to_float: /* 0x8c */
10047/* File: mips64/alt_stub.S */
10048/*
10049 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10050 * any interesting requests and then jump to the real instruction
10051 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10052 */
10053    .extern MterpCheckBefore
10054    EXPORT_PC
10055    REFRESH_IBASE
10056    dla     ra, artMterpAsmInstructionStart
10057    dla     t9, MterpCheckBefore
10058    move    a0, rSELF
10059    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10060    daddu   ra, ra, (140 * 128)            # Addr of primary handler.
10061    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10062
10063/* ------------------------------ */
10064    .balign 128
10065.L_ALT_op_int_to_byte: /* 0x8d */
10066/* File: mips64/alt_stub.S */
10067/*
10068 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10069 * any interesting requests and then jump to the real instruction
10070 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10071 */
10072    .extern MterpCheckBefore
10073    EXPORT_PC
10074    REFRESH_IBASE
10075    dla     ra, artMterpAsmInstructionStart
10076    dla     t9, MterpCheckBefore
10077    move    a0, rSELF
10078    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10079    daddu   ra, ra, (141 * 128)            # Addr of primary handler.
10080    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10081
10082/* ------------------------------ */
10083    .balign 128
10084.L_ALT_op_int_to_char: /* 0x8e */
10085/* File: mips64/alt_stub.S */
10086/*
10087 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10088 * any interesting requests and then jump to the real instruction
10089 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10090 */
10091    .extern MterpCheckBefore
10092    EXPORT_PC
10093    REFRESH_IBASE
10094    dla     ra, artMterpAsmInstructionStart
10095    dla     t9, MterpCheckBefore
10096    move    a0, rSELF
10097    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10098    daddu   ra, ra, (142 * 128)            # Addr of primary handler.
10099    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10100
10101/* ------------------------------ */
10102    .balign 128
10103.L_ALT_op_int_to_short: /* 0x8f */
10104/* File: mips64/alt_stub.S */
10105/*
10106 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10107 * any interesting requests and then jump to the real instruction
10108 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10109 */
10110    .extern MterpCheckBefore
10111    EXPORT_PC
10112    REFRESH_IBASE
10113    dla     ra, artMterpAsmInstructionStart
10114    dla     t9, MterpCheckBefore
10115    move    a0, rSELF
10116    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10117    daddu   ra, ra, (143 * 128)            # Addr of primary handler.
10118    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10119
10120/* ------------------------------ */
10121    .balign 128
10122.L_ALT_op_add_int: /* 0x90 */
10123/* File: mips64/alt_stub.S */
10124/*
10125 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10126 * any interesting requests and then jump to the real instruction
10127 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10128 */
10129    .extern MterpCheckBefore
10130    EXPORT_PC
10131    REFRESH_IBASE
10132    dla     ra, artMterpAsmInstructionStart
10133    dla     t9, MterpCheckBefore
10134    move    a0, rSELF
10135    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10136    daddu   ra, ra, (144 * 128)            # Addr of primary handler.
10137    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10138
10139/* ------------------------------ */
10140    .balign 128
10141.L_ALT_op_sub_int: /* 0x91 */
10142/* File: mips64/alt_stub.S */
10143/*
10144 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10145 * any interesting requests and then jump to the real instruction
10146 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10147 */
10148    .extern MterpCheckBefore
10149    EXPORT_PC
10150    REFRESH_IBASE
10151    dla     ra, artMterpAsmInstructionStart
10152    dla     t9, MterpCheckBefore
10153    move    a0, rSELF
10154    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10155    daddu   ra, ra, (145 * 128)            # Addr of primary handler.
10156    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10157
10158/* ------------------------------ */
10159    .balign 128
10160.L_ALT_op_mul_int: /* 0x92 */
10161/* File: mips64/alt_stub.S */
10162/*
10163 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10164 * any interesting requests and then jump to the real instruction
10165 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10166 */
10167    .extern MterpCheckBefore
10168    EXPORT_PC
10169    REFRESH_IBASE
10170    dla     ra, artMterpAsmInstructionStart
10171    dla     t9, MterpCheckBefore
10172    move    a0, rSELF
10173    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10174    daddu   ra, ra, (146 * 128)            # Addr of primary handler.
10175    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10176
10177/* ------------------------------ */
10178    .balign 128
10179.L_ALT_op_div_int: /* 0x93 */
10180/* File: mips64/alt_stub.S */
10181/*
10182 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10183 * any interesting requests and then jump to the real instruction
10184 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10185 */
10186    .extern MterpCheckBefore
10187    EXPORT_PC
10188    REFRESH_IBASE
10189    dla     ra, artMterpAsmInstructionStart
10190    dla     t9, MterpCheckBefore
10191    move    a0, rSELF
10192    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10193    daddu   ra, ra, (147 * 128)            # Addr of primary handler.
10194    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10195
10196/* ------------------------------ */
10197    .balign 128
10198.L_ALT_op_rem_int: /* 0x94 */
10199/* File: mips64/alt_stub.S */
10200/*
10201 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10202 * any interesting requests and then jump to the real instruction
10203 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10204 */
10205    .extern MterpCheckBefore
10206    EXPORT_PC
10207    REFRESH_IBASE
10208    dla     ra, artMterpAsmInstructionStart
10209    dla     t9, MterpCheckBefore
10210    move    a0, rSELF
10211    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10212    daddu   ra, ra, (148 * 128)            # Addr of primary handler.
10213    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10214
10215/* ------------------------------ */
10216    .balign 128
10217.L_ALT_op_and_int: /* 0x95 */
10218/* File: mips64/alt_stub.S */
10219/*
10220 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10221 * any interesting requests and then jump to the real instruction
10222 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10223 */
10224    .extern MterpCheckBefore
10225    EXPORT_PC
10226    REFRESH_IBASE
10227    dla     ra, artMterpAsmInstructionStart
10228    dla     t9, MterpCheckBefore
10229    move    a0, rSELF
10230    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10231    daddu   ra, ra, (149 * 128)            # Addr of primary handler.
10232    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10233
10234/* ------------------------------ */
10235    .balign 128
10236.L_ALT_op_or_int: /* 0x96 */
10237/* File: mips64/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.  Note that the call to MterpCheckBefore is done as a tail call.
10242 */
10243    .extern MterpCheckBefore
10244    EXPORT_PC
10245    REFRESH_IBASE
10246    dla     ra, artMterpAsmInstructionStart
10247    dla     t9, MterpCheckBefore
10248    move    a0, rSELF
10249    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10250    daddu   ra, ra, (150 * 128)            # Addr of primary handler.
10251    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10252
10253/* ------------------------------ */
10254    .balign 128
10255.L_ALT_op_xor_int: /* 0x97 */
10256/* File: mips64/alt_stub.S */
10257/*
10258 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10259 * any interesting requests and then jump to the real instruction
10260 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10261 */
10262    .extern MterpCheckBefore
10263    EXPORT_PC
10264    REFRESH_IBASE
10265    dla     ra, artMterpAsmInstructionStart
10266    dla     t9, MterpCheckBefore
10267    move    a0, rSELF
10268    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10269    daddu   ra, ra, (151 * 128)            # Addr of primary handler.
10270    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10271
10272/* ------------------------------ */
10273    .balign 128
10274.L_ALT_op_shl_int: /* 0x98 */
10275/* File: mips64/alt_stub.S */
10276/*
10277 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10278 * any interesting requests and then jump to the real instruction
10279 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10280 */
10281    .extern MterpCheckBefore
10282    EXPORT_PC
10283    REFRESH_IBASE
10284    dla     ra, artMterpAsmInstructionStart
10285    dla     t9, MterpCheckBefore
10286    move    a0, rSELF
10287    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10288    daddu   ra, ra, (152 * 128)            # Addr of primary handler.
10289    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10290
10291/* ------------------------------ */
10292    .balign 128
10293.L_ALT_op_shr_int: /* 0x99 */
10294/* File: mips64/alt_stub.S */
10295/*
10296 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10297 * any interesting requests and then jump to the real instruction
10298 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10299 */
10300    .extern MterpCheckBefore
10301    EXPORT_PC
10302    REFRESH_IBASE
10303    dla     ra, artMterpAsmInstructionStart
10304    dla     t9, MterpCheckBefore
10305    move    a0, rSELF
10306    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10307    daddu   ra, ra, (153 * 128)            # Addr of primary handler.
10308    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10309
10310/* ------------------------------ */
10311    .balign 128
10312.L_ALT_op_ushr_int: /* 0x9a */
10313/* File: mips64/alt_stub.S */
10314/*
10315 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10316 * any interesting requests and then jump to the real instruction
10317 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10318 */
10319    .extern MterpCheckBefore
10320    EXPORT_PC
10321    REFRESH_IBASE
10322    dla     ra, artMterpAsmInstructionStart
10323    dla     t9, MterpCheckBefore
10324    move    a0, rSELF
10325    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10326    daddu   ra, ra, (154 * 128)            # Addr of primary handler.
10327    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10328
10329/* ------------------------------ */
10330    .balign 128
10331.L_ALT_op_add_long: /* 0x9b */
10332/* File: mips64/alt_stub.S */
10333/*
10334 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10335 * any interesting requests and then jump to the real instruction
10336 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10337 */
10338    .extern MterpCheckBefore
10339    EXPORT_PC
10340    REFRESH_IBASE
10341    dla     ra, artMterpAsmInstructionStart
10342    dla     t9, MterpCheckBefore
10343    move    a0, rSELF
10344    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10345    daddu   ra, ra, (155 * 128)            # Addr of primary handler.
10346    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10347
10348/* ------------------------------ */
10349    .balign 128
10350.L_ALT_op_sub_long: /* 0x9c */
10351/* File: mips64/alt_stub.S */
10352/*
10353 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10354 * any interesting requests and then jump to the real instruction
10355 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10356 */
10357    .extern MterpCheckBefore
10358    EXPORT_PC
10359    REFRESH_IBASE
10360    dla     ra, artMterpAsmInstructionStart
10361    dla     t9, MterpCheckBefore
10362    move    a0, rSELF
10363    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10364    daddu   ra, ra, (156 * 128)            # Addr of primary handler.
10365    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10366
10367/* ------------------------------ */
10368    .balign 128
10369.L_ALT_op_mul_long: /* 0x9d */
10370/* File: mips64/alt_stub.S */
10371/*
10372 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10373 * any interesting requests and then jump to the real instruction
10374 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10375 */
10376    .extern MterpCheckBefore
10377    EXPORT_PC
10378    REFRESH_IBASE
10379    dla     ra, artMterpAsmInstructionStart
10380    dla     t9, MterpCheckBefore
10381    move    a0, rSELF
10382    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10383    daddu   ra, ra, (157 * 128)            # Addr of primary handler.
10384    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10385
10386/* ------------------------------ */
10387    .balign 128
10388.L_ALT_op_div_long: /* 0x9e */
10389/* File: mips64/alt_stub.S */
10390/*
10391 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10392 * any interesting requests and then jump to the real instruction
10393 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10394 */
10395    .extern MterpCheckBefore
10396    EXPORT_PC
10397    REFRESH_IBASE
10398    dla     ra, artMterpAsmInstructionStart
10399    dla     t9, MterpCheckBefore
10400    move    a0, rSELF
10401    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10402    daddu   ra, ra, (158 * 128)            # Addr of primary handler.
10403    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10404
10405/* ------------------------------ */
10406    .balign 128
10407.L_ALT_op_rem_long: /* 0x9f */
10408/* File: mips64/alt_stub.S */
10409/*
10410 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10411 * any interesting requests and then jump to the real instruction
10412 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10413 */
10414    .extern MterpCheckBefore
10415    EXPORT_PC
10416    REFRESH_IBASE
10417    dla     ra, artMterpAsmInstructionStart
10418    dla     t9, MterpCheckBefore
10419    move    a0, rSELF
10420    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10421    daddu   ra, ra, (159 * 128)            # Addr of primary handler.
10422    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10423
10424/* ------------------------------ */
10425    .balign 128
10426.L_ALT_op_and_long: /* 0xa0 */
10427/* File: mips64/alt_stub.S */
10428/*
10429 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10430 * any interesting requests and then jump to the real instruction
10431 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10432 */
10433    .extern MterpCheckBefore
10434    EXPORT_PC
10435    REFRESH_IBASE
10436    dla     ra, artMterpAsmInstructionStart
10437    dla     t9, MterpCheckBefore
10438    move    a0, rSELF
10439    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10440    daddu   ra, ra, (160 * 128)            # Addr of primary handler.
10441    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10442
10443/* ------------------------------ */
10444    .balign 128
10445.L_ALT_op_or_long: /* 0xa1 */
10446/* File: mips64/alt_stub.S */
10447/*
10448 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10449 * any interesting requests and then jump to the real instruction
10450 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10451 */
10452    .extern MterpCheckBefore
10453    EXPORT_PC
10454    REFRESH_IBASE
10455    dla     ra, artMterpAsmInstructionStart
10456    dla     t9, MterpCheckBefore
10457    move    a0, rSELF
10458    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10459    daddu   ra, ra, (161 * 128)            # Addr of primary handler.
10460    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10461
10462/* ------------------------------ */
10463    .balign 128
10464.L_ALT_op_xor_long: /* 0xa2 */
10465/* File: mips64/alt_stub.S */
10466/*
10467 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10468 * any interesting requests and then jump to the real instruction
10469 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10470 */
10471    .extern MterpCheckBefore
10472    EXPORT_PC
10473    REFRESH_IBASE
10474    dla     ra, artMterpAsmInstructionStart
10475    dla     t9, MterpCheckBefore
10476    move    a0, rSELF
10477    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10478    daddu   ra, ra, (162 * 128)            # Addr of primary handler.
10479    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10480
10481/* ------------------------------ */
10482    .balign 128
10483.L_ALT_op_shl_long: /* 0xa3 */
10484/* File: mips64/alt_stub.S */
10485/*
10486 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10487 * any interesting requests and then jump to the real instruction
10488 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10489 */
10490    .extern MterpCheckBefore
10491    EXPORT_PC
10492    REFRESH_IBASE
10493    dla     ra, artMterpAsmInstructionStart
10494    dla     t9, MterpCheckBefore
10495    move    a0, rSELF
10496    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10497    daddu   ra, ra, (163 * 128)            # Addr of primary handler.
10498    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10499
10500/* ------------------------------ */
10501    .balign 128
10502.L_ALT_op_shr_long: /* 0xa4 */
10503/* File: mips64/alt_stub.S */
10504/*
10505 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10506 * any interesting requests and then jump to the real instruction
10507 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10508 */
10509    .extern MterpCheckBefore
10510    EXPORT_PC
10511    REFRESH_IBASE
10512    dla     ra, artMterpAsmInstructionStart
10513    dla     t9, MterpCheckBefore
10514    move    a0, rSELF
10515    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10516    daddu   ra, ra, (164 * 128)            # Addr of primary handler.
10517    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10518
10519/* ------------------------------ */
10520    .balign 128
10521.L_ALT_op_ushr_long: /* 0xa5 */
10522/* File: mips64/alt_stub.S */
10523/*
10524 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10525 * any interesting requests and then jump to the real instruction
10526 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10527 */
10528    .extern MterpCheckBefore
10529    EXPORT_PC
10530    REFRESH_IBASE
10531    dla     ra, artMterpAsmInstructionStart
10532    dla     t9, MterpCheckBefore
10533    move    a0, rSELF
10534    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10535    daddu   ra, ra, (165 * 128)            # Addr of primary handler.
10536    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10537
10538/* ------------------------------ */
10539    .balign 128
10540.L_ALT_op_add_float: /* 0xa6 */
10541/* File: mips64/alt_stub.S */
10542/*
10543 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10544 * any interesting requests and then jump to the real instruction
10545 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10546 */
10547    .extern MterpCheckBefore
10548    EXPORT_PC
10549    REFRESH_IBASE
10550    dla     ra, artMterpAsmInstructionStart
10551    dla     t9, MterpCheckBefore
10552    move    a0, rSELF
10553    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10554    daddu   ra, ra, (166 * 128)            # Addr of primary handler.
10555    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10556
10557/* ------------------------------ */
10558    .balign 128
10559.L_ALT_op_sub_float: /* 0xa7 */
10560/* File: mips64/alt_stub.S */
10561/*
10562 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10563 * any interesting requests and then jump to the real instruction
10564 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10565 */
10566    .extern MterpCheckBefore
10567    EXPORT_PC
10568    REFRESH_IBASE
10569    dla     ra, artMterpAsmInstructionStart
10570    dla     t9, MterpCheckBefore
10571    move    a0, rSELF
10572    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10573    daddu   ra, ra, (167 * 128)            # Addr of primary handler.
10574    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10575
10576/* ------------------------------ */
10577    .balign 128
10578.L_ALT_op_mul_float: /* 0xa8 */
10579/* File: mips64/alt_stub.S */
10580/*
10581 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10582 * any interesting requests and then jump to the real instruction
10583 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10584 */
10585    .extern MterpCheckBefore
10586    EXPORT_PC
10587    REFRESH_IBASE
10588    dla     ra, artMterpAsmInstructionStart
10589    dla     t9, MterpCheckBefore
10590    move    a0, rSELF
10591    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10592    daddu   ra, ra, (168 * 128)            # Addr of primary handler.
10593    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10594
10595/* ------------------------------ */
10596    .balign 128
10597.L_ALT_op_div_float: /* 0xa9 */
10598/* File: mips64/alt_stub.S */
10599/*
10600 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10601 * any interesting requests and then jump to the real instruction
10602 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10603 */
10604    .extern MterpCheckBefore
10605    EXPORT_PC
10606    REFRESH_IBASE
10607    dla     ra, artMterpAsmInstructionStart
10608    dla     t9, MterpCheckBefore
10609    move    a0, rSELF
10610    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10611    daddu   ra, ra, (169 * 128)            # Addr of primary handler.
10612    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10613
10614/* ------------------------------ */
10615    .balign 128
10616.L_ALT_op_rem_float: /* 0xaa */
10617/* File: mips64/alt_stub.S */
10618/*
10619 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10620 * any interesting requests and then jump to the real instruction
10621 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10622 */
10623    .extern MterpCheckBefore
10624    EXPORT_PC
10625    REFRESH_IBASE
10626    dla     ra, artMterpAsmInstructionStart
10627    dla     t9, MterpCheckBefore
10628    move    a0, rSELF
10629    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10630    daddu   ra, ra, (170 * 128)            # Addr of primary handler.
10631    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10632
10633/* ------------------------------ */
10634    .balign 128
10635.L_ALT_op_add_double: /* 0xab */
10636/* File: mips64/alt_stub.S */
10637/*
10638 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10639 * any interesting requests and then jump to the real instruction
10640 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10641 */
10642    .extern MterpCheckBefore
10643    EXPORT_PC
10644    REFRESH_IBASE
10645    dla     ra, artMterpAsmInstructionStart
10646    dla     t9, MterpCheckBefore
10647    move    a0, rSELF
10648    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10649    daddu   ra, ra, (171 * 128)            # Addr of primary handler.
10650    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10651
10652/* ------------------------------ */
10653    .balign 128
10654.L_ALT_op_sub_double: /* 0xac */
10655/* File: mips64/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.  Note that the call to MterpCheckBefore is done as a tail call.
10660 */
10661    .extern MterpCheckBefore
10662    EXPORT_PC
10663    REFRESH_IBASE
10664    dla     ra, artMterpAsmInstructionStart
10665    dla     t9, MterpCheckBefore
10666    move    a0, rSELF
10667    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10668    daddu   ra, ra, (172 * 128)            # Addr of primary handler.
10669    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10670
10671/* ------------------------------ */
10672    .balign 128
10673.L_ALT_op_mul_double: /* 0xad */
10674/* File: mips64/alt_stub.S */
10675/*
10676 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10677 * any interesting requests and then jump to the real instruction
10678 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10679 */
10680    .extern MterpCheckBefore
10681    EXPORT_PC
10682    REFRESH_IBASE
10683    dla     ra, artMterpAsmInstructionStart
10684    dla     t9, MterpCheckBefore
10685    move    a0, rSELF
10686    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10687    daddu   ra, ra, (173 * 128)            # Addr of primary handler.
10688    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10689
10690/* ------------------------------ */
10691    .balign 128
10692.L_ALT_op_div_double: /* 0xae */
10693/* File: mips64/alt_stub.S */
10694/*
10695 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10696 * any interesting requests and then jump to the real instruction
10697 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10698 */
10699    .extern MterpCheckBefore
10700    EXPORT_PC
10701    REFRESH_IBASE
10702    dla     ra, artMterpAsmInstructionStart
10703    dla     t9, MterpCheckBefore
10704    move    a0, rSELF
10705    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10706    daddu   ra, ra, (174 * 128)            # Addr of primary handler.
10707    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10708
10709/* ------------------------------ */
10710    .balign 128
10711.L_ALT_op_rem_double: /* 0xaf */
10712/* File: mips64/alt_stub.S */
10713/*
10714 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10715 * any interesting requests and then jump to the real instruction
10716 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10717 */
10718    .extern MterpCheckBefore
10719    EXPORT_PC
10720    REFRESH_IBASE
10721    dla     ra, artMterpAsmInstructionStart
10722    dla     t9, MterpCheckBefore
10723    move    a0, rSELF
10724    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10725    daddu   ra, ra, (175 * 128)            # Addr of primary handler.
10726    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10727
10728/* ------------------------------ */
10729    .balign 128
10730.L_ALT_op_add_int_2addr: /* 0xb0 */
10731/* File: mips64/alt_stub.S */
10732/*
10733 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10734 * any interesting requests and then jump to the real instruction
10735 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10736 */
10737    .extern MterpCheckBefore
10738    EXPORT_PC
10739    REFRESH_IBASE
10740    dla     ra, artMterpAsmInstructionStart
10741    dla     t9, MterpCheckBefore
10742    move    a0, rSELF
10743    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10744    daddu   ra, ra, (176 * 128)            # Addr of primary handler.
10745    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10746
10747/* ------------------------------ */
10748    .balign 128
10749.L_ALT_op_sub_int_2addr: /* 0xb1 */
10750/* File: mips64/alt_stub.S */
10751/*
10752 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10753 * any interesting requests and then jump to the real instruction
10754 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10755 */
10756    .extern MterpCheckBefore
10757    EXPORT_PC
10758    REFRESH_IBASE
10759    dla     ra, artMterpAsmInstructionStart
10760    dla     t9, MterpCheckBefore
10761    move    a0, rSELF
10762    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10763    daddu   ra, ra, (177 * 128)            # Addr of primary handler.
10764    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10765
10766/* ------------------------------ */
10767    .balign 128
10768.L_ALT_op_mul_int_2addr: /* 0xb2 */
10769/* File: mips64/alt_stub.S */
10770/*
10771 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10772 * any interesting requests and then jump to the real instruction
10773 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10774 */
10775    .extern MterpCheckBefore
10776    EXPORT_PC
10777    REFRESH_IBASE
10778    dla     ra, artMterpAsmInstructionStart
10779    dla     t9, MterpCheckBefore
10780    move    a0, rSELF
10781    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10782    daddu   ra, ra, (178 * 128)            # Addr of primary handler.
10783    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10784
10785/* ------------------------------ */
10786    .balign 128
10787.L_ALT_op_div_int_2addr: /* 0xb3 */
10788/* File: mips64/alt_stub.S */
10789/*
10790 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10791 * any interesting requests and then jump to the real instruction
10792 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10793 */
10794    .extern MterpCheckBefore
10795    EXPORT_PC
10796    REFRESH_IBASE
10797    dla     ra, artMterpAsmInstructionStart
10798    dla     t9, MterpCheckBefore
10799    move    a0, rSELF
10800    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10801    daddu   ra, ra, (179 * 128)            # Addr of primary handler.
10802    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10803
10804/* ------------------------------ */
10805    .balign 128
10806.L_ALT_op_rem_int_2addr: /* 0xb4 */
10807/* File: mips64/alt_stub.S */
10808/*
10809 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10810 * any interesting requests and then jump to the real instruction
10811 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10812 */
10813    .extern MterpCheckBefore
10814    EXPORT_PC
10815    REFRESH_IBASE
10816    dla     ra, artMterpAsmInstructionStart
10817    dla     t9, MterpCheckBefore
10818    move    a0, rSELF
10819    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10820    daddu   ra, ra, (180 * 128)            # Addr of primary handler.
10821    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10822
10823/* ------------------------------ */
10824    .balign 128
10825.L_ALT_op_and_int_2addr: /* 0xb5 */
10826/* File: mips64/alt_stub.S */
10827/*
10828 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10829 * any interesting requests and then jump to the real instruction
10830 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10831 */
10832    .extern MterpCheckBefore
10833    EXPORT_PC
10834    REFRESH_IBASE
10835    dla     ra, artMterpAsmInstructionStart
10836    dla     t9, MterpCheckBefore
10837    move    a0, rSELF
10838    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10839    daddu   ra, ra, (181 * 128)            # Addr of primary handler.
10840    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10841
10842/* ------------------------------ */
10843    .balign 128
10844.L_ALT_op_or_int_2addr: /* 0xb6 */
10845/* File: mips64/alt_stub.S */
10846/*
10847 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10848 * any interesting requests and then jump to the real instruction
10849 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10850 */
10851    .extern MterpCheckBefore
10852    EXPORT_PC
10853    REFRESH_IBASE
10854    dla     ra, artMterpAsmInstructionStart
10855    dla     t9, MterpCheckBefore
10856    move    a0, rSELF
10857    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10858    daddu   ra, ra, (182 * 128)            # Addr of primary handler.
10859    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10860
10861/* ------------------------------ */
10862    .balign 128
10863.L_ALT_op_xor_int_2addr: /* 0xb7 */
10864/* File: mips64/alt_stub.S */
10865/*
10866 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10867 * any interesting requests and then jump to the real instruction
10868 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10869 */
10870    .extern MterpCheckBefore
10871    EXPORT_PC
10872    REFRESH_IBASE
10873    dla     ra, artMterpAsmInstructionStart
10874    dla     t9, MterpCheckBefore
10875    move    a0, rSELF
10876    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10877    daddu   ra, ra, (183 * 128)            # Addr of primary handler.
10878    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10879
10880/* ------------------------------ */
10881    .balign 128
10882.L_ALT_op_shl_int_2addr: /* 0xb8 */
10883/* File: mips64/alt_stub.S */
10884/*
10885 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10886 * any interesting requests and then jump to the real instruction
10887 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10888 */
10889    .extern MterpCheckBefore
10890    EXPORT_PC
10891    REFRESH_IBASE
10892    dla     ra, artMterpAsmInstructionStart
10893    dla     t9, MterpCheckBefore
10894    move    a0, rSELF
10895    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10896    daddu   ra, ra, (184 * 128)            # Addr of primary handler.
10897    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10898
10899/* ------------------------------ */
10900    .balign 128
10901.L_ALT_op_shr_int_2addr: /* 0xb9 */
10902/* File: mips64/alt_stub.S */
10903/*
10904 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10905 * any interesting requests and then jump to the real instruction
10906 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10907 */
10908    .extern MterpCheckBefore
10909    EXPORT_PC
10910    REFRESH_IBASE
10911    dla     ra, artMterpAsmInstructionStart
10912    dla     t9, MterpCheckBefore
10913    move    a0, rSELF
10914    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10915    daddu   ra, ra, (185 * 128)            # Addr of primary handler.
10916    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10917
10918/* ------------------------------ */
10919    .balign 128
10920.L_ALT_op_ushr_int_2addr: /* 0xba */
10921/* File: mips64/alt_stub.S */
10922/*
10923 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10924 * any interesting requests and then jump to the real instruction
10925 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10926 */
10927    .extern MterpCheckBefore
10928    EXPORT_PC
10929    REFRESH_IBASE
10930    dla     ra, artMterpAsmInstructionStart
10931    dla     t9, MterpCheckBefore
10932    move    a0, rSELF
10933    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10934    daddu   ra, ra, (186 * 128)            # Addr of primary handler.
10935    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10936
10937/* ------------------------------ */
10938    .balign 128
10939.L_ALT_op_add_long_2addr: /* 0xbb */
10940/* File: mips64/alt_stub.S */
10941/*
10942 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10943 * any interesting requests and then jump to the real instruction
10944 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10945 */
10946    .extern MterpCheckBefore
10947    EXPORT_PC
10948    REFRESH_IBASE
10949    dla     ra, artMterpAsmInstructionStart
10950    dla     t9, MterpCheckBefore
10951    move    a0, rSELF
10952    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10953    daddu   ra, ra, (187 * 128)            # Addr of primary handler.
10954    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10955
10956/* ------------------------------ */
10957    .balign 128
10958.L_ALT_op_sub_long_2addr: /* 0xbc */
10959/* File: mips64/alt_stub.S */
10960/*
10961 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10962 * any interesting requests and then jump to the real instruction
10963 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10964 */
10965    .extern MterpCheckBefore
10966    EXPORT_PC
10967    REFRESH_IBASE
10968    dla     ra, artMterpAsmInstructionStart
10969    dla     t9, MterpCheckBefore
10970    move    a0, rSELF
10971    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10972    daddu   ra, ra, (188 * 128)            # Addr of primary handler.
10973    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10974
10975/* ------------------------------ */
10976    .balign 128
10977.L_ALT_op_mul_long_2addr: /* 0xbd */
10978/* File: mips64/alt_stub.S */
10979/*
10980 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10981 * any interesting requests and then jump to the real instruction
10982 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10983 */
10984    .extern MterpCheckBefore
10985    EXPORT_PC
10986    REFRESH_IBASE
10987    dla     ra, artMterpAsmInstructionStart
10988    dla     t9, MterpCheckBefore
10989    move    a0, rSELF
10990    daddu   a1, rFP, OFF_FP_SHADOWFRAME
10991    daddu   ra, ra, (189 * 128)            # Addr of primary handler.
10992    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
10993
10994/* ------------------------------ */
10995    .balign 128
10996.L_ALT_op_div_long_2addr: /* 0xbe */
10997/* File: mips64/alt_stub.S */
10998/*
10999 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11000 * any interesting requests and then jump to the real instruction
11001 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11002 */
11003    .extern MterpCheckBefore
11004    EXPORT_PC
11005    REFRESH_IBASE
11006    dla     ra, artMterpAsmInstructionStart
11007    dla     t9, MterpCheckBefore
11008    move    a0, rSELF
11009    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11010    daddu   ra, ra, (190 * 128)            # Addr of primary handler.
11011    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11012
11013/* ------------------------------ */
11014    .balign 128
11015.L_ALT_op_rem_long_2addr: /* 0xbf */
11016/* File: mips64/alt_stub.S */
11017/*
11018 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11019 * any interesting requests and then jump to the real instruction
11020 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11021 */
11022    .extern MterpCheckBefore
11023    EXPORT_PC
11024    REFRESH_IBASE
11025    dla     ra, artMterpAsmInstructionStart
11026    dla     t9, MterpCheckBefore
11027    move    a0, rSELF
11028    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11029    daddu   ra, ra, (191 * 128)            # Addr of primary handler.
11030    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11031
11032/* ------------------------------ */
11033    .balign 128
11034.L_ALT_op_and_long_2addr: /* 0xc0 */
11035/* File: mips64/alt_stub.S */
11036/*
11037 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11038 * any interesting requests and then jump to the real instruction
11039 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11040 */
11041    .extern MterpCheckBefore
11042    EXPORT_PC
11043    REFRESH_IBASE
11044    dla     ra, artMterpAsmInstructionStart
11045    dla     t9, MterpCheckBefore
11046    move    a0, rSELF
11047    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11048    daddu   ra, ra, (192 * 128)            # Addr of primary handler.
11049    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11050
11051/* ------------------------------ */
11052    .balign 128
11053.L_ALT_op_or_long_2addr: /* 0xc1 */
11054/* File: mips64/alt_stub.S */
11055/*
11056 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11057 * any interesting requests and then jump to the real instruction
11058 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11059 */
11060    .extern MterpCheckBefore
11061    EXPORT_PC
11062    REFRESH_IBASE
11063    dla     ra, artMterpAsmInstructionStart
11064    dla     t9, MterpCheckBefore
11065    move    a0, rSELF
11066    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11067    daddu   ra, ra, (193 * 128)            # Addr of primary handler.
11068    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11069
11070/* ------------------------------ */
11071    .balign 128
11072.L_ALT_op_xor_long_2addr: /* 0xc2 */
11073/* File: mips64/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.  Note that the call to MterpCheckBefore is done as a tail call.
11078 */
11079    .extern MterpCheckBefore
11080    EXPORT_PC
11081    REFRESH_IBASE
11082    dla     ra, artMterpAsmInstructionStart
11083    dla     t9, MterpCheckBefore
11084    move    a0, rSELF
11085    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11086    daddu   ra, ra, (194 * 128)            # Addr of primary handler.
11087    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11088
11089/* ------------------------------ */
11090    .balign 128
11091.L_ALT_op_shl_long_2addr: /* 0xc3 */
11092/* File: mips64/alt_stub.S */
11093/*
11094 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11095 * any interesting requests and then jump to the real instruction
11096 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11097 */
11098    .extern MterpCheckBefore
11099    EXPORT_PC
11100    REFRESH_IBASE
11101    dla     ra, artMterpAsmInstructionStart
11102    dla     t9, MterpCheckBefore
11103    move    a0, rSELF
11104    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11105    daddu   ra, ra, (195 * 128)            # Addr of primary handler.
11106    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11107
11108/* ------------------------------ */
11109    .balign 128
11110.L_ALT_op_shr_long_2addr: /* 0xc4 */
11111/* File: mips64/alt_stub.S */
11112/*
11113 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11114 * any interesting requests and then jump to the real instruction
11115 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11116 */
11117    .extern MterpCheckBefore
11118    EXPORT_PC
11119    REFRESH_IBASE
11120    dla     ra, artMterpAsmInstructionStart
11121    dla     t9, MterpCheckBefore
11122    move    a0, rSELF
11123    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11124    daddu   ra, ra, (196 * 128)            # Addr of primary handler.
11125    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11126
11127/* ------------------------------ */
11128    .balign 128
11129.L_ALT_op_ushr_long_2addr: /* 0xc5 */
11130/* File: mips64/alt_stub.S */
11131/*
11132 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11133 * any interesting requests and then jump to the real instruction
11134 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11135 */
11136    .extern MterpCheckBefore
11137    EXPORT_PC
11138    REFRESH_IBASE
11139    dla     ra, artMterpAsmInstructionStart
11140    dla     t9, MterpCheckBefore
11141    move    a0, rSELF
11142    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11143    daddu   ra, ra, (197 * 128)            # Addr of primary handler.
11144    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11145
11146/* ------------------------------ */
11147    .balign 128
11148.L_ALT_op_add_float_2addr: /* 0xc6 */
11149/* File: mips64/alt_stub.S */
11150/*
11151 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11152 * any interesting requests and then jump to the real instruction
11153 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11154 */
11155    .extern MterpCheckBefore
11156    EXPORT_PC
11157    REFRESH_IBASE
11158    dla     ra, artMterpAsmInstructionStart
11159    dla     t9, MterpCheckBefore
11160    move    a0, rSELF
11161    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11162    daddu   ra, ra, (198 * 128)            # Addr of primary handler.
11163    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11164
11165/* ------------------------------ */
11166    .balign 128
11167.L_ALT_op_sub_float_2addr: /* 0xc7 */
11168/* File: mips64/alt_stub.S */
11169/*
11170 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11171 * any interesting requests and then jump to the real instruction
11172 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11173 */
11174    .extern MterpCheckBefore
11175    EXPORT_PC
11176    REFRESH_IBASE
11177    dla     ra, artMterpAsmInstructionStart
11178    dla     t9, MterpCheckBefore
11179    move    a0, rSELF
11180    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11181    daddu   ra, ra, (199 * 128)            # Addr of primary handler.
11182    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11183
11184/* ------------------------------ */
11185    .balign 128
11186.L_ALT_op_mul_float_2addr: /* 0xc8 */
11187/* File: mips64/alt_stub.S */
11188/*
11189 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11190 * any interesting requests and then jump to the real instruction
11191 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11192 */
11193    .extern MterpCheckBefore
11194    EXPORT_PC
11195    REFRESH_IBASE
11196    dla     ra, artMterpAsmInstructionStart
11197    dla     t9, MterpCheckBefore
11198    move    a0, rSELF
11199    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11200    daddu   ra, ra, (200 * 128)            # Addr of primary handler.
11201    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11202
11203/* ------------------------------ */
11204    .balign 128
11205.L_ALT_op_div_float_2addr: /* 0xc9 */
11206/* File: mips64/alt_stub.S */
11207/*
11208 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11209 * any interesting requests and then jump to the real instruction
11210 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11211 */
11212    .extern MterpCheckBefore
11213    EXPORT_PC
11214    REFRESH_IBASE
11215    dla     ra, artMterpAsmInstructionStart
11216    dla     t9, MterpCheckBefore
11217    move    a0, rSELF
11218    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11219    daddu   ra, ra, (201 * 128)            # Addr of primary handler.
11220    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11221
11222/* ------------------------------ */
11223    .balign 128
11224.L_ALT_op_rem_float_2addr: /* 0xca */
11225/* File: mips64/alt_stub.S */
11226/*
11227 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11228 * any interesting requests and then jump to the real instruction
11229 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11230 */
11231    .extern MterpCheckBefore
11232    EXPORT_PC
11233    REFRESH_IBASE
11234    dla     ra, artMterpAsmInstructionStart
11235    dla     t9, MterpCheckBefore
11236    move    a0, rSELF
11237    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11238    daddu   ra, ra, (202 * 128)            # Addr of primary handler.
11239    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11240
11241/* ------------------------------ */
11242    .balign 128
11243.L_ALT_op_add_double_2addr: /* 0xcb */
11244/* File: mips64/alt_stub.S */
11245/*
11246 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11247 * any interesting requests and then jump to the real instruction
11248 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11249 */
11250    .extern MterpCheckBefore
11251    EXPORT_PC
11252    REFRESH_IBASE
11253    dla     ra, artMterpAsmInstructionStart
11254    dla     t9, MterpCheckBefore
11255    move    a0, rSELF
11256    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11257    daddu   ra, ra, (203 * 128)            # Addr of primary handler.
11258    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11259
11260/* ------------------------------ */
11261    .balign 128
11262.L_ALT_op_sub_double_2addr: /* 0xcc */
11263/* File: mips64/alt_stub.S */
11264/*
11265 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11266 * any interesting requests and then jump to the real instruction
11267 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11268 */
11269    .extern MterpCheckBefore
11270    EXPORT_PC
11271    REFRESH_IBASE
11272    dla     ra, artMterpAsmInstructionStart
11273    dla     t9, MterpCheckBefore
11274    move    a0, rSELF
11275    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11276    daddu   ra, ra, (204 * 128)            # Addr of primary handler.
11277    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11278
11279/* ------------------------------ */
11280    .balign 128
11281.L_ALT_op_mul_double_2addr: /* 0xcd */
11282/* File: mips64/alt_stub.S */
11283/*
11284 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11285 * any interesting requests and then jump to the real instruction
11286 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11287 */
11288    .extern MterpCheckBefore
11289    EXPORT_PC
11290    REFRESH_IBASE
11291    dla     ra, artMterpAsmInstructionStart
11292    dla     t9, MterpCheckBefore
11293    move    a0, rSELF
11294    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11295    daddu   ra, ra, (205 * 128)            # Addr of primary handler.
11296    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11297
11298/* ------------------------------ */
11299    .balign 128
11300.L_ALT_op_div_double_2addr: /* 0xce */
11301/* File: mips64/alt_stub.S */
11302/*
11303 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11304 * any interesting requests and then jump to the real instruction
11305 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11306 */
11307    .extern MterpCheckBefore
11308    EXPORT_PC
11309    REFRESH_IBASE
11310    dla     ra, artMterpAsmInstructionStart
11311    dla     t9, MterpCheckBefore
11312    move    a0, rSELF
11313    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11314    daddu   ra, ra, (206 * 128)            # Addr of primary handler.
11315    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11316
11317/* ------------------------------ */
11318    .balign 128
11319.L_ALT_op_rem_double_2addr: /* 0xcf */
11320/* File: mips64/alt_stub.S */
11321/*
11322 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11323 * any interesting requests and then jump to the real instruction
11324 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11325 */
11326    .extern MterpCheckBefore
11327    EXPORT_PC
11328    REFRESH_IBASE
11329    dla     ra, artMterpAsmInstructionStart
11330    dla     t9, MterpCheckBefore
11331    move    a0, rSELF
11332    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11333    daddu   ra, ra, (207 * 128)            # Addr of primary handler.
11334    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11335
11336/* ------------------------------ */
11337    .balign 128
11338.L_ALT_op_add_int_lit16: /* 0xd0 */
11339/* File: mips64/alt_stub.S */
11340/*
11341 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11342 * any interesting requests and then jump to the real instruction
11343 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11344 */
11345    .extern MterpCheckBefore
11346    EXPORT_PC
11347    REFRESH_IBASE
11348    dla     ra, artMterpAsmInstructionStart
11349    dla     t9, MterpCheckBefore
11350    move    a0, rSELF
11351    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11352    daddu   ra, ra, (208 * 128)            # Addr of primary handler.
11353    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11354
11355/* ------------------------------ */
11356    .balign 128
11357.L_ALT_op_rsub_int: /* 0xd1 */
11358/* File: mips64/alt_stub.S */
11359/*
11360 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11361 * any interesting requests and then jump to the real instruction
11362 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11363 */
11364    .extern MterpCheckBefore
11365    EXPORT_PC
11366    REFRESH_IBASE
11367    dla     ra, artMterpAsmInstructionStart
11368    dla     t9, MterpCheckBefore
11369    move    a0, rSELF
11370    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11371    daddu   ra, ra, (209 * 128)            # Addr of primary handler.
11372    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11373
11374/* ------------------------------ */
11375    .balign 128
11376.L_ALT_op_mul_int_lit16: /* 0xd2 */
11377/* File: mips64/alt_stub.S */
11378/*
11379 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11380 * any interesting requests and then jump to the real instruction
11381 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11382 */
11383    .extern MterpCheckBefore
11384    EXPORT_PC
11385    REFRESH_IBASE
11386    dla     ra, artMterpAsmInstructionStart
11387    dla     t9, MterpCheckBefore
11388    move    a0, rSELF
11389    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11390    daddu   ra, ra, (210 * 128)            # Addr of primary handler.
11391    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11392
11393/* ------------------------------ */
11394    .balign 128
11395.L_ALT_op_div_int_lit16: /* 0xd3 */
11396/* File: mips64/alt_stub.S */
11397/*
11398 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11399 * any interesting requests and then jump to the real instruction
11400 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11401 */
11402    .extern MterpCheckBefore
11403    EXPORT_PC
11404    REFRESH_IBASE
11405    dla     ra, artMterpAsmInstructionStart
11406    dla     t9, MterpCheckBefore
11407    move    a0, rSELF
11408    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11409    daddu   ra, ra, (211 * 128)            # Addr of primary handler.
11410    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11411
11412/* ------------------------------ */
11413    .balign 128
11414.L_ALT_op_rem_int_lit16: /* 0xd4 */
11415/* File: mips64/alt_stub.S */
11416/*
11417 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11418 * any interesting requests and then jump to the real instruction
11419 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11420 */
11421    .extern MterpCheckBefore
11422    EXPORT_PC
11423    REFRESH_IBASE
11424    dla     ra, artMterpAsmInstructionStart
11425    dla     t9, MterpCheckBefore
11426    move    a0, rSELF
11427    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11428    daddu   ra, ra, (212 * 128)            # Addr of primary handler.
11429    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11430
11431/* ------------------------------ */
11432    .balign 128
11433.L_ALT_op_and_int_lit16: /* 0xd5 */
11434/* File: mips64/alt_stub.S */
11435/*
11436 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11437 * any interesting requests and then jump to the real instruction
11438 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11439 */
11440    .extern MterpCheckBefore
11441    EXPORT_PC
11442    REFRESH_IBASE
11443    dla     ra, artMterpAsmInstructionStart
11444    dla     t9, MterpCheckBefore
11445    move    a0, rSELF
11446    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11447    daddu   ra, ra, (213 * 128)            # Addr of primary handler.
11448    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11449
11450/* ------------------------------ */
11451    .balign 128
11452.L_ALT_op_or_int_lit16: /* 0xd6 */
11453/* File: mips64/alt_stub.S */
11454/*
11455 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11456 * any interesting requests and then jump to the real instruction
11457 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11458 */
11459    .extern MterpCheckBefore
11460    EXPORT_PC
11461    REFRESH_IBASE
11462    dla     ra, artMterpAsmInstructionStart
11463    dla     t9, MterpCheckBefore
11464    move    a0, rSELF
11465    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11466    daddu   ra, ra, (214 * 128)            # Addr of primary handler.
11467    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11468
11469/* ------------------------------ */
11470    .balign 128
11471.L_ALT_op_xor_int_lit16: /* 0xd7 */
11472/* File: mips64/alt_stub.S */
11473/*
11474 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11475 * any interesting requests and then jump to the real instruction
11476 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11477 */
11478    .extern MterpCheckBefore
11479    EXPORT_PC
11480    REFRESH_IBASE
11481    dla     ra, artMterpAsmInstructionStart
11482    dla     t9, MterpCheckBefore
11483    move    a0, rSELF
11484    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11485    daddu   ra, ra, (215 * 128)            # Addr of primary handler.
11486    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11487
11488/* ------------------------------ */
11489    .balign 128
11490.L_ALT_op_add_int_lit8: /* 0xd8 */
11491/* File: mips64/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.  Note that the call to MterpCheckBefore is done as a tail call.
11496 */
11497    .extern MterpCheckBefore
11498    EXPORT_PC
11499    REFRESH_IBASE
11500    dla     ra, artMterpAsmInstructionStart
11501    dla     t9, MterpCheckBefore
11502    move    a0, rSELF
11503    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11504    daddu   ra, ra, (216 * 128)            # Addr of primary handler.
11505    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11506
11507/* ------------------------------ */
11508    .balign 128
11509.L_ALT_op_rsub_int_lit8: /* 0xd9 */
11510/* File: mips64/alt_stub.S */
11511/*
11512 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11513 * any interesting requests and then jump to the real instruction
11514 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11515 */
11516    .extern MterpCheckBefore
11517    EXPORT_PC
11518    REFRESH_IBASE
11519    dla     ra, artMterpAsmInstructionStart
11520    dla     t9, MterpCheckBefore
11521    move    a0, rSELF
11522    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11523    daddu   ra, ra, (217 * 128)            # Addr of primary handler.
11524    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11525
11526/* ------------------------------ */
11527    .balign 128
11528.L_ALT_op_mul_int_lit8: /* 0xda */
11529/* File: mips64/alt_stub.S */
11530/*
11531 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11532 * any interesting requests and then jump to the real instruction
11533 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11534 */
11535    .extern MterpCheckBefore
11536    EXPORT_PC
11537    REFRESH_IBASE
11538    dla     ra, artMterpAsmInstructionStart
11539    dla     t9, MterpCheckBefore
11540    move    a0, rSELF
11541    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11542    daddu   ra, ra, (218 * 128)            # Addr of primary handler.
11543    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11544
11545/* ------------------------------ */
11546    .balign 128
11547.L_ALT_op_div_int_lit8: /* 0xdb */
11548/* File: mips64/alt_stub.S */
11549/*
11550 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11551 * any interesting requests and then jump to the real instruction
11552 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11553 */
11554    .extern MterpCheckBefore
11555    EXPORT_PC
11556    REFRESH_IBASE
11557    dla     ra, artMterpAsmInstructionStart
11558    dla     t9, MterpCheckBefore
11559    move    a0, rSELF
11560    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11561    daddu   ra, ra, (219 * 128)            # Addr of primary handler.
11562    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11563
11564/* ------------------------------ */
11565    .balign 128
11566.L_ALT_op_rem_int_lit8: /* 0xdc */
11567/* File: mips64/alt_stub.S */
11568/*
11569 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11570 * any interesting requests and then jump to the real instruction
11571 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11572 */
11573    .extern MterpCheckBefore
11574    EXPORT_PC
11575    REFRESH_IBASE
11576    dla     ra, artMterpAsmInstructionStart
11577    dla     t9, MterpCheckBefore
11578    move    a0, rSELF
11579    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11580    daddu   ra, ra, (220 * 128)            # Addr of primary handler.
11581    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11582
11583/* ------------------------------ */
11584    .balign 128
11585.L_ALT_op_and_int_lit8: /* 0xdd */
11586/* File: mips64/alt_stub.S */
11587/*
11588 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11589 * any interesting requests and then jump to the real instruction
11590 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11591 */
11592    .extern MterpCheckBefore
11593    EXPORT_PC
11594    REFRESH_IBASE
11595    dla     ra, artMterpAsmInstructionStart
11596    dla     t9, MterpCheckBefore
11597    move    a0, rSELF
11598    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11599    daddu   ra, ra, (221 * 128)            # Addr of primary handler.
11600    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11601
11602/* ------------------------------ */
11603    .balign 128
11604.L_ALT_op_or_int_lit8: /* 0xde */
11605/* File: mips64/alt_stub.S */
11606/*
11607 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11608 * any interesting requests and then jump to the real instruction
11609 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11610 */
11611    .extern MterpCheckBefore
11612    EXPORT_PC
11613    REFRESH_IBASE
11614    dla     ra, artMterpAsmInstructionStart
11615    dla     t9, MterpCheckBefore
11616    move    a0, rSELF
11617    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11618    daddu   ra, ra, (222 * 128)            # Addr of primary handler.
11619    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11620
11621/* ------------------------------ */
11622    .balign 128
11623.L_ALT_op_xor_int_lit8: /* 0xdf */
11624/* File: mips64/alt_stub.S */
11625/*
11626 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11627 * any interesting requests and then jump to the real instruction
11628 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11629 */
11630    .extern MterpCheckBefore
11631    EXPORT_PC
11632    REFRESH_IBASE
11633    dla     ra, artMterpAsmInstructionStart
11634    dla     t9, MterpCheckBefore
11635    move    a0, rSELF
11636    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11637    daddu   ra, ra, (223 * 128)            # Addr of primary handler.
11638    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11639
11640/* ------------------------------ */
11641    .balign 128
11642.L_ALT_op_shl_int_lit8: /* 0xe0 */
11643/* File: mips64/alt_stub.S */
11644/*
11645 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11646 * any interesting requests and then jump to the real instruction
11647 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11648 */
11649    .extern MterpCheckBefore
11650    EXPORT_PC
11651    REFRESH_IBASE
11652    dla     ra, artMterpAsmInstructionStart
11653    dla     t9, MterpCheckBefore
11654    move    a0, rSELF
11655    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11656    daddu   ra, ra, (224 * 128)            # Addr of primary handler.
11657    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11658
11659/* ------------------------------ */
11660    .balign 128
11661.L_ALT_op_shr_int_lit8: /* 0xe1 */
11662/* File: mips64/alt_stub.S */
11663/*
11664 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11665 * any interesting requests and then jump to the real instruction
11666 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11667 */
11668    .extern MterpCheckBefore
11669    EXPORT_PC
11670    REFRESH_IBASE
11671    dla     ra, artMterpAsmInstructionStart
11672    dla     t9, MterpCheckBefore
11673    move    a0, rSELF
11674    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11675    daddu   ra, ra, (225 * 128)            # Addr of primary handler.
11676    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11677
11678/* ------------------------------ */
11679    .balign 128
11680.L_ALT_op_ushr_int_lit8: /* 0xe2 */
11681/* File: mips64/alt_stub.S */
11682/*
11683 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11684 * any interesting requests and then jump to the real instruction
11685 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11686 */
11687    .extern MterpCheckBefore
11688    EXPORT_PC
11689    REFRESH_IBASE
11690    dla     ra, artMterpAsmInstructionStart
11691    dla     t9, MterpCheckBefore
11692    move    a0, rSELF
11693    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11694    daddu   ra, ra, (226 * 128)            # Addr of primary handler.
11695    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11696
11697/* ------------------------------ */
11698    .balign 128
11699.L_ALT_op_iget_quick: /* 0xe3 */
11700/* File: mips64/alt_stub.S */
11701/*
11702 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11703 * any interesting requests and then jump to the real instruction
11704 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11705 */
11706    .extern MterpCheckBefore
11707    EXPORT_PC
11708    REFRESH_IBASE
11709    dla     ra, artMterpAsmInstructionStart
11710    dla     t9, MterpCheckBefore
11711    move    a0, rSELF
11712    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11713    daddu   ra, ra, (227 * 128)            # Addr of primary handler.
11714    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11715
11716/* ------------------------------ */
11717    .balign 128
11718.L_ALT_op_iget_wide_quick: /* 0xe4 */
11719/* File: mips64/alt_stub.S */
11720/*
11721 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11722 * any interesting requests and then jump to the real instruction
11723 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11724 */
11725    .extern MterpCheckBefore
11726    EXPORT_PC
11727    REFRESH_IBASE
11728    dla     ra, artMterpAsmInstructionStart
11729    dla     t9, MterpCheckBefore
11730    move    a0, rSELF
11731    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11732    daddu   ra, ra, (228 * 128)            # Addr of primary handler.
11733    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11734
11735/* ------------------------------ */
11736    .balign 128
11737.L_ALT_op_iget_object_quick: /* 0xe5 */
11738/* File: mips64/alt_stub.S */
11739/*
11740 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11741 * any interesting requests and then jump to the real instruction
11742 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11743 */
11744    .extern MterpCheckBefore
11745    EXPORT_PC
11746    REFRESH_IBASE
11747    dla     ra, artMterpAsmInstructionStart
11748    dla     t9, MterpCheckBefore
11749    move    a0, rSELF
11750    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11751    daddu   ra, ra, (229 * 128)            # Addr of primary handler.
11752    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11753
11754/* ------------------------------ */
11755    .balign 128
11756.L_ALT_op_iput_quick: /* 0xe6 */
11757/* File: mips64/alt_stub.S */
11758/*
11759 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11760 * any interesting requests and then jump to the real instruction
11761 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11762 */
11763    .extern MterpCheckBefore
11764    EXPORT_PC
11765    REFRESH_IBASE
11766    dla     ra, artMterpAsmInstructionStart
11767    dla     t9, MterpCheckBefore
11768    move    a0, rSELF
11769    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11770    daddu   ra, ra, (230 * 128)            # Addr of primary handler.
11771    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11772
11773/* ------------------------------ */
11774    .balign 128
11775.L_ALT_op_iput_wide_quick: /* 0xe7 */
11776/* File: mips64/alt_stub.S */
11777/*
11778 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11779 * any interesting requests and then jump to the real instruction
11780 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11781 */
11782    .extern MterpCheckBefore
11783    EXPORT_PC
11784    REFRESH_IBASE
11785    dla     ra, artMterpAsmInstructionStart
11786    dla     t9, MterpCheckBefore
11787    move    a0, rSELF
11788    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11789    daddu   ra, ra, (231 * 128)            # Addr of primary handler.
11790    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11791
11792/* ------------------------------ */
11793    .balign 128
11794.L_ALT_op_iput_object_quick: /* 0xe8 */
11795/* File: mips64/alt_stub.S */
11796/*
11797 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11798 * any interesting requests and then jump to the real instruction
11799 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11800 */
11801    .extern MterpCheckBefore
11802    EXPORT_PC
11803    REFRESH_IBASE
11804    dla     ra, artMterpAsmInstructionStart
11805    dla     t9, MterpCheckBefore
11806    move    a0, rSELF
11807    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11808    daddu   ra, ra, (232 * 128)            # Addr of primary handler.
11809    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11810
11811/* ------------------------------ */
11812    .balign 128
11813.L_ALT_op_invoke_virtual_quick: /* 0xe9 */
11814/* File: mips64/alt_stub.S */
11815/*
11816 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11817 * any interesting requests and then jump to the real instruction
11818 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11819 */
11820    .extern MterpCheckBefore
11821    EXPORT_PC
11822    REFRESH_IBASE
11823    dla     ra, artMterpAsmInstructionStart
11824    dla     t9, MterpCheckBefore
11825    move    a0, rSELF
11826    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11827    daddu   ra, ra, (233 * 128)            # Addr of primary handler.
11828    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11829
11830/* ------------------------------ */
11831    .balign 128
11832.L_ALT_op_invoke_virtual_range_quick: /* 0xea */
11833/* File: mips64/alt_stub.S */
11834/*
11835 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11836 * any interesting requests and then jump to the real instruction
11837 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11838 */
11839    .extern MterpCheckBefore
11840    EXPORT_PC
11841    REFRESH_IBASE
11842    dla     ra, artMterpAsmInstructionStart
11843    dla     t9, MterpCheckBefore
11844    move    a0, rSELF
11845    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11846    daddu   ra, ra, (234 * 128)            # Addr of primary handler.
11847    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11848
11849/* ------------------------------ */
11850    .balign 128
11851.L_ALT_op_iput_boolean_quick: /* 0xeb */
11852/* File: mips64/alt_stub.S */
11853/*
11854 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11855 * any interesting requests and then jump to the real instruction
11856 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11857 */
11858    .extern MterpCheckBefore
11859    EXPORT_PC
11860    REFRESH_IBASE
11861    dla     ra, artMterpAsmInstructionStart
11862    dla     t9, MterpCheckBefore
11863    move    a0, rSELF
11864    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11865    daddu   ra, ra, (235 * 128)            # Addr of primary handler.
11866    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11867
11868/* ------------------------------ */
11869    .balign 128
11870.L_ALT_op_iput_byte_quick: /* 0xec */
11871/* File: mips64/alt_stub.S */
11872/*
11873 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11874 * any interesting requests and then jump to the real instruction
11875 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11876 */
11877    .extern MterpCheckBefore
11878    EXPORT_PC
11879    REFRESH_IBASE
11880    dla     ra, artMterpAsmInstructionStart
11881    dla     t9, MterpCheckBefore
11882    move    a0, rSELF
11883    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11884    daddu   ra, ra, (236 * 128)            # Addr of primary handler.
11885    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11886
11887/* ------------------------------ */
11888    .balign 128
11889.L_ALT_op_iput_char_quick: /* 0xed */
11890/* File: mips64/alt_stub.S */
11891/*
11892 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11893 * any interesting requests and then jump to the real instruction
11894 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11895 */
11896    .extern MterpCheckBefore
11897    EXPORT_PC
11898    REFRESH_IBASE
11899    dla     ra, artMterpAsmInstructionStart
11900    dla     t9, MterpCheckBefore
11901    move    a0, rSELF
11902    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11903    daddu   ra, ra, (237 * 128)            # Addr of primary handler.
11904    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11905
11906/* ------------------------------ */
11907    .balign 128
11908.L_ALT_op_iput_short_quick: /* 0xee */
11909/* File: mips64/alt_stub.S */
11910/*
11911 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11912 * any interesting requests and then jump to the real instruction
11913 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11914 */
11915    .extern MterpCheckBefore
11916    EXPORT_PC
11917    REFRESH_IBASE
11918    dla     ra, artMterpAsmInstructionStart
11919    dla     t9, MterpCheckBefore
11920    move    a0, rSELF
11921    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11922    daddu   ra, ra, (238 * 128)            # Addr of primary handler.
11923    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11924
11925/* ------------------------------ */
11926    .balign 128
11927.L_ALT_op_iget_boolean_quick: /* 0xef */
11928/* File: mips64/alt_stub.S */
11929/*
11930 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11931 * any interesting requests and then jump to the real instruction
11932 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11933 */
11934    .extern MterpCheckBefore
11935    EXPORT_PC
11936    REFRESH_IBASE
11937    dla     ra, artMterpAsmInstructionStart
11938    dla     t9, MterpCheckBefore
11939    move    a0, rSELF
11940    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11941    daddu   ra, ra, (239 * 128)            # Addr of primary handler.
11942    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11943
11944/* ------------------------------ */
11945    .balign 128
11946.L_ALT_op_iget_byte_quick: /* 0xf0 */
11947/* File: mips64/alt_stub.S */
11948/*
11949 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11950 * any interesting requests and then jump to the real instruction
11951 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11952 */
11953    .extern MterpCheckBefore
11954    EXPORT_PC
11955    REFRESH_IBASE
11956    dla     ra, artMterpAsmInstructionStart
11957    dla     t9, MterpCheckBefore
11958    move    a0, rSELF
11959    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11960    daddu   ra, ra, (240 * 128)            # Addr of primary handler.
11961    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11962
11963/* ------------------------------ */
11964    .balign 128
11965.L_ALT_op_iget_char_quick: /* 0xf1 */
11966/* File: mips64/alt_stub.S */
11967/*
11968 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11969 * any interesting requests and then jump to the real instruction
11970 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11971 */
11972    .extern MterpCheckBefore
11973    EXPORT_PC
11974    REFRESH_IBASE
11975    dla     ra, artMterpAsmInstructionStart
11976    dla     t9, MterpCheckBefore
11977    move    a0, rSELF
11978    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11979    daddu   ra, ra, (241 * 128)            # Addr of primary handler.
11980    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
11981
11982/* ------------------------------ */
11983    .balign 128
11984.L_ALT_op_iget_short_quick: /* 0xf2 */
11985/* File: mips64/alt_stub.S */
11986/*
11987 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11988 * any interesting requests and then jump to the real instruction
11989 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11990 */
11991    .extern MterpCheckBefore
11992    EXPORT_PC
11993    REFRESH_IBASE
11994    dla     ra, artMterpAsmInstructionStart
11995    dla     t9, MterpCheckBefore
11996    move    a0, rSELF
11997    daddu   a1, rFP, OFF_FP_SHADOWFRAME
11998    daddu   ra, ra, (242 * 128)            # Addr of primary handler.
11999    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
12000
12001/* ------------------------------ */
12002    .balign 128
12003.L_ALT_op_invoke_lambda: /* 0xf3 */
12004/* File: mips64/alt_stub.S */
12005/*
12006 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12007 * any interesting requests and then jump to the real instruction
12008 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
12009 */
12010    .extern MterpCheckBefore
12011    EXPORT_PC
12012    REFRESH_IBASE
12013    dla     ra, artMterpAsmInstructionStart
12014    dla     t9, MterpCheckBefore
12015    move    a0, rSELF
12016    daddu   a1, rFP, OFF_FP_SHADOWFRAME
12017    daddu   ra, ra, (243 * 128)            # Addr of primary handler.
12018    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
12019
12020/* ------------------------------ */
12021    .balign 128
12022.L_ALT_op_unused_f4: /* 0xf4 */
12023/* File: mips64/alt_stub.S */
12024/*
12025 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12026 * any interesting requests and then jump to the real instruction
12027 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
12028 */
12029    .extern MterpCheckBefore
12030    EXPORT_PC
12031    REFRESH_IBASE
12032    dla     ra, artMterpAsmInstructionStart
12033    dla     t9, MterpCheckBefore
12034    move    a0, rSELF
12035    daddu   a1, rFP, OFF_FP_SHADOWFRAME
12036    daddu   ra, ra, (244 * 128)            # Addr of primary handler.
12037    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
12038
12039/* ------------------------------ */
12040    .balign 128
12041.L_ALT_op_capture_variable: /* 0xf5 */
12042/* File: mips64/alt_stub.S */
12043/*
12044 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12045 * any interesting requests and then jump to the real instruction
12046 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
12047 */
12048    .extern MterpCheckBefore
12049    EXPORT_PC
12050    REFRESH_IBASE
12051    dla     ra, artMterpAsmInstructionStart
12052    dla     t9, MterpCheckBefore
12053    move    a0, rSELF
12054    daddu   a1, rFP, OFF_FP_SHADOWFRAME
12055    daddu   ra, ra, (245 * 128)            # Addr of primary handler.
12056    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
12057
12058/* ------------------------------ */
12059    .balign 128
12060.L_ALT_op_create_lambda: /* 0xf6 */
12061/* File: mips64/alt_stub.S */
12062/*
12063 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12064 * any interesting requests and then jump to the real instruction
12065 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
12066 */
12067    .extern MterpCheckBefore
12068    EXPORT_PC
12069    REFRESH_IBASE
12070    dla     ra, artMterpAsmInstructionStart
12071    dla     t9, MterpCheckBefore
12072    move    a0, rSELF
12073    daddu   a1, rFP, OFF_FP_SHADOWFRAME
12074    daddu   ra, ra, (246 * 128)            # Addr of primary handler.
12075    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
12076
12077/* ------------------------------ */
12078    .balign 128
12079.L_ALT_op_liberate_variable: /* 0xf7 */
12080/* File: mips64/alt_stub.S */
12081/*
12082 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12083 * any interesting requests and then jump to the real instruction
12084 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
12085 */
12086    .extern MterpCheckBefore
12087    EXPORT_PC
12088    REFRESH_IBASE
12089    dla     ra, artMterpAsmInstructionStart
12090    dla     t9, MterpCheckBefore
12091    move    a0, rSELF
12092    daddu   a1, rFP, OFF_FP_SHADOWFRAME
12093    daddu   ra, ra, (247 * 128)            # Addr of primary handler.
12094    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
12095
12096/* ------------------------------ */
12097    .balign 128
12098.L_ALT_op_box_lambda: /* 0xf8 */
12099/* File: mips64/alt_stub.S */
12100/*
12101 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12102 * any interesting requests and then jump to the real instruction
12103 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
12104 */
12105    .extern MterpCheckBefore
12106    EXPORT_PC
12107    REFRESH_IBASE
12108    dla     ra, artMterpAsmInstructionStart
12109    dla     t9, MterpCheckBefore
12110    move    a0, rSELF
12111    daddu   a1, rFP, OFF_FP_SHADOWFRAME
12112    daddu   ra, ra, (248 * 128)            # Addr of primary handler.
12113    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
12114
12115/* ------------------------------ */
12116    .balign 128
12117.L_ALT_op_unbox_lambda: /* 0xf9 */
12118/* File: mips64/alt_stub.S */
12119/*
12120 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12121 * any interesting requests and then jump to the real instruction
12122 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
12123 */
12124    .extern MterpCheckBefore
12125    EXPORT_PC
12126    REFRESH_IBASE
12127    dla     ra, artMterpAsmInstructionStart
12128    dla     t9, MterpCheckBefore
12129    move    a0, rSELF
12130    daddu   a1, rFP, OFF_FP_SHADOWFRAME
12131    daddu   ra, ra, (249 * 128)            # Addr of primary handler.
12132    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
12133
12134/* ------------------------------ */
12135    .balign 128
12136.L_ALT_op_unused_fa: /* 0xfa */
12137/* File: mips64/alt_stub.S */
12138/*
12139 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12140 * any interesting requests and then jump to the real instruction
12141 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
12142 */
12143    .extern MterpCheckBefore
12144    EXPORT_PC
12145    REFRESH_IBASE
12146    dla     ra, artMterpAsmInstructionStart
12147    dla     t9, MterpCheckBefore
12148    move    a0, rSELF
12149    daddu   a1, rFP, OFF_FP_SHADOWFRAME
12150    daddu   ra, ra, (250 * 128)            # Addr of primary handler.
12151    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
12152
12153/* ------------------------------ */
12154    .balign 128
12155.L_ALT_op_unused_fb: /* 0xfb */
12156/* File: mips64/alt_stub.S */
12157/*
12158 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12159 * any interesting requests and then jump to the real instruction
12160 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
12161 */
12162    .extern MterpCheckBefore
12163    EXPORT_PC
12164    REFRESH_IBASE
12165    dla     ra, artMterpAsmInstructionStart
12166    dla     t9, MterpCheckBefore
12167    move    a0, rSELF
12168    daddu   a1, rFP, OFF_FP_SHADOWFRAME
12169    daddu   ra, ra, (251 * 128)            # Addr of primary handler.
12170    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
12171
12172/* ------------------------------ */
12173    .balign 128
12174.L_ALT_op_unused_fc: /* 0xfc */
12175/* File: mips64/alt_stub.S */
12176/*
12177 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12178 * any interesting requests and then jump to the real instruction
12179 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
12180 */
12181    .extern MterpCheckBefore
12182    EXPORT_PC
12183    REFRESH_IBASE
12184    dla     ra, artMterpAsmInstructionStart
12185    dla     t9, MterpCheckBefore
12186    move    a0, rSELF
12187    daddu   a1, rFP, OFF_FP_SHADOWFRAME
12188    daddu   ra, ra, (252 * 128)            # Addr of primary handler.
12189    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
12190
12191/* ------------------------------ */
12192    .balign 128
12193.L_ALT_op_unused_fd: /* 0xfd */
12194/* File: mips64/alt_stub.S */
12195/*
12196 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12197 * any interesting requests and then jump to the real instruction
12198 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
12199 */
12200    .extern MterpCheckBefore
12201    EXPORT_PC
12202    REFRESH_IBASE
12203    dla     ra, artMterpAsmInstructionStart
12204    dla     t9, MterpCheckBefore
12205    move    a0, rSELF
12206    daddu   a1, rFP, OFF_FP_SHADOWFRAME
12207    daddu   ra, ra, (253 * 128)            # Addr of primary handler.
12208    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
12209
12210/* ------------------------------ */
12211    .balign 128
12212.L_ALT_op_unused_fe: /* 0xfe */
12213/* File: mips64/alt_stub.S */
12214/*
12215 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12216 * any interesting requests and then jump to the real instruction
12217 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
12218 */
12219    .extern MterpCheckBefore
12220    EXPORT_PC
12221    REFRESH_IBASE
12222    dla     ra, artMterpAsmInstructionStart
12223    dla     t9, MterpCheckBefore
12224    move    a0, rSELF
12225    daddu   a1, rFP, OFF_FP_SHADOWFRAME
12226    daddu   ra, ra, (254 * 128)            # Addr of primary handler.
12227    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
12228
12229/* ------------------------------ */
12230    .balign 128
12231.L_ALT_op_unused_ff: /* 0xff */
12232/* File: mips64/alt_stub.S */
12233/*
12234 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12235 * any interesting requests and then jump to the real instruction
12236 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
12237 */
12238    .extern MterpCheckBefore
12239    EXPORT_PC
12240    REFRESH_IBASE
12241    dla     ra, artMterpAsmInstructionStart
12242    dla     t9, MterpCheckBefore
12243    move    a0, rSELF
12244    daddu   a1, rFP, OFF_FP_SHADOWFRAME
12245    daddu   ra, ra, (255 * 128)            # Addr of primary handler.
12246    jalr    zero, t9                            # (self, shadow_frame) Note: tail call.
12247
12248    .balign 128
12249    .size   artMterpAsmAltInstructionStart, .-artMterpAsmAltInstructionStart
12250    .global artMterpAsmAltInstructionEnd
12251artMterpAsmAltInstructionEnd:
12252/* File: mips64/footer.S */
12253/*
12254 * We've detected a condition that will result in an exception, but the exception
12255 * has not yet been thrown.  Just bail out to the reference interpreter to deal with it.
12256 * TUNING: for consistency, we may want to just go ahead and handle these here.
12257 */
12258
12259    .extern MterpLogDivideByZeroException
12260common_errDivideByZero:
12261    EXPORT_PC
12262#if MTERP_LOGGING
12263    move    a0, rSELF
12264    daddu   a1, rFP, OFF_FP_SHADOWFRAME
12265    jal     MterpLogDivideByZeroException
12266#endif
12267    b       MterpCommonFallback
12268
12269    .extern MterpLogArrayIndexException
12270common_errArrayIndex:
12271    EXPORT_PC
12272#if MTERP_LOGGING
12273    move    a0, rSELF
12274    daddu   a1, rFP, OFF_FP_SHADOWFRAME
12275    jal     MterpLogArrayIndexException
12276#endif
12277    b       MterpCommonFallback
12278
12279    .extern MterpLogNullObjectException
12280common_errNullObject:
12281    EXPORT_PC
12282#if MTERP_LOGGING
12283    move    a0, rSELF
12284    daddu   a1, rFP, OFF_FP_SHADOWFRAME
12285    jal     MterpLogNullObjectException
12286#endif
12287    b       MterpCommonFallback
12288
12289/*
12290 * If we're here, something is out of the ordinary.  If there is a pending
12291 * exception, handle it.  Otherwise, roll back and retry with the reference
12292 * interpreter.
12293 */
12294MterpPossibleException:
12295    ld      a0, THREAD_EXCEPTION_OFFSET(rSELF)
12296    beqzc   a0, MterpFallback                       # If not, fall back to reference interpreter.
12297    /* intentional fallthrough - handle pending exception. */
12298/*
12299 * On return from a runtime helper routine, we've found a pending exception.
12300 * Can we handle it here - or need to bail out to caller?
12301 *
12302 */
12303    .extern MterpHandleException
12304    .extern MterpShouldSwitchInterpreters
12305MterpException:
12306    move    a0, rSELF
12307    daddu   a1, rFP, OFF_FP_SHADOWFRAME
12308    jal     MterpHandleException                    # (self, shadow_frame)
12309    beqzc   v0, MterpExceptionReturn                # no local catch, back to caller.
12310    ld      a0, OFF_FP_CODE_ITEM(rFP)
12311    lwu     a1, OFF_FP_DEX_PC(rFP)
12312    REFRESH_IBASE
12313    daddu   rPC, a0, CODEITEM_INSNS_OFFSET
12314    dlsa    rPC, a1, rPC, 1                         # generate new dex_pc_ptr
12315    /* Do we need to switch interpreters? */
12316    jal     MterpShouldSwitchInterpreters
12317    bnezc   v0, MterpFallback
12318    /* resume execution at catch block */
12319    EXPORT_PC
12320    FETCH_INST
12321    GET_INST_OPCODE v0
12322    GOTO_OPCODE v0
12323    /* NOTE: no fallthrough */
12324
12325/*
12326 * Check for suspend check request.  Assumes rINST already loaded, rPC advanced and
12327 * still needs to get the opcode and branch to it, and flags are in ra.
12328 */
12329    .extern MterpSuspendCheck
12330MterpCheckSuspendAndContinue:
12331    REFRESH_IBASE
12332    and     ra, ra, (THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
12333    bnez    ra, check1
12334    GET_INST_OPCODE v0                              # extract opcode from rINST
12335    GOTO_OPCODE v0                                  # jump to next instruction
12336check1:
12337    EXPORT_PC
12338    move    a0, rSELF
12339    jal     MterpSuspendCheck                       # (self)
12340    bnezc   v0, MterpFallback                       # Something in the environment changed, switch interpreters
12341    GET_INST_OPCODE v0                              # extract opcode from rINST
12342    GOTO_OPCODE v0                                  # jump to next instruction
12343
12344/*
12345 * On-stack replacement has happened, and now we've returned from the compiled method.
12346 */
12347MterpOnStackReplacement:
12348#if MTERP_LOGGING
12349    move    a0, rSELF
12350    daddu   a1, rFP, OFF_FP_SHADOWFRAME
12351    move    a2, rINST                               # rINST contains offset
12352    jal     MterpLogOSR
12353#endif
12354    li      v0, 1                                   # Signal normal return
12355    b       MterpDone
12356
12357/*
12358 * Bail out to reference interpreter.
12359 */
12360    .extern MterpLogFallback
12361MterpFallback:
12362    EXPORT_PC
12363#if MTERP_LOGGING
12364    move    a0, rSELF
12365    daddu   a1, rFP, OFF_FP_SHADOWFRAME
12366    jal     MterpLogFallback
12367#endif
12368MterpCommonFallback:
12369    li      v0, 0                                   # signal retry with reference interpreter.
12370    b       MterpDone
12371
12372/*
12373 * We pushed some registers on the stack in ExecuteMterpImpl, then saved
12374 * SP and RA.  Here we restore SP, restore the registers, and then restore
12375 * RA to PC.
12376 *
12377 * On entry:
12378 *  uint32_t* rFP  (should still be live, pointer to base of vregs)
12379 */
12380MterpExceptionReturn:
12381    li      v0, 1                                   # signal return to caller.
12382    b       MterpDone
12383/*
12384 * Returned value is expected in a0 and if it's not 64-bit, the 32 most
12385 * significant bits of a0 must be 0.
12386 */
12387MterpReturn:
12388    ld      a2, OFF_FP_RESULT_REGISTER(rFP)
12389    lw      ra, THREAD_FLAGS_OFFSET(rSELF)
12390    sd      a0, 0(a2)
12391    move    a0, rSELF
12392    and     ra, ra, (THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
12393    beqzc   ra, check2
12394    jal     MterpSuspendCheck                       # (self)
12395check2:
12396    li      v0, 1                                   # signal return to caller.
12397MterpDone:
12398    ld      s5, STACK_OFFSET_S5(sp)
12399    .cfi_restore 21
12400    ld      s4, STACK_OFFSET_S4(sp)
12401    .cfi_restore 20
12402    ld      s3, STACK_OFFSET_S3(sp)
12403    .cfi_restore 19
12404    ld      s2, STACK_OFFSET_S2(sp)
12405    .cfi_restore 18
12406    ld      s1, STACK_OFFSET_S1(sp)
12407    .cfi_restore 17
12408    ld      s0, STACK_OFFSET_S0(sp)
12409    .cfi_restore 16
12410
12411    ld      ra, STACK_OFFSET_RA(sp)
12412    .cfi_restore 31
12413
12414    ld      t8, STACK_OFFSET_GP(sp)
12415    .cpreturn
12416    .cfi_restore 28
12417
12418    .set    noreorder
12419    jr      ra
12420    daddu   sp, sp, STACK_SIZE
12421    .cfi_adjust_cfa_offset -STACK_SIZE
12422
12423    .cfi_endproc
12424    .size ExecuteMterpImpl, .-ExecuteMterpImpl
12425
12426