1/*
2 * This file was generated automatically by gen-mterp.py for 'mips'.
3 *
4 * --> DO NOT EDIT <--
5 */
6
7/* File: mips/header.S */
8/*
9 * Copyright (C) 2016 The Android Open Source Project
10 *
11 * Licensed under the Apache License, Version 2.0 (the "License");
12 * you may not use this file except in compliance with the License.
13 * You may obtain a copy of the License at
14 *
15 *      http://www.apache.org/licenses/LICENSE-2.0
16 *
17 * Unless required by applicable law or agreed to in writing, software
18 * distributed under the License is distributed on an "AS IS" BASIS,
19 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20 * See the License for the specific language governing permissions and
21 * limitations under the License.
22 */
23
24/*
25  Art assembly interpreter notes:
26
27  First validate assembly code by implementing ExecuteXXXImpl() style body (doesn't
28  handle invoke, allows higher-level code to create frame & shadow frame.
29
30  Once that's working, support direct entry code & eliminate shadow frame (and
31  excess locals allocation.
32
33  Some (hopefully) temporary ugliness.  We'll treat rFP as pointing to the
34  base of the vreg array within the shadow frame.  Access the other fields,
35  dex_pc_, method_ and number_of_vregs_ via negative offsets.  For now, we'll continue
36  the shadow frame mechanism of double-storing object references - via rFP &
37  number_of_vregs_.
38
39 */
40
41#include "asm_support.h"
42
43#if (__mips==32) && (__mips_isa_rev>=2)
44#define MIPS32REVGE2    /* mips32r2 and greater */
45#if (__mips==32) && (__mips_isa_rev>=5)
46#define FPU64           /* 64 bit FPU */
47#if (__mips==32) && (__mips_isa_rev>=6)
48#define MIPS32REVGE6    /* mips32r6 and greater */
49#endif
50#endif
51#endif
52
53/* MIPS definitions and declarations
54
55   reg  nick      purpose
56   s0   rPC       interpreted program counter, used for fetching instructions
57   s1   rFP       interpreted frame pointer, used for accessing locals and args
58   s2   rSELF     self (Thread) pointer
59   s3   rIBASE    interpreted instruction base pointer, used for computed goto
60   s4   rINST     first 16-bit code unit of current instruction
61   s6   rREFS     base of object references in shadow frame (ideally, we'll get rid of this later).
62*/
63
64/* single-purpose registers, given names for clarity */
65#define rPC s0
66#define rFP s1
67#define rSELF s2
68#define rIBASE s3
69#define rINST s4
70#define rOBJ s5
71#define rREFS s6
72#define rTEMP s7
73
74#define rARG0 a0
75#define rARG1 a1
76#define rARG2 a2
77#define rARG3 a3
78#define rRESULT0 v0
79#define rRESULT1 v1
80
81/* GP register definitions */
82#define zero    $0      /* always zero */
83#define AT      $at     /* assembler temp */
84#define v0      $2      /* return value */
85#define v1      $3
86#define a0      $4      /* argument registers */
87#define a1      $5
88#define a2      $6
89#define a3      $7
90#define t0      $8      /* temp registers (not saved across subroutine calls) */
91#define t1      $9
92#define t2      $10
93#define t3      $11
94#define t4      $12
95#define t5      $13
96#define t6      $14
97#define t7      $15
98#define ta0     $12     /* alias */
99#define ta1     $13
100#define ta2     $14
101#define ta3     $15
102#define s0      $16     /* saved across subroutine calls (callee saved) */
103#define s1      $17
104#define s2      $18
105#define s3      $19
106#define s4      $20
107#define s5      $21
108#define s6      $22
109#define s7      $23
110#define t8      $24     /* two more temp registers */
111#define t9      $25
112#define k0      $26     /* kernel temporary */
113#define k1      $27
114#define gp      $28     /* global pointer */
115#define sp      $29     /* stack pointer */
116#define s8      $30     /* one more callee saved */
117#define ra      $31     /* return address */
118
119/* FP register definitions */
120#define fv0    $f0
121#define fv0f   $f1
122#define fv1    $f2
123#define fv1f   $f3
124#define fa0    $f12
125#define fa0f   $f13
126#define fa1    $f14
127#define fa1f   $f15
128#define ft0    $f4
129#define ft0f   $f5
130#define ft1    $f6
131#define ft1f   $f7
132#define ft2    $f8
133#define ft2f   $f9
134#define ft3    $f10
135#define ft3f   $f11
136#define ft4    $f16
137#define ft4f   $f17
138#define ft5    $f18
139#define ft5f   $f19
140#define fs0    $f20
141#define fs0f   $f21
142#define fs1    $f22
143#define fs1f   $f23
144#define fs2    $f24
145#define fs2f   $f25
146#define fs3    $f26
147#define fs3f   $f27
148#define fs4    $f28
149#define fs4f   $f29
150#define fs5    $f30
151#define fs5f   $f31
152
153#ifndef MIPS32REVGE6
154#define fcc0   $fcc0
155#define fcc1   $fcc1
156#endif
157
158/*
159 * Instead of holding a pointer to the shadow frame, we keep rFP at the base of the vregs.  So,
160 * to access other shadow frame fields, we need to use a backwards offset.  Define those here.
161 */
162#define OFF_FP(a) (a - SHADOWFRAME_VREGS_OFFSET)
163#define OFF_FP_NUMBER_OF_VREGS OFF_FP(SHADOWFRAME_NUMBER_OF_VREGS_OFFSET)
164#define OFF_FP_DEX_PC OFF_FP(SHADOWFRAME_DEX_PC_OFFSET)
165#define OFF_FP_LINK OFF_FP(SHADOWFRAME_LINK_OFFSET)
166#define OFF_FP_METHOD OFF_FP(SHADOWFRAME_METHOD_OFFSET)
167#define OFF_FP_RESULT_REGISTER OFF_FP(SHADOWFRAME_RESULT_REGISTER_OFFSET)
168#define OFF_FP_DEX_PC_PTR OFF_FP(SHADOWFRAME_DEX_PC_PTR_OFFSET)
169#define OFF_FP_CODE_ITEM OFF_FP(SHADOWFRAME_CODE_ITEM_OFFSET)
170#define OFF_FP_SHADOWFRAME (-SHADOWFRAME_VREGS_OFFSET)
171
172#define MTERP_PROFILE_BRANCHES 1
173#define MTERP_LOGGING 0
174
175/*
176 * "export" the PC to dex_pc field in the shadow frame, f/b/o future exception objects.  Must
177 * be done *before* something throws.
178 *
179 * It's okay to do this more than once.
180 *
181 * NOTE: the fast interpreter keeps track of dex pc as a direct pointer to the mapped
182 * dex byte codes.  However, the rest of the runtime expects dex pc to be an instruction
183 * offset into the code_items_[] array.  For effiency, we will "export" the
184 * current dex pc as a direct pointer using the EXPORT_PC macro, and rely on GetDexPC
185 * to convert to a dex pc when needed.
186 */
187#define EXPORT_PC() \
188    sw        rPC, OFF_FP_DEX_PC_PTR(rFP)
189
190#define EXPORT_DEX_PC(tmp) \
191    lw   tmp, OFF_FP_CODE_ITEM(rFP) \
192    sw   rPC, OFF_FP_DEX_PC_PTR(rFP) \
193    addu tmp, CODEITEM_INSNS_OFFSET \
194    subu tmp, rPC, tmp \
195    sra  tmp, tmp, 1 \
196    sw   tmp, OFF_FP_DEX_PC(rFP)
197
198/*
199 * Fetch the next instruction from rPC into rINST.  Does not advance rPC.
200 */
201#define FETCH_INST() lhu rINST, (rPC)
202
203/*
204 * Fetch the next instruction from the specified offset.  Advances rPC
205 * to point to the next instruction.  "_count" is in 16-bit code units.
206 *
207 * This must come AFTER anything that can throw an exception, or the
208 * exception catch may miss.  (This also implies that it must come after
209 * EXPORT_PC().)
210 */
211#define FETCH_ADVANCE_INST(_count) lhu rINST, ((_count)*2)(rPC); \
212    addu      rPC, rPC, ((_count) * 2)
213
214/*
215 * The operation performed here is similar to FETCH_ADVANCE_INST, except the
216 * src and dest registers are parameterized (not hard-wired to rPC and rINST).
217 */
218#define PREFETCH_ADVANCE_INST(_dreg, _sreg, _count) \
219    lhu       _dreg, ((_count)*2)(_sreg) ;            \
220    addu      _sreg, _sreg, (_count)*2
221
222/*
223 * Similar to FETCH_ADVANCE_INST, but does not update rPC.  Used to load
224 * rINST ahead of possible exception point.  Be sure to manually advance rPC
225 * later.
226 */
227#define PREFETCH_INST(_count) lhu rINST, ((_count)*2)(rPC)
228
229/* Advance rPC by some number of code units. */
230#define ADVANCE(_count) addu rPC, rPC, ((_count) * 2)
231
232/*
233 * Fetch the next instruction from an offset specified by rd.  Updates
234 * rPC to point to the next instruction.  "rd" must specify the distance
235 * in bytes, *not* 16-bit code units, and may be a signed value.
236 */
237#define FETCH_ADVANCE_INST_RB(rd) addu rPC, rPC, rd; \
238    lhu       rINST, (rPC)
239
240/*
241 * Fetch a half-word code unit from an offset past the current PC.  The
242 * "_count" value is in 16-bit code units.  Does not advance rPC.
243 *
244 * The "_S" variant works the same but treats the value as signed.
245 */
246#define FETCH(rd, _count) lhu rd, ((_count) * 2)(rPC)
247#define FETCH_S(rd, _count) lh rd, ((_count) * 2)(rPC)
248
249/*
250 * Fetch one byte from an offset past the current PC.  Pass in the same
251 * "_count" as you would for FETCH, and an additional 0/1 indicating which
252 * byte of the halfword you want (lo/hi).
253 */
254#define FETCH_B(rd, _count, _byte) lbu rd, ((_count) * 2 + _byte)(rPC)
255
256/*
257 * Put the instruction's opcode field into the specified register.
258 */
259#define GET_INST_OPCODE(rd) and rd, rINST, 0xFF
260
261/*
262 * Put the prefetched instruction's opcode field into the specified register.
263 */
264#define GET_PREFETCHED_OPCODE(dreg, sreg)   andi     dreg, sreg, 255
265
266/*
267 * Begin executing the opcode in rd.
268 */
269#define GOTO_OPCODE(rd) sll rd, rd, 7; \
270    addu      rd, rIBASE, rd; \
271    jalr      zero, rd
272
273#define GOTO_OPCODE_BASE(_base, rd)  sll rd, rd, 7; \
274    addu      rd, _base, rd; \
275    jalr      zero, rd
276
277/*
278 * Get/set the 32-bit value from a Dalvik register.
279 */
280#define GET_VREG(rd, rix) LOAD_eas2(rd, rFP, rix)
281
282#define GET_VREG_F(rd, rix) EAS2(AT, rFP, rix); \
283    .set noat; l.s rd, (AT); .set at
284
285#define SET_VREG(rd, rix) .set noat; \
286    sll       AT, rix, 2; \
287    addu      t8, rFP, AT; \
288    sw        rd, 0(t8); \
289    addu      t8, rREFS, AT; \
290    .set at; \
291    sw        zero, 0(t8)
292
293#define SET_VREG64(rlo, rhi, rix) .set noat; \
294    sll       AT, rix, 2; \
295    addu      t8, rFP, AT; \
296    sw        rlo, 0(t8); \
297    sw        rhi, 4(t8); \
298    addu      t8, rREFS, AT; \
299    .set at; \
300    sw        zero, 0(t8); \
301    sw        zero, 4(t8)
302
303#ifdef FPU64
304#define SET_VREG64_F(rlo, rhi, rix) .set noat; \
305    sll       AT, rix, 2; \
306    addu      t8, rREFS, AT; \
307    sw        zero, 0(t8); \
308    sw        zero, 4(t8); \
309    addu      t8, rFP, AT; \
310    mfhc1     AT, rlo; \
311    sw        AT, 4(t8); \
312    .set at; \
313    s.s       rlo, 0(t8)
314#else
315#define SET_VREG64_F(rlo, rhi, rix) .set noat; \
316    sll       AT, rix, 2; \
317    addu      t8, rFP, AT; \
318    s.s       rlo, 0(t8); \
319    s.s       rhi, 4(t8); \
320    addu      t8, rREFS, AT; \
321    .set at; \
322    sw        zero, 0(t8); \
323    sw        zero, 4(t8)
324#endif
325
326#define SET_VREG_OBJECT(rd, rix) .set noat; \
327    sll       AT, rix, 2; \
328    addu      t8, rFP, AT; \
329    sw        rd, 0(t8); \
330    addu      t8, rREFS, AT; \
331    .set at; \
332    sw        rd, 0(t8)
333
334/* Combination of the SET_VREG and GOTO_OPCODE functions to save 1 instruction */
335#define SET_VREG_GOTO(rd, rix, dst) .set noreorder; \
336    sll       dst, dst, 7; \
337    addu      dst, rIBASE, dst; \
338    .set noat; \
339    sll       AT, rix, 2; \
340    addu      t8, rFP, AT; \
341    sw        rd, 0(t8); \
342    addu      t8, rREFS, AT; \
343    .set at; \
344    jalr      zero, dst; \
345    sw        zero, 0(t8); \
346    .set reorder
347
348/* Combination of the SET_VREG64 and GOTO_OPCODE functions to save 1 instruction */
349#define SET_VREG64_GOTO(rlo, rhi, rix, dst) .set noreorder; \
350    sll       dst, dst, 7; \
351    addu      dst, rIBASE, dst; \
352    .set noat; \
353    sll       AT, rix, 2; \
354    addu      t8, rFP, AT; \
355    sw        rlo, 0(t8); \
356    sw        rhi, 4(t8); \
357    addu      t8, rREFS, AT; \
358    .set at; \
359    sw        zero, 0(t8); \
360    jalr      zero, dst; \
361    sw        zero, 4(t8); \
362    .set reorder
363
364#define SET_VREG_F(rd, rix) .set noat; \
365    sll       AT, rix, 2; \
366    addu      t8, rFP, AT; \
367    s.s       rd, 0(t8); \
368    addu      t8, rREFS, AT; \
369    .set at; \
370    sw        zero, 0(t8)
371
372#define GET_OPA(rd) srl rd, rINST, 8
373#ifdef MIPS32REVGE2
374#define GET_OPA4(rd) ext rd, rINST, 8, 4
375#else
376#define GET_OPA4(rd) GET_OPA(rd); and rd, 0xf
377#endif
378#define GET_OPB(rd) srl rd, rINST, 12
379
380/*
381 * Form an Effective Address rd = rbase + roff<<n;
382 * Uses reg AT
383 */
384#define EASN(rd, rbase, roff, rshift) .set noat; \
385    sll       AT, roff, rshift; \
386    addu      rd, rbase, AT; \
387    .set at
388
389#define EAS1(rd, rbase, roff) EASN(rd, rbase, roff, 1)
390#define EAS2(rd, rbase, roff) EASN(rd, rbase, roff, 2)
391#define EAS3(rd, rbase, roff) EASN(rd, rbase, roff, 3)
392#define EAS4(rd, rbase, roff) EASN(rd, rbase, roff, 4)
393
394/*
395 * Form an Effective Shift Right rd = rbase + roff>>n;
396 * Uses reg AT
397 */
398#define ESRN(rd, rbase, roff, rshift) .set noat; \
399    srl       AT, roff, rshift; \
400    addu      rd, rbase, AT; \
401    .set at
402
403#define LOAD_eas2(rd, rbase, roff) EAS2(AT, rbase, roff); \
404    .set noat; lw rd, 0(AT); .set at
405
406#define STORE_eas2(rd, rbase, roff) EAS2(AT, rbase, roff); \
407    .set noat; sw rd, 0(AT); .set at
408
409#define LOAD_RB_OFF(rd, rbase, off) lw rd, off(rbase)
410#define STORE_RB_OFF(rd, rbase, off) sw rd, off(rbase)
411
412#define STORE64_off(rlo, rhi, rbase, off) sw rlo, off(rbase); \
413    sw        rhi, (off+4)(rbase)
414#define LOAD64_off(rlo, rhi, rbase, off) lw rlo, off(rbase); \
415    lw        rhi, (off+4)(rbase)
416
417#define STORE64(rlo, rhi, rbase) STORE64_off(rlo, rhi, rbase, 0)
418#define LOAD64(rlo, rhi, rbase) LOAD64_off(rlo, rhi, rbase, 0)
419
420#ifdef FPU64
421#define STORE64_off_F(rlo, rhi, rbase, off) s.s rlo, off(rbase); \
422    .set noat; \
423    mfhc1     AT, rlo; \
424    sw        AT, (off+4)(rbase); \
425    .set at
426#define LOAD64_off_F(rlo, rhi, rbase, off) l.s rlo, off(rbase); \
427    .set noat; \
428    lw        AT, (off+4)(rbase); \
429    mthc1     AT, rlo; \
430    .set at
431#else
432#define STORE64_off_F(rlo, rhi, rbase, off) s.s rlo, off(rbase); \
433    s.s       rhi, (off+4)(rbase)
434#define LOAD64_off_F(rlo, rhi, rbase, off) l.s rlo, off(rbase); \
435    l.s       rhi, (off+4)(rbase)
436#endif
437
438#define STORE64_F(rlo, rhi, rbase) STORE64_off_F(rlo, rhi, rbase, 0)
439#define LOAD64_F(rlo, rhi, rbase) LOAD64_off_F(rlo, rhi, rbase, 0)
440
441
442#define LOAD_base_offMirrorArray_length(rd, rbase) LOAD_RB_OFF(rd, rbase, MIRROR_ARRAY_LENGTH_OFFSET)
443
444#define STACK_STORE(rd, off) sw rd, off(sp)
445#define STACK_LOAD(rd, off) lw rd, off(sp)
446#define CREATE_STACK(n) subu sp, sp, n
447#define DELETE_STACK(n) addu sp, sp, n
448
449#define LOAD_ADDR(dest, addr) la dest, addr
450#define LOAD_IMM(dest, imm) li dest, imm
451#define MOVE_REG(dest, src) move dest, src
452#define STACK_SIZE 128
453
454#define STACK_OFFSET_ARG04 16
455#define STACK_OFFSET_ARG05 20
456#define STACK_OFFSET_ARG06 24
457#define STACK_OFFSET_ARG07 28
458#define STACK_OFFSET_GP    84
459
460#define JAL(n) jal n
461#define BAL(n) bal n
462
463/*
464 * FP register usage restrictions:
465 * 1) We don't use the callee save FP registers so we don't have to save them.
466 * 2) We don't use the odd FP registers so we can share code with mips32r6.
467 */
468#define STACK_STORE_FULL() CREATE_STACK(STACK_SIZE); \
469    STACK_STORE(ra, 124); \
470    STACK_STORE(s8, 120); \
471    STACK_STORE(s0, 116); \
472    STACK_STORE(s1, 112); \
473    STACK_STORE(s2, 108); \
474    STACK_STORE(s3, 104); \
475    STACK_STORE(s4, 100); \
476    STACK_STORE(s5, 96); \
477    STACK_STORE(s6, 92); \
478    STACK_STORE(s7, 88);
479
480#define STACK_LOAD_FULL() STACK_LOAD(gp, STACK_OFFSET_GP); \
481    STACK_LOAD(s7, 88); \
482    STACK_LOAD(s6, 92); \
483    STACK_LOAD(s5, 96); \
484    STACK_LOAD(s4, 100); \
485    STACK_LOAD(s3, 104); \
486    STACK_LOAD(s2, 108); \
487    STACK_LOAD(s1, 112); \
488    STACK_LOAD(s0, 116); \
489    STACK_LOAD(s8, 120); \
490    STACK_LOAD(ra, 124); \
491    DELETE_STACK(STACK_SIZE)
492
493/* File: mips/entry.S */
494/*
495 * Copyright (C) 2016 The Android Open Source Project
496 *
497 * Licensed under the Apache License, Version 2.0 (the "License");
498 * you may not use this file except in compliance with the License.
499 * You may obtain a copy of the License at
500 *
501 *      http://www.apache.org/licenses/LICENSE-2.0
502 *
503 * Unless required by applicable law or agreed to in writing, software
504 * distributed under the License is distributed on an "AS IS" BASIS,
505 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
506 * See the License for the specific language governing permissions and
507 * limitations under the License.
508 */
509/*
510 * Interpreter entry point.
511 */
512
513    .text
514    .align 2
515    .global ExecuteMterpImpl
516    .ent    ExecuteMterpImpl
517    .frame sp, STACK_SIZE, ra
518/*
519 * On entry:
520 *  a0  Thread* self
521 *  a1  code_item
522 *  a2  ShadowFrame
523 *  a3  JValue* result_register
524 *
525 */
526
527ExecuteMterpImpl:
528    .set noreorder
529    .cpload t9
530    .set reorder
531/* Save to the stack. Frame size = STACK_SIZE */
532    STACK_STORE_FULL()
533/* This directive will make sure all subsequent jal restore gp at a known offset */
534    .cprestore STACK_OFFSET_GP
535
536    /* Remember the return register */
537    sw      a3, SHADOWFRAME_RESULT_REGISTER_OFFSET(a2)
538
539    /* Remember the code_item */
540    sw      a1, SHADOWFRAME_CODE_ITEM_OFFSET(a2)
541
542    /* set up "named" registers */
543    move    rSELF, a0
544    lw      a0, SHADOWFRAME_NUMBER_OF_VREGS_OFFSET(a2)
545    addu    rFP, a2, SHADOWFRAME_VREGS_OFFSET     # point to vregs.
546    EAS2(rREFS, rFP, a0)                          # point to reference array in shadow frame
547    lw      a0, SHADOWFRAME_DEX_PC_OFFSET(a2)     # Get starting dex_pc
548    addu    rPC, a1, CODEITEM_INSNS_OFFSET        # Point to base of insns[]
549    EAS1(rPC, rPC, a0)                            # Create direct pointer to 1st dex opcode
550
551    EXPORT_PC()
552
553    /* Starting ibase */
554    lw      rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)
555
556    /* start executing the instruction at rPC */
557    FETCH_INST()                           # load rINST from rPC
558    GET_INST_OPCODE(t0)                    # extract opcode from rINST
559    GOTO_OPCODE(t0)                        # jump to next instruction
560    /* NOTE: no fallthrough */
561
562
563    .global artMterpAsmInstructionStart
564    .type   artMterpAsmInstructionStart, %function
565artMterpAsmInstructionStart = .L_op_nop
566    .text
567
568/* ------------------------------ */
569    .balign 128
570.L_op_nop: /* 0x00 */
571/* File: mips/op_nop.S */
572    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
573    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
574    GOTO_OPCODE(t0)                        #  jump to next instruction
575
576/* ------------------------------ */
577    .balign 128
578.L_op_move: /* 0x01 */
579/* File: mips/op_move.S */
580    /* for move, move-object, long-to-int */
581    /* op vA, vB */
582    GET_OPB(a1)                            #  a1 <- B from 15:12
583    GET_OPA4(a0)                           #  a0 <- A from 11:8
584    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
585    GET_VREG(a2, a1)                       #  a2 <- fp[B]
586    GET_INST_OPCODE(t0)                    #  t0 <- opcode from rINST
587    .if 0
588    SET_VREG_OBJECT(a2, a0)                #  fp[A] <- a2
589    .else
590    SET_VREG(a2, a0)                       #  fp[A] <- a2
591    .endif
592    GOTO_OPCODE(t0)                        #  jump to next instruction
593
594/* ------------------------------ */
595    .balign 128
596.L_op_move_from16: /* 0x02 */
597/* File: mips/op_move_from16.S */
598    /* for: move/from16, move-object/from16 */
599    /* op vAA, vBBBB */
600    FETCH(a1, 1)                           #  a1 <- BBBB
601    GET_OPA(a0)                            #  a0 <- AA
602    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
603    GET_VREG(a2, a1)                       #  a2 <- fp[BBBB]
604    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
605    .if 0
606    SET_VREG_OBJECT(a2, a0)                #  fp[AA] <- a2
607    .else
608    SET_VREG(a2, a0)                       #  fp[AA] <- a2
609    .endif
610    GOTO_OPCODE(t0)                        #  jump to next instruction
611
612/* ------------------------------ */
613    .balign 128
614.L_op_move_16: /* 0x03 */
615/* File: mips/op_move_16.S */
616    /* for: move/16, move-object/16 */
617    /* op vAAAA, vBBBB */
618    FETCH(a1, 2)                           #  a1 <- BBBB
619    FETCH(a0, 1)                           #  a0 <- AAAA
620    FETCH_ADVANCE_INST(3)                  #  advance rPC, load rINST
621    GET_VREG(a2, a1)                       #  a2 <- fp[BBBB]
622    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
623    .if 0
624    SET_VREG_OBJECT(a2, a0)                #  fp[AAAA] <- a2
625    .else
626    SET_VREG(a2, a0)                       #  fp[AAAA] <- a2
627    .endif
628    GOTO_OPCODE(t0)                        #  jump to next instruction
629
630/* ------------------------------ */
631    .balign 128
632.L_op_move_wide: /* 0x04 */
633/* File: mips/op_move_wide.S */
634    /* move-wide vA, vB */
635    /* NOTE: regs can overlap, e.g. "move v6, v7" or "move v7, v6" */
636    GET_OPA4(a2)                           #  a2 <- A(+)
637    GET_OPB(a3)                            #  a3 <- B
638    EAS2(a3, rFP, a3)                      #  a3 <- &fp[B]
639    LOAD64(a0, a1, a3)                     #  a0/a1 <- fp[B]
640    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
641    SET_VREG64(a0, a1, a2)                 #  fp[A] <- a0/a1
642    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
643    GOTO_OPCODE(t0)                        #  jump to next instruction
644
645/* ------------------------------ */
646    .balign 128
647.L_op_move_wide_from16: /* 0x05 */
648/* File: mips/op_move_wide_from16.S */
649    /* move-wide/from16 vAA, vBBBB */
650    /* NOTE: regs can overlap, e.g. "move v6, v7" or "move v7, v6" */
651    FETCH(a3, 1)                           #  a3 <- BBBB
652    GET_OPA(a2)                            #  a2 <- AA
653    EAS2(a3, rFP, a3)                      #  a3 <- &fp[BBBB]
654    LOAD64(a0, a1, a3)                     #  a0/a1 <- fp[BBBB]
655    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
656    SET_VREG64(a0, a1, a2)                 #  fp[AA] <- a0/a1
657    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
658    GOTO_OPCODE(t0)                        #  jump to next instruction
659
660/* ------------------------------ */
661    .balign 128
662.L_op_move_wide_16: /* 0x06 */
663/* File: mips/op_move_wide_16.S */
664    /* move-wide/16 vAAAA, vBBBB */
665    /* NOTE: regs can overlap, e.g. "move v6, v7" or "move v7, v6" */
666    FETCH(a3, 2)                           #  a3 <- BBBB
667    FETCH(a2, 1)                           #  a2 <- AAAA
668    EAS2(a3, rFP, a3)                      #  a3 <- &fp[BBBB]
669    LOAD64(a0, a1, a3)                     #  a0/a1 <- fp[BBBB]
670    FETCH_ADVANCE_INST(3)                  #  advance rPC, load rINST
671    SET_VREG64(a0, a1, a2)                 #  fp[AAAA] <- a0/a1
672    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
673    GOTO_OPCODE(t0)                        #  jump to next instruction
674
675/* ------------------------------ */
676    .balign 128
677.L_op_move_object: /* 0x07 */
678/* File: mips/op_move_object.S */
679/* File: mips/op_move.S */
680    /* for move, move-object, long-to-int */
681    /* op vA, vB */
682    GET_OPB(a1)                            #  a1 <- B from 15:12
683    GET_OPA4(a0)                           #  a0 <- A from 11:8
684    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
685    GET_VREG(a2, a1)                       #  a2 <- fp[B]
686    GET_INST_OPCODE(t0)                    #  t0 <- opcode from rINST
687    .if 1
688    SET_VREG_OBJECT(a2, a0)                #  fp[A] <- a2
689    .else
690    SET_VREG(a2, a0)                       #  fp[A] <- a2
691    .endif
692    GOTO_OPCODE(t0)                        #  jump to next instruction
693
694
695/* ------------------------------ */
696    .balign 128
697.L_op_move_object_from16: /* 0x08 */
698/* File: mips/op_move_object_from16.S */
699/* File: mips/op_move_from16.S */
700    /* for: move/from16, move-object/from16 */
701    /* op vAA, vBBBB */
702    FETCH(a1, 1)                           #  a1 <- BBBB
703    GET_OPA(a0)                            #  a0 <- AA
704    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
705    GET_VREG(a2, a1)                       #  a2 <- fp[BBBB]
706    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
707    .if 1
708    SET_VREG_OBJECT(a2, a0)                #  fp[AA] <- a2
709    .else
710    SET_VREG(a2, a0)                       #  fp[AA] <- a2
711    .endif
712    GOTO_OPCODE(t0)                        #  jump to next instruction
713
714
715/* ------------------------------ */
716    .balign 128
717.L_op_move_object_16: /* 0x09 */
718/* File: mips/op_move_object_16.S */
719/* File: mips/op_move_16.S */
720    /* for: move/16, move-object/16 */
721    /* op vAAAA, vBBBB */
722    FETCH(a1, 2)                           #  a1 <- BBBB
723    FETCH(a0, 1)                           #  a0 <- AAAA
724    FETCH_ADVANCE_INST(3)                  #  advance rPC, load rINST
725    GET_VREG(a2, a1)                       #  a2 <- fp[BBBB]
726    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
727    .if 1
728    SET_VREG_OBJECT(a2, a0)                #  fp[AAAA] <- a2
729    .else
730    SET_VREG(a2, a0)                       #  fp[AAAA] <- a2
731    .endif
732    GOTO_OPCODE(t0)                        #  jump to next instruction
733
734
735/* ------------------------------ */
736    .balign 128
737.L_op_move_result: /* 0x0a */
738/* File: mips/op_move_result.S */
739    /* for: move-result, move-result-object */
740    /* op vAA */
741    GET_OPA(a2)                            #  a2 <- AA
742    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
743    lw    a0, OFF_FP_RESULT_REGISTER(rFP)  #  get pointer to result JType
744    lw    a0, 0(a0)                        #  a0 <- result.i
745    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
746    .if 0
747    SET_VREG_OBJECT(a0, a2)                #  fp[AA] <- a0
748    .else
749    SET_VREG(a0, a2)                       #  fp[AA] <- a0
750    .endif
751    GOTO_OPCODE(t0)                        #  jump to next instruction
752
753/* ------------------------------ */
754    .balign 128
755.L_op_move_result_wide: /* 0x0b */
756/* File: mips/op_move_result_wide.S */
757    /* move-result-wide vAA */
758    GET_OPA(a2)                            #  a2 <- AA
759    lw    a3, OFF_FP_RESULT_REGISTER(rFP)  #  get pointer to result JType
760    LOAD64(a0, a1, a3)                     #  a0/a1 <- retval.j
761    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
762    SET_VREG64(a0, a1, a2)                 #  fp[AA] <- a0/a1
763    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
764    GOTO_OPCODE(t0)                        #  jump to next instruction
765
766/* ------------------------------ */
767    .balign 128
768.L_op_move_result_object: /* 0x0c */
769/* File: mips/op_move_result_object.S */
770/* File: mips/op_move_result.S */
771    /* for: move-result, move-result-object */
772    /* op vAA */
773    GET_OPA(a2)                            #  a2 <- AA
774    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
775    lw    a0, OFF_FP_RESULT_REGISTER(rFP)  #  get pointer to result JType
776    lw    a0, 0(a0)                        #  a0 <- result.i
777    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
778    .if 1
779    SET_VREG_OBJECT(a0, a2)                #  fp[AA] <- a0
780    .else
781    SET_VREG(a0, a2)                       #  fp[AA] <- a0
782    .endif
783    GOTO_OPCODE(t0)                        #  jump to next instruction
784
785
786/* ------------------------------ */
787    .balign 128
788.L_op_move_exception: /* 0x0d */
789/* File: mips/op_move_exception.S */
790    /* move-exception vAA */
791    GET_OPA(a2)                                 #  a2 <- AA
792    lw    a3, THREAD_EXCEPTION_OFFSET(rSELF)    #  get exception obj
793    FETCH_ADVANCE_INST(1)                       #  advance rPC, load rINST
794    SET_VREG_OBJECT(a3, a2)                     #  fp[AA] <- exception obj
795    GET_INST_OPCODE(t0)                         #  extract opcode from rINST
796    sw    zero, THREAD_EXCEPTION_OFFSET(rSELF)  #  clear exception
797    GOTO_OPCODE(t0)                             #  jump to next instruction
798
799/* ------------------------------ */
800    .balign 128
801.L_op_return_void: /* 0x0e */
802/* File: mips/op_return_void.S */
803    .extern MterpThreadFenceForConstructor
804    JAL(MterpThreadFenceForConstructor)
805    lw        ra, THREAD_FLAGS_OFFSET(rSELF)
806    move      a0, rSELF
807    and       ra, (THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
808    beqz      ra, 1f
809    JAL(MterpSuspendCheck)                 # (self)
8101:
811    move      v0, zero
812    move      v1, zero
813    b         MterpReturn
814
815/* ------------------------------ */
816    .balign 128
817.L_op_return: /* 0x0f */
818/* File: mips/op_return.S */
819    /*
820     * Return a 32-bit value.
821     *
822     * for: return, return-object
823     */
824    /* op vAA */
825    .extern MterpThreadFenceForConstructor
826    JAL(MterpThreadFenceForConstructor)
827    lw        ra, THREAD_FLAGS_OFFSET(rSELF)
828    move      a0, rSELF
829    and       ra, (THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
830    beqz      ra, 1f
831    JAL(MterpSuspendCheck)                 # (self)
8321:
833    GET_OPA(a2)                            #  a2 <- AA
834    GET_VREG(v0, a2)                       #  v0 <- vAA
835    move      v1, zero
836    b         MterpReturn
837
838/* ------------------------------ */
839    .balign 128
840.L_op_return_wide: /* 0x10 */
841/* File: mips/op_return_wide.S */
842    /*
843     * Return a 64-bit value.
844     */
845    /* return-wide vAA */
846    .extern MterpThreadFenceForConstructor
847    JAL(MterpThreadFenceForConstructor)
848    lw        ra, THREAD_FLAGS_OFFSET(rSELF)
849    move      a0, rSELF
850    and       ra, (THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
851    beqz      ra, 1f
852    JAL(MterpSuspendCheck)                 # (self)
8531:
854    GET_OPA(a2)                            #  a2 <- AA
855    EAS2(a2, rFP, a2)                      #  a2 <- &fp[AA]
856    LOAD64(v0, v1, a2)                     #  v0/v1 <- vAA/vAA+1
857    b         MterpReturn
858
859/* ------------------------------ */
860    .balign 128
861.L_op_return_object: /* 0x11 */
862/* File: mips/op_return_object.S */
863/* File: mips/op_return.S */
864    /*
865     * Return a 32-bit value.
866     *
867     * for: return, return-object
868     */
869    /* op vAA */
870    .extern MterpThreadFenceForConstructor
871    JAL(MterpThreadFenceForConstructor)
872    lw        ra, THREAD_FLAGS_OFFSET(rSELF)
873    move      a0, rSELF
874    and       ra, (THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
875    beqz      ra, 1f
876    JAL(MterpSuspendCheck)                 # (self)
8771:
878    GET_OPA(a2)                            #  a2 <- AA
879    GET_VREG(v0, a2)                       #  v0 <- vAA
880    move      v1, zero
881    b         MterpReturn
882
883
884/* ------------------------------ */
885    .balign 128
886.L_op_const_4: /* 0x12 */
887/* File: mips/op_const_4.S */
888    # const/4 vA,                          /* +B */
889    sll       a1, rINST, 16                #  a1 <- Bxxx0000
890    GET_OPA(a0)                            #  a0 <- A+
891    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
892    sra       a1, a1, 28                   #  a1 <- sssssssB (sign-extended)
893    and       a0, a0, 15
894    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
895    SET_VREG_GOTO(a1, a0, t0)              #  fp[A] <- a1
896
897/* ------------------------------ */
898    .balign 128
899.L_op_const_16: /* 0x13 */
900/* File: mips/op_const_16.S */
901    # const/16 vAA,                        /* +BBBB */
902    FETCH_S(a0, 1)                         #  a0 <- ssssBBBB (sign-extended)
903    GET_OPA(a3)                            #  a3 <- AA
904    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
905    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
906    SET_VREG_GOTO(a0, a3, t0)              #  vAA <- a0
907
908/* ------------------------------ */
909    .balign 128
910.L_op_const: /* 0x14 */
911/* File: mips/op_const.S */
912    # const vAA,                           /* +BBBBbbbb */
913    GET_OPA(a3)                            #  a3 <- AA
914    FETCH(a0, 1)                           #  a0 <- bbbb (low)
915    FETCH(a1, 2)                           #  a1 <- BBBB (high)
916    FETCH_ADVANCE_INST(3)                  #  advance rPC, load rINST
917    sll       a1, a1, 16
918    or        a0, a1, a0                   #  a0 <- BBBBbbbb
919    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
920    SET_VREG_GOTO(a0, a3, t0)              #  vAA <- a0
921
922/* ------------------------------ */
923    .balign 128
924.L_op_const_high16: /* 0x15 */
925/* File: mips/op_const_high16.S */
926    # const/high16 vAA,                    /* +BBBB0000 */
927    FETCH(a0, 1)                           #  a0 <- 0000BBBB (zero-extended)
928    GET_OPA(a3)                            #  a3 <- AA
929    sll       a0, a0, 16                   #  a0 <- BBBB0000
930    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
931    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
932    SET_VREG_GOTO(a0, a3, t0)              #  vAA <- a0
933
934/* ------------------------------ */
935    .balign 128
936.L_op_const_wide_16: /* 0x16 */
937/* File: mips/op_const_wide_16.S */
938    # const-wide/16 vAA,                   /* +BBBB */
939    FETCH_S(a0, 1)                         #  a0 <- ssssBBBB (sign-extended)
940    GET_OPA(a3)                            #  a3 <- AA
941    sra       a1, a0, 31                   #  a1 <- ssssssss
942    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
943    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
944    SET_VREG64(a0, a1, a3)                 #  vAA <- a0/a1
945    GOTO_OPCODE(t0)                        #  jump to next instruction
946
947/* ------------------------------ */
948    .balign 128
949.L_op_const_wide_32: /* 0x17 */
950/* File: mips/op_const_wide_32.S */
951    # const-wide/32 vAA,                   /* +BBBBbbbb */
952    FETCH(a0, 1)                           #  a0 <- 0000bbbb (low)
953    GET_OPA(a3)                            #  a3 <- AA
954    FETCH_S(a2, 2)                         #  a2 <- ssssBBBB (high)
955    FETCH_ADVANCE_INST(3)                  #  advance rPC, load rINST
956    sll       a2, a2, 16
957    or        a0, a0, a2                   #  a0 <- BBBBbbbb
958    sra       a1, a0, 31                   #  a1 <- ssssssss
959    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
960    SET_VREG64(a0, a1, a3)                 #  vAA <- a0/a1
961    GOTO_OPCODE(t0)                        #  jump to next instruction
962
963/* ------------------------------ */
964    .balign 128
965.L_op_const_wide: /* 0x18 */
966/* File: mips/op_const_wide.S */
967    # const-wide vAA,                      /* +HHHHhhhhBBBBbbbb */
968    FETCH(a0, 1)                           #  a0 <- bbbb (low)
969    FETCH(a1, 2)                           #  a1 <- BBBB (low middle)
970    FETCH(a2, 3)                           #  a2 <- hhhh (high middle)
971    sll       a1, 16 #
972    or        a0, a1                       #  a0 <- BBBBbbbb (low word)
973    FETCH(a3, 4)                           #  a3 <- HHHH (high)
974    GET_OPA(t1)                            #  t1 <- AA
975    sll       a3, 16
976    or        a1, a3, a2                   #  a1 <- HHHHhhhh (high word)
977    FETCH_ADVANCE_INST(5)                  #  advance rPC, load rINST
978    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
979    SET_VREG64(a0, a1, t1)                 #  vAA <- a0/a1
980    GOTO_OPCODE(t0)                        #  jump to next instruction
981
982/* ------------------------------ */
983    .balign 128
984.L_op_const_wide_high16: /* 0x19 */
985/* File: mips/op_const_wide_high16.S */
986    # const-wide/high16 vAA,               /* +BBBB000000000000 */
987    FETCH(a1, 1)                           #  a1 <- 0000BBBB (zero-extended)
988    GET_OPA(a3)                            #  a3 <- AA
989    li        a0, 0                        #  a0 <- 00000000
990    sll       a1, 16                       #  a1 <- BBBB0000
991    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
992    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
993    SET_VREG64(a0, a1, a3)                 #  vAA <- a0/a1
994    GOTO_OPCODE(t0)                        #  jump to next instruction
995
996/* ------------------------------ */
997    .balign 128
998.L_op_const_string: /* 0x1a */
999/* File: mips/op_const_string.S */
1000    # const/string vAA, String             /* BBBB */
1001    EXPORT_PC()
1002    FETCH(a0, 1)                        # a0 <- BBBB
1003    GET_OPA(a1)                         # a1 <- AA
1004    addu   a2, rFP, OFF_FP_SHADOWFRAME  # a2 <- shadow frame
1005    move   a3, rSELF
1006    JAL(MterpConstString)               # v0 <- Mterp(index, tgt_reg, shadow_frame, self)
1007    PREFETCH_INST(2)                    # load rINST
1008    bnez   v0, MterpPossibleException
1009    ADVANCE(2)                          # advance rPC
1010    GET_INST_OPCODE(t0)                 # extract opcode from rINST
1011    GOTO_OPCODE(t0)                     # jump to next instruction
1012
1013/* ------------------------------ */
1014    .balign 128
1015.L_op_const_string_jumbo: /* 0x1b */
1016/* File: mips/op_const_string_jumbo.S */
1017    # const/string vAA, String          /* BBBBBBBB */
1018    EXPORT_PC()
1019    FETCH(a0, 1)                        # a0 <- bbbb (low)
1020    FETCH(a2, 2)                        # a2 <- BBBB (high)
1021    GET_OPA(a1)                         # a1 <- AA
1022    sll    a2, a2, 16
1023    or     a0, a0, a2                   # a0 <- BBBBbbbb
1024    addu   a2, rFP, OFF_FP_SHADOWFRAME  # a2 <- shadow frame
1025    move   a3, rSELF
1026    JAL(MterpConstString)               # v0 <- Mterp(index, tgt_reg, shadow_frame, self)
1027    PREFETCH_INST(3)                    # load rINST
1028    bnez   v0, MterpPossibleException
1029    ADVANCE(3)                          # advance rPC
1030    GET_INST_OPCODE(t0)                 # extract opcode from rINST
1031    GOTO_OPCODE(t0)                     # jump to next instruction
1032
1033/* ------------------------------ */
1034    .balign 128
1035.L_op_const_class: /* 0x1c */
1036/* File: mips/op_const_class.S */
1037    # const/class vAA, Class               /* BBBB */
1038    EXPORT_PC()
1039    FETCH(a0, 1)                        # a0 <- BBBB
1040    GET_OPA(a1)                         # a1 <- AA
1041    addu   a2, rFP, OFF_FP_SHADOWFRAME  # a2 <- shadow frame
1042    move   a3, rSELF
1043    JAL(MterpConstClass)
1044    PREFETCH_INST(2)                    # load rINST
1045    bnez   v0, MterpPossibleException
1046    ADVANCE(2)                          # advance rPC
1047    GET_INST_OPCODE(t0)                 # extract opcode from rINST
1048    GOTO_OPCODE(t0)                     # jump to next instruction
1049
1050/* ------------------------------ */
1051    .balign 128
1052.L_op_monitor_enter: /* 0x1d */
1053/* File: mips/op_monitor_enter.S */
1054    /*
1055     * Synchronize on an object.
1056     */
1057    /* monitor-enter vAA */
1058    EXPORT_PC()
1059    GET_OPA(a2)                            # a2 <- AA
1060    GET_VREG(a0, a2)                       # a0 <- vAA (object)
1061    move   a1, rSELF                       # a1 <- self
1062    JAL(artLockObjectFromCode)             # v0 <- artLockObject(obj, self)
1063    bnez v0, MterpException
1064    FETCH_ADVANCE_INST(1)                  # advance rPC, load rINST
1065    GET_INST_OPCODE(t0)                    # extract opcode from rINST
1066    GOTO_OPCODE(t0)                        # jump to next instruction
1067
1068/* ------------------------------ */
1069    .balign 128
1070.L_op_monitor_exit: /* 0x1e */
1071/* File: mips/op_monitor_exit.S */
1072    /*
1073     * Unlock an object.
1074     *
1075     * Exceptions that occur when unlocking a monitor need to appear as
1076     * if they happened at the following instruction.  See the Dalvik
1077     * instruction spec.
1078     */
1079    /* monitor-exit vAA */
1080    EXPORT_PC()
1081    GET_OPA(a2)                            # a2 <- AA
1082    GET_VREG(a0, a2)                       # a0 <- vAA (object)
1083    move   a1, rSELF                       # a1 <- self
1084    JAL(artUnlockObjectFromCode)           # v0 <- artUnlockObject(obj, self)
1085    bnez v0, MterpException
1086    FETCH_ADVANCE_INST(1)                  # advance rPC, load rINST
1087    GET_INST_OPCODE(t0)                    # extract opcode from rINST
1088    GOTO_OPCODE(t0)                        # jump to next instruction
1089
1090/* ------------------------------ */
1091    .balign 128
1092.L_op_check_cast: /* 0x1f */
1093/* File: mips/op_check_cast.S */
1094    /*
1095     * Check to see if a cast from one class to another is allowed.
1096     */
1097    # check-cast vAA, class                /* BBBB */
1098    EXPORT_PC()
1099    FETCH(a0, 1)                           #  a0 <- BBBB
1100    GET_OPA(a1)                            #  a1 <- AA
1101    EAS2(a1, rFP, a1)                      #  a1 <- &object
1102    lw     a2, OFF_FP_METHOD(rFP)          #  a2 <- method
1103    move   a3, rSELF                       #  a3 <- self
1104    JAL(MterpCheckCast)                    #  v0 <- CheckCast(index, &obj, method, self)
1105    PREFETCH_INST(2)
1106    bnez   v0, MterpPossibleException
1107    ADVANCE(2)
1108    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
1109    GOTO_OPCODE(t0)                        #  jump to next instruction
1110
1111/* ------------------------------ */
1112    .balign 128
1113.L_op_instance_of: /* 0x20 */
1114/* File: mips/op_instance_of.S */
1115    /*
1116     * Check to see if an object reference is an instance of a class.
1117     *
1118     * Most common situation is a non-null object, being compared against
1119     * an already-resolved class.
1120     */
1121    # instance-of vA, vB, class            /* CCCC */
1122    EXPORT_PC()
1123    FETCH(a0, 1)                           # a0 <- CCCC
1124    GET_OPB(a1)                            # a1 <- B
1125    EAS2(a1, rFP, a1)                      # a1 <- &object
1126    lw    a2, OFF_FP_METHOD(rFP)           # a2 <- method
1127    move  a3, rSELF                        # a3 <- self
1128    GET_OPA4(rOBJ)                         # rOBJ <- A+
1129    JAL(MterpInstanceOf)                   # v0 <- Mterp(index, &obj, method, self)
1130    lw   a1, THREAD_EXCEPTION_OFFSET(rSELF)
1131    PREFETCH_INST(2)                       # load rINST
1132    bnez a1, MterpException
1133    ADVANCE(2)                             # advance rPC
1134    GET_INST_OPCODE(t0)                    # extract opcode from rINST
1135    SET_VREG_GOTO(v0, rOBJ, t0)            # vA <- v0
1136
1137/* ------------------------------ */
1138    .balign 128
1139.L_op_array_length: /* 0x21 */
1140/* File: mips/op_array_length.S */
1141    /*
1142     * Return the length of an array.
1143     */
1144    GET_OPB(a1)                            #  a1 <- B
1145    GET_OPA4(a2)                           #  a2 <- A+
1146    GET_VREG(a0, a1)                       #  a0 <- vB (object ref)
1147    # is object null?
1148    beqz      a0, common_errNullObject     #  yup, fail
1149    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
1150    LOAD_base_offMirrorArray_length(a3, a0) #  a3 <- array length
1151    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
1152    SET_VREG_GOTO(a3, a2, t0)              #  vA <- length
1153
1154/* ------------------------------ */
1155    .balign 128
1156.L_op_new_instance: /* 0x22 */
1157/* File: mips/op_new_instance.S */
1158    /*
1159     * Create a new instance of a class.
1160     */
1161    # new-instance vAA, class              /* BBBB */
1162    EXPORT_PC()
1163    addu   a0, rFP, OFF_FP_SHADOWFRAME
1164    move   a1, rSELF
1165    move   a2, rINST
1166    JAL(MterpNewInstance)
1167    beqz   v0, MterpPossibleException
1168    FETCH_ADVANCE_INST(2)               # advance rPC, load rINST
1169    GET_INST_OPCODE(t0)                 # extract opcode from rINST
1170    GOTO_OPCODE(t0)                     # jump to next instruction
1171
1172/* ------------------------------ */
1173    .balign 128
1174.L_op_new_array: /* 0x23 */
1175/* File: mips/op_new_array.S */
1176    /*
1177     * Allocate an array of objects, specified with the array class
1178     * and a count.
1179     *
1180     * The verifier guarantees that this is an array class, so we don't
1181     * check for it here.
1182     */
1183    /* new-array vA, vB, class@CCCC */
1184    EXPORT_PC()
1185    addu   a0, rFP, OFF_FP_SHADOWFRAME
1186    move   a1, rPC
1187    move   a2, rINST
1188    move   a3, rSELF
1189    JAL(MterpNewArray)
1190    beqz   v0, MterpPossibleException
1191    FETCH_ADVANCE_INST(2)               # advance rPC, load rINST
1192    GET_INST_OPCODE(t0)                 # extract opcode from rINST
1193    GOTO_OPCODE(t0)                     # jump to next instruction
1194
1195/* ------------------------------ */
1196    .balign 128
1197.L_op_filled_new_array: /* 0x24 */
1198/* File: mips/op_filled_new_array.S */
1199    /*
1200     * Create a new array with elements filled from registers.
1201     *
1202     * for: filled-new-array, filled-new-array/range
1203     */
1204    # op vB, {vD, vE, vF, vG, vA}, class   /* CCCC */
1205    # op {vCCCC..v(CCCC+AA-1)}, type       /* BBBB */
1206    .extern MterpFilledNewArray
1207    EXPORT_PC()
1208    addu   a0, rFP, OFF_FP_SHADOWFRAME     # a0 <- shadow frame
1209    move   a1, rPC
1210    move   a2, rSELF
1211    JAL(MterpFilledNewArray)                           #  v0 <- helper(shadow_frame, pc, self)
1212    beqz      v0,  MterpPossibleException  #  has exception
1213    FETCH_ADVANCE_INST(3)                  #  advance rPC, load rINST
1214    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
1215    GOTO_OPCODE(t0)                        #  jump to next instruction
1216
1217/* ------------------------------ */
1218    .balign 128
1219.L_op_filled_new_array_range: /* 0x25 */
1220/* File: mips/op_filled_new_array_range.S */
1221/* File: mips/op_filled_new_array.S */
1222    /*
1223     * Create a new array with elements filled from registers.
1224     *
1225     * for: filled-new-array, filled-new-array/range
1226     */
1227    # op vB, {vD, vE, vF, vG, vA}, class   /* CCCC */
1228    # op {vCCCC..v(CCCC+AA-1)}, type       /* BBBB */
1229    .extern MterpFilledNewArrayRange
1230    EXPORT_PC()
1231    addu   a0, rFP, OFF_FP_SHADOWFRAME     # a0 <- shadow frame
1232    move   a1, rPC
1233    move   a2, rSELF
1234    JAL(MterpFilledNewArrayRange)                           #  v0 <- helper(shadow_frame, pc, self)
1235    beqz      v0,  MterpPossibleException  #  has exception
1236    FETCH_ADVANCE_INST(3)                  #  advance rPC, load rINST
1237    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
1238    GOTO_OPCODE(t0)                        #  jump to next instruction
1239
1240
1241/* ------------------------------ */
1242    .balign 128
1243.L_op_fill_array_data: /* 0x26 */
1244/* File: mips/op_fill_array_data.S */
1245    /* fill-array-data vAA, +BBBBBBBB */
1246    EXPORT_PC()
1247    FETCH(a0, 1)                           #  a0 <- bbbb (lo)
1248    FETCH(a1, 2)                           #  a1 <- BBBB (hi)
1249    GET_OPA(a3)                            #  a3 <- AA
1250    sll       a1, a1, 16                   #  a1 <- BBBBbbbb
1251    or        a1, a0, a1                   #  a1 <- BBBBbbbb
1252    GET_VREG(a0, a3)                       #  a0 <- vAA (array object)
1253    EAS1(a1, rPC, a1)                      #  a1 <- PC + BBBBbbbb*2 (array data off.)
1254    JAL(MterpFillArrayData)                #  v0 <- Mterp(obj, payload)
1255    beqz      v0,  MterpPossibleException  #  has exception
1256    FETCH_ADVANCE_INST(3)                  #  advance rPC, load rINST
1257    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
1258    GOTO_OPCODE(t0)                        #  jump to next instruction
1259
1260/* ------------------------------ */
1261    .balign 128
1262.L_op_throw: /* 0x27 */
1263/* File: mips/op_throw.S */
1264    /*
1265     * Throw an exception object in the current thread.
1266     */
1267    /* throw vAA */
1268    EXPORT_PC()                              #  exception handler can throw
1269    GET_OPA(a2)                              #  a2 <- AA
1270    GET_VREG(a1, a2)                         #  a1 <- vAA (exception object)
1271    # null object?
1272    beqz  a1, common_errNullObject           #  yes, throw an NPE instead
1273    sw    a1, THREAD_EXCEPTION_OFFSET(rSELF) #  thread->exception <- obj
1274    b         MterpException
1275
1276/* ------------------------------ */
1277    .balign 128
1278.L_op_goto: /* 0x28 */
1279/* File: mips/op_goto.S */
1280    /*
1281     * Unconditional branch, 8-bit offset.
1282     *
1283     * The branch distance is a signed code-unit offset, which we need to
1284     * double to get a byte offset.
1285     */
1286    /* goto +AA */
1287#if MTERP_PROFILE_BRANCHES
1288    sll       a0, rINST, 16                #  a0 <- AAxx0000
1289    sra       rINST, a0, 24                #  rINST <- ssssssAA (sign-extended)
1290    EXPORT_PC()
1291    move      a0, rSELF
1292    addu      a1, rFP, OFF_FP_SHADOWFRAME
1293    move      a2, rINST
1294    JAL(MterpProfileBranch)                #  (self, shadow_frame, offset)
1295    bnez      v0, MterpOnStackReplacement  #  Note: offset must be in rINST
1296    addu      a2, rINST, rINST             #  a2 <- byte offset
1297    FETCH_ADVANCE_INST_RB(a2)              #  update rPC, load rINST
1298    /* If backwards branch refresh rIBASE */
1299    bgez      a2, 1f
1300    lw        ra, THREAD_FLAGS_OFFSET(rSELF)
1301    b         MterpCheckSuspendAndContinue
13021:
1303    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
1304    GOTO_OPCODE(t0)                        #  jump to next instruction
1305#else
1306    sll       a0, rINST, 16                #  a0 <- AAxx0000
1307    sra       rINST, a0, 24                #  rINST <- ssssssAA (sign-extended)
1308    addu      a2, rINST, rINST             #  a2 <- byte offset
1309    FETCH_ADVANCE_INST_RB(a2)              #  update rPC, load rINST
1310    /* If backwards branch refresh rIBASE */
1311    bgez      a1, 1f
1312    lw        ra, THREAD_FLAGS_OFFSET(rSELF)
1313    b         MterpCheckSuspendAndContinue
13141:
1315    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
1316    GOTO_OPCODE(t0)                        #  jump to next instruction
1317#endif
1318
1319/* ------------------------------ */
1320    .balign 128
1321.L_op_goto_16: /* 0x29 */
1322/* File: mips/op_goto_16.S */
1323    /*
1324     * Unconditional branch, 16-bit offset.
1325     *
1326     * The branch distance is a signed code-unit offset, which we need to
1327     * double to get a byte offset.
1328     */
1329    /* goto/16 +AAAA */
1330#if MTERP_PROFILE_BRANCHES
1331    FETCH_S(rINST, 1)                      #  rINST <- ssssAAAA (sign-extended)
1332    EXPORT_PC()
1333    move      a0, rSELF
1334    addu      a1, rFP, OFF_FP_SHADOWFRAME
1335    move      a2, rINST
1336    JAL(MterpProfileBranch)                #  (self, shadow_frame, offset)
1337    bnez      v0, MterpOnStackReplacement  #  Note: offset must be in rINST
1338    addu      a1, rINST, rINST             #  a1 <- byte offset, flags set
1339    FETCH_ADVANCE_INST_RB(a1)              #  update rPC, load rINST
1340    bgez      a1, 1f
1341    lw        ra, THREAD_FLAGS_OFFSET(rSELF)
1342    b         MterpCheckSuspendAndContinue
13431:
1344    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
1345    GOTO_OPCODE(t0)                        #  jump to next instruction
1346#else
1347    FETCH_S(rINST, 1)                      #  rINST <- ssssAAAA (sign-extended)
1348    addu      a1, rINST, rINST             #  a1 <- byte offset, flags set
1349    FETCH_ADVANCE_INST_RB(a1)              #  update rPC, load rINST
1350    bgez      a1, 1f
1351    lw        ra, THREAD_FLAGS_OFFSET(rSELF)
1352    b         MterpCheckSuspendAndContinue
13531:
1354    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
1355    GOTO_OPCODE(t0)                        #  jump to next instruction
1356#endif
1357
1358/* ------------------------------ */
1359    .balign 128
1360.L_op_goto_32: /* 0x2a */
1361/* File: mips/op_goto_32.S */
1362    /*
1363     * Unconditional branch, 32-bit offset.
1364     *
1365     * The branch distance is a signed code-unit offset, which we need to
1366     * double to get a byte offset.
1367     *
1368     * Unlike most opcodes, this one is allowed to branch to itself, so
1369     * our "backward branch" test must be "<=0" instead of "<0".
1370     */
1371    /* goto/32 +AAAAAAAA */
1372#if MTERP_PROFILE_BRANCHES
1373    FETCH(a0, 1)                           #  a0 <- aaaa (lo)
1374    FETCH(a1, 2)                           #  a1 <- AAAA (hi)
1375    sll       a1, a1, 16
1376    or        rINST, a0, a1                #  rINST <- AAAAaaaa
1377    EXPORT_PC()
1378    move      a0, rSELF
1379    addu      a1, rFP, OFF_FP_SHADOWFRAME
1380    move      a2, rINST
1381    JAL(MterpProfileBranch)                #  (self, shadow_frame, offset)
1382    bnez      v0, MterpOnStackReplacement  #  Note: offset must be in rINST
1383    addu      a1, rINST, rINST             #  a1 <- byte offset
1384    FETCH_ADVANCE_INST_RB(a1)              #  update rPC, load rINST
1385    bgtz      a1, 1f
1386    lw        ra, THREAD_FLAGS_OFFSET(rSELF)
1387    b         MterpCheckSuspendAndContinue
13881:
1389    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
1390    GOTO_OPCODE(t0)                        #  jump to next instruction
1391#else
1392    FETCH(a0, 1)                           #  a0 <- aaaa (lo)
1393    FETCH(a1, 2)                           #  a1 <- AAAA (hi)
1394    sll       a1, a1, 16
1395    or        rINST, a0, a1                #  rINST <- AAAAaaaa
1396    addu      a1, rINST, rINST             #  a1 <- byte offset
1397    FETCH_ADVANCE_INST_RB(a1)              #  update rPC, load rINST
1398    bgtz      a1, 1f
1399    lw        ra, THREAD_FLAGS_OFFSET(rSELF)
1400    b         MterpCheckSuspendAndContinue
14011:
1402    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
1403    GOTO_OPCODE(t0)                        #  jump to next instruction
1404#endif
1405
1406/* ------------------------------ */
1407    .balign 128
1408.L_op_packed_switch: /* 0x2b */
1409/* File: mips/op_packed_switch.S */
1410    /*
1411     * Handle a packed-switch or sparse-switch instruction.  In both cases
1412     * we decode it and hand it off to a helper function.
1413     *
1414     * We don't really expect backward branches in a switch statement, but
1415     * they're perfectly legal, so we check for them here.
1416     *
1417     * for: packed-switch, sparse-switch
1418     */
1419    /* op vAA, +BBBB */
1420#if MTERP_PROFILE_BRANCHES
1421    FETCH(a0, 1)                           #  a0 <- bbbb (lo)
1422    FETCH(a1, 2)                           #  a1 <- BBBB (hi)
1423    GET_OPA(a3)                            #  a3 <- AA
1424    sll       t0, a1, 16
1425    or        a0, a0, t0                   #  a0 <- BBBBbbbb
1426    GET_VREG(a1, a3)                       #  a1 <- vAA
1427    EAS1(a0, rPC, a0)                      #  a0 <- PC + BBBBbbbb*2
1428    JAL(MterpDoPackedSwitch)                             #  a0 <- code-unit branch offset
1429    move      rINST, v0
1430    EXPORT_PC()
1431    move      a0, rSELF
1432    addu      a1, rFP, OFF_FP_SHADOWFRAME
1433    move      a2, rINST
1434    JAL(MterpProfileBranch)                #  (self, shadow_frame, offset)
1435    bnez      v0, MterpOnStackReplacement  #  Note: offset must be in rINST
1436    addu      a1, rINST, rINST             #  a1 <- byte offset
1437    FETCH_ADVANCE_INST_RB(a1)              #  update rPC, load rINST
1438    bgtz      a1, .Lop_packed_switch_finish
1439    lw        ra, THREAD_FLAGS_OFFSET(rSELF)
1440    b         MterpCheckSuspendAndContinue
1441#else
1442    FETCH(a0, 1)                           #  a0 <- bbbb (lo)
1443    FETCH(a1, 2)                           #  a1 <- BBBB (hi)
1444    GET_OPA(a3)                            #  a3 <- AA
1445    sll       t0, a1, 16
1446    or        a0, a0, t0                   #  a0 <- BBBBbbbb
1447    GET_VREG(a1, a3)                       #  a1 <- vAA
1448    EAS1(a0, rPC, a0)                      #  a0 <- PC + BBBBbbbb*2
1449    JAL(MterpDoPackedSwitch)                             #  a0 <- code-unit branch offset
1450    move      rINST, v0
1451    addu      a1, rINST, rINST             #  a1 <- byte offset
1452    FETCH_ADVANCE_INST_RB(a1)              #  update rPC, load rINST
1453    bgtz      a1, 1f
1454    lw        ra, THREAD_FLAGS_OFFSET(rSELF)
1455    b         MterpCheckSuspendAndContinue
14561:
1457    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
1458    GOTO_OPCODE(t0)                        #  jump to next instruction
1459#endif
1460
1461
1462/* ------------------------------ */
1463    .balign 128
1464.L_op_sparse_switch: /* 0x2c */
1465/* File: mips/op_sparse_switch.S */
1466/* File: mips/op_packed_switch.S */
1467    /*
1468     * Handle a packed-switch or sparse-switch instruction.  In both cases
1469     * we decode it and hand it off to a helper function.
1470     *
1471     * We don't really expect backward branches in a switch statement, but
1472     * they're perfectly legal, so we check for them here.
1473     *
1474     * for: packed-switch, sparse-switch
1475     */
1476    /* op vAA, +BBBB */
1477#if MTERP_PROFILE_BRANCHES
1478    FETCH(a0, 1)                           #  a0 <- bbbb (lo)
1479    FETCH(a1, 2)                           #  a1 <- BBBB (hi)
1480    GET_OPA(a3)                            #  a3 <- AA
1481    sll       t0, a1, 16
1482    or        a0, a0, t0                   #  a0 <- BBBBbbbb
1483    GET_VREG(a1, a3)                       #  a1 <- vAA
1484    EAS1(a0, rPC, a0)                      #  a0 <- PC + BBBBbbbb*2
1485    JAL(MterpDoSparseSwitch)                             #  a0 <- code-unit branch offset
1486    move      rINST, v0
1487    EXPORT_PC()
1488    move      a0, rSELF
1489    addu      a1, rFP, OFF_FP_SHADOWFRAME
1490    move      a2, rINST
1491    JAL(MterpProfileBranch)                #  (self, shadow_frame, offset)
1492    bnez      v0, MterpOnStackReplacement  #  Note: offset must be in rINST
1493    addu      a1, rINST, rINST             #  a1 <- byte offset
1494    FETCH_ADVANCE_INST_RB(a1)              #  update rPC, load rINST
1495    bgtz      a1, .Lop_sparse_switch_finish
1496    lw        ra, THREAD_FLAGS_OFFSET(rSELF)
1497    b         MterpCheckSuspendAndContinue
1498#else
1499    FETCH(a0, 1)                           #  a0 <- bbbb (lo)
1500    FETCH(a1, 2)                           #  a1 <- BBBB (hi)
1501    GET_OPA(a3)                            #  a3 <- AA
1502    sll       t0, a1, 16
1503    or        a0, a0, t0                   #  a0 <- BBBBbbbb
1504    GET_VREG(a1, a3)                       #  a1 <- vAA
1505    EAS1(a0, rPC, a0)                      #  a0 <- PC + BBBBbbbb*2
1506    JAL(MterpDoSparseSwitch)                             #  a0 <- code-unit branch offset
1507    move      rINST, v0
1508    addu      a1, rINST, rINST             #  a1 <- byte offset
1509    FETCH_ADVANCE_INST_RB(a1)              #  update rPC, load rINST
1510    bgtz      a1, 1f
1511    lw        ra, THREAD_FLAGS_OFFSET(rSELF)
1512    b         MterpCheckSuspendAndContinue
15131:
1514    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
1515    GOTO_OPCODE(t0)                        #  jump to next instruction
1516#endif
1517
1518
1519
1520/* ------------------------------ */
1521    .balign 128
1522.L_op_cmpl_float: /* 0x2d */
1523/* File: mips/op_cmpl_float.S */
1524    /*
1525     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1526     * destination register rTEMP based on the results of the comparison.
1527     *
1528     * Provide a "naninst" instruction that puts 1 or -1 into rTEMP depending
1529     * on what value we'd like to return when one of the operands is NaN.
1530     *
1531     * The operation we're implementing is:
1532     *   if (x == y)
1533     *     return 0;
1534     *   else if (x < y)
1535     *     return -1;
1536     *   else if (x > y)
1537     *     return 1;
1538     *   else
1539     *     return {-1 or 1};  // one or both operands was NaN
1540     *
1541     * for: cmpl-float, cmpg-float
1542     */
1543    /* op vAA, vBB, vCC */
1544
1545    /* "clasic" form */
1546    FETCH(a0, 1)                           #  a0 <- CCBB
1547    and       a2, a0, 255                  #  a2 <- BB
1548    srl       a3, a0, 8
1549    GET_VREG_F(ft0, a2)
1550    GET_VREG_F(ft1, a3)
1551#ifdef MIPS32REVGE6
1552    cmp.ult.s ft2, ft0, ft1               # Is ft0 < ft1
1553    li        rTEMP, -1
1554    bc1nez    ft2, .Lop_cmpl_float_finish
1555    cmp.ult.s ft2, ft1, ft0
1556    li        rTEMP, 1
1557    bc1nez    ft2, .Lop_cmpl_float_finish
1558    cmp.eq.s  ft2, ft0, ft1
1559    li        rTEMP, 0
1560    bc1nez    ft2, .Lop_cmpl_float_finish
1561    b         .Lop_cmpl_float_nan
1562#else
1563    c.olt.s   fcc0, ft0, ft1               # Is ft0 < ft1
1564    li        rTEMP, -1
1565    bc1t      fcc0, .Lop_cmpl_float_finish
1566    c.olt.s   fcc0, ft1, ft0
1567    li        rTEMP, 1
1568    bc1t      fcc0, .Lop_cmpl_float_finish
1569    c.eq.s    fcc0, ft0, ft1
1570    li        rTEMP, 0
1571    bc1t      fcc0, .Lop_cmpl_float_finish
1572    b         .Lop_cmpl_float_nan
1573#endif
1574
1575/* ------------------------------ */
1576    .balign 128
1577.L_op_cmpg_float: /* 0x2e */
1578/* File: mips/op_cmpg_float.S */
1579/* File: mips/op_cmpl_float.S */
1580    /*
1581     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1582     * destination register rTEMP based on the results of the comparison.
1583     *
1584     * Provide a "naninst" instruction that puts 1 or -1 into rTEMP depending
1585     * on what value we'd like to return when one of the operands is NaN.
1586     *
1587     * The operation we're implementing is:
1588     *   if (x == y)
1589     *     return 0;
1590     *   else if (x < y)
1591     *     return -1;
1592     *   else if (x > y)
1593     *     return 1;
1594     *   else
1595     *     return {-1 or 1};  // one or both operands was NaN
1596     *
1597     * for: cmpl-float, cmpg-float
1598     */
1599    /* op vAA, vBB, vCC */
1600
1601    /* "clasic" form */
1602    FETCH(a0, 1)                           #  a0 <- CCBB
1603    and       a2, a0, 255                  #  a2 <- BB
1604    srl       a3, a0, 8
1605    GET_VREG_F(ft0, a2)
1606    GET_VREG_F(ft1, a3)
1607#ifdef MIPS32REVGE6
1608    cmp.ult.s ft2, ft0, ft1               # Is ft0 < ft1
1609    li        rTEMP, -1
1610    bc1nez    ft2, .Lop_cmpg_float_finish
1611    cmp.ult.s ft2, ft1, ft0
1612    li        rTEMP, 1
1613    bc1nez    ft2, .Lop_cmpg_float_finish
1614    cmp.eq.s  ft2, ft0, ft1
1615    li        rTEMP, 0
1616    bc1nez    ft2, .Lop_cmpg_float_finish
1617    b         .Lop_cmpg_float_nan
1618#else
1619    c.olt.s   fcc0, ft0, ft1               # Is ft0 < ft1
1620    li        rTEMP, -1
1621    bc1t      fcc0, .Lop_cmpg_float_finish
1622    c.olt.s   fcc0, ft1, ft0
1623    li        rTEMP, 1
1624    bc1t      fcc0, .Lop_cmpg_float_finish
1625    c.eq.s    fcc0, ft0, ft1
1626    li        rTEMP, 0
1627    bc1t      fcc0, .Lop_cmpg_float_finish
1628    b         .Lop_cmpg_float_nan
1629#endif
1630
1631
1632/* ------------------------------ */
1633    .balign 128
1634.L_op_cmpl_double: /* 0x2f */
1635/* File: mips/op_cmpl_double.S */
1636    /*
1637     * Compare two floating-point values. Puts 0(==), 1(>), or -1(<)
1638     * into the destination register (rTEMP) based on the comparison results.
1639     *
1640     * Provide a "naninst" instruction that puts 1 or -1 into rTEMP depending
1641     * on what value we'd like to return when one of the operands is NaN.
1642     *
1643     * See op_cmpl_float for more details.
1644     *
1645     * For: cmpl-double, cmpg-double
1646     */
1647    /* op vAA, vBB, vCC */
1648
1649    FETCH(a0, 1)                           #  a0 <- CCBB
1650    and       rOBJ, a0, 255                #  s5 <- BB
1651    srl       t0, a0, 8                    #  t0 <- CC
1652    EAS2(rOBJ, rFP, rOBJ)                  #  s5 <- &fp[BB]
1653    EAS2(t0, rFP, t0)                      #  t0 <- &fp[CC]
1654    LOAD64_F(ft0, ft0f, rOBJ)
1655    LOAD64_F(ft1, ft1f, t0)
1656#ifdef MIPS32REVGE6
1657    cmp.ult.d ft2, ft0, ft1
1658    li        rTEMP, -1
1659    bc1nez    ft2, .Lop_cmpl_double_finish
1660    cmp.ult.d ft2, ft1, ft0
1661    li        rTEMP, 1
1662    bc1nez    ft2, .Lop_cmpl_double_finish
1663    cmp.eq.d  ft2, ft0, ft1
1664    li        rTEMP, 0
1665    bc1nez    ft2, .Lop_cmpl_double_finish
1666    b         .Lop_cmpl_double_nan
1667#else
1668    c.olt.d   fcc0, ft0, ft1
1669    li        rTEMP, -1
1670    bc1t      fcc0, .Lop_cmpl_double_finish
1671    c.olt.d   fcc0, ft1, ft0
1672    li        rTEMP, 1
1673    bc1t      fcc0, .Lop_cmpl_double_finish
1674    c.eq.d    fcc0, ft0, ft1
1675    li        rTEMP, 0
1676    bc1t      fcc0, .Lop_cmpl_double_finish
1677    b         .Lop_cmpl_double_nan
1678#endif
1679
1680/* ------------------------------ */
1681    .balign 128
1682.L_op_cmpg_double: /* 0x30 */
1683/* File: mips/op_cmpg_double.S */
1684/* File: mips/op_cmpl_double.S */
1685    /*
1686     * Compare two floating-point values. Puts 0(==), 1(>), or -1(<)
1687     * into the destination register (rTEMP) based on the comparison results.
1688     *
1689     * Provide a "naninst" instruction that puts 1 or -1 into rTEMP depending
1690     * on what value we'd like to return when one of the operands is NaN.
1691     *
1692     * See op_cmpl_float for more details.
1693     *
1694     * For: cmpl-double, cmpg-double
1695     */
1696    /* op vAA, vBB, vCC */
1697
1698    FETCH(a0, 1)                           #  a0 <- CCBB
1699    and       rOBJ, a0, 255                #  s5 <- BB
1700    srl       t0, a0, 8                    #  t0 <- CC
1701    EAS2(rOBJ, rFP, rOBJ)                  #  s5 <- &fp[BB]
1702    EAS2(t0, rFP, t0)                      #  t0 <- &fp[CC]
1703    LOAD64_F(ft0, ft0f, rOBJ)
1704    LOAD64_F(ft1, ft1f, t0)
1705#ifdef MIPS32REVGE6
1706    cmp.ult.d ft2, ft0, ft1
1707    li        rTEMP, -1
1708    bc1nez    ft2, .Lop_cmpg_double_finish
1709    cmp.ult.d ft2, ft1, ft0
1710    li        rTEMP, 1
1711    bc1nez    ft2, .Lop_cmpg_double_finish
1712    cmp.eq.d  ft2, ft0, ft1
1713    li        rTEMP, 0
1714    bc1nez    ft2, .Lop_cmpg_double_finish
1715    b         .Lop_cmpg_double_nan
1716#else
1717    c.olt.d   fcc0, ft0, ft1
1718    li        rTEMP, -1
1719    bc1t      fcc0, .Lop_cmpg_double_finish
1720    c.olt.d   fcc0, ft1, ft0
1721    li        rTEMP, 1
1722    bc1t      fcc0, .Lop_cmpg_double_finish
1723    c.eq.d    fcc0, ft0, ft1
1724    li        rTEMP, 0
1725    bc1t      fcc0, .Lop_cmpg_double_finish
1726    b         .Lop_cmpg_double_nan
1727#endif
1728
1729
1730/* ------------------------------ */
1731    .balign 128
1732.L_op_cmp_long: /* 0x31 */
1733/* File: mips/op_cmp_long.S */
1734    /*
1735     * Compare two 64-bit values
1736     *    x = y     return  0
1737     *    x < y     return -1
1738     *    x > y     return  1
1739     *
1740     * I think I can improve on the ARM code by the following observation
1741     *    slt   t0,  x.hi, y.hi;        # (x.hi < y.hi) ? 1:0
1742     *    sgt   t1,  x.hi, y.hi;        # (y.hi > x.hi) ? 1:0
1743     *    subu  v0, t0, t1              # v0= -1:1:0 for [ < > = ]
1744     */
1745    /* cmp-long vAA, vBB, vCC */
1746    FETCH(a0, 1)                           #  a0 <- CCBB
1747    GET_OPA(rOBJ)                          #  rOBJ <- AA
1748    and       a2, a0, 255                  #  a2 <- BB
1749    srl       a3, a0, 8                    #  a3 <- CC
1750    EAS2(a2, rFP, a2)                      #  a2 <- &fp[BB]
1751    EAS2(a3, rFP, a3)                      #  a3 <- &fp[CC]
1752    LOAD64(a0, a1, a2)                     #  a0/a1 <- vBB/vBB+1
1753    LOAD64(a2, a3, a3)                     #  a2/a3 <- vCC/vCC+1
1754
1755    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
1756    slt       t0, a1, a3                   #  compare hi
1757    sgt       t1, a1, a3
1758    subu      v0, t1, t0                   #  v0 <- (-1, 1, 0)
1759    bnez      v0, .Lop_cmp_long_finish
1760    # at this point x.hi==y.hi
1761    sltu      t0, a0, a2                   #  compare lo
1762    sgtu      t1, a0, a2
1763    subu      v0, t1, t0                   #  v0 <- (-1, 1, 0) for [< > =]
1764
1765.Lop_cmp_long_finish:
1766    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
1767    SET_VREG_GOTO(v0, rOBJ, t0)            #  vAA <- v0
1768
1769/* ------------------------------ */
1770    .balign 128
1771.L_op_if_eq: /* 0x32 */
1772/* File: mips/op_if_eq.S */
1773/* File: mips/bincmp.S */
1774    /*
1775     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1776     * fragment that specifies the *reverse* comparison to perform, e.g.
1777     * for "if-le" you would use "gt".
1778     *
1779     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1780     */
1781    /* if-cmp vA, vB, +CCCC */
1782    GET_OPA4(a0)                           #  a0 <- A+
1783    GET_OPB(a1)                            #  a1 <- B
1784    GET_VREG(a3, a1)                       #  a3 <- vB
1785    GET_VREG(a2, a0)                       #  a2 <- vA
1786    bne a2, a3, 1f                  #  branch to 1 if comparison failed
1787    FETCH_S(rINST, 1)                      #  rINST<- branch offset, in code units
1788    b 2f
17891:
1790    li        rINST, 2                     #  rINST- BYTE branch dist for not-taken
17912:
1792#if MTERP_PROFILE_BRANCHES
1793    EXPORT_PC()
1794    move      a0, rSELF
1795    addu      a1, rFP, OFF_FP_SHADOWFRAME
1796    move      a2, rINST
1797    JAL(MterpProfileBranch)                #  (self, shadow_frame, offset)
1798    bnez      v0, MterpOnStackReplacement  #  Note: offset must be in rINST
1799#endif
1800    addu      a2, rINST, rINST             #  convert to bytes
1801    FETCH_ADVANCE_INST_RB(a2)              #  update rPC, load rINST
1802    bgez      a2, .L_op_if_eq_finish
1803    lw        ra, THREAD_FLAGS_OFFSET(rSELF)
1804    b         MterpCheckSuspendAndContinue
1805
1806
1807
1808/* ------------------------------ */
1809    .balign 128
1810.L_op_if_ne: /* 0x33 */
1811/* File: mips/op_if_ne.S */
1812/* File: mips/bincmp.S */
1813    /*
1814     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1815     * fragment that specifies the *reverse* comparison to perform, e.g.
1816     * for "if-le" you would use "gt".
1817     *
1818     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1819     */
1820    /* if-cmp vA, vB, +CCCC */
1821    GET_OPA4(a0)                           #  a0 <- A+
1822    GET_OPB(a1)                            #  a1 <- B
1823    GET_VREG(a3, a1)                       #  a3 <- vB
1824    GET_VREG(a2, a0)                       #  a2 <- vA
1825    beq a2, a3, 1f                  #  branch to 1 if comparison failed
1826    FETCH_S(rINST, 1)                      #  rINST<- branch offset, in code units
1827    b 2f
18281:
1829    li        rINST, 2                     #  rINST- BYTE branch dist for not-taken
18302:
1831#if MTERP_PROFILE_BRANCHES
1832    EXPORT_PC()
1833    move      a0, rSELF
1834    addu      a1, rFP, OFF_FP_SHADOWFRAME
1835    move      a2, rINST
1836    JAL(MterpProfileBranch)                #  (self, shadow_frame, offset)
1837    bnez      v0, MterpOnStackReplacement  #  Note: offset must be in rINST
1838#endif
1839    addu      a2, rINST, rINST             #  convert to bytes
1840    FETCH_ADVANCE_INST_RB(a2)              #  update rPC, load rINST
1841    bgez      a2, .L_op_if_ne_finish
1842    lw        ra, THREAD_FLAGS_OFFSET(rSELF)
1843    b         MterpCheckSuspendAndContinue
1844
1845
1846
1847/* ------------------------------ */
1848    .balign 128
1849.L_op_if_lt: /* 0x34 */
1850/* File: mips/op_if_lt.S */
1851/* File: mips/bincmp.S */
1852    /*
1853     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1854     * fragment that specifies the *reverse* comparison to perform, e.g.
1855     * for "if-le" you would use "gt".
1856     *
1857     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1858     */
1859    /* if-cmp vA, vB, +CCCC */
1860    GET_OPA4(a0)                           #  a0 <- A+
1861    GET_OPB(a1)                            #  a1 <- B
1862    GET_VREG(a3, a1)                       #  a3 <- vB
1863    GET_VREG(a2, a0)                       #  a2 <- vA
1864    bge a2, a3, 1f                  #  branch to 1 if comparison failed
1865    FETCH_S(rINST, 1)                      #  rINST<- branch offset, in code units
1866    b 2f
18671:
1868    li        rINST, 2                     #  rINST- BYTE branch dist for not-taken
18692:
1870#if MTERP_PROFILE_BRANCHES
1871    EXPORT_PC()
1872    move      a0, rSELF
1873    addu      a1, rFP, OFF_FP_SHADOWFRAME
1874    move      a2, rINST
1875    JAL(MterpProfileBranch)                #  (self, shadow_frame, offset)
1876    bnez      v0, MterpOnStackReplacement  #  Note: offset must be in rINST
1877#endif
1878    addu      a2, rINST, rINST             #  convert to bytes
1879    FETCH_ADVANCE_INST_RB(a2)              #  update rPC, load rINST
1880    bgez      a2, .L_op_if_lt_finish
1881    lw        ra, THREAD_FLAGS_OFFSET(rSELF)
1882    b         MterpCheckSuspendAndContinue
1883
1884
1885
1886/* ------------------------------ */
1887    .balign 128
1888.L_op_if_ge: /* 0x35 */
1889/* File: mips/op_if_ge.S */
1890/* File: mips/bincmp.S */
1891    /*
1892     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1893     * fragment that specifies the *reverse* comparison to perform, e.g.
1894     * for "if-le" you would use "gt".
1895     *
1896     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1897     */
1898    /* if-cmp vA, vB, +CCCC */
1899    GET_OPA4(a0)                           #  a0 <- A+
1900    GET_OPB(a1)                            #  a1 <- B
1901    GET_VREG(a3, a1)                       #  a3 <- vB
1902    GET_VREG(a2, a0)                       #  a2 <- vA
1903    blt a2, a3, 1f                  #  branch to 1 if comparison failed
1904    FETCH_S(rINST, 1)                      #  rINST<- branch offset, in code units
1905    b 2f
19061:
1907    li        rINST, 2                     #  rINST- BYTE branch dist for not-taken
19082:
1909#if MTERP_PROFILE_BRANCHES
1910    EXPORT_PC()
1911    move      a0, rSELF
1912    addu      a1, rFP, OFF_FP_SHADOWFRAME
1913    move      a2, rINST
1914    JAL(MterpProfileBranch)                #  (self, shadow_frame, offset)
1915    bnez      v0, MterpOnStackReplacement  #  Note: offset must be in rINST
1916#endif
1917    addu      a2, rINST, rINST             #  convert to bytes
1918    FETCH_ADVANCE_INST_RB(a2)              #  update rPC, load rINST
1919    bgez      a2, .L_op_if_ge_finish
1920    lw        ra, THREAD_FLAGS_OFFSET(rSELF)
1921    b         MterpCheckSuspendAndContinue
1922
1923
1924
1925/* ------------------------------ */
1926    .balign 128
1927.L_op_if_gt: /* 0x36 */
1928/* File: mips/op_if_gt.S */
1929/* File: mips/bincmp.S */
1930    /*
1931     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1932     * fragment that specifies the *reverse* comparison to perform, e.g.
1933     * for "if-le" you would use "gt".
1934     *
1935     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1936     */
1937    /* if-cmp vA, vB, +CCCC */
1938    GET_OPA4(a0)                           #  a0 <- A+
1939    GET_OPB(a1)                            #  a1 <- B
1940    GET_VREG(a3, a1)                       #  a3 <- vB
1941    GET_VREG(a2, a0)                       #  a2 <- vA
1942    ble a2, a3, 1f                  #  branch to 1 if comparison failed
1943    FETCH_S(rINST, 1)                      #  rINST<- branch offset, in code units
1944    b 2f
19451:
1946    li        rINST, 2                     #  rINST- BYTE branch dist for not-taken
19472:
1948#if MTERP_PROFILE_BRANCHES
1949    EXPORT_PC()
1950    move      a0, rSELF
1951    addu      a1, rFP, OFF_FP_SHADOWFRAME
1952    move      a2, rINST
1953    JAL(MterpProfileBranch)                #  (self, shadow_frame, offset)
1954    bnez      v0, MterpOnStackReplacement  #  Note: offset must be in rINST
1955#endif
1956    addu      a2, rINST, rINST             #  convert to bytes
1957    FETCH_ADVANCE_INST_RB(a2)              #  update rPC, load rINST
1958    bgez      a2, .L_op_if_gt_finish
1959    lw        ra, THREAD_FLAGS_OFFSET(rSELF)
1960    b         MterpCheckSuspendAndContinue
1961
1962
1963
1964/* ------------------------------ */
1965    .balign 128
1966.L_op_if_le: /* 0x37 */
1967/* File: mips/op_if_le.S */
1968/* File: mips/bincmp.S */
1969    /*
1970     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1971     * fragment that specifies the *reverse* comparison to perform, e.g.
1972     * for "if-le" you would use "gt".
1973     *
1974     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1975     */
1976    /* if-cmp vA, vB, +CCCC */
1977    GET_OPA4(a0)                           #  a0 <- A+
1978    GET_OPB(a1)                            #  a1 <- B
1979    GET_VREG(a3, a1)                       #  a3 <- vB
1980    GET_VREG(a2, a0)                       #  a2 <- vA
1981    bgt a2, a3, 1f                  #  branch to 1 if comparison failed
1982    FETCH_S(rINST, 1)                      #  rINST<- branch offset, in code units
1983    b 2f
19841:
1985    li        rINST, 2                     #  rINST- BYTE branch dist for not-taken
19862:
1987#if MTERP_PROFILE_BRANCHES
1988    EXPORT_PC()
1989    move      a0, rSELF
1990    addu      a1, rFP, OFF_FP_SHADOWFRAME
1991    move      a2, rINST
1992    JAL(MterpProfileBranch)                #  (self, shadow_frame, offset)
1993    bnez      v0, MterpOnStackReplacement  #  Note: offset must be in rINST
1994#endif
1995    addu      a2, rINST, rINST             #  convert to bytes
1996    FETCH_ADVANCE_INST_RB(a2)              #  update rPC, load rINST
1997    bgez      a2, .L_op_if_le_finish
1998    lw        ra, THREAD_FLAGS_OFFSET(rSELF)
1999    b         MterpCheckSuspendAndContinue
2000
2001
2002
2003/* ------------------------------ */
2004    .balign 128
2005.L_op_if_eqz: /* 0x38 */
2006/* File: mips/op_if_eqz.S */
2007/* File: mips/zcmp.S */
2008    /*
2009     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
2010     * fragment that specifies the *reverse* comparison to perform, e.g.
2011     * for "if-le" you would use "gt".
2012     *
2013     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
2014     */
2015    /* if-cmp vAA, +BBBB */
2016    GET_OPA(a0)                            #  a0 <- AA
2017    GET_VREG(a2, a0)                       #  a2 <- vAA
2018    FETCH_S(rINST, 1)                      #  rINST <- branch offset, in code units
2019    bne a2, zero, 1f                #  branch to 1 if comparison failed
2020    b 2f
20211:
2022    li        rINST, 2                     #  rINST- BYTE branch dist for not-taken
20232:
2024#if MTERP_PROFILE_BRANCHES
2025    EXPORT_PC()
2026    move      a0, rSELF
2027    addu      a1, rFP, OFF_FP_SHADOWFRAME
2028    move      a2, rINST
2029    JAL(MterpProfileBranch)                #  (self, shadow_frame, offset)
2030    bnez      v0, MterpOnStackReplacement  #  Note: offset must be in rINST
2031#endif
2032    addu      a1, rINST, rINST             #  convert to bytes
2033    FETCH_ADVANCE_INST_RB(a1)              #  update rPC, load rINST
2034    bgez      a1, 3f
2035    lw        ra, THREAD_FLAGS_OFFSET(rSELF)
2036    b         MterpCheckSuspendAndContinue
20373:
2038    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
2039    GOTO_OPCODE(t0)                        #  jump to next instruction
2040
2041
2042/* ------------------------------ */
2043    .balign 128
2044.L_op_if_nez: /* 0x39 */
2045/* File: mips/op_if_nez.S */
2046/* File: mips/zcmp.S */
2047    /*
2048     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
2049     * fragment that specifies the *reverse* comparison to perform, e.g.
2050     * for "if-le" you would use "gt".
2051     *
2052     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
2053     */
2054    /* if-cmp vAA, +BBBB */
2055    GET_OPA(a0)                            #  a0 <- AA
2056    GET_VREG(a2, a0)                       #  a2 <- vAA
2057    FETCH_S(rINST, 1)                      #  rINST <- branch offset, in code units
2058    beq a2, zero, 1f                #  branch to 1 if comparison failed
2059    b 2f
20601:
2061    li        rINST, 2                     #  rINST- BYTE branch dist for not-taken
20622:
2063#if MTERP_PROFILE_BRANCHES
2064    EXPORT_PC()
2065    move      a0, rSELF
2066    addu      a1, rFP, OFF_FP_SHADOWFRAME
2067    move      a2, rINST
2068    JAL(MterpProfileBranch)                #  (self, shadow_frame, offset)
2069    bnez      v0, MterpOnStackReplacement  #  Note: offset must be in rINST
2070#endif
2071    addu      a1, rINST, rINST             #  convert to bytes
2072    FETCH_ADVANCE_INST_RB(a1)              #  update rPC, load rINST
2073    bgez      a1, 3f
2074    lw        ra, THREAD_FLAGS_OFFSET(rSELF)
2075    b         MterpCheckSuspendAndContinue
20763:
2077    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
2078    GOTO_OPCODE(t0)                        #  jump to next instruction
2079
2080
2081/* ------------------------------ */
2082    .balign 128
2083.L_op_if_ltz: /* 0x3a */
2084/* File: mips/op_if_ltz.S */
2085/* File: mips/zcmp.S */
2086    /*
2087     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
2088     * fragment that specifies the *reverse* comparison to perform, e.g.
2089     * for "if-le" you would use "gt".
2090     *
2091     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
2092     */
2093    /* if-cmp vAA, +BBBB */
2094    GET_OPA(a0)                            #  a0 <- AA
2095    GET_VREG(a2, a0)                       #  a2 <- vAA
2096    FETCH_S(rINST, 1)                      #  rINST <- branch offset, in code units
2097    bge a2, zero, 1f                #  branch to 1 if comparison failed
2098    b 2f
20991:
2100    li        rINST, 2                     #  rINST- BYTE branch dist for not-taken
21012:
2102#if MTERP_PROFILE_BRANCHES
2103    EXPORT_PC()
2104    move      a0, rSELF
2105    addu      a1, rFP, OFF_FP_SHADOWFRAME
2106    move      a2, rINST
2107    JAL(MterpProfileBranch)                #  (self, shadow_frame, offset)
2108    bnez      v0, MterpOnStackReplacement  #  Note: offset must be in rINST
2109#endif
2110    addu      a1, rINST, rINST             #  convert to bytes
2111    FETCH_ADVANCE_INST_RB(a1)              #  update rPC, load rINST
2112    bgez      a1, 3f
2113    lw        ra, THREAD_FLAGS_OFFSET(rSELF)
2114    b         MterpCheckSuspendAndContinue
21153:
2116    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
2117    GOTO_OPCODE(t0)                        #  jump to next instruction
2118
2119
2120/* ------------------------------ */
2121    .balign 128
2122.L_op_if_gez: /* 0x3b */
2123/* File: mips/op_if_gez.S */
2124/* File: mips/zcmp.S */
2125    /*
2126     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
2127     * fragment that specifies the *reverse* comparison to perform, e.g.
2128     * for "if-le" you would use "gt".
2129     *
2130     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
2131     */
2132    /* if-cmp vAA, +BBBB */
2133    GET_OPA(a0)                            #  a0 <- AA
2134    GET_VREG(a2, a0)                       #  a2 <- vAA
2135    FETCH_S(rINST, 1)                      #  rINST <- branch offset, in code units
2136    blt a2, zero, 1f                #  branch to 1 if comparison failed
2137    b 2f
21381:
2139    li        rINST, 2                     #  rINST- BYTE branch dist for not-taken
21402:
2141#if MTERP_PROFILE_BRANCHES
2142    EXPORT_PC()
2143    move      a0, rSELF
2144    addu      a1, rFP, OFF_FP_SHADOWFRAME
2145    move      a2, rINST
2146    JAL(MterpProfileBranch)                #  (self, shadow_frame, offset)
2147    bnez      v0, MterpOnStackReplacement  #  Note: offset must be in rINST
2148#endif
2149    addu      a1, rINST, rINST             #  convert to bytes
2150    FETCH_ADVANCE_INST_RB(a1)              #  update rPC, load rINST
2151    bgez      a1, 3f
2152    lw        ra, THREAD_FLAGS_OFFSET(rSELF)
2153    b         MterpCheckSuspendAndContinue
21543:
2155    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
2156    GOTO_OPCODE(t0)                        #  jump to next instruction
2157
2158
2159/* ------------------------------ */
2160    .balign 128
2161.L_op_if_gtz: /* 0x3c */
2162/* File: mips/op_if_gtz.S */
2163/* File: mips/zcmp.S */
2164    /*
2165     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
2166     * fragment that specifies the *reverse* comparison to perform, e.g.
2167     * for "if-le" you would use "gt".
2168     *
2169     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
2170     */
2171    /* if-cmp vAA, +BBBB */
2172    GET_OPA(a0)                            #  a0 <- AA
2173    GET_VREG(a2, a0)                       #  a2 <- vAA
2174    FETCH_S(rINST, 1)                      #  rINST <- branch offset, in code units
2175    ble a2, zero, 1f                #  branch to 1 if comparison failed
2176    b 2f
21771:
2178    li        rINST, 2                     #  rINST- BYTE branch dist for not-taken
21792:
2180#if MTERP_PROFILE_BRANCHES
2181    EXPORT_PC()
2182    move      a0, rSELF
2183    addu      a1, rFP, OFF_FP_SHADOWFRAME
2184    move      a2, rINST
2185    JAL(MterpProfileBranch)                #  (self, shadow_frame, offset)
2186    bnez      v0, MterpOnStackReplacement  #  Note: offset must be in rINST
2187#endif
2188    addu      a1, rINST, rINST             #  convert to bytes
2189    FETCH_ADVANCE_INST_RB(a1)              #  update rPC, load rINST
2190    bgez      a1, 3f
2191    lw        ra, THREAD_FLAGS_OFFSET(rSELF)
2192    b         MterpCheckSuspendAndContinue
21933:
2194    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
2195    GOTO_OPCODE(t0)                        #  jump to next instruction
2196
2197
2198/* ------------------------------ */
2199    .balign 128
2200.L_op_if_lez: /* 0x3d */
2201/* File: mips/op_if_lez.S */
2202/* File: mips/zcmp.S */
2203    /*
2204     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
2205     * fragment that specifies the *reverse* comparison to perform, e.g.
2206     * for "if-le" you would use "gt".
2207     *
2208     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
2209     */
2210    /* if-cmp vAA, +BBBB */
2211    GET_OPA(a0)                            #  a0 <- AA
2212    GET_VREG(a2, a0)                       #  a2 <- vAA
2213    FETCH_S(rINST, 1)                      #  rINST <- branch offset, in code units
2214    bgt a2, zero, 1f                #  branch to 1 if comparison failed
2215    b 2f
22161:
2217    li        rINST, 2                     #  rINST- BYTE branch dist for not-taken
22182:
2219#if MTERP_PROFILE_BRANCHES
2220    EXPORT_PC()
2221    move      a0, rSELF
2222    addu      a1, rFP, OFF_FP_SHADOWFRAME
2223    move      a2, rINST
2224    JAL(MterpProfileBranch)                #  (self, shadow_frame, offset)
2225    bnez      v0, MterpOnStackReplacement  #  Note: offset must be in rINST
2226#endif
2227    addu      a1, rINST, rINST             #  convert to bytes
2228    FETCH_ADVANCE_INST_RB(a1)              #  update rPC, load rINST
2229    bgez      a1, 3f
2230    lw        ra, THREAD_FLAGS_OFFSET(rSELF)
2231    b         MterpCheckSuspendAndContinue
22323:
2233    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
2234    GOTO_OPCODE(t0)                        #  jump to next instruction
2235
2236
2237/* ------------------------------ */
2238    .balign 128
2239.L_op_unused_3e: /* 0x3e */
2240/* File: mips/op_unused_3e.S */
2241/* File: mips/unused.S */
2242/*
2243 * Bail to reference interpreter to throw.
2244 */
2245  b MterpFallback
2246
2247
2248/* ------------------------------ */
2249    .balign 128
2250.L_op_unused_3f: /* 0x3f */
2251/* File: mips/op_unused_3f.S */
2252/* File: mips/unused.S */
2253/*
2254 * Bail to reference interpreter to throw.
2255 */
2256  b MterpFallback
2257
2258
2259/* ------------------------------ */
2260    .balign 128
2261.L_op_unused_40: /* 0x40 */
2262/* File: mips/op_unused_40.S */
2263/* File: mips/unused.S */
2264/*
2265 * Bail to reference interpreter to throw.
2266 */
2267  b MterpFallback
2268
2269
2270/* ------------------------------ */
2271    .balign 128
2272.L_op_unused_41: /* 0x41 */
2273/* File: mips/op_unused_41.S */
2274/* File: mips/unused.S */
2275/*
2276 * Bail to reference interpreter to throw.
2277 */
2278  b MterpFallback
2279
2280
2281/* ------------------------------ */
2282    .balign 128
2283.L_op_unused_42: /* 0x42 */
2284/* File: mips/op_unused_42.S */
2285/* File: mips/unused.S */
2286/*
2287 * Bail to reference interpreter to throw.
2288 */
2289  b MterpFallback
2290
2291
2292/* ------------------------------ */
2293    .balign 128
2294.L_op_unused_43: /* 0x43 */
2295/* File: mips/op_unused_43.S */
2296/* File: mips/unused.S */
2297/*
2298 * Bail to reference interpreter to throw.
2299 */
2300  b MterpFallback
2301
2302
2303/* ------------------------------ */
2304    .balign 128
2305.L_op_aget: /* 0x44 */
2306/* File: mips/op_aget.S */
2307    /*
2308     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2309     *
2310     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2311     * instructions.  We use a pair of FETCH_Bs instead.
2312     *
2313     * for: aget, aget-boolean, aget-byte, aget-char, aget-short
2314     *
2315     * NOTE: assumes data offset for arrays is the same for all non-wide types.
2316     * If this changes, specialize.
2317     */
2318    /* op vAA, vBB, vCC */
2319    FETCH_B(a2, 1, 0)                      #  a2 <- BB
2320    GET_OPA(rOBJ)                          #  rOBJ <- AA
2321    FETCH_B(a3, 1, 1)                      #  a3 <- CC
2322    GET_VREG(a0, a2)                       #  a0 <- vBB (array object)
2323    GET_VREG(a1, a3)                       #  a1 <- vCC (requested index)
2324    # null array object?
2325    beqz      a0, common_errNullObject     #  yes, bail
2326    LOAD_base_offMirrorArray_length(a3, a0) #  a3 <- arrayObj->length
2327    .if 2
2328    EASN(a0, a0, a1, 2)               #  a0 <- arrayObj + index*width
2329    .else
2330    addu      a0, a0, a1
2331    .endif
2332    # a1 >= a3; compare unsigned index
2333    bgeu      a1, a3, common_errArrayIndex #  index >= length, bail
2334    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
2335    lw a2, MIRROR_INT_ARRAY_DATA_OFFSET(a0)             #  a2 <- vBB[vCC]
2336    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
2337    SET_VREG_GOTO(a2, rOBJ, t0)            #  vAA <- a2
2338
2339/* ------------------------------ */
2340    .balign 128
2341.L_op_aget_wide: /* 0x45 */
2342/* File: mips/op_aget_wide.S */
2343    /*
2344     * Array get, 64 bits.  vAA <- vBB[vCC].
2345     *
2346     * Arrays of long/double are 64-bit aligned.
2347     */
2348    /* aget-wide vAA, vBB, vCC */
2349    FETCH(a0, 1)                           #  a0 <- CCBB
2350    GET_OPA(rOBJ)                          #  rOBJ <- AA
2351    and       a2, a0, 255                  #  a2 <- BB
2352    srl       a3, a0, 8                    #  a3 <- CC
2353    GET_VREG(a0, a2)                       #  a0 <- vBB (array object)
2354    GET_VREG(a1, a3)                       #  a1 <- vCC (requested index)
2355    # null array object?
2356    beqz      a0, common_errNullObject     #  yes, bail
2357    LOAD_base_offMirrorArray_length(a3, a0) #  a3 <- arrayObj->length
2358    EAS3(a0, a0, a1)                       #  a0 <- arrayObj + index*width
2359    bgeu      a1, a3, common_errArrayIndex #  index >= length, bail
2360
2361    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
2362    LOAD64_off(a2, a3, a0, MIRROR_WIDE_ARRAY_DATA_OFFSET)
2363    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
2364    SET_VREG64_GOTO(a2, a3, rOBJ, t0)      #  vAA/vAA+1 <- a2/a3
2365
2366/* ------------------------------ */
2367    .balign 128
2368.L_op_aget_object: /* 0x46 */
2369/* File: mips/op_aget_object.S */
2370    /*
2371     * Array object get.  vAA <- vBB[vCC].
2372     *
2373     * for: aget-object
2374     */
2375    /* op vAA, vBB, vCC */
2376    FETCH_B(a2, 1, 0)                      #  a2 <- BB
2377    GET_OPA(rOBJ)                          #  rOBJ <- AA
2378    FETCH_B(a3, 1, 1)                      #  a3 <- CC
2379    EXPORT_PC()
2380    GET_VREG(a0, a2)                       #  a0 <- vBB (array object)
2381    GET_VREG(a1, a3)                       #  a1 <- vCC (requested index)
2382    JAL(artAGetObjectFromMterp)            #  v0 <- GetObj(array, index)
2383    lw   a1, THREAD_EXCEPTION_OFFSET(rSELF)
2384    PREFETCH_INST(2)                       #  load rINST
2385    bnez a1, MterpException
2386    SET_VREG_OBJECT(v0, rOBJ)              #  vAA <- v0
2387    ADVANCE(2)                             #  advance rPC
2388    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
2389    GOTO_OPCODE(t0)                        #  jump to next instruction
2390
2391/* ------------------------------ */
2392    .balign 128
2393.L_op_aget_boolean: /* 0x47 */
2394/* File: mips/op_aget_boolean.S */
2395/* File: mips/op_aget.S */
2396    /*
2397     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2398     *
2399     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2400     * instructions.  We use a pair of FETCH_Bs instead.
2401     *
2402     * for: aget, aget-boolean, aget-byte, aget-char, aget-short
2403     *
2404     * NOTE: assumes data offset for arrays is the same for all non-wide types.
2405     * If this changes, specialize.
2406     */
2407    /* op vAA, vBB, vCC */
2408    FETCH_B(a2, 1, 0)                      #  a2 <- BB
2409    GET_OPA(rOBJ)                          #  rOBJ <- AA
2410    FETCH_B(a3, 1, 1)                      #  a3 <- CC
2411    GET_VREG(a0, a2)                       #  a0 <- vBB (array object)
2412    GET_VREG(a1, a3)                       #  a1 <- vCC (requested index)
2413    # null array object?
2414    beqz      a0, common_errNullObject     #  yes, bail
2415    LOAD_base_offMirrorArray_length(a3, a0) #  a3 <- arrayObj->length
2416    .if 0
2417    EASN(a0, a0, a1, 0)               #  a0 <- arrayObj + index*width
2418    .else
2419    addu      a0, a0, a1
2420    .endif
2421    # a1 >= a3; compare unsigned index
2422    bgeu      a1, a3, common_errArrayIndex #  index >= length, bail
2423    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
2424    lbu a2, MIRROR_BOOLEAN_ARRAY_DATA_OFFSET(a0)             #  a2 <- vBB[vCC]
2425    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
2426    SET_VREG_GOTO(a2, rOBJ, t0)            #  vAA <- a2
2427
2428
2429/* ------------------------------ */
2430    .balign 128
2431.L_op_aget_byte: /* 0x48 */
2432/* File: mips/op_aget_byte.S */
2433/* File: mips/op_aget.S */
2434    /*
2435     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2436     *
2437     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2438     * instructions.  We use a pair of FETCH_Bs instead.
2439     *
2440     * for: aget, aget-boolean, aget-byte, aget-char, aget-short
2441     *
2442     * NOTE: assumes data offset for arrays is the same for all non-wide types.
2443     * If this changes, specialize.
2444     */
2445    /* op vAA, vBB, vCC */
2446    FETCH_B(a2, 1, 0)                      #  a2 <- BB
2447    GET_OPA(rOBJ)                          #  rOBJ <- AA
2448    FETCH_B(a3, 1, 1)                      #  a3 <- CC
2449    GET_VREG(a0, a2)                       #  a0 <- vBB (array object)
2450    GET_VREG(a1, a3)                       #  a1 <- vCC (requested index)
2451    # null array object?
2452    beqz      a0, common_errNullObject     #  yes, bail
2453    LOAD_base_offMirrorArray_length(a3, a0) #  a3 <- arrayObj->length
2454    .if 0
2455    EASN(a0, a0, a1, 0)               #  a0 <- arrayObj + index*width
2456    .else
2457    addu      a0, a0, a1
2458    .endif
2459    # a1 >= a3; compare unsigned index
2460    bgeu      a1, a3, common_errArrayIndex #  index >= length, bail
2461    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
2462    lb a2, MIRROR_BYTE_ARRAY_DATA_OFFSET(a0)             #  a2 <- vBB[vCC]
2463    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
2464    SET_VREG_GOTO(a2, rOBJ, t0)            #  vAA <- a2
2465
2466
2467/* ------------------------------ */
2468    .balign 128
2469.L_op_aget_char: /* 0x49 */
2470/* File: mips/op_aget_char.S */
2471/* File: mips/op_aget.S */
2472    /*
2473     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2474     *
2475     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2476     * instructions.  We use a pair of FETCH_Bs instead.
2477     *
2478     * for: aget, aget-boolean, aget-byte, aget-char, aget-short
2479     *
2480     * NOTE: assumes data offset for arrays is the same for all non-wide types.
2481     * If this changes, specialize.
2482     */
2483    /* op vAA, vBB, vCC */
2484    FETCH_B(a2, 1, 0)                      #  a2 <- BB
2485    GET_OPA(rOBJ)                          #  rOBJ <- AA
2486    FETCH_B(a3, 1, 1)                      #  a3 <- CC
2487    GET_VREG(a0, a2)                       #  a0 <- vBB (array object)
2488    GET_VREG(a1, a3)                       #  a1 <- vCC (requested index)
2489    # null array object?
2490    beqz      a0, common_errNullObject     #  yes, bail
2491    LOAD_base_offMirrorArray_length(a3, a0) #  a3 <- arrayObj->length
2492    .if 1
2493    EASN(a0, a0, a1, 1)               #  a0 <- arrayObj + index*width
2494    .else
2495    addu      a0, a0, a1
2496    .endif
2497    # a1 >= a3; compare unsigned index
2498    bgeu      a1, a3, common_errArrayIndex #  index >= length, bail
2499    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
2500    lhu a2, MIRROR_CHAR_ARRAY_DATA_OFFSET(a0)             #  a2 <- vBB[vCC]
2501    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
2502    SET_VREG_GOTO(a2, rOBJ, t0)            #  vAA <- a2
2503
2504
2505/* ------------------------------ */
2506    .balign 128
2507.L_op_aget_short: /* 0x4a */
2508/* File: mips/op_aget_short.S */
2509/* File: mips/op_aget.S */
2510    /*
2511     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2512     *
2513     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2514     * instructions.  We use a pair of FETCH_Bs instead.
2515     *
2516     * for: aget, aget-boolean, aget-byte, aget-char, aget-short
2517     *
2518     * NOTE: assumes data offset for arrays is the same for all non-wide types.
2519     * If this changes, specialize.
2520     */
2521    /* op vAA, vBB, vCC */
2522    FETCH_B(a2, 1, 0)                      #  a2 <- BB
2523    GET_OPA(rOBJ)                          #  rOBJ <- AA
2524    FETCH_B(a3, 1, 1)                      #  a3 <- CC
2525    GET_VREG(a0, a2)                       #  a0 <- vBB (array object)
2526    GET_VREG(a1, a3)                       #  a1 <- vCC (requested index)
2527    # null array object?
2528    beqz      a0, common_errNullObject     #  yes, bail
2529    LOAD_base_offMirrorArray_length(a3, a0) #  a3 <- arrayObj->length
2530    .if 1
2531    EASN(a0, a0, a1, 1)               #  a0 <- arrayObj + index*width
2532    .else
2533    addu      a0, a0, a1
2534    .endif
2535    # a1 >= a3; compare unsigned index
2536    bgeu      a1, a3, common_errArrayIndex #  index >= length, bail
2537    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
2538    lh a2, MIRROR_SHORT_ARRAY_DATA_OFFSET(a0)             #  a2 <- vBB[vCC]
2539    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
2540    SET_VREG_GOTO(a2, rOBJ, t0)            #  vAA <- a2
2541
2542
2543/* ------------------------------ */
2544    .balign 128
2545.L_op_aput: /* 0x4b */
2546/* File: mips/op_aput.S */
2547
2548    /*
2549     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2550     *
2551     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2552     *
2553     * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2554     * If this changes, specialize.
2555     */
2556    /* op vAA, vBB, vCC */
2557    FETCH_B(a2, 1, 0)                      #  a2 <- BB
2558    GET_OPA(rOBJ)                          #  rOBJ <- AA
2559    FETCH_B(a3, 1, 1)                      #  a3 <- CC
2560    GET_VREG(a0, a2)                       #  a0 <- vBB (array object)
2561    GET_VREG(a1, a3)                       #  a1 <- vCC (requested index)
2562    # null array object?
2563    beqz      a0, common_errNullObject     #  yes, bail
2564    LOAD_base_offMirrorArray_length(a3, a0) #  a3 <- arrayObj->length
2565    .if 2
2566    EASN(a0, a0, a1, 2)               #  a0 <- arrayObj + index*width
2567    .else
2568    addu      a0, a0, a1
2569    .endif
2570    bgeu      a1, a3, common_errArrayIndex #  index >= length, bail
2571    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
2572    GET_VREG(a2, rOBJ)                     #  a2 <- vAA
2573    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
2574    sw a2, MIRROR_INT_ARRAY_DATA_OFFSET(a0)            #  vBB[vCC] <- a2
2575    GOTO_OPCODE(t0)                        #  jump to next instruction
2576
2577/* ------------------------------ */
2578    .balign 128
2579.L_op_aput_wide: /* 0x4c */
2580/* File: mips/op_aput_wide.S */
2581    /*
2582     * Array put, 64 bits.  vBB[vCC] <- vAA.
2583     *
2584     * Arrays of long/double are 64-bit aligned, so it's okay to use STRD.
2585     */
2586    /* aput-wide vAA, vBB, vCC */
2587    FETCH(a0, 1)                           #  a0 <- CCBB
2588    GET_OPA(t0)                            #  t0 <- AA
2589    and       a2, a0, 255                  #  a2 <- BB
2590    srl       a3, a0, 8                    #  a3 <- CC
2591    GET_VREG(a0, a2)                       #  a0 <- vBB (array object)
2592    GET_VREG(a1, a3)                       #  a1 <- vCC (requested index)
2593    # null array object?
2594    beqz      a0, common_errNullObject     #  yes, bail
2595    LOAD_base_offMirrorArray_length(a3, a0) #  a3 <- arrayObj->length
2596    EAS3(a0, a0, a1)                       #  a0 <- arrayObj + index*width
2597    EAS2(rOBJ, rFP, t0)                    #  rOBJ <- &fp[AA]
2598    # compare unsigned index, length
2599    bgeu      a1, a3, common_errArrayIndex #  index >= length, bail
2600
2601    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
2602    LOAD64(a2, a3, rOBJ)                   #  a2/a3 <- vAA/vAA+1
2603    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
2604    STORE64_off(a2, a3, a0, MIRROR_WIDE_ARRAY_DATA_OFFSET) #  a2/a3 <- vBB[vCC]
2605    GOTO_OPCODE(t0)                        #  jump to next instruction
2606
2607/* ------------------------------ */
2608    .balign 128
2609.L_op_aput_object: /* 0x4d */
2610/* File: mips/op_aput_object.S */
2611    /*
2612     * Store an object into an array.  vBB[vCC] <- vAA.
2613     *
2614     */
2615    /* op vAA, vBB, vCC */
2616    EXPORT_PC()
2617    addu   a0, rFP, OFF_FP_SHADOWFRAME
2618    move   a1, rPC
2619    move   a2, rINST
2620    JAL(MterpAputObject)
2621    beqz   v0, MterpPossibleException
2622    FETCH_ADVANCE_INST(2)               # advance rPC, load rINST
2623    GET_INST_OPCODE(t0)                 # extract opcode from rINST
2624    GOTO_OPCODE(t0)                     # jump to next instruction
2625
2626/* ------------------------------ */
2627    .balign 128
2628.L_op_aput_boolean: /* 0x4e */
2629/* File: mips/op_aput_boolean.S */
2630/* File: mips/op_aput.S */
2631
2632    /*
2633     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2634     *
2635     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2636     *
2637     * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2638     * If this changes, specialize.
2639     */
2640    /* op vAA, vBB, vCC */
2641    FETCH_B(a2, 1, 0)                      #  a2 <- BB
2642    GET_OPA(rOBJ)                          #  rOBJ <- AA
2643    FETCH_B(a3, 1, 1)                      #  a3 <- CC
2644    GET_VREG(a0, a2)                       #  a0 <- vBB (array object)
2645    GET_VREG(a1, a3)                       #  a1 <- vCC (requested index)
2646    # null array object?
2647    beqz      a0, common_errNullObject     #  yes, bail
2648    LOAD_base_offMirrorArray_length(a3, a0) #  a3 <- arrayObj->length
2649    .if 0
2650    EASN(a0, a0, a1, 0)               #  a0 <- arrayObj + index*width
2651    .else
2652    addu      a0, a0, a1
2653    .endif
2654    bgeu      a1, a3, common_errArrayIndex #  index >= length, bail
2655    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
2656    GET_VREG(a2, rOBJ)                     #  a2 <- vAA
2657    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
2658    sb a2, MIRROR_BOOLEAN_ARRAY_DATA_OFFSET(a0)            #  vBB[vCC] <- a2
2659    GOTO_OPCODE(t0)                        #  jump to next instruction
2660
2661
2662/* ------------------------------ */
2663    .balign 128
2664.L_op_aput_byte: /* 0x4f */
2665/* File: mips/op_aput_byte.S */
2666/* File: mips/op_aput.S */
2667
2668    /*
2669     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2670     *
2671     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2672     *
2673     * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2674     * If this changes, specialize.
2675     */
2676    /* op vAA, vBB, vCC */
2677    FETCH_B(a2, 1, 0)                      #  a2 <- BB
2678    GET_OPA(rOBJ)                          #  rOBJ <- AA
2679    FETCH_B(a3, 1, 1)                      #  a3 <- CC
2680    GET_VREG(a0, a2)                       #  a0 <- vBB (array object)
2681    GET_VREG(a1, a3)                       #  a1 <- vCC (requested index)
2682    # null array object?
2683    beqz      a0, common_errNullObject     #  yes, bail
2684    LOAD_base_offMirrorArray_length(a3, a0) #  a3 <- arrayObj->length
2685    .if 0
2686    EASN(a0, a0, a1, 0)               #  a0 <- arrayObj + index*width
2687    .else
2688    addu      a0, a0, a1
2689    .endif
2690    bgeu      a1, a3, common_errArrayIndex #  index >= length, bail
2691    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
2692    GET_VREG(a2, rOBJ)                     #  a2 <- vAA
2693    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
2694    sb a2, MIRROR_BYTE_ARRAY_DATA_OFFSET(a0)            #  vBB[vCC] <- a2
2695    GOTO_OPCODE(t0)                        #  jump to next instruction
2696
2697
2698/* ------------------------------ */
2699    .balign 128
2700.L_op_aput_char: /* 0x50 */
2701/* File: mips/op_aput_char.S */
2702/* File: mips/op_aput.S */
2703
2704    /*
2705     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2706     *
2707     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2708     *
2709     * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2710     * If this changes, specialize.
2711     */
2712    /* op vAA, vBB, vCC */
2713    FETCH_B(a2, 1, 0)                      #  a2 <- BB
2714    GET_OPA(rOBJ)                          #  rOBJ <- AA
2715    FETCH_B(a3, 1, 1)                      #  a3 <- CC
2716    GET_VREG(a0, a2)                       #  a0 <- vBB (array object)
2717    GET_VREG(a1, a3)                       #  a1 <- vCC (requested index)
2718    # null array object?
2719    beqz      a0, common_errNullObject     #  yes, bail
2720    LOAD_base_offMirrorArray_length(a3, a0) #  a3 <- arrayObj->length
2721    .if 1
2722    EASN(a0, a0, a1, 1)               #  a0 <- arrayObj + index*width
2723    .else
2724    addu      a0, a0, a1
2725    .endif
2726    bgeu      a1, a3, common_errArrayIndex #  index >= length, bail
2727    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
2728    GET_VREG(a2, rOBJ)                     #  a2 <- vAA
2729    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
2730    sh a2, MIRROR_CHAR_ARRAY_DATA_OFFSET(a0)            #  vBB[vCC] <- a2
2731    GOTO_OPCODE(t0)                        #  jump to next instruction
2732
2733
2734/* ------------------------------ */
2735    .balign 128
2736.L_op_aput_short: /* 0x51 */
2737/* File: mips/op_aput_short.S */
2738/* File: mips/op_aput.S */
2739
2740    /*
2741     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2742     *
2743     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2744     *
2745     * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2746     * If this changes, specialize.
2747     */
2748    /* op vAA, vBB, vCC */
2749    FETCH_B(a2, 1, 0)                      #  a2 <- BB
2750    GET_OPA(rOBJ)                          #  rOBJ <- AA
2751    FETCH_B(a3, 1, 1)                      #  a3 <- CC
2752    GET_VREG(a0, a2)                       #  a0 <- vBB (array object)
2753    GET_VREG(a1, a3)                       #  a1 <- vCC (requested index)
2754    # null array object?
2755    beqz      a0, common_errNullObject     #  yes, bail
2756    LOAD_base_offMirrorArray_length(a3, a0) #  a3 <- arrayObj->length
2757    .if 1
2758    EASN(a0, a0, a1, 1)               #  a0 <- arrayObj + index*width
2759    .else
2760    addu      a0, a0, a1
2761    .endif
2762    bgeu      a1, a3, common_errArrayIndex #  index >= length, bail
2763    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
2764    GET_VREG(a2, rOBJ)                     #  a2 <- vAA
2765    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
2766    sh a2, MIRROR_SHORT_ARRAY_DATA_OFFSET(a0)            #  vBB[vCC] <- a2
2767    GOTO_OPCODE(t0)                        #  jump to next instruction
2768
2769
2770/* ------------------------------ */
2771    .balign 128
2772.L_op_iget: /* 0x52 */
2773/* File: mips/op_iget.S */
2774    /*
2775     * General instance field get.
2776     *
2777     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2778     */
2779    EXPORT_PC()
2780    FETCH(a0, 1)                           # a0 <- field ref CCCC
2781    GET_OPB(a1)                            # a1 <- B
2782    GET_VREG(a1, a1)                       # a1 <- fp[B], the object pointer
2783    lw    a2, OFF_FP_METHOD(rFP)           # a2 <- referrer
2784    move  a3, rSELF                        # a3 <- self
2785    JAL(artGet32InstanceFromCode)
2786    lw   a3, THREAD_EXCEPTION_OFFSET(rSELF)
2787    GET_OPA4(a2)                           # a2<- A+
2788    PREFETCH_INST(2)                       # load rINST
2789    bnez  a3, MterpPossibleException        # bail out
2790    .if 0
2791    SET_VREG_OBJECT(v0, a2)                # fp[A] <- v0
2792    .else
2793    SET_VREG(v0, a2)                       # fp[A] <- v0
2794    .endif
2795    ADVANCE(2)                             #  advance rPC
2796    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
2797    GOTO_OPCODE(t0)                        #  jump to next instruction
2798
2799/* ------------------------------ */
2800    .balign 128
2801.L_op_iget_wide: /* 0x53 */
2802/* File: mips/op_iget_wide.S */
2803    /*
2804     * 64-bit instance field get.
2805     *
2806     * for: iget-wide
2807     */
2808    EXPORT_PC()
2809    FETCH(a0, 1)                           # a0 <- field byte offset
2810    GET_OPB(a1)                            # a1 <- B
2811    GET_VREG(a1, a1)                       # a1 <- fp[B], the object pointer
2812    lw    a2, OFF_FP_METHOD(rFP)           # a2 <- referrer
2813    move  a3, rSELF                        # a3 <- self
2814    JAL(artGet64InstanceFromCode)
2815    lw   a3, THREAD_EXCEPTION_OFFSET(rSELF)
2816    GET_OPA4(a2)                           # a2<- A+
2817    PREFETCH_INST(2)                       # load rINST
2818    bnez a3, MterpException                # bail out
2819    SET_VREG64(v0, v1, a2)                 # fp[A] <- v0/v1
2820    ADVANCE(2)                             # advance rPC
2821    GET_INST_OPCODE(t0)                    # extract opcode from rINST
2822    GOTO_OPCODE(t0)                        # jump to next instruction
2823
2824/* ------------------------------ */
2825    .balign 128
2826.L_op_iget_object: /* 0x54 */
2827/* File: mips/op_iget_object.S */
2828/* File: mips/op_iget.S */
2829    /*
2830     * General instance field get.
2831     *
2832     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2833     */
2834    EXPORT_PC()
2835    FETCH(a0, 1)                           # a0 <- field ref CCCC
2836    GET_OPB(a1)                            # a1 <- B
2837    GET_VREG(a1, a1)                       # a1 <- fp[B], the object pointer
2838    lw    a2, OFF_FP_METHOD(rFP)           # a2 <- referrer
2839    move  a3, rSELF                        # a3 <- self
2840    JAL(artGetObjInstanceFromCode)
2841    lw   a3, THREAD_EXCEPTION_OFFSET(rSELF)
2842    GET_OPA4(a2)                           # a2<- A+
2843    PREFETCH_INST(2)                       # load rINST
2844    bnez  a3, MterpPossibleException        # bail out
2845    .if 1
2846    SET_VREG_OBJECT(v0, a2)                # fp[A] <- v0
2847    .else
2848    SET_VREG(v0, a2)                       # fp[A] <- v0
2849    .endif
2850    ADVANCE(2)                             #  advance rPC
2851    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
2852    GOTO_OPCODE(t0)                        #  jump to next instruction
2853
2854
2855/* ------------------------------ */
2856    .balign 128
2857.L_op_iget_boolean: /* 0x55 */
2858/* File: mips/op_iget_boolean.S */
2859/* File: mips/op_iget.S */
2860    /*
2861     * General instance field get.
2862     *
2863     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2864     */
2865    EXPORT_PC()
2866    FETCH(a0, 1)                           # a0 <- field ref CCCC
2867    GET_OPB(a1)                            # a1 <- B
2868    GET_VREG(a1, a1)                       # a1 <- fp[B], the object pointer
2869    lw    a2, OFF_FP_METHOD(rFP)           # a2 <- referrer
2870    move  a3, rSELF                        # a3 <- self
2871    JAL(artGetBooleanInstanceFromCode)
2872    lw   a3, THREAD_EXCEPTION_OFFSET(rSELF)
2873    GET_OPA4(a2)                           # a2<- A+
2874    PREFETCH_INST(2)                       # load rINST
2875    bnez  a3, MterpPossibleException        # bail out
2876    .if 0
2877    SET_VREG_OBJECT(v0, a2)                # fp[A] <- v0
2878    .else
2879    SET_VREG(v0, a2)                       # fp[A] <- v0
2880    .endif
2881    ADVANCE(2)                             #  advance rPC
2882    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
2883    GOTO_OPCODE(t0)                        #  jump to next instruction
2884
2885
2886/* ------------------------------ */
2887    .balign 128
2888.L_op_iget_byte: /* 0x56 */
2889/* File: mips/op_iget_byte.S */
2890/* File: mips/op_iget.S */
2891    /*
2892     * General instance field get.
2893     *
2894     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2895     */
2896    EXPORT_PC()
2897    FETCH(a0, 1)                           # a0 <- field ref CCCC
2898    GET_OPB(a1)                            # a1 <- B
2899    GET_VREG(a1, a1)                       # a1 <- fp[B], the object pointer
2900    lw    a2, OFF_FP_METHOD(rFP)           # a2 <- referrer
2901    move  a3, rSELF                        # a3 <- self
2902    JAL(artGetByteInstanceFromCode)
2903    lw   a3, THREAD_EXCEPTION_OFFSET(rSELF)
2904    GET_OPA4(a2)                           # a2<- A+
2905    PREFETCH_INST(2)                       # load rINST
2906    bnez  a3, MterpPossibleException        # bail out
2907    .if 0
2908    SET_VREG_OBJECT(v0, a2)                # fp[A] <- v0
2909    .else
2910    SET_VREG(v0, a2)                       # fp[A] <- v0
2911    .endif
2912    ADVANCE(2)                             #  advance rPC
2913    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
2914    GOTO_OPCODE(t0)                        #  jump to next instruction
2915
2916
2917/* ------------------------------ */
2918    .balign 128
2919.L_op_iget_char: /* 0x57 */
2920/* File: mips/op_iget_char.S */
2921/* File: mips/op_iget.S */
2922    /*
2923     * General instance field get.
2924     *
2925     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2926     */
2927    EXPORT_PC()
2928    FETCH(a0, 1)                           # a0 <- field ref CCCC
2929    GET_OPB(a1)                            # a1 <- B
2930    GET_VREG(a1, a1)                       # a1 <- fp[B], the object pointer
2931    lw    a2, OFF_FP_METHOD(rFP)           # a2 <- referrer
2932    move  a3, rSELF                        # a3 <- self
2933    JAL(artGetCharInstanceFromCode)
2934    lw   a3, THREAD_EXCEPTION_OFFSET(rSELF)
2935    GET_OPA4(a2)                           # a2<- A+
2936    PREFETCH_INST(2)                       # load rINST
2937    bnez  a3, MterpPossibleException        # bail out
2938    .if 0
2939    SET_VREG_OBJECT(v0, a2)                # fp[A] <- v0
2940    .else
2941    SET_VREG(v0, a2)                       # fp[A] <- v0
2942    .endif
2943    ADVANCE(2)                             #  advance rPC
2944    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
2945    GOTO_OPCODE(t0)                        #  jump to next instruction
2946
2947
2948/* ------------------------------ */
2949    .balign 128
2950.L_op_iget_short: /* 0x58 */
2951/* File: mips/op_iget_short.S */
2952/* File: mips/op_iget.S */
2953    /*
2954     * General instance field get.
2955     *
2956     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2957     */
2958    EXPORT_PC()
2959    FETCH(a0, 1)                           # a0 <- field ref CCCC
2960    GET_OPB(a1)                            # a1 <- B
2961    GET_VREG(a1, a1)                       # a1 <- fp[B], the object pointer
2962    lw    a2, OFF_FP_METHOD(rFP)           # a2 <- referrer
2963    move  a3, rSELF                        # a3 <- self
2964    JAL(artGetShortInstanceFromCode)
2965    lw   a3, THREAD_EXCEPTION_OFFSET(rSELF)
2966    GET_OPA4(a2)                           # a2<- A+
2967    PREFETCH_INST(2)                       # load rINST
2968    bnez  a3, MterpPossibleException        # bail out
2969    .if 0
2970    SET_VREG_OBJECT(v0, a2)                # fp[A] <- v0
2971    .else
2972    SET_VREG(v0, a2)                       # fp[A] <- v0
2973    .endif
2974    ADVANCE(2)                             #  advance rPC
2975    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
2976    GOTO_OPCODE(t0)                        #  jump to next instruction
2977
2978
2979/* ------------------------------ */
2980    .balign 128
2981.L_op_iput: /* 0x59 */
2982/* File: mips/op_iput.S */
2983    /*
2984     * General 32-bit instance field put.
2985     *
2986     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2987     */
2988    # op vA, vB, field                     /* CCCC */
2989    .extern artSet32InstanceFromMterp
2990    EXPORT_PC()
2991    FETCH(a0, 1)                           # a0 <- field ref CCCC
2992    GET_OPB(a1)                            # a1 <- B
2993    GET_VREG(a1, a1)                       # a1 <- fp[B], the object pointer
2994    GET_OPA4(a2)                           # a2 <- A+
2995    GET_VREG(a2, a2)                       # a2 <- fp[A]
2996    lw    a3, OFF_FP_METHOD(rFP)           # a3 <- referrer
2997    PREFETCH_INST(2)                       # load rINST
2998    JAL(artSet32InstanceFromMterp)
2999    bnez  v0, MterpPossibleException       # bail out
3000    ADVANCE(2)                             # advance rPC
3001    GET_INST_OPCODE(t0)                    # extract opcode from rINST
3002    GOTO_OPCODE(t0)                        # jump to next instruction
3003
3004/* ------------------------------ */
3005    .balign 128
3006.L_op_iput_wide: /* 0x5a */
3007/* File: mips/op_iput_wide.S */
3008    # iput-wide vA, vB, field              /* CCCC */
3009    .extern artSet64InstanceFromMterp
3010    EXPORT_PC()
3011    FETCH(a0, 1)                           # a0 <- field ref CCCC
3012    GET_OPB(a1)                            # a1 <- B
3013    GET_VREG(a1, a1)                       # a1 <- fp[B], the object pointer
3014    GET_OPA4(a2)                           # a2 <- A+
3015    EAS2(a2, rFP, a2)                      # a2 <- &fp[A]
3016    lw    a3, OFF_FP_METHOD(rFP)           # a3 <- referrer
3017    PREFETCH_INST(2)                       # load rINST
3018    JAL(artSet64InstanceFromMterp)
3019    bnez  v0, MterpPossibleException       # bail out
3020    ADVANCE(2)                             # advance rPC
3021    GET_INST_OPCODE(t0)                    # extract opcode from rINST
3022    GOTO_OPCODE(t0)                        # jump to next instruction
3023
3024/* ------------------------------ */
3025    .balign 128
3026.L_op_iput_object: /* 0x5b */
3027/* File: mips/op_iput_object.S */
3028    /*
3029     * 32-bit instance field put.
3030     *
3031     * for: iput-object, iput-object-volatile
3032     */
3033    # op vA, vB, field                     /* CCCC */
3034    EXPORT_PC()
3035    addu   a0, rFP, OFF_FP_SHADOWFRAME
3036    move   a1, rPC
3037    move   a2, rINST
3038    move   a3, rSELF
3039    JAL(MterpIputObject)
3040    beqz   v0, MterpException
3041    FETCH_ADVANCE_INST(2)               # advance rPC, load rINST
3042    GET_INST_OPCODE(t0)                 # extract opcode from rINST
3043    GOTO_OPCODE(t0)                     # jump to next instruction
3044
3045/* ------------------------------ */
3046    .balign 128
3047.L_op_iput_boolean: /* 0x5c */
3048/* File: mips/op_iput_boolean.S */
3049/* File: mips/op_iput.S */
3050    /*
3051     * General 32-bit instance field put.
3052     *
3053     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
3054     */
3055    # op vA, vB, field                     /* CCCC */
3056    .extern artSet8InstanceFromMterp
3057    EXPORT_PC()
3058    FETCH(a0, 1)                           # a0 <- field ref CCCC
3059    GET_OPB(a1)                            # a1 <- B
3060    GET_VREG(a1, a1)                       # a1 <- fp[B], the object pointer
3061    GET_OPA4(a2)                           # a2 <- A+
3062    GET_VREG(a2, a2)                       # a2 <- fp[A]
3063    lw    a3, OFF_FP_METHOD(rFP)           # a3 <- referrer
3064    PREFETCH_INST(2)                       # load rINST
3065    JAL(artSet8InstanceFromMterp)
3066    bnez  v0, MterpPossibleException       # bail out
3067    ADVANCE(2)                             # advance rPC
3068    GET_INST_OPCODE(t0)                    # extract opcode from rINST
3069    GOTO_OPCODE(t0)                        # jump to next instruction
3070
3071
3072/* ------------------------------ */
3073    .balign 128
3074.L_op_iput_byte: /* 0x5d */
3075/* File: mips/op_iput_byte.S */
3076/* File: mips/op_iput.S */
3077    /*
3078     * General 32-bit instance field put.
3079     *
3080     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
3081     */
3082    # op vA, vB, field                     /* CCCC */
3083    .extern artSet8InstanceFromMterp
3084    EXPORT_PC()
3085    FETCH(a0, 1)                           # a0 <- field ref CCCC
3086    GET_OPB(a1)                            # a1 <- B
3087    GET_VREG(a1, a1)                       # a1 <- fp[B], the object pointer
3088    GET_OPA4(a2)                           # a2 <- A+
3089    GET_VREG(a2, a2)                       # a2 <- fp[A]
3090    lw    a3, OFF_FP_METHOD(rFP)           # a3 <- referrer
3091    PREFETCH_INST(2)                       # load rINST
3092    JAL(artSet8InstanceFromMterp)
3093    bnez  v0, MterpPossibleException       # bail out
3094    ADVANCE(2)                             # advance rPC
3095    GET_INST_OPCODE(t0)                    # extract opcode from rINST
3096    GOTO_OPCODE(t0)                        # jump to next instruction
3097
3098
3099/* ------------------------------ */
3100    .balign 128
3101.L_op_iput_char: /* 0x5e */
3102/* File: mips/op_iput_char.S */
3103/* File: mips/op_iput.S */
3104    /*
3105     * General 32-bit instance field put.
3106     *
3107     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
3108     */
3109    # op vA, vB, field                     /* CCCC */
3110    .extern artSet16InstanceFromMterp
3111    EXPORT_PC()
3112    FETCH(a0, 1)                           # a0 <- field ref CCCC
3113    GET_OPB(a1)                            # a1 <- B
3114    GET_VREG(a1, a1)                       # a1 <- fp[B], the object pointer
3115    GET_OPA4(a2)                           # a2 <- A+
3116    GET_VREG(a2, a2)                       # a2 <- fp[A]
3117    lw    a3, OFF_FP_METHOD(rFP)           # a3 <- referrer
3118    PREFETCH_INST(2)                       # load rINST
3119    JAL(artSet16InstanceFromMterp)
3120    bnez  v0, MterpPossibleException       # bail out
3121    ADVANCE(2)                             # advance rPC
3122    GET_INST_OPCODE(t0)                    # extract opcode from rINST
3123    GOTO_OPCODE(t0)                        # jump to next instruction
3124
3125
3126/* ------------------------------ */
3127    .balign 128
3128.L_op_iput_short: /* 0x5f */
3129/* File: mips/op_iput_short.S */
3130/* File: mips/op_iput.S */
3131    /*
3132     * General 32-bit instance field put.
3133     *
3134     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
3135     */
3136    # op vA, vB, field                     /* CCCC */
3137    .extern artSet16InstanceFromMterp
3138    EXPORT_PC()
3139    FETCH(a0, 1)                           # a0 <- field ref CCCC
3140    GET_OPB(a1)                            # a1 <- B
3141    GET_VREG(a1, a1)                       # a1 <- fp[B], the object pointer
3142    GET_OPA4(a2)                           # a2 <- A+
3143    GET_VREG(a2, a2)                       # a2 <- fp[A]
3144    lw    a3, OFF_FP_METHOD(rFP)           # a3 <- referrer
3145    PREFETCH_INST(2)                       # load rINST
3146    JAL(artSet16InstanceFromMterp)
3147    bnez  v0, MterpPossibleException       # bail out
3148    ADVANCE(2)                             # advance rPC
3149    GET_INST_OPCODE(t0)                    # extract opcode from rINST
3150    GOTO_OPCODE(t0)                        # jump to next instruction
3151
3152
3153/* ------------------------------ */
3154    .balign 128
3155.L_op_sget: /* 0x60 */
3156/* File: mips/op_sget.S */
3157    /*
3158     * General SGET handler.
3159     *
3160     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3161     */
3162    # op vAA, field                        /* BBBB */
3163    .extern artGet32StaticFromCode
3164    EXPORT_PC()
3165    FETCH(a0, 1)                           # a0 <- field ref BBBB
3166    lw    a1, OFF_FP_METHOD(rFP)           # a1 <- method
3167    move  a2, rSELF                        # a2 <- self
3168    JAL(artGet32StaticFromCode)
3169    lw    a3, THREAD_EXCEPTION_OFFSET(rSELF)
3170    GET_OPA(a2)                            # a2 <- AA
3171    PREFETCH_INST(2)
3172    bnez  a3, MterpException               # bail out
3173.if 0
3174    SET_VREG_OBJECT(v0, a2)                # fp[AA] <- v0
3175.else
3176    SET_VREG(v0, a2)                       # fp[AA] <- v0
3177.endif
3178    ADVANCE(2)
3179    GET_INST_OPCODE(t0)                    # extract opcode from rINST
3180    GOTO_OPCODE(t0)                        # jump to next instruction
3181
3182/* ------------------------------ */
3183    .balign 128
3184.L_op_sget_wide: /* 0x61 */
3185/* File: mips/op_sget_wide.S */
3186    /*
3187     * 64-bit SGET handler.
3188     */
3189    # sget-wide vAA, field                 /* BBBB */
3190    .extern artGet64StaticFromCode
3191    EXPORT_PC()
3192    FETCH(a0, 1)                           # a0 <- field ref BBBB
3193    lw    a1, OFF_FP_METHOD(rFP)           # a1 <- method
3194    move  a2, rSELF                        # a2 <- self
3195    JAL(artGet64StaticFromCode)
3196    lw    a3, THREAD_EXCEPTION_OFFSET(rSELF)
3197    bnez  a3, MterpException
3198    GET_OPA(a1)                            # a1 <- AA
3199    FETCH_ADVANCE_INST(2)                  # advance rPC, load rINST
3200    SET_VREG64(v0, v1, a1)                 # vAA/vAA+1 <- v0/v1
3201    GET_INST_OPCODE(t0)                    # extract opcode from rINST
3202    GOTO_OPCODE(t0)                        # jump to next instruction
3203
3204/* ------------------------------ */
3205    .balign 128
3206.L_op_sget_object: /* 0x62 */
3207/* File: mips/op_sget_object.S */
3208/* File: mips/op_sget.S */
3209    /*
3210     * General SGET handler.
3211     *
3212     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3213     */
3214    # op vAA, field                        /* BBBB */
3215    .extern artGetObjStaticFromCode
3216    EXPORT_PC()
3217    FETCH(a0, 1)                           # a0 <- field ref BBBB
3218    lw    a1, OFF_FP_METHOD(rFP)           # a1 <- method
3219    move  a2, rSELF                        # a2 <- self
3220    JAL(artGetObjStaticFromCode)
3221    lw    a3, THREAD_EXCEPTION_OFFSET(rSELF)
3222    GET_OPA(a2)                            # a2 <- AA
3223    PREFETCH_INST(2)
3224    bnez  a3, MterpException               # bail out
3225.if 1
3226    SET_VREG_OBJECT(v0, a2)                # fp[AA] <- v0
3227.else
3228    SET_VREG(v0, a2)                       # fp[AA] <- v0
3229.endif
3230    ADVANCE(2)
3231    GET_INST_OPCODE(t0)                    # extract opcode from rINST
3232    GOTO_OPCODE(t0)                        # jump to next instruction
3233
3234
3235/* ------------------------------ */
3236    .balign 128
3237.L_op_sget_boolean: /* 0x63 */
3238/* File: mips/op_sget_boolean.S */
3239/* File: mips/op_sget.S */
3240    /*
3241     * General SGET handler.
3242     *
3243     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3244     */
3245    # op vAA, field                        /* BBBB */
3246    .extern artGetBooleanStaticFromCode
3247    EXPORT_PC()
3248    FETCH(a0, 1)                           # a0 <- field ref BBBB
3249    lw    a1, OFF_FP_METHOD(rFP)           # a1 <- method
3250    move  a2, rSELF                        # a2 <- self
3251    JAL(artGetBooleanStaticFromCode)
3252    lw    a3, THREAD_EXCEPTION_OFFSET(rSELF)
3253    GET_OPA(a2)                            # a2 <- AA
3254    PREFETCH_INST(2)
3255    bnez  a3, MterpException               # bail out
3256.if 0
3257    SET_VREG_OBJECT(v0, a2)                # fp[AA] <- v0
3258.else
3259    SET_VREG(v0, a2)                       # fp[AA] <- v0
3260.endif
3261    ADVANCE(2)
3262    GET_INST_OPCODE(t0)                    # extract opcode from rINST
3263    GOTO_OPCODE(t0)                        # jump to next instruction
3264
3265
3266/* ------------------------------ */
3267    .balign 128
3268.L_op_sget_byte: /* 0x64 */
3269/* File: mips/op_sget_byte.S */
3270/* File: mips/op_sget.S */
3271    /*
3272     * General SGET handler.
3273     *
3274     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3275     */
3276    # op vAA, field                        /* BBBB */
3277    .extern artGetByteStaticFromCode
3278    EXPORT_PC()
3279    FETCH(a0, 1)                           # a0 <- field ref BBBB
3280    lw    a1, OFF_FP_METHOD(rFP)           # a1 <- method
3281    move  a2, rSELF                        # a2 <- self
3282    JAL(artGetByteStaticFromCode)
3283    lw    a3, THREAD_EXCEPTION_OFFSET(rSELF)
3284    GET_OPA(a2)                            # a2 <- AA
3285    PREFETCH_INST(2)
3286    bnez  a3, MterpException               # bail out
3287.if 0
3288    SET_VREG_OBJECT(v0, a2)                # fp[AA] <- v0
3289.else
3290    SET_VREG(v0, a2)                       # fp[AA] <- v0
3291.endif
3292    ADVANCE(2)
3293    GET_INST_OPCODE(t0)                    # extract opcode from rINST
3294    GOTO_OPCODE(t0)                        # jump to next instruction
3295
3296
3297/* ------------------------------ */
3298    .balign 128
3299.L_op_sget_char: /* 0x65 */
3300/* File: mips/op_sget_char.S */
3301/* File: mips/op_sget.S */
3302    /*
3303     * General SGET handler.
3304     *
3305     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3306     */
3307    # op vAA, field                        /* BBBB */
3308    .extern artGetCharStaticFromCode
3309    EXPORT_PC()
3310    FETCH(a0, 1)                           # a0 <- field ref BBBB
3311    lw    a1, OFF_FP_METHOD(rFP)           # a1 <- method
3312    move  a2, rSELF                        # a2 <- self
3313    JAL(artGetCharStaticFromCode)
3314    lw    a3, THREAD_EXCEPTION_OFFSET(rSELF)
3315    GET_OPA(a2)                            # a2 <- AA
3316    PREFETCH_INST(2)
3317    bnez  a3, MterpException               # bail out
3318.if 0
3319    SET_VREG_OBJECT(v0, a2)                # fp[AA] <- v0
3320.else
3321    SET_VREG(v0, a2)                       # fp[AA] <- v0
3322.endif
3323    ADVANCE(2)
3324    GET_INST_OPCODE(t0)                    # extract opcode from rINST
3325    GOTO_OPCODE(t0)                        # jump to next instruction
3326
3327
3328/* ------------------------------ */
3329    .balign 128
3330.L_op_sget_short: /* 0x66 */
3331/* File: mips/op_sget_short.S */
3332/* File: mips/op_sget.S */
3333    /*
3334     * General SGET handler.
3335     *
3336     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3337     */
3338    # op vAA, field                        /* BBBB */
3339    .extern artGetShortStaticFromCode
3340    EXPORT_PC()
3341    FETCH(a0, 1)                           # a0 <- field ref BBBB
3342    lw    a1, OFF_FP_METHOD(rFP)           # a1 <- method
3343    move  a2, rSELF                        # a2 <- self
3344    JAL(artGetShortStaticFromCode)
3345    lw    a3, THREAD_EXCEPTION_OFFSET(rSELF)
3346    GET_OPA(a2)                            # a2 <- AA
3347    PREFETCH_INST(2)
3348    bnez  a3, MterpException               # bail out
3349.if 0
3350    SET_VREG_OBJECT(v0, a2)                # fp[AA] <- v0
3351.else
3352    SET_VREG(v0, a2)                       # fp[AA] <- v0
3353.endif
3354    ADVANCE(2)
3355    GET_INST_OPCODE(t0)                    # extract opcode from rINST
3356    GOTO_OPCODE(t0)                        # jump to next instruction
3357
3358
3359/* ------------------------------ */
3360    .balign 128
3361.L_op_sput: /* 0x67 */
3362/* File: mips/op_sput.S */
3363    /*
3364     * General SPUT handler.
3365     *
3366     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3367     */
3368    # op vAA, field                        /* BBBB */
3369    EXPORT_PC()
3370    FETCH(a0, 1)                           # a0 <- field ref BBBB
3371    GET_OPA(a3)                            # a3 <- AA
3372    GET_VREG(a1, a3)                       # a1 <- fp[AA], the object pointer
3373    lw    a2, OFF_FP_METHOD(rFP)           # a2 <- method
3374    move  a3, rSELF                        # a3 <- self
3375    PREFETCH_INST(2)                       # load rINST
3376    JAL(artSet32StaticFromCode)
3377    bnez  v0, MterpException               # bail out
3378    ADVANCE(2)                             # advance rPC
3379    GET_INST_OPCODE(t0)                    # extract opcode from rINST
3380    GOTO_OPCODE(t0)                        # jump to next instruction
3381
3382/* ------------------------------ */
3383    .balign 128
3384.L_op_sput_wide: /* 0x68 */
3385/* File: mips/op_sput_wide.S */
3386    /*
3387     * 64-bit SPUT handler.
3388     */
3389    # sput-wide vAA, field                 /* BBBB */
3390    .extern artSet64IndirectStaticFromMterp
3391    EXPORT_PC()
3392    FETCH(a0, 1)                           # a0 <- field ref CCCC
3393    lw    a1, OFF_FP_METHOD(rFP)           # a1 <- method
3394    GET_OPA(a2)                            # a2 <- AA
3395    EAS2(a2, rFP, a2)                      # a2 <- &fp[AA]
3396    move  a3, rSELF                        # a3 <- self
3397    PREFETCH_INST(2)                       # load rINST
3398    JAL(artSet64IndirectStaticFromMterp)
3399    bnez  v0, MterpException               # bail out
3400    ADVANCE(2)                             # advance rPC
3401    GET_INST_OPCODE(t0)                    # extract opcode from rINST
3402    GOTO_OPCODE(t0)                        # jump to next instruction
3403
3404/* ------------------------------ */
3405    .balign 128
3406.L_op_sput_object: /* 0x69 */
3407/* File: mips/op_sput_object.S */
3408    /*
3409     * General 32-bit SPUT handler.
3410     *
3411     * for: sput-object,
3412     */
3413    /* op vAA, field@BBBB */
3414    EXPORT_PC()
3415    addu   a0, rFP, OFF_FP_SHADOWFRAME
3416    move   a1, rPC
3417    move   a2, rINST
3418    move   a3, rSELF
3419    JAL(MterpSputObject)
3420    beqz   v0, MterpException
3421    FETCH_ADVANCE_INST(2)               # advance rPC, load rINST
3422    GET_INST_OPCODE(t0)                 # extract opcode from rINST
3423    GOTO_OPCODE(t0)                     # jump to next instruction
3424
3425/* ------------------------------ */
3426    .balign 128
3427.L_op_sput_boolean: /* 0x6a */
3428/* File: mips/op_sput_boolean.S */
3429/* File: mips/op_sput.S */
3430    /*
3431     * General SPUT handler.
3432     *
3433     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3434     */
3435    # op vAA, field                        /* BBBB */
3436    EXPORT_PC()
3437    FETCH(a0, 1)                           # a0 <- field ref BBBB
3438    GET_OPA(a3)                            # a3 <- AA
3439    GET_VREG(a1, a3)                       # a1 <- fp[AA], the object pointer
3440    lw    a2, OFF_FP_METHOD(rFP)           # a2 <- method
3441    move  a3, rSELF                        # a3 <- self
3442    PREFETCH_INST(2)                       # load rINST
3443    JAL(artSet8StaticFromCode)
3444    bnez  v0, MterpException               # bail out
3445    ADVANCE(2)                             # advance rPC
3446    GET_INST_OPCODE(t0)                    # extract opcode from rINST
3447    GOTO_OPCODE(t0)                        # jump to next instruction
3448
3449
3450/* ------------------------------ */
3451    .balign 128
3452.L_op_sput_byte: /* 0x6b */
3453/* File: mips/op_sput_byte.S */
3454/* File: mips/op_sput.S */
3455    /*
3456     * General SPUT handler.
3457     *
3458     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3459     */
3460    # op vAA, field                        /* BBBB */
3461    EXPORT_PC()
3462    FETCH(a0, 1)                           # a0 <- field ref BBBB
3463    GET_OPA(a3)                            # a3 <- AA
3464    GET_VREG(a1, a3)                       # a1 <- fp[AA], the object pointer
3465    lw    a2, OFF_FP_METHOD(rFP)           # a2 <- method
3466    move  a3, rSELF                        # a3 <- self
3467    PREFETCH_INST(2)                       # load rINST
3468    JAL(artSet8StaticFromCode)
3469    bnez  v0, MterpException               # bail out
3470    ADVANCE(2)                             # advance rPC
3471    GET_INST_OPCODE(t0)                    # extract opcode from rINST
3472    GOTO_OPCODE(t0)                        # jump to next instruction
3473
3474
3475/* ------------------------------ */
3476    .balign 128
3477.L_op_sput_char: /* 0x6c */
3478/* File: mips/op_sput_char.S */
3479/* File: mips/op_sput.S */
3480    /*
3481     * General SPUT handler.
3482     *
3483     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3484     */
3485    # op vAA, field                        /* BBBB */
3486    EXPORT_PC()
3487    FETCH(a0, 1)                           # a0 <- field ref BBBB
3488    GET_OPA(a3)                            # a3 <- AA
3489    GET_VREG(a1, a3)                       # a1 <- fp[AA], the object pointer
3490    lw    a2, OFF_FP_METHOD(rFP)           # a2 <- method
3491    move  a3, rSELF                        # a3 <- self
3492    PREFETCH_INST(2)                       # load rINST
3493    JAL(artSet16StaticFromCode)
3494    bnez  v0, MterpException               # bail out
3495    ADVANCE(2)                             # advance rPC
3496    GET_INST_OPCODE(t0)                    # extract opcode from rINST
3497    GOTO_OPCODE(t0)                        # jump to next instruction
3498
3499
3500/* ------------------------------ */
3501    .balign 128
3502.L_op_sput_short: /* 0x6d */
3503/* File: mips/op_sput_short.S */
3504/* File: mips/op_sput.S */
3505    /*
3506     * General SPUT handler.
3507     *
3508     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3509     */
3510    # op vAA, field                        /* BBBB */
3511    EXPORT_PC()
3512    FETCH(a0, 1)                           # a0 <- field ref BBBB
3513    GET_OPA(a3)                            # a3 <- AA
3514    GET_VREG(a1, a3)                       # a1 <- fp[AA], the object pointer
3515    lw    a2, OFF_FP_METHOD(rFP)           # a2 <- method
3516    move  a3, rSELF                        # a3 <- self
3517    PREFETCH_INST(2)                       # load rINST
3518    JAL(artSet16StaticFromCode)
3519    bnez  v0, MterpException               # bail out
3520    ADVANCE(2)                             # advance rPC
3521    GET_INST_OPCODE(t0)                    # extract opcode from rINST
3522    GOTO_OPCODE(t0)                        # jump to next instruction
3523
3524
3525/* ------------------------------ */
3526    .balign 128
3527.L_op_invoke_virtual: /* 0x6e */
3528/* File: mips/op_invoke_virtual.S */
3529/* File: mips/invoke.S */
3530    /*
3531     * Generic invoke handler wrapper.
3532     */
3533    # op vB, {vD, vE, vF, vG, vA}, class   /* CCCC */
3534    # op {vCCCC..v(CCCC+AA-1)}, meth       /* BBBB */
3535    .extern MterpInvokeVirtual
3536    EXPORT_PC()
3537    move    a0, rSELF
3538    addu    a1, rFP, OFF_FP_SHADOWFRAME
3539    move    a2, rPC
3540    move    a3, rINST
3541    JAL(MterpInvokeVirtual)
3542    beqz    v0, MterpException
3543    FETCH_ADVANCE_INST(3)
3544    JAL(MterpShouldSwitchInterpreters)
3545    bnez    v0, MterpFallback
3546    GET_INST_OPCODE(t0)
3547    GOTO_OPCODE(t0)
3548
3549
3550/* ------------------------------ */
3551    .balign 128
3552.L_op_invoke_super: /* 0x6f */
3553/* File: mips/op_invoke_super.S */
3554/* File: mips/invoke.S */
3555    /*
3556     * Generic invoke handler wrapper.
3557     */
3558    # op vB, {vD, vE, vF, vG, vA}, class   /* CCCC */
3559    # op {vCCCC..v(CCCC+AA-1)}, meth       /* BBBB */
3560    .extern MterpInvokeSuper
3561    EXPORT_PC()
3562    move    a0, rSELF
3563    addu    a1, rFP, OFF_FP_SHADOWFRAME
3564    move    a2, rPC
3565    move    a3, rINST
3566    JAL(MterpInvokeSuper)
3567    beqz    v0, MterpException
3568    FETCH_ADVANCE_INST(3)
3569    JAL(MterpShouldSwitchInterpreters)
3570    bnez    v0, MterpFallback
3571    GET_INST_OPCODE(t0)
3572    GOTO_OPCODE(t0)
3573
3574
3575/* ------------------------------ */
3576    .balign 128
3577.L_op_invoke_direct: /* 0x70 */
3578/* File: mips/op_invoke_direct.S */
3579/* File: mips/invoke.S */
3580    /*
3581     * Generic invoke handler wrapper.
3582     */
3583    # op vB, {vD, vE, vF, vG, vA}, class   /* CCCC */
3584    # op {vCCCC..v(CCCC+AA-1)}, meth       /* BBBB */
3585    .extern MterpInvokeDirect
3586    EXPORT_PC()
3587    move    a0, rSELF
3588    addu    a1, rFP, OFF_FP_SHADOWFRAME
3589    move    a2, rPC
3590    move    a3, rINST
3591    JAL(MterpInvokeDirect)
3592    beqz    v0, MterpException
3593    FETCH_ADVANCE_INST(3)
3594    JAL(MterpShouldSwitchInterpreters)
3595    bnez    v0, MterpFallback
3596    GET_INST_OPCODE(t0)
3597    GOTO_OPCODE(t0)
3598
3599
3600/* ------------------------------ */
3601    .balign 128
3602.L_op_invoke_static: /* 0x71 */
3603/* File: mips/op_invoke_static.S */
3604/* File: mips/invoke.S */
3605    /*
3606     * Generic invoke handler wrapper.
3607     */
3608    # op vB, {vD, vE, vF, vG, vA}, class   /* CCCC */
3609    # op {vCCCC..v(CCCC+AA-1)}, meth       /* BBBB */
3610    .extern MterpInvokeStatic
3611    EXPORT_PC()
3612    move    a0, rSELF
3613    addu    a1, rFP, OFF_FP_SHADOWFRAME
3614    move    a2, rPC
3615    move    a3, rINST
3616    JAL(MterpInvokeStatic)
3617    beqz    v0, MterpException
3618    FETCH_ADVANCE_INST(3)
3619    JAL(MterpShouldSwitchInterpreters)
3620    bnez    v0, MterpFallback
3621    GET_INST_OPCODE(t0)
3622    GOTO_OPCODE(t0)
3623
3624
3625/* ------------------------------ */
3626    .balign 128
3627.L_op_invoke_interface: /* 0x72 */
3628/* File: mips/op_invoke_interface.S */
3629/* File: mips/invoke.S */
3630    /*
3631     * Generic invoke handler wrapper.
3632     */
3633    # op vB, {vD, vE, vF, vG, vA}, class   /* CCCC */
3634    # op {vCCCC..v(CCCC+AA-1)}, meth       /* BBBB */
3635    .extern MterpInvokeInterface
3636    EXPORT_PC()
3637    move    a0, rSELF
3638    addu    a1, rFP, OFF_FP_SHADOWFRAME
3639    move    a2, rPC
3640    move    a3, rINST
3641    JAL(MterpInvokeInterface)
3642    beqz    v0, MterpException
3643    FETCH_ADVANCE_INST(3)
3644    JAL(MterpShouldSwitchInterpreters)
3645    bnez    v0, MterpFallback
3646    GET_INST_OPCODE(t0)
3647    GOTO_OPCODE(t0)
3648
3649
3650/* ------------------------------ */
3651    .balign 128
3652.L_op_return_void_no_barrier: /* 0x73 */
3653/* File: mips/op_return_void_no_barrier.S */
3654    lw     ra, THREAD_FLAGS_OFFSET(rSELF)
3655    move   a0, rSELF
3656    and    ra, (THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
3657    beqz   ra, 1f
3658    JAL(MterpSuspendCheck)                 # (self)
36591:
3660    move   v0, zero
3661    move   v1, zero
3662    b      MterpReturn
3663
3664/* ------------------------------ */
3665    .balign 128
3666.L_op_invoke_virtual_range: /* 0x74 */
3667/* File: mips/op_invoke_virtual_range.S */
3668/* File: mips/invoke.S */
3669    /*
3670     * Generic invoke handler wrapper.
3671     */
3672    # op vB, {vD, vE, vF, vG, vA}, class   /* CCCC */
3673    # op {vCCCC..v(CCCC+AA-1)}, meth       /* BBBB */
3674    .extern MterpInvokeVirtualRange
3675    EXPORT_PC()
3676    move    a0, rSELF
3677    addu    a1, rFP, OFF_FP_SHADOWFRAME
3678    move    a2, rPC
3679    move    a3, rINST
3680    JAL(MterpInvokeVirtualRange)
3681    beqz    v0, MterpException
3682    FETCH_ADVANCE_INST(3)
3683    JAL(MterpShouldSwitchInterpreters)
3684    bnez    v0, MterpFallback
3685    GET_INST_OPCODE(t0)
3686    GOTO_OPCODE(t0)
3687
3688
3689/* ------------------------------ */
3690    .balign 128
3691.L_op_invoke_super_range: /* 0x75 */
3692/* File: mips/op_invoke_super_range.S */
3693/* File: mips/invoke.S */
3694    /*
3695     * Generic invoke handler wrapper.
3696     */
3697    # op vB, {vD, vE, vF, vG, vA}, class   /* CCCC */
3698    # op {vCCCC..v(CCCC+AA-1)}, meth       /* BBBB */
3699    .extern MterpInvokeSuperRange
3700    EXPORT_PC()
3701    move    a0, rSELF
3702    addu    a1, rFP, OFF_FP_SHADOWFRAME
3703    move    a2, rPC
3704    move    a3, rINST
3705    JAL(MterpInvokeSuperRange)
3706    beqz    v0, MterpException
3707    FETCH_ADVANCE_INST(3)
3708    JAL(MterpShouldSwitchInterpreters)
3709    bnez    v0, MterpFallback
3710    GET_INST_OPCODE(t0)
3711    GOTO_OPCODE(t0)
3712
3713
3714/* ------------------------------ */
3715    .balign 128
3716.L_op_invoke_direct_range: /* 0x76 */
3717/* File: mips/op_invoke_direct_range.S */
3718/* File: mips/invoke.S */
3719    /*
3720     * Generic invoke handler wrapper.
3721     */
3722    # op vB, {vD, vE, vF, vG, vA}, class   /* CCCC */
3723    # op {vCCCC..v(CCCC+AA-1)}, meth       /* BBBB */
3724    .extern MterpInvokeDirectRange
3725    EXPORT_PC()
3726    move    a0, rSELF
3727    addu    a1, rFP, OFF_FP_SHADOWFRAME
3728    move    a2, rPC
3729    move    a3, rINST
3730    JAL(MterpInvokeDirectRange)
3731    beqz    v0, MterpException
3732    FETCH_ADVANCE_INST(3)
3733    JAL(MterpShouldSwitchInterpreters)
3734    bnez    v0, MterpFallback
3735    GET_INST_OPCODE(t0)
3736    GOTO_OPCODE(t0)
3737
3738
3739/* ------------------------------ */
3740    .balign 128
3741.L_op_invoke_static_range: /* 0x77 */
3742/* File: mips/op_invoke_static_range.S */
3743/* File: mips/invoke.S */
3744    /*
3745     * Generic invoke handler wrapper.
3746     */
3747    # op vB, {vD, vE, vF, vG, vA}, class   /* CCCC */
3748    # op {vCCCC..v(CCCC+AA-1)}, meth       /* BBBB */
3749    .extern MterpInvokeStaticRange
3750    EXPORT_PC()
3751    move    a0, rSELF
3752    addu    a1, rFP, OFF_FP_SHADOWFRAME
3753    move    a2, rPC
3754    move    a3, rINST
3755    JAL(MterpInvokeStaticRange)
3756    beqz    v0, MterpException
3757    FETCH_ADVANCE_INST(3)
3758    JAL(MterpShouldSwitchInterpreters)
3759    bnez    v0, MterpFallback
3760    GET_INST_OPCODE(t0)
3761    GOTO_OPCODE(t0)
3762
3763
3764/* ------------------------------ */
3765    .balign 128
3766.L_op_invoke_interface_range: /* 0x78 */
3767/* File: mips/op_invoke_interface_range.S */
3768/* File: mips/invoke.S */
3769    /*
3770     * Generic invoke handler wrapper.
3771     */
3772    # op vB, {vD, vE, vF, vG, vA}, class   /* CCCC */
3773    # op {vCCCC..v(CCCC+AA-1)}, meth       /* BBBB */
3774    .extern MterpInvokeInterfaceRange
3775    EXPORT_PC()
3776    move    a0, rSELF
3777    addu    a1, rFP, OFF_FP_SHADOWFRAME
3778    move    a2, rPC
3779    move    a3, rINST
3780    JAL(MterpInvokeInterfaceRange)
3781    beqz    v0, MterpException
3782    FETCH_ADVANCE_INST(3)
3783    JAL(MterpShouldSwitchInterpreters)
3784    bnez    v0, MterpFallback
3785    GET_INST_OPCODE(t0)
3786    GOTO_OPCODE(t0)
3787
3788
3789/* ------------------------------ */
3790    .balign 128
3791.L_op_unused_79: /* 0x79 */
3792/* File: mips/op_unused_79.S */
3793/* File: mips/unused.S */
3794/*
3795 * Bail to reference interpreter to throw.
3796 */
3797  b MterpFallback
3798
3799
3800/* ------------------------------ */
3801    .balign 128
3802.L_op_unused_7a: /* 0x7a */
3803/* File: mips/op_unused_7a.S */
3804/* File: mips/unused.S */
3805/*
3806 * Bail to reference interpreter to throw.
3807 */
3808  b MterpFallback
3809
3810
3811/* ------------------------------ */
3812    .balign 128
3813.L_op_neg_int: /* 0x7b */
3814/* File: mips/op_neg_int.S */
3815/* File: mips/unop.S */
3816    /*
3817     * Generic 32-bit unary operation.  Provide an "instr" line that
3818     * specifies an instruction that performs "result = op a0".
3819     * This could be a MIPS instruction or a function call.
3820     *
3821     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3822     *      int-to-byte, int-to-char, int-to-short
3823     */
3824    /* unop vA, vB */
3825    GET_OPB(a3)                            #  a3 <- B
3826    GET_OPA4(t0)                           #  t0 <- A+
3827    GET_VREG(a0, a3)                       #  a0 <- vB
3828    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
3829                                  #  optional op
3830    negu a0, a0                                 #  a0 <- op, a0-a3 changed
3831    GET_INST_OPCODE(t1)                    #  extract opcode from rINST
3832    SET_VREG_GOTO(a0, t0, t1)        #  vAA <- result0
3833    /* 9-10 instructions */
3834
3835
3836/* ------------------------------ */
3837    .balign 128
3838.L_op_not_int: /* 0x7c */
3839/* File: mips/op_not_int.S */
3840/* File: mips/unop.S */
3841    /*
3842     * Generic 32-bit unary operation.  Provide an "instr" line that
3843     * specifies an instruction that performs "result = op a0".
3844     * This could be a MIPS instruction or a function call.
3845     *
3846     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3847     *      int-to-byte, int-to-char, int-to-short
3848     */
3849    /* unop vA, vB */
3850    GET_OPB(a3)                            #  a3 <- B
3851    GET_OPA4(t0)                           #  t0 <- A+
3852    GET_VREG(a0, a3)                       #  a0 <- vB
3853    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
3854                                  #  optional op
3855    not a0, a0                                 #  a0 <- op, a0-a3 changed
3856    GET_INST_OPCODE(t1)                    #  extract opcode from rINST
3857    SET_VREG_GOTO(a0, t0, t1)        #  vAA <- result0
3858    /* 9-10 instructions */
3859
3860
3861/* ------------------------------ */
3862    .balign 128
3863.L_op_neg_long: /* 0x7d */
3864/* File: mips/op_neg_long.S */
3865/* File: mips/unopWide.S */
3866    /*
3867     * Generic 64-bit unary operation.  Provide an "instr" line that
3868     * specifies an instruction that performs "result = op a0/a1".
3869     * This could be MIPS instruction or a function call.
3870     *
3871     * For: neg-long, not-long, neg-double,
3872     */
3873    /* unop vA, vB */
3874    GET_OPA4(rOBJ)                         #  rOBJ <- A+
3875    GET_OPB(a3)                            #  a3 <- B
3876    EAS2(a3, rFP, a3)                      #  a3 <- &fp[B]
3877    LOAD64(a0, a1, a3)                     #  a0/a1 <- vAA
3878    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
3879    negu v0, a0                              #  optional op
3880    negu v1, a1; sltu a0, zero, v0; subu v1, v1, a0                                 #  a0/a1 <- op, a2-a3 changed
3881    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
3882    SET_VREG64(v0, v1, rOBJ)   #  vAA <- a0/a1
3883    GOTO_OPCODE(t0)                        #  jump to next instruction
3884    /* 12-13 instructions */
3885
3886
3887/* ------------------------------ */
3888    .balign 128
3889.L_op_not_long: /* 0x7e */
3890/* File: mips/op_not_long.S */
3891/* File: mips/unopWide.S */
3892    /*
3893     * Generic 64-bit unary operation.  Provide an "instr" line that
3894     * specifies an instruction that performs "result = op a0/a1".
3895     * This could be MIPS instruction or a function call.
3896     *
3897     * For: neg-long, not-long, neg-double,
3898     */
3899    /* unop vA, vB */
3900    GET_OPA4(rOBJ)                         #  rOBJ <- A+
3901    GET_OPB(a3)                            #  a3 <- B
3902    EAS2(a3, rFP, a3)                      #  a3 <- &fp[B]
3903    LOAD64(a0, a1, a3)                     #  a0/a1 <- vAA
3904    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
3905    not a0, a0                              #  optional op
3906    not a1, a1                                 #  a0/a1 <- op, a2-a3 changed
3907    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
3908    SET_VREG64(a0, a1, rOBJ)   #  vAA <- a0/a1
3909    GOTO_OPCODE(t0)                        #  jump to next instruction
3910    /* 12-13 instructions */
3911
3912
3913/* ------------------------------ */
3914    .balign 128
3915.L_op_neg_float: /* 0x7f */
3916/* File: mips/op_neg_float.S */
3917/* File: mips/unop.S */
3918    /*
3919     * Generic 32-bit unary operation.  Provide an "instr" line that
3920     * specifies an instruction that performs "result = op a0".
3921     * This could be a MIPS instruction or a function call.
3922     *
3923     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3924     *      int-to-byte, int-to-char, int-to-short
3925     */
3926    /* unop vA, vB */
3927    GET_OPB(a3)                            #  a3 <- B
3928    GET_OPA4(t0)                           #  t0 <- A+
3929    GET_VREG(a0, a3)                       #  a0 <- vB
3930    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
3931                                  #  optional op
3932    addu a0, a0, 0x80000000                                 #  a0 <- op, a0-a3 changed
3933    GET_INST_OPCODE(t1)                    #  extract opcode from rINST
3934    SET_VREG_GOTO(a0, t0, t1)        #  vAA <- result0
3935    /* 9-10 instructions */
3936
3937
3938/* ------------------------------ */
3939    .balign 128
3940.L_op_neg_double: /* 0x80 */
3941/* File: mips/op_neg_double.S */
3942/* File: mips/unopWide.S */
3943    /*
3944     * Generic 64-bit unary operation.  Provide an "instr" line that
3945     * specifies an instruction that performs "result = op a0/a1".
3946     * This could be MIPS instruction or a function call.
3947     *
3948     * For: neg-long, not-long, neg-double,
3949     */
3950    /* unop vA, vB */
3951    GET_OPA4(rOBJ)                         #  rOBJ <- A+
3952    GET_OPB(a3)                            #  a3 <- B
3953    EAS2(a3, rFP, a3)                      #  a3 <- &fp[B]
3954    LOAD64(a0, a1, a3)                     #  a0/a1 <- vAA
3955    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
3956                                  #  optional op
3957    addu a1, a1, 0x80000000                                 #  a0/a1 <- op, a2-a3 changed
3958    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
3959    SET_VREG64(a0, a1, rOBJ)   #  vAA <- a0/a1
3960    GOTO_OPCODE(t0)                        #  jump to next instruction
3961    /* 12-13 instructions */
3962
3963
3964/* ------------------------------ */
3965    .balign 128
3966.L_op_int_to_long: /* 0x81 */
3967/* File: mips/op_int_to_long.S */
3968/* File: mips/unopWider.S */
3969    /*
3970     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
3971     * that specifies an instruction that performs "result = op a0", where
3972     * "result" is a 64-bit quantity in a0/a1.
3973     *
3974     * For: int-to-long
3975     */
3976    /* unop vA, vB */
3977    GET_OPA4(rOBJ)                         #  rOBJ <- A+
3978    GET_OPB(a3)                            #  a3 <- B
3979    GET_VREG(a0, a3)                       #  a0 <- vB
3980    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
3981                                  #  optional op
3982    sra a1, a0, 31                                 #  result <- op, a0-a3 changed
3983    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
3984    SET_VREG64(a0, a1, rOBJ)   #  vA/vA+1 <- a0/a1
3985    GOTO_OPCODE(t0)                        #  jump to next instruction
3986    /* 10-11 instructions */
3987
3988
3989/* ------------------------------ */
3990    .balign 128
3991.L_op_int_to_float: /* 0x82 */
3992/* File: mips/op_int_to_float.S */
3993/* File: mips/funop.S */
3994    /*
3995     * Generic 32-bit unary operation.  Provide an "instr" line that
3996     * specifies an instruction that performs "result = op a0".
3997     * This could be a MIPS instruction or a function call.
3998     *
3999     * for: int-to-float, float-to-int
4000     */
4001    /* unop vA, vB */
4002    GET_OPB(a3)                            #  a3 <- B
4003    GET_OPA4(rOBJ)                         #  t0 <- A+
4004    GET_VREG_F(fa0, a3)
4005    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
4006    cvt.s.w fv0, fa0
4007
4008.Lop_int_to_float_set_vreg_f:
4009    SET_VREG_F(fv0, rOBJ)
4010    GET_INST_OPCODE(t1)                    #  extract opcode from rINST
4011    GOTO_OPCODE(t1)                        #  jump to next instruction
4012
4013
4014/* ------------------------------ */
4015    .balign 128
4016.L_op_int_to_double: /* 0x83 */
4017/* File: mips/op_int_to_double.S */
4018/* File: mips/funopWider.S */
4019    /*
4020     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
4021     * that specifies an instruction that performs "result = op a0", where
4022     * "result" is a 64-bit quantity in a0/a1.
4023     *
4024     * For: int-to-double, float-to-long, float-to-double
4025     */
4026    /* unop vA, vB */
4027    GET_OPA4(rOBJ)                         #  rOBJ <- A+
4028    GET_OPB(a3)                            #  a3 <- B
4029    GET_VREG_F(fa0, a3)
4030    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
4031    cvt.d.w fv0, fa0
4032
4033.Lop_int_to_double_set_vreg:
4034    SET_VREG64_F(fv0, fv0f, rOBJ)                             #  vA/vA+1 <- a0/a1
4035    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
4036    GOTO_OPCODE(t0)                        #  jump to next instruction
4037
4038
4039/* ------------------------------ */
4040    .balign 128
4041.L_op_long_to_int: /* 0x84 */
4042/* File: mips/op_long_to_int.S */
4043/* we ignore the high word, making this equivalent to a 32-bit reg move */
4044/* File: mips/op_move.S */
4045    /* for move, move-object, long-to-int */
4046    /* op vA, vB */
4047    GET_OPB(a1)                            #  a1 <- B from 15:12
4048    GET_OPA4(a0)                           #  a0 <- A from 11:8
4049    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
4050    GET_VREG(a2, a1)                       #  a2 <- fp[B]
4051    GET_INST_OPCODE(t0)                    #  t0 <- opcode from rINST
4052    .if 0
4053    SET_VREG_OBJECT(a2, a0)                #  fp[A] <- a2
4054    .else
4055    SET_VREG(a2, a0)                       #  fp[A] <- a2
4056    .endif
4057    GOTO_OPCODE(t0)                        #  jump to next instruction
4058
4059
4060/* ------------------------------ */
4061    .balign 128
4062.L_op_long_to_float: /* 0x85 */
4063/* File: mips/op_long_to_float.S */
4064/* File: mips/unopNarrower.S */
4065    /*
4066     * Generic 64bit-to-32bit unary operation.  Provide an "instr" line
4067     * that specifies an instruction that performs "result = op a0/a1", where
4068     * "result" is a 32-bit quantity in a0.
4069     *
4070     * For: long-to-float, double-to-int, double-to-float
4071     * If hard floating point support is available, use fa0 as the parameter,
4072     * except for long-to-float opcode.
4073     * (This would work for long-to-int, but that instruction is actually
4074     * an exact match for OP_MOVE.)
4075     */
4076    /* unop vA, vB */
4077    GET_OPB(a3)                            #  a3 <- B
4078    GET_OPA4(rOBJ)                         #  t1 <- A+
4079    EAS2(a3, rFP, a3)                      #  a3 <- &fp[B]
4080    LOAD64(rARG0, rARG1, a3)
4081    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
4082    JAL(__floatdisf)
4083
4084.Lop_long_to_float_set_vreg_f:
4085    SET_VREG_F(fv0, rOBJ)                  #  vA <- result0
4086    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
4087    GOTO_OPCODE(t0)                        #  jump to next instruction
4088
4089
4090/* ------------------------------ */
4091    .balign 128
4092.L_op_long_to_double: /* 0x86 */
4093/* File: mips/op_long_to_double.S */
4094/* File: mips/funopWide.S */
4095    /*
4096     * Generic 64-bit unary operation.  Provide an "instr" line that
4097     * specifies an instruction that performs "result = op a0/a1".
4098     * This could be a MIPS instruction or a function call.
4099     *
4100     * long-to-double, double-to-long
4101     */
4102    /* unop vA, vB */
4103    GET_OPA4(rOBJ)                         #  t1 <- A+
4104    GET_OPB(a3)                            #  a3 <- B
4105    EAS2(a3, rFP, a3)                      #  a3 <- &fp[B]
4106    LOAD64(rARG0, rARG1, a3)
4107    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
4108                                  #  optional op
4109    JAL(__floatdidf)                                 #  a0/a1 <- op, a2-a3 changed
4110
4111.Lop_long_to_double_set_vreg:
4112    SET_VREG64_F(fv0, fv0f, rOBJ)                             #  vAA <- a0/a1
4113    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
4114    GOTO_OPCODE(t0)                        #  jump to next instruction
4115    /* 12-13 instructions */
4116
4117
4118/* ------------------------------ */
4119    .balign 128
4120.L_op_float_to_int: /* 0x87 */
4121/* File: mips/op_float_to_int.S */
4122/* File: mips/funop.S */
4123    /*
4124     * Generic 32-bit unary operation.  Provide an "instr" line that
4125     * specifies an instruction that performs "result = op a0".
4126     * This could be a MIPS instruction or a function call.
4127     *
4128     * for: int-to-float, float-to-int
4129     */
4130    /* unop vA, vB */
4131    GET_OPB(a3)                            #  a3 <- B
4132    GET_OPA4(rOBJ)                         #  t0 <- A+
4133    GET_VREG_F(fa0, a3)
4134    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
4135    b f2i_doconv
4136
4137.Lop_float_to_int_set_vreg_f:
4138    SET_VREG_F(fv0, rOBJ)
4139    GET_INST_OPCODE(t1)                    #  extract opcode from rINST
4140    GOTO_OPCODE(t1)                        #  jump to next instruction
4141
4142
4143/* ------------------------------ */
4144    .balign 128
4145.L_op_float_to_long: /* 0x88 */
4146/* File: mips/op_float_to_long.S */
4147/* File: mips/funopWider.S */
4148    /*
4149     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
4150     * that specifies an instruction that performs "result = op a0", where
4151     * "result" is a 64-bit quantity in a0/a1.
4152     *
4153     * For: int-to-double, float-to-long, float-to-double
4154     */
4155    /* unop vA, vB */
4156    GET_OPA4(rOBJ)                         #  rOBJ <- A+
4157    GET_OPB(a3)                            #  a3 <- B
4158    GET_VREG_F(fa0, a3)
4159    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
4160    b f2l_doconv
4161
4162.Lop_float_to_long_set_vreg:
4163    SET_VREG64(rRESULT0, rRESULT1, rOBJ)                             #  vA/vA+1 <- a0/a1
4164    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
4165    GOTO_OPCODE(t0)                        #  jump to next instruction
4166
4167
4168/* ------------------------------ */
4169    .balign 128
4170.L_op_float_to_double: /* 0x89 */
4171/* File: mips/op_float_to_double.S */
4172/* File: mips/funopWider.S */
4173    /*
4174     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
4175     * that specifies an instruction that performs "result = op a0", where
4176     * "result" is a 64-bit quantity in a0/a1.
4177     *
4178     * For: int-to-double, float-to-long, float-to-double
4179     */
4180    /* unop vA, vB */
4181    GET_OPA4(rOBJ)                         #  rOBJ <- A+
4182    GET_OPB(a3)                            #  a3 <- B
4183    GET_VREG_F(fa0, a3)
4184    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
4185    cvt.d.s fv0, fa0
4186
4187.Lop_float_to_double_set_vreg:
4188    SET_VREG64_F(fv0, fv0f, rOBJ)                             #  vA/vA+1 <- a0/a1
4189    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
4190    GOTO_OPCODE(t0)                        #  jump to next instruction
4191
4192
4193/* ------------------------------ */
4194    .balign 128
4195.L_op_double_to_int: /* 0x8a */
4196/* File: mips/op_double_to_int.S */
4197/* File: mips/unopNarrower.S */
4198    /*
4199     * Generic 64bit-to-32bit unary operation.  Provide an "instr" line
4200     * that specifies an instruction that performs "result = op a0/a1", where
4201     * "result" is a 32-bit quantity in a0.
4202     *
4203     * For: long-to-float, double-to-int, double-to-float
4204     * If hard floating point support is available, use fa0 as the parameter,
4205     * except for long-to-float opcode.
4206     * (This would work for long-to-int, but that instruction is actually
4207     * an exact match for OP_MOVE.)
4208     */
4209    /* unop vA, vB */
4210    GET_OPB(a3)                            #  a3 <- B
4211    GET_OPA4(rOBJ)                         #  t1 <- A+
4212    EAS2(a3, rFP, a3)                      #  a3 <- &fp[B]
4213    LOAD64_F(fa0, fa0f, a3)
4214    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
4215    b d2i_doconv
4216
4217.Lop_double_to_int_set_vreg_f:
4218    SET_VREG_F(fv0, rOBJ)                  #  vA <- result0
4219    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
4220    GOTO_OPCODE(t0)                        #  jump to next instruction
4221
4222/*
4223 * Convert the double in a0/a1 to an int in a0.
4224 *
4225 * We have to clip values to int min/max per the specification.  The
4226 * expected common case is a "reasonable" value that converts directly
4227 * to modest integer.  The EABI convert function isn't doing this for us.
4228 */
4229
4230/* ------------------------------ */
4231    .balign 128
4232.L_op_double_to_long: /* 0x8b */
4233/* File: mips/op_double_to_long.S */
4234/* File: mips/funopWide.S */
4235    /*
4236     * Generic 64-bit unary operation.  Provide an "instr" line that
4237     * specifies an instruction that performs "result = op a0/a1".
4238     * This could be a MIPS instruction or a function call.
4239     *
4240     * long-to-double, double-to-long
4241     */
4242    /* unop vA, vB */
4243    GET_OPA4(rOBJ)                         #  t1 <- A+
4244    GET_OPB(a3)                            #  a3 <- B
4245    EAS2(a3, rFP, a3)                      #  a3 <- &fp[B]
4246    LOAD64_F(fa0, fa0f, a3)
4247    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
4248                                  #  optional op
4249    b d2l_doconv                                 #  a0/a1 <- op, a2-a3 changed
4250
4251.Lop_double_to_long_set_vreg:
4252    SET_VREG64(rRESULT0, rRESULT1, rOBJ)                             #  vAA <- a0/a1
4253    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
4254    GOTO_OPCODE(t0)                        #  jump to next instruction
4255    /* 12-13 instructions */
4256
4257
4258/* ------------------------------ */
4259    .balign 128
4260.L_op_double_to_float: /* 0x8c */
4261/* File: mips/op_double_to_float.S */
4262/* File: mips/unopNarrower.S */
4263    /*
4264     * Generic 64bit-to-32bit unary operation.  Provide an "instr" line
4265     * that specifies an instruction that performs "result = op a0/a1", where
4266     * "result" is a 32-bit quantity in a0.
4267     *
4268     * For: long-to-float, double-to-int, double-to-float
4269     * If hard floating point support is available, use fa0 as the parameter,
4270     * except for long-to-float opcode.
4271     * (This would work for long-to-int, but that instruction is actually
4272     * an exact match for OP_MOVE.)
4273     */
4274    /* unop vA, vB */
4275    GET_OPB(a3)                            #  a3 <- B
4276    GET_OPA4(rOBJ)                         #  t1 <- A+
4277    EAS2(a3, rFP, a3)                      #  a3 <- &fp[B]
4278    LOAD64_F(fa0, fa0f, a3)
4279    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
4280    cvt.s.d fv0, fa0
4281
4282.Lop_double_to_float_set_vreg_f:
4283    SET_VREG_F(fv0, rOBJ)                  #  vA <- result0
4284    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
4285    GOTO_OPCODE(t0)                        #  jump to next instruction
4286
4287
4288/* ------------------------------ */
4289    .balign 128
4290.L_op_int_to_byte: /* 0x8d */
4291/* File: mips/op_int_to_byte.S */
4292/* File: mips/unop.S */
4293    /*
4294     * Generic 32-bit unary operation.  Provide an "instr" line that
4295     * specifies an instruction that performs "result = op a0".
4296     * This could be a MIPS instruction or a function call.
4297     *
4298     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4299     *      int-to-byte, int-to-char, int-to-short
4300     */
4301    /* unop vA, vB */
4302    GET_OPB(a3)                            #  a3 <- B
4303    GET_OPA4(t0)                           #  t0 <- A+
4304    GET_VREG(a0, a3)                       #  a0 <- vB
4305    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
4306    sll a0, a0, 24                              #  optional op
4307    sra a0, a0, 24                                 #  a0 <- op, a0-a3 changed
4308    GET_INST_OPCODE(t1)                    #  extract opcode from rINST
4309    SET_VREG_GOTO(a0, t0, t1)        #  vAA <- result0
4310    /* 9-10 instructions */
4311
4312
4313/* ------------------------------ */
4314    .balign 128
4315.L_op_int_to_char: /* 0x8e */
4316/* File: mips/op_int_to_char.S */
4317/* File: mips/unop.S */
4318    /*
4319     * Generic 32-bit unary operation.  Provide an "instr" line that
4320     * specifies an instruction that performs "result = op a0".
4321     * This could be a MIPS instruction or a function call.
4322     *
4323     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4324     *      int-to-byte, int-to-char, int-to-short
4325     */
4326    /* unop vA, vB */
4327    GET_OPB(a3)                            #  a3 <- B
4328    GET_OPA4(t0)                           #  t0 <- A+
4329    GET_VREG(a0, a3)                       #  a0 <- vB
4330    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
4331                                  #  optional op
4332    and a0, 0xffff                                 #  a0 <- op, a0-a3 changed
4333    GET_INST_OPCODE(t1)                    #  extract opcode from rINST
4334    SET_VREG_GOTO(a0, t0, t1)        #  vAA <- result0
4335    /* 9-10 instructions */
4336
4337
4338/* ------------------------------ */
4339    .balign 128
4340.L_op_int_to_short: /* 0x8f */
4341/* File: mips/op_int_to_short.S */
4342/* File: mips/unop.S */
4343    /*
4344     * Generic 32-bit unary operation.  Provide an "instr" line that
4345     * specifies an instruction that performs "result = op a0".
4346     * This could be a MIPS instruction or a function call.
4347     *
4348     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4349     *      int-to-byte, int-to-char, int-to-short
4350     */
4351    /* unop vA, vB */
4352    GET_OPB(a3)                            #  a3 <- B
4353    GET_OPA4(t0)                           #  t0 <- A+
4354    GET_VREG(a0, a3)                       #  a0 <- vB
4355    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
4356    sll a0, 16                              #  optional op
4357    sra a0, 16                                 #  a0 <- op, a0-a3 changed
4358    GET_INST_OPCODE(t1)                    #  extract opcode from rINST
4359    SET_VREG_GOTO(a0, t0, t1)        #  vAA <- result0
4360    /* 9-10 instructions */
4361
4362
4363/* ------------------------------ */
4364    .balign 128
4365.L_op_add_int: /* 0x90 */
4366/* File: mips/op_add_int.S */
4367/* File: mips/binop.S */
4368    /*
4369     * Generic 32-bit binary operation.  Provide an "instr" line that
4370     * specifies an instruction that performs "result = a0 op a1".
4371     * This could be a MIPS instruction or a function call.  (If the result
4372     * comes back in a register other than a0, you can override "result".)
4373     *
4374     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4375     * vCC (a1).  Useful for integer division and modulus.  Note that we
4376     * *don't* check for (INT_MIN / -1) here, because the CPU handles it
4377     * correctly.
4378     *
4379     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4380     *      xor-int, shl-int, shr-int, ushr-int
4381     */
4382    /* binop vAA, vBB, vCC */
4383    FETCH(a0, 1)                           #  a0 <- CCBB
4384    GET_OPA(rOBJ)                          #  rOBJ <- AA
4385    srl       a3, a0, 8                    #  a3 <- CC
4386    and       a2, a0, 255                  #  a2 <- BB
4387    GET_VREG(a1, a3)                       #  a1 <- vCC
4388    GET_VREG(a0, a2)                       #  a0 <- vBB
4389    .if 0
4390    # is second operand zero?
4391    beqz      a1, common_errDivideByZero
4392    .endif
4393
4394    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
4395                                  #  optional op
4396    addu a0, a0, a1                                 #  a0 <- op, a0-a3 changed
4397    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
4398    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
4399    /* 11-14 instructions */
4400
4401
4402/* ------------------------------ */
4403    .balign 128
4404.L_op_sub_int: /* 0x91 */
4405/* File: mips/op_sub_int.S */
4406/* File: mips/binop.S */
4407    /*
4408     * Generic 32-bit binary operation.  Provide an "instr" line that
4409     * specifies an instruction that performs "result = a0 op a1".
4410     * This could be a MIPS instruction or a function call.  (If the result
4411     * comes back in a register other than a0, you can override "result".)
4412     *
4413     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4414     * vCC (a1).  Useful for integer division and modulus.  Note that we
4415     * *don't* check for (INT_MIN / -1) here, because the CPU handles it
4416     * correctly.
4417     *
4418     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4419     *      xor-int, shl-int, shr-int, ushr-int
4420     */
4421    /* binop vAA, vBB, vCC */
4422    FETCH(a0, 1)                           #  a0 <- CCBB
4423    GET_OPA(rOBJ)                          #  rOBJ <- AA
4424    srl       a3, a0, 8                    #  a3 <- CC
4425    and       a2, a0, 255                  #  a2 <- BB
4426    GET_VREG(a1, a3)                       #  a1 <- vCC
4427    GET_VREG(a0, a2)                       #  a0 <- vBB
4428    .if 0
4429    # is second operand zero?
4430    beqz      a1, common_errDivideByZero
4431    .endif
4432
4433    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
4434                                  #  optional op
4435    subu a0, a0, a1                                 #  a0 <- op, a0-a3 changed
4436    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
4437    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
4438    /* 11-14 instructions */
4439
4440
4441/* ------------------------------ */
4442    .balign 128
4443.L_op_mul_int: /* 0x92 */
4444/* File: mips/op_mul_int.S */
4445/* File: mips/binop.S */
4446    /*
4447     * Generic 32-bit binary operation.  Provide an "instr" line that
4448     * specifies an instruction that performs "result = a0 op a1".
4449     * This could be a MIPS instruction or a function call.  (If the result
4450     * comes back in a register other than a0, you can override "result".)
4451     *
4452     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4453     * vCC (a1).  Useful for integer division and modulus.  Note that we
4454     * *don't* check for (INT_MIN / -1) here, because the CPU handles it
4455     * correctly.
4456     *
4457     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4458     *      xor-int, shl-int, shr-int, ushr-int
4459     */
4460    /* binop vAA, vBB, vCC */
4461    FETCH(a0, 1)                           #  a0 <- CCBB
4462    GET_OPA(rOBJ)                          #  rOBJ <- AA
4463    srl       a3, a0, 8                    #  a3 <- CC
4464    and       a2, a0, 255                  #  a2 <- BB
4465    GET_VREG(a1, a3)                       #  a1 <- vCC
4466    GET_VREG(a0, a2)                       #  a0 <- vBB
4467    .if 0
4468    # is second operand zero?
4469    beqz      a1, common_errDivideByZero
4470    .endif
4471
4472    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
4473                                  #  optional op
4474    mul a0, a0, a1                                 #  a0 <- op, a0-a3 changed
4475    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
4476    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
4477    /* 11-14 instructions */
4478
4479
4480/* ------------------------------ */
4481    .balign 128
4482.L_op_div_int: /* 0x93 */
4483/* File: mips/op_div_int.S */
4484#ifdef MIPS32REVGE6
4485/* File: mips/binop.S */
4486    /*
4487     * Generic 32-bit binary operation.  Provide an "instr" line that
4488     * specifies an instruction that performs "result = a0 op a1".
4489     * This could be a MIPS instruction or a function call.  (If the result
4490     * comes back in a register other than a0, you can override "result".)
4491     *
4492     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4493     * vCC (a1).  Useful for integer division and modulus.  Note that we
4494     * *don't* check for (INT_MIN / -1) here, because the CPU handles it
4495     * correctly.
4496     *
4497     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4498     *      xor-int, shl-int, shr-int, ushr-int
4499     */
4500    /* binop vAA, vBB, vCC */
4501    FETCH(a0, 1)                           #  a0 <- CCBB
4502    GET_OPA(rOBJ)                          #  rOBJ <- AA
4503    srl       a3, a0, 8                    #  a3 <- CC
4504    and       a2, a0, 255                  #  a2 <- BB
4505    GET_VREG(a1, a3)                       #  a1 <- vCC
4506    GET_VREG(a0, a2)                       #  a0 <- vBB
4507    .if 1
4508    # is second operand zero?
4509    beqz      a1, common_errDivideByZero
4510    .endif
4511
4512    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
4513                                  #  optional op
4514    div a0, a0, a1                                 #  a0 <- op, a0-a3 changed
4515    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
4516    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
4517    /* 11-14 instructions */
4518
4519#else
4520/* File: mips/binop.S */
4521    /*
4522     * Generic 32-bit binary operation.  Provide an "instr" line that
4523     * specifies an instruction that performs "result = a0 op a1".
4524     * This could be a MIPS instruction or a function call.  (If the result
4525     * comes back in a register other than a0, you can override "result".)
4526     *
4527     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4528     * vCC (a1).  Useful for integer division and modulus.  Note that we
4529     * *don't* check for (INT_MIN / -1) here, because the CPU handles it
4530     * correctly.
4531     *
4532     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4533     *      xor-int, shl-int, shr-int, ushr-int
4534     */
4535    /* binop vAA, vBB, vCC */
4536    FETCH(a0, 1)                           #  a0 <- CCBB
4537    GET_OPA(rOBJ)                          #  rOBJ <- AA
4538    srl       a3, a0, 8                    #  a3 <- CC
4539    and       a2, a0, 255                  #  a2 <- BB
4540    GET_VREG(a1, a3)                       #  a1 <- vCC
4541    GET_VREG(a0, a2)                       #  a0 <- vBB
4542    .if 1
4543    # is second operand zero?
4544    beqz      a1, common_errDivideByZero
4545    .endif
4546
4547    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
4548    div zero, a0, a1                              #  optional op
4549    mflo a0                                 #  a0 <- op, a0-a3 changed
4550    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
4551    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
4552    /* 11-14 instructions */
4553
4554#endif
4555
4556/* ------------------------------ */
4557    .balign 128
4558.L_op_rem_int: /* 0x94 */
4559/* File: mips/op_rem_int.S */
4560#ifdef MIPS32REVGE6
4561/* File: mips/binop.S */
4562    /*
4563     * Generic 32-bit binary operation.  Provide an "instr" line that
4564     * specifies an instruction that performs "result = a0 op a1".
4565     * This could be a MIPS instruction or a function call.  (If the result
4566     * comes back in a register other than a0, you can override "result".)
4567     *
4568     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4569     * vCC (a1).  Useful for integer division and modulus.  Note that we
4570     * *don't* check for (INT_MIN / -1) here, because the CPU handles it
4571     * correctly.
4572     *
4573     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4574     *      xor-int, shl-int, shr-int, ushr-int
4575     */
4576    /* binop vAA, vBB, vCC */
4577    FETCH(a0, 1)                           #  a0 <- CCBB
4578    GET_OPA(rOBJ)                          #  rOBJ <- AA
4579    srl       a3, a0, 8                    #  a3 <- CC
4580    and       a2, a0, 255                  #  a2 <- BB
4581    GET_VREG(a1, a3)                       #  a1 <- vCC
4582    GET_VREG(a0, a2)                       #  a0 <- vBB
4583    .if 1
4584    # is second operand zero?
4585    beqz      a1, common_errDivideByZero
4586    .endif
4587
4588    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
4589                                  #  optional op
4590    mod a0, a0, a1                                 #  a0 <- op, a0-a3 changed
4591    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
4592    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
4593    /* 11-14 instructions */
4594
4595#else
4596/* File: mips/binop.S */
4597    /*
4598     * Generic 32-bit binary operation.  Provide an "instr" line that
4599     * specifies an instruction that performs "result = a0 op a1".
4600     * This could be a MIPS instruction or a function call.  (If the result
4601     * comes back in a register other than a0, you can override "result".)
4602     *
4603     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4604     * vCC (a1).  Useful for integer division and modulus.  Note that we
4605     * *don't* check for (INT_MIN / -1) here, because the CPU handles it
4606     * correctly.
4607     *
4608     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4609     *      xor-int, shl-int, shr-int, ushr-int
4610     */
4611    /* binop vAA, vBB, vCC */
4612    FETCH(a0, 1)                           #  a0 <- CCBB
4613    GET_OPA(rOBJ)                          #  rOBJ <- AA
4614    srl       a3, a0, 8                    #  a3 <- CC
4615    and       a2, a0, 255                  #  a2 <- BB
4616    GET_VREG(a1, a3)                       #  a1 <- vCC
4617    GET_VREG(a0, a2)                       #  a0 <- vBB
4618    .if 1
4619    # is second operand zero?
4620    beqz      a1, common_errDivideByZero
4621    .endif
4622
4623    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
4624    div zero, a0, a1                              #  optional op
4625    mfhi a0                                 #  a0 <- op, a0-a3 changed
4626    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
4627    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
4628    /* 11-14 instructions */
4629
4630#endif
4631
4632/* ------------------------------ */
4633    .balign 128
4634.L_op_and_int: /* 0x95 */
4635/* File: mips/op_and_int.S */
4636/* File: mips/binop.S */
4637    /*
4638     * Generic 32-bit binary operation.  Provide an "instr" line that
4639     * specifies an instruction that performs "result = a0 op a1".
4640     * This could be a MIPS instruction or a function call.  (If the result
4641     * comes back in a register other than a0, you can override "result".)
4642     *
4643     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4644     * vCC (a1).  Useful for integer division and modulus.  Note that we
4645     * *don't* check for (INT_MIN / -1) here, because the CPU handles it
4646     * correctly.
4647     *
4648     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4649     *      xor-int, shl-int, shr-int, ushr-int
4650     */
4651    /* binop vAA, vBB, vCC */
4652    FETCH(a0, 1)                           #  a0 <- CCBB
4653    GET_OPA(rOBJ)                          #  rOBJ <- AA
4654    srl       a3, a0, 8                    #  a3 <- CC
4655    and       a2, a0, 255                  #  a2 <- BB
4656    GET_VREG(a1, a3)                       #  a1 <- vCC
4657    GET_VREG(a0, a2)                       #  a0 <- vBB
4658    .if 0
4659    # is second operand zero?
4660    beqz      a1, common_errDivideByZero
4661    .endif
4662
4663    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
4664                                  #  optional op
4665    and a0, a0, a1                                 #  a0 <- op, a0-a3 changed
4666    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
4667    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
4668    /* 11-14 instructions */
4669
4670
4671/* ------------------------------ */
4672    .balign 128
4673.L_op_or_int: /* 0x96 */
4674/* File: mips/op_or_int.S */
4675/* File: mips/binop.S */
4676    /*
4677     * Generic 32-bit binary operation.  Provide an "instr" line that
4678     * specifies an instruction that performs "result = a0 op a1".
4679     * This could be a MIPS instruction or a function call.  (If the result
4680     * comes back in a register other than a0, you can override "result".)
4681     *
4682     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4683     * vCC (a1).  Useful for integer division and modulus.  Note that we
4684     * *don't* check for (INT_MIN / -1) here, because the CPU handles it
4685     * correctly.
4686     *
4687     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4688     *      xor-int, shl-int, shr-int, ushr-int
4689     */
4690    /* binop vAA, vBB, vCC */
4691    FETCH(a0, 1)                           #  a0 <- CCBB
4692    GET_OPA(rOBJ)                          #  rOBJ <- AA
4693    srl       a3, a0, 8                    #  a3 <- CC
4694    and       a2, a0, 255                  #  a2 <- BB
4695    GET_VREG(a1, a3)                       #  a1 <- vCC
4696    GET_VREG(a0, a2)                       #  a0 <- vBB
4697    .if 0
4698    # is second operand zero?
4699    beqz      a1, common_errDivideByZero
4700    .endif
4701
4702    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
4703                                  #  optional op
4704    or a0, a0, a1                                 #  a0 <- op, a0-a3 changed
4705    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
4706    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
4707    /* 11-14 instructions */
4708
4709
4710/* ------------------------------ */
4711    .balign 128
4712.L_op_xor_int: /* 0x97 */
4713/* File: mips/op_xor_int.S */
4714/* File: mips/binop.S */
4715    /*
4716     * Generic 32-bit binary operation.  Provide an "instr" line that
4717     * specifies an instruction that performs "result = a0 op a1".
4718     * This could be a MIPS instruction or a function call.  (If the result
4719     * comes back in a register other than a0, you can override "result".)
4720     *
4721     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4722     * vCC (a1).  Useful for integer division and modulus.  Note that we
4723     * *don't* check for (INT_MIN / -1) here, because the CPU handles it
4724     * correctly.
4725     *
4726     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4727     *      xor-int, shl-int, shr-int, ushr-int
4728     */
4729    /* binop vAA, vBB, vCC */
4730    FETCH(a0, 1)                           #  a0 <- CCBB
4731    GET_OPA(rOBJ)                          #  rOBJ <- AA
4732    srl       a3, a0, 8                    #  a3 <- CC
4733    and       a2, a0, 255                  #  a2 <- BB
4734    GET_VREG(a1, a3)                       #  a1 <- vCC
4735    GET_VREG(a0, a2)                       #  a0 <- vBB
4736    .if 0
4737    # is second operand zero?
4738    beqz      a1, common_errDivideByZero
4739    .endif
4740
4741    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
4742                                  #  optional op
4743    xor a0, a0, a1                                 #  a0 <- op, a0-a3 changed
4744    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
4745    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
4746    /* 11-14 instructions */
4747
4748
4749/* ------------------------------ */
4750    .balign 128
4751.L_op_shl_int: /* 0x98 */
4752/* File: mips/op_shl_int.S */
4753/* File: mips/binop.S */
4754    /*
4755     * Generic 32-bit binary operation.  Provide an "instr" line that
4756     * specifies an instruction that performs "result = a0 op a1".
4757     * This could be a MIPS instruction or a function call.  (If the result
4758     * comes back in a register other than a0, you can override "result".)
4759     *
4760     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4761     * vCC (a1).  Useful for integer division and modulus.  Note that we
4762     * *don't* check for (INT_MIN / -1) here, because the CPU handles it
4763     * correctly.
4764     *
4765     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4766     *      xor-int, shl-int, shr-int, ushr-int
4767     */
4768    /* binop vAA, vBB, vCC */
4769    FETCH(a0, 1)                           #  a0 <- CCBB
4770    GET_OPA(rOBJ)                          #  rOBJ <- AA
4771    srl       a3, a0, 8                    #  a3 <- CC
4772    and       a2, a0, 255                  #  a2 <- BB
4773    GET_VREG(a1, a3)                       #  a1 <- vCC
4774    GET_VREG(a0, a2)                       #  a0 <- vBB
4775    .if 0
4776    # is second operand zero?
4777    beqz      a1, common_errDivideByZero
4778    .endif
4779
4780    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
4781                                  #  optional op
4782    sll a0, a0, a1                                 #  a0 <- op, a0-a3 changed
4783    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
4784    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
4785    /* 11-14 instructions */
4786
4787
4788/* ------------------------------ */
4789    .balign 128
4790.L_op_shr_int: /* 0x99 */
4791/* File: mips/op_shr_int.S */
4792/* File: mips/binop.S */
4793    /*
4794     * Generic 32-bit binary operation.  Provide an "instr" line that
4795     * specifies an instruction that performs "result = a0 op a1".
4796     * This could be a MIPS instruction or a function call.  (If the result
4797     * comes back in a register other than a0, you can override "result".)
4798     *
4799     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4800     * vCC (a1).  Useful for integer division and modulus.  Note that we
4801     * *don't* check for (INT_MIN / -1) here, because the CPU handles it
4802     * correctly.
4803     *
4804     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4805     *      xor-int, shl-int, shr-int, ushr-int
4806     */
4807    /* binop vAA, vBB, vCC */
4808    FETCH(a0, 1)                           #  a0 <- CCBB
4809    GET_OPA(rOBJ)                          #  rOBJ <- AA
4810    srl       a3, a0, 8                    #  a3 <- CC
4811    and       a2, a0, 255                  #  a2 <- BB
4812    GET_VREG(a1, a3)                       #  a1 <- vCC
4813    GET_VREG(a0, a2)                       #  a0 <- vBB
4814    .if 0
4815    # is second operand zero?
4816    beqz      a1, common_errDivideByZero
4817    .endif
4818
4819    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
4820                                  #  optional op
4821    sra a0, a0, a1                                 #  a0 <- op, a0-a3 changed
4822    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
4823    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
4824    /* 11-14 instructions */
4825
4826
4827/* ------------------------------ */
4828    .balign 128
4829.L_op_ushr_int: /* 0x9a */
4830/* File: mips/op_ushr_int.S */
4831/* File: mips/binop.S */
4832    /*
4833     * Generic 32-bit binary operation.  Provide an "instr" line that
4834     * specifies an instruction that performs "result = a0 op a1".
4835     * This could be a MIPS instruction or a function call.  (If the result
4836     * comes back in a register other than a0, you can override "result".)
4837     *
4838     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4839     * vCC (a1).  Useful for integer division and modulus.  Note that we
4840     * *don't* check for (INT_MIN / -1) here, because the CPU handles it
4841     * correctly.
4842     *
4843     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4844     *      xor-int, shl-int, shr-int, ushr-int
4845     */
4846    /* binop vAA, vBB, vCC */
4847    FETCH(a0, 1)                           #  a0 <- CCBB
4848    GET_OPA(rOBJ)                          #  rOBJ <- AA
4849    srl       a3, a0, 8                    #  a3 <- CC
4850    and       a2, a0, 255                  #  a2 <- BB
4851    GET_VREG(a1, a3)                       #  a1 <- vCC
4852    GET_VREG(a0, a2)                       #  a0 <- vBB
4853    .if 0
4854    # is second operand zero?
4855    beqz      a1, common_errDivideByZero
4856    .endif
4857
4858    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
4859                                  #  optional op
4860    srl a0, a0, a1                                 #  a0 <- op, a0-a3 changed
4861    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
4862    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
4863    /* 11-14 instructions */
4864
4865
4866/* ------------------------------ */
4867    .balign 128
4868.L_op_add_long: /* 0x9b */
4869/* File: mips/op_add_long.S */
4870/*
4871 *  The compiler generates the following sequence for
4872 *  [v1 v0] =  [a1 a0] + [a3 a2];
4873 *    addu v0,a2,a0
4874 *    addu a1,a3,a1
4875 *    sltu v1,v0,a2
4876 *    addu v1,v1,a1
4877 */
4878/* File: mips/binopWide.S */
4879    /*
4880     * Generic 64-bit binary operation.  Provide an "instr" line that
4881     * specifies an instruction that performs "result = a0-a1 op a2-a3".
4882     * This could be a MIPS instruction or a function call.  (If the result
4883     * comes back in a register other than a0, you can override "result".)
4884     *
4885     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4886     * vCC (a1).  Useful for integer division and modulus.
4887     *
4888     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4889     *      xor-long
4890     *
4891     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4892     */
4893    /* binop vAA, vBB, vCC */
4894    FETCH(a0, 1)                           #  a0 <- CCBB
4895    GET_OPA(rOBJ)                          #  rOBJ <- AA
4896    and       a2, a0, 255                  #  a2 <- BB
4897    srl       a3, a0, 8                    #  a3 <- CC
4898    EAS2(a2, rFP, a2)                      #  a2 <- &fp[BB]
4899    EAS2(t1, rFP, a3)                      #  a3 <- &fp[CC]
4900    LOAD64(a0, a1, a2)               #  a0/a1 <- vBB/vBB+1
4901    LOAD64(a2, a3, t1)               #  a2/a3 <- vCC/vCC+1
4902    .if 0
4903    or        t0, a2, a3             #  second arg (a2-a3) is zero?
4904    beqz      t0, common_errDivideByZero
4905    .endif
4906    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
4907
4908    addu v0, a2, a0                              #  optional op
4909    addu a1, a3, a1; sltu v1, v0, a2; addu v1, v1, a1                                 #  result <- op, a0-a3 changed
4910    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
4911    SET_VREG64_GOTO(v0, v1, rOBJ, t0)   #  vAA/vAA+1 <- v0/v1
4912    /* 14-17 instructions */
4913
4914
4915/* ------------------------------ */
4916    .balign 128
4917.L_op_sub_long: /* 0x9c */
4918/* File: mips/op_sub_long.S */
4919/*
4920 * For little endian the code sequence looks as follows:
4921 *    subu    v0,a0,a2
4922 *    subu    v1,a1,a3
4923 *    sltu    a0,a0,v0
4924 *    subu    v1,v1,a0
4925 */
4926/* File: mips/binopWide.S */
4927    /*
4928     * Generic 64-bit binary operation.  Provide an "instr" line that
4929     * specifies an instruction that performs "result = a0-a1 op a2-a3".
4930     * This could be a MIPS instruction or a function call.  (If the result
4931     * comes back in a register other than a0, you can override "result".)
4932     *
4933     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4934     * vCC (a1).  Useful for integer division and modulus.
4935     *
4936     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4937     *      xor-long
4938     *
4939     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4940     */
4941    /* binop vAA, vBB, vCC */
4942    FETCH(a0, 1)                           #  a0 <- CCBB
4943    GET_OPA(rOBJ)                          #  rOBJ <- AA
4944    and       a2, a0, 255                  #  a2 <- BB
4945    srl       a3, a0, 8                    #  a3 <- CC
4946    EAS2(a2, rFP, a2)                      #  a2 <- &fp[BB]
4947    EAS2(t1, rFP, a3)                      #  a3 <- &fp[CC]
4948    LOAD64(a0, a1, a2)               #  a0/a1 <- vBB/vBB+1
4949    LOAD64(a2, a3, t1)               #  a2/a3 <- vCC/vCC+1
4950    .if 0
4951    or        t0, a2, a3             #  second arg (a2-a3) is zero?
4952    beqz      t0, common_errDivideByZero
4953    .endif
4954    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
4955
4956    subu v0, a0, a2                              #  optional op
4957    subu v1, a1, a3; sltu a0, a0, v0; subu v1, v1, a0                                 #  result <- op, a0-a3 changed
4958    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
4959    SET_VREG64_GOTO(v0, v1, rOBJ, t0)   #  vAA/vAA+1 <- v0/v1
4960    /* 14-17 instructions */
4961
4962
4963/* ------------------------------ */
4964    .balign 128
4965.L_op_mul_long: /* 0x9d */
4966/* File: mips/op_mul_long.S */
4967    /*
4968     * Signed 64-bit integer multiply.
4969     *         a1   a0
4970     *   x     a3   a2
4971     *   -------------
4972     *       a2a1 a2a0
4973     *       a3a0
4974     *  a3a1 (<= unused)
4975     *  ---------------
4976     *         v1   v0
4977     */
4978    /* mul-long vAA, vBB, vCC */
4979    FETCH(a0, 1)                           #  a0 <- CCBB
4980    and       t0, a0, 255                  #  a2 <- BB
4981    srl       t1, a0, 8                    #  a3 <- CC
4982    EAS2(t0, rFP, t0)                      #  t0 <- &fp[BB]
4983    LOAD64(a0, a1, t0)                     #  a0/a1 <- vBB/vBB+1
4984
4985    EAS2(t1, rFP, t1)                      #  t0 <- &fp[CC]
4986    LOAD64(a2, a3, t1)                     #  a2/a3 <- vCC/vCC+1
4987
4988    mul       v1, a3, a0                   #  v1= a3a0
4989#ifdef MIPS32REVGE6
4990    mulu      v0, a2, a0                   #  v0= a2a0
4991    muhu      t1, a2, a0
4992#else
4993    multu     a2, a0
4994    mfhi      t1
4995    mflo      v0                           #  v0= a2a0
4996#endif
4997    mul       t0, a2, a1                   #  t0= a2a1
4998    addu      v1, v1, t1                   #  v1+= hi(a2a0)
4999    addu      v1, v1, t0                   #  v1= a3a0 + a2a1;
5000
5001    GET_OPA(a0)                            #  a0 <- AA
5002    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
5003    b         .Lop_mul_long_finish
5004
5005/* ------------------------------ */
5006    .balign 128
5007.L_op_div_long: /* 0x9e */
5008/* File: mips/op_div_long.S */
5009/* File: mips/binopWide.S */
5010    /*
5011     * Generic 64-bit binary operation.  Provide an "instr" line that
5012     * specifies an instruction that performs "result = a0-a1 op a2-a3".
5013     * This could be a MIPS instruction or a function call.  (If the result
5014     * comes back in a register other than a0, you can override "result".)
5015     *
5016     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5017     * vCC (a1).  Useful for integer division and modulus.
5018     *
5019     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5020     *      xor-long
5021     *
5022     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5023     */
5024    /* binop vAA, vBB, vCC */
5025    FETCH(a0, 1)                           #  a0 <- CCBB
5026    GET_OPA(rOBJ)                          #  rOBJ <- AA
5027    and       a2, a0, 255                  #  a2 <- BB
5028    srl       a3, a0, 8                    #  a3 <- CC
5029    EAS2(a2, rFP, a2)                      #  a2 <- &fp[BB]
5030    EAS2(t1, rFP, a3)                      #  a3 <- &fp[CC]
5031    LOAD64(a0, a1, a2)               #  a0/a1 <- vBB/vBB+1
5032    LOAD64(a2, a3, t1)               #  a2/a3 <- vCC/vCC+1
5033    .if 1
5034    or        t0, a2, a3             #  second arg (a2-a3) is zero?
5035    beqz      t0, common_errDivideByZero
5036    .endif
5037    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
5038
5039                                  #  optional op
5040    JAL(__divdi3)                                 #  result <- op, a0-a3 changed
5041    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
5042    SET_VREG64_GOTO(v0, v1, rOBJ, t0)   #  vAA/vAA+1 <- v0/v1
5043    /* 14-17 instructions */
5044
5045
5046/* ------------------------------ */
5047    .balign 128
5048.L_op_rem_long: /* 0x9f */
5049/* File: mips/op_rem_long.S */
5050/* File: mips/binopWide.S */
5051    /*
5052     * Generic 64-bit binary operation.  Provide an "instr" line that
5053     * specifies an instruction that performs "result = a0-a1 op a2-a3".
5054     * This could be a MIPS instruction or a function call.  (If the result
5055     * comes back in a register other than a0, you can override "result".)
5056     *
5057     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5058     * vCC (a1).  Useful for integer division and modulus.
5059     *
5060     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5061     *      xor-long
5062     *
5063     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5064     */
5065    /* binop vAA, vBB, vCC */
5066    FETCH(a0, 1)                           #  a0 <- CCBB
5067    GET_OPA(rOBJ)                          #  rOBJ <- AA
5068    and       a2, a0, 255                  #  a2 <- BB
5069    srl       a3, a0, 8                    #  a3 <- CC
5070    EAS2(a2, rFP, a2)                      #  a2 <- &fp[BB]
5071    EAS2(t1, rFP, a3)                      #  a3 <- &fp[CC]
5072    LOAD64(a0, a1, a2)               #  a0/a1 <- vBB/vBB+1
5073    LOAD64(a2, a3, t1)               #  a2/a3 <- vCC/vCC+1
5074    .if 1
5075    or        t0, a2, a3             #  second arg (a2-a3) is zero?
5076    beqz      t0, common_errDivideByZero
5077    .endif
5078    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
5079
5080                                  #  optional op
5081    JAL(__moddi3)                                 #  result <- op, a0-a3 changed
5082    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
5083    SET_VREG64_GOTO(v0, v1, rOBJ, t0)   #  vAA/vAA+1 <- v0/v1
5084    /* 14-17 instructions */
5085
5086
5087/* ------------------------------ */
5088    .balign 128
5089.L_op_and_long: /* 0xa0 */
5090/* File: mips/op_and_long.S */
5091/* File: mips/binopWide.S */
5092    /*
5093     * Generic 64-bit binary operation.  Provide an "instr" line that
5094     * specifies an instruction that performs "result = a0-a1 op a2-a3".
5095     * This could be a MIPS instruction or a function call.  (If the result
5096     * comes back in a register other than a0, you can override "result".)
5097     *
5098     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5099     * vCC (a1).  Useful for integer division and modulus.
5100     *
5101     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5102     *      xor-long
5103     *
5104     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5105     */
5106    /* binop vAA, vBB, vCC */
5107    FETCH(a0, 1)                           #  a0 <- CCBB
5108    GET_OPA(rOBJ)                          #  rOBJ <- AA
5109    and       a2, a0, 255                  #  a2 <- BB
5110    srl       a3, a0, 8                    #  a3 <- CC
5111    EAS2(a2, rFP, a2)                      #  a2 <- &fp[BB]
5112    EAS2(t1, rFP, a3)                      #  a3 <- &fp[CC]
5113    LOAD64(a0, a1, a2)               #  a0/a1 <- vBB/vBB+1
5114    LOAD64(a2, a3, t1)               #  a2/a3 <- vCC/vCC+1
5115    .if 0
5116    or        t0, a2, a3             #  second arg (a2-a3) is zero?
5117    beqz      t0, common_errDivideByZero
5118    .endif
5119    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
5120
5121    and a0, a0, a2                              #  optional op
5122    and a1, a1, a3                                 #  result <- op, a0-a3 changed
5123    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
5124    SET_VREG64_GOTO(a0, a1, rOBJ, t0)   #  vAA/vAA+1 <- a0/a1
5125    /* 14-17 instructions */
5126
5127
5128/* ------------------------------ */
5129    .balign 128
5130.L_op_or_long: /* 0xa1 */
5131/* File: mips/op_or_long.S */
5132/* File: mips/binopWide.S */
5133    /*
5134     * Generic 64-bit binary operation.  Provide an "instr" line that
5135     * specifies an instruction that performs "result = a0-a1 op a2-a3".
5136     * This could be a MIPS instruction or a function call.  (If the result
5137     * comes back in a register other than a0, you can override "result".)
5138     *
5139     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5140     * vCC (a1).  Useful for integer division and modulus.
5141     *
5142     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5143     *      xor-long
5144     *
5145     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5146     */
5147    /* binop vAA, vBB, vCC */
5148    FETCH(a0, 1)                           #  a0 <- CCBB
5149    GET_OPA(rOBJ)                          #  rOBJ <- AA
5150    and       a2, a0, 255                  #  a2 <- BB
5151    srl       a3, a0, 8                    #  a3 <- CC
5152    EAS2(a2, rFP, a2)                      #  a2 <- &fp[BB]
5153    EAS2(t1, rFP, a3)                      #  a3 <- &fp[CC]
5154    LOAD64(a0, a1, a2)               #  a0/a1 <- vBB/vBB+1
5155    LOAD64(a2, a3, t1)               #  a2/a3 <- vCC/vCC+1
5156    .if 0
5157    or        t0, a2, a3             #  second arg (a2-a3) is zero?
5158    beqz      t0, common_errDivideByZero
5159    .endif
5160    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
5161
5162    or a0, a0, a2                              #  optional op
5163    or a1, a1, a3                                 #  result <- op, a0-a3 changed
5164    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
5165    SET_VREG64_GOTO(a0, a1, rOBJ, t0)   #  vAA/vAA+1 <- a0/a1
5166    /* 14-17 instructions */
5167
5168
5169/* ------------------------------ */
5170    .balign 128
5171.L_op_xor_long: /* 0xa2 */
5172/* File: mips/op_xor_long.S */
5173/* File: mips/binopWide.S */
5174    /*
5175     * Generic 64-bit binary operation.  Provide an "instr" line that
5176     * specifies an instruction that performs "result = a0-a1 op a2-a3".
5177     * This could be a MIPS instruction or a function call.  (If the result
5178     * comes back in a register other than a0, you can override "result".)
5179     *
5180     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5181     * vCC (a1).  Useful for integer division and modulus.
5182     *
5183     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5184     *      xor-long
5185     *
5186     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5187     */
5188    /* binop vAA, vBB, vCC */
5189    FETCH(a0, 1)                           #  a0 <- CCBB
5190    GET_OPA(rOBJ)                          #  rOBJ <- AA
5191    and       a2, a0, 255                  #  a2 <- BB
5192    srl       a3, a0, 8                    #  a3 <- CC
5193    EAS2(a2, rFP, a2)                      #  a2 <- &fp[BB]
5194    EAS2(t1, rFP, a3)                      #  a3 <- &fp[CC]
5195    LOAD64(a0, a1, a2)               #  a0/a1 <- vBB/vBB+1
5196    LOAD64(a2, a3, t1)               #  a2/a3 <- vCC/vCC+1
5197    .if 0
5198    or        t0, a2, a3             #  second arg (a2-a3) is zero?
5199    beqz      t0, common_errDivideByZero
5200    .endif
5201    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
5202
5203    xor a0, a0, a2                              #  optional op
5204    xor a1, a1, a3                                 #  result <- op, a0-a3 changed
5205    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
5206    SET_VREG64_GOTO(a0, a1, rOBJ, t0)   #  vAA/vAA+1 <- a0/a1
5207    /* 14-17 instructions */
5208
5209
5210/* ------------------------------ */
5211    .balign 128
5212.L_op_shl_long: /* 0xa3 */
5213/* File: mips/op_shl_long.S */
5214    /*
5215     * Long integer shift.  This is different from the generic 32/64-bit
5216     * binary operations because vAA/vBB are 64-bit but vCC (the shift
5217     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
5218     * 6 bits of the shift distance.
5219     */
5220    /* shl-long vAA, vBB, vCC */
5221    FETCH(a0, 1)                           #  a0 <- CCBB
5222    GET_OPA(t2)                            #  t2 <- AA
5223    and       a3, a0, 255                  #  a3 <- BB
5224    srl       a0, a0, 8                    #  a0 <- CC
5225    EAS2(a3, rFP, a3)                      #  a3 <- &fp[BB]
5226    GET_VREG(a2, a0)                       #  a2 <- vCC
5227    LOAD64(a0, a1, a3)                     #  a0/a1 <- vBB/vBB+1
5228
5229    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
5230    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
5231
5232    andi    v1, a2, 0x20                   #  shift< shift & 0x20
5233    sll     v0, a0, a2                     #  rlo<- alo << (shift&31)
5234    bnez    v1, .Lop_shl_long_finish
5235    not     v1, a2                         #  rhi<- 31-shift  (shift is 5b)
5236    srl     a0, 1
5237    srl     a0, v1                         #  alo<- alo >> (32-(shift&31))
5238    sll     v1, a1, a2                     #  rhi<- ahi << (shift&31)
5239    or      v1, a0                         #  rhi<- rhi | alo
5240    SET_VREG64_GOTO(v0, v1, t2, t0)        #  vAA/vAA+1 <- a0/a1
5241
5242/* ------------------------------ */
5243    .balign 128
5244.L_op_shr_long: /* 0xa4 */
5245/* File: mips/op_shr_long.S */
5246    /*
5247     * Long integer shift.  This is different from the generic 32/64-bit
5248     * binary operations because vAA/vBB are 64-bit but vCC (the shift
5249     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
5250     * 6 bits of the shift distance.
5251     */
5252    /* shr-long vAA, vBB, vCC */
5253    FETCH(a0, 1)                           #  a0 <- CCBB
5254    GET_OPA(t3)                            #  t3 <- AA
5255    and       a3, a0, 255                  #  a3 <- BB
5256    srl       a0, a0, 8                    #  a0 <- CC
5257    EAS2(a3, rFP, a3)                      #  a3 <- &fp[BB]
5258    GET_VREG(a2, a0)                       #  a2 <- vCC
5259    LOAD64(a0, a1, a3)                     #  a0/a1 <- vBB/vBB+1
5260    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
5261    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
5262
5263    andi    v0, a2, 0x20                   #  shift & 0x20
5264    sra     v1, a1, a2                     #  rhi<- ahi >> (shift&31)
5265    bnez    v0, .Lop_shr_long_finish
5266    srl     v0, a0, a2                     #  rlo<- alo >> (shift&31)
5267    not     a0, a2                         #  alo<- 31-shift (shift is 5b)
5268    sll     a1, 1
5269    sll     a1, a0                         #  ahi<- ahi << (32-(shift&31))
5270    or      v0, a1                         #  rlo<- rlo | ahi
5271    SET_VREG64_GOTO(v0, v1, t3, t0)        #  vAA/VAA+1 <- v0/v0
5272
5273/* ------------------------------ */
5274    .balign 128
5275.L_op_ushr_long: /* 0xa5 */
5276/* File: mips/op_ushr_long.S */
5277    /*
5278     * Long integer shift.  This is different from the generic 32/64-bit
5279     * binary operations because vAA/vBB are 64-bit but vCC (the shift
5280     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
5281     * 6 bits of the shift distance.
5282     */
5283    /* ushr-long vAA, vBB, vCC */
5284    FETCH(a0, 1)                           #  a0 <- CCBB
5285    GET_OPA(rOBJ)                          #  rOBJ <- AA
5286    and       a3, a0, 255                  #  a3 <- BB
5287    srl       a0, a0, 8                    #  a0 <- CC
5288    EAS2(a3, rFP, a3)                      #  a3 <- &fp[BB]
5289    GET_VREG(a2, a0)                       #  a2 <- vCC
5290    LOAD64(a0, a1, a3)                     #  a0/a1 <- vBB/vBB+1
5291
5292    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
5293    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
5294
5295    andi      v0, a2, 0x20                 #  shift & 0x20
5296    srl       v1, a1, a2                   #  rhi<- ahi >> (shift&31)
5297    bnez      v0, .Lop_ushr_long_finish
5298    srl       v0, a0, a2                   #  rlo<- alo >> (shift&31)
5299    not       a0, a2                       #  alo<- 31-n  (shift is 5b)
5300    sll       a1, 1
5301    sll       a1, a0                       #  ahi<- ahi << (32-(shift&31))
5302    or        v0, a1                       #  rlo<- rlo | ahi
5303    SET_VREG64_GOTO(v0, v1, rOBJ, t0)      #  vAA/vAA+1 <- v0/v1
5304
5305/* ------------------------------ */
5306    .balign 128
5307.L_op_add_float: /* 0xa6 */
5308/* File: mips/op_add_float.S */
5309/* File: mips/fbinop.S */
5310    /*
5311     * Generic 32-bit binary float operation.
5312     *
5313     * For: add-fp, sub-fp, mul-fp, div-fp, rem-fp
5314     */
5315
5316    /* binop vAA, vBB, vCC */
5317    FETCH(a0, 1)                           #  a0 <- CCBB
5318    GET_OPA(rOBJ)                          #  s5 <- AA
5319    srl       a3, a0, 8                    #  a3 <- CC
5320    and       a2, a0, 255                  #  a2 <- BB
5321    GET_VREG_F(fa1, a3)                    #  a1 <- vCC
5322    GET_VREG_F(fa0, a2)                    #  a0 <- vBB
5323
5324    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
5325    add.s fv0, fa0, fa1                                 #  f0 = result
5326    SET_VREG_F(fv0, rOBJ)                  #  vAA <- fv0
5327    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
5328    GOTO_OPCODE(t0)                        #  jump to next instruction
5329
5330
5331/* ------------------------------ */
5332    .balign 128
5333.L_op_sub_float: /* 0xa7 */
5334/* File: mips/op_sub_float.S */
5335/* File: mips/fbinop.S */
5336    /*
5337     * Generic 32-bit binary float operation.
5338     *
5339     * For: add-fp, sub-fp, mul-fp, div-fp, rem-fp
5340     */
5341
5342    /* binop vAA, vBB, vCC */
5343    FETCH(a0, 1)                           #  a0 <- CCBB
5344    GET_OPA(rOBJ)                          #  s5 <- AA
5345    srl       a3, a0, 8                    #  a3 <- CC
5346    and       a2, a0, 255                  #  a2 <- BB
5347    GET_VREG_F(fa1, a3)                    #  a1 <- vCC
5348    GET_VREG_F(fa0, a2)                    #  a0 <- vBB
5349
5350    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
5351    sub.s fv0, fa0, fa1                                 #  f0 = result
5352    SET_VREG_F(fv0, rOBJ)                  #  vAA <- fv0
5353    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
5354    GOTO_OPCODE(t0)                        #  jump to next instruction
5355
5356
5357/* ------------------------------ */
5358    .balign 128
5359.L_op_mul_float: /* 0xa8 */
5360/* File: mips/op_mul_float.S */
5361/* File: mips/fbinop.S */
5362    /*
5363     * Generic 32-bit binary float operation.
5364     *
5365     * For: add-fp, sub-fp, mul-fp, div-fp, rem-fp
5366     */
5367
5368    /* binop vAA, vBB, vCC */
5369    FETCH(a0, 1)                           #  a0 <- CCBB
5370    GET_OPA(rOBJ)                          #  s5 <- AA
5371    srl       a3, a0, 8                    #  a3 <- CC
5372    and       a2, a0, 255                  #  a2 <- BB
5373    GET_VREG_F(fa1, a3)                    #  a1 <- vCC
5374    GET_VREG_F(fa0, a2)                    #  a0 <- vBB
5375
5376    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
5377    mul.s fv0, fa0, fa1                                 #  f0 = result
5378    SET_VREG_F(fv0, rOBJ)                  #  vAA <- fv0
5379    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
5380    GOTO_OPCODE(t0)                        #  jump to next instruction
5381
5382
5383/* ------------------------------ */
5384    .balign 128
5385.L_op_div_float: /* 0xa9 */
5386/* File: mips/op_div_float.S */
5387/* File: mips/fbinop.S */
5388    /*
5389     * Generic 32-bit binary float operation.
5390     *
5391     * For: add-fp, sub-fp, mul-fp, div-fp, rem-fp
5392     */
5393
5394    /* binop vAA, vBB, vCC */
5395    FETCH(a0, 1)                           #  a0 <- CCBB
5396    GET_OPA(rOBJ)                          #  s5 <- AA
5397    srl       a3, a0, 8                    #  a3 <- CC
5398    and       a2, a0, 255                  #  a2 <- BB
5399    GET_VREG_F(fa1, a3)                    #  a1 <- vCC
5400    GET_VREG_F(fa0, a2)                    #  a0 <- vBB
5401
5402    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
5403    div.s fv0, fa0, fa1                                 #  f0 = result
5404    SET_VREG_F(fv0, rOBJ)                  #  vAA <- fv0
5405    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
5406    GOTO_OPCODE(t0)                        #  jump to next instruction
5407
5408
5409/* ------------------------------ */
5410    .balign 128
5411.L_op_rem_float: /* 0xaa */
5412/* File: mips/op_rem_float.S */
5413/* File: mips/fbinop.S */
5414    /*
5415     * Generic 32-bit binary float operation.
5416     *
5417     * For: add-fp, sub-fp, mul-fp, div-fp, rem-fp
5418     */
5419
5420    /* binop vAA, vBB, vCC */
5421    FETCH(a0, 1)                           #  a0 <- CCBB
5422    GET_OPA(rOBJ)                          #  s5 <- AA
5423    srl       a3, a0, 8                    #  a3 <- CC
5424    and       a2, a0, 255                  #  a2 <- BB
5425    GET_VREG_F(fa1, a3)                    #  a1 <- vCC
5426    GET_VREG_F(fa0, a2)                    #  a0 <- vBB
5427
5428    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
5429    JAL(fmodf)                                 #  f0 = result
5430    SET_VREG_F(fv0, rOBJ)                  #  vAA <- fv0
5431    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
5432    GOTO_OPCODE(t0)                        #  jump to next instruction
5433
5434
5435/* ------------------------------ */
5436    .balign 128
5437.L_op_add_double: /* 0xab */
5438/* File: mips/op_add_double.S */
5439/* File: mips/fbinopWide.S */
5440    /*
5441     * Generic 64-bit binary operation.  Provide an "instr" line that
5442     * specifies an instruction that performs "result = a0-a1 op a2-a3".
5443     * This could be an MIPS instruction or a function call.
5444     *
5445     * for: add-double, sub-double, mul-double, div-double,
5446     *      rem-double
5447     *
5448     */
5449    /* binop vAA, vBB, vCC */
5450    FETCH(a0, 1)                           #  a0 <- CCBB
5451    GET_OPA(rOBJ)                          #  s5 <- AA
5452    and       a2, a0, 255                  #  a2 <- BB
5453    srl       a3, a0, 8                    #  a3 <- CC
5454    EAS2(a2, rFP, a2)                      #  a2 <- &fp[BB]
5455    EAS2(t1, rFP, a3)                      #  a3 <- &fp[CC]
5456    LOAD64_F(fa0, fa0f, a2)
5457    LOAD64_F(fa1, fa1f, t1)
5458
5459    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
5460    add.d fv0, fa0, fa1
5461    SET_VREG64_F(fv0, fv0f, rOBJ)
5462    b         .Lop_add_double_finish
5463
5464
5465/* ------------------------------ */
5466    .balign 128
5467.L_op_sub_double: /* 0xac */
5468/* File: mips/op_sub_double.S */
5469/* File: mips/fbinopWide.S */
5470    /*
5471     * Generic 64-bit binary operation.  Provide an "instr" line that
5472     * specifies an instruction that performs "result = a0-a1 op a2-a3".
5473     * This could be an MIPS instruction or a function call.
5474     *
5475     * for: add-double, sub-double, mul-double, div-double,
5476     *      rem-double
5477     *
5478     */
5479    /* binop vAA, vBB, vCC */
5480    FETCH(a0, 1)                           #  a0 <- CCBB
5481    GET_OPA(rOBJ)                          #  s5 <- AA
5482    and       a2, a0, 255                  #  a2 <- BB
5483    srl       a3, a0, 8                    #  a3 <- CC
5484    EAS2(a2, rFP, a2)                      #  a2 <- &fp[BB]
5485    EAS2(t1, rFP, a3)                      #  a3 <- &fp[CC]
5486    LOAD64_F(fa0, fa0f, a2)
5487    LOAD64_F(fa1, fa1f, t1)
5488
5489    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
5490    sub.d fv0, fa0, fa1
5491    SET_VREG64_F(fv0, fv0f, rOBJ)
5492    b         .Lop_sub_double_finish
5493
5494
5495/* ------------------------------ */
5496    .balign 128
5497.L_op_mul_double: /* 0xad */
5498/* File: mips/op_mul_double.S */
5499/* File: mips/fbinopWide.S */
5500    /*
5501     * Generic 64-bit binary operation.  Provide an "instr" line that
5502     * specifies an instruction that performs "result = a0-a1 op a2-a3".
5503     * This could be an MIPS instruction or a function call.
5504     *
5505     * for: add-double, sub-double, mul-double, div-double,
5506     *      rem-double
5507     *
5508     */
5509    /* binop vAA, vBB, vCC */
5510    FETCH(a0, 1)                           #  a0 <- CCBB
5511    GET_OPA(rOBJ)                          #  s5 <- AA
5512    and       a2, a0, 255                  #  a2 <- BB
5513    srl       a3, a0, 8                    #  a3 <- CC
5514    EAS2(a2, rFP, a2)                      #  a2 <- &fp[BB]
5515    EAS2(t1, rFP, a3)                      #  a3 <- &fp[CC]
5516    LOAD64_F(fa0, fa0f, a2)
5517    LOAD64_F(fa1, fa1f, t1)
5518
5519    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
5520    mul.d fv0, fa0, fa1
5521    SET_VREG64_F(fv0, fv0f, rOBJ)
5522    b         .Lop_mul_double_finish
5523
5524
5525/* ------------------------------ */
5526    .balign 128
5527.L_op_div_double: /* 0xae */
5528/* File: mips/op_div_double.S */
5529/* File: mips/fbinopWide.S */
5530    /*
5531     * Generic 64-bit binary operation.  Provide an "instr" line that
5532     * specifies an instruction that performs "result = a0-a1 op a2-a3".
5533     * This could be an MIPS instruction or a function call.
5534     *
5535     * for: add-double, sub-double, mul-double, div-double,
5536     *      rem-double
5537     *
5538     */
5539    /* binop vAA, vBB, vCC */
5540    FETCH(a0, 1)                           #  a0 <- CCBB
5541    GET_OPA(rOBJ)                          #  s5 <- AA
5542    and       a2, a0, 255                  #  a2 <- BB
5543    srl       a3, a0, 8                    #  a3 <- CC
5544    EAS2(a2, rFP, a2)                      #  a2 <- &fp[BB]
5545    EAS2(t1, rFP, a3)                      #  a3 <- &fp[CC]
5546    LOAD64_F(fa0, fa0f, a2)
5547    LOAD64_F(fa1, fa1f, t1)
5548
5549    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
5550    div.d fv0, fa0, fa1
5551    SET_VREG64_F(fv0, fv0f, rOBJ)
5552    b         .Lop_div_double_finish
5553
5554
5555/* ------------------------------ */
5556    .balign 128
5557.L_op_rem_double: /* 0xaf */
5558/* File: mips/op_rem_double.S */
5559/* File: mips/fbinopWide.S */
5560    /*
5561     * Generic 64-bit binary operation.  Provide an "instr" line that
5562     * specifies an instruction that performs "result = a0-a1 op a2-a3".
5563     * This could be an MIPS instruction or a function call.
5564     *
5565     * for: add-double, sub-double, mul-double, div-double,
5566     *      rem-double
5567     *
5568     */
5569    /* binop vAA, vBB, vCC */
5570    FETCH(a0, 1)                           #  a0 <- CCBB
5571    GET_OPA(rOBJ)                          #  s5 <- AA
5572    and       a2, a0, 255                  #  a2 <- BB
5573    srl       a3, a0, 8                    #  a3 <- CC
5574    EAS2(a2, rFP, a2)                      #  a2 <- &fp[BB]
5575    EAS2(t1, rFP, a3)                      #  a3 <- &fp[CC]
5576    LOAD64_F(fa0, fa0f, a2)
5577    LOAD64_F(fa1, fa1f, t1)
5578
5579    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
5580    JAL(fmod)
5581    SET_VREG64_F(fv0, fv0f, rOBJ)
5582    b         .Lop_rem_double_finish
5583
5584
5585/* ------------------------------ */
5586    .balign 128
5587.L_op_add_int_2addr: /* 0xb0 */
5588/* File: mips/op_add_int_2addr.S */
5589/* File: mips/binop2addr.S */
5590    /*
5591     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5592     * that specifies an instruction that performs "result = a0 op a1".
5593     * This could be an MIPS instruction or a function call.
5594     *
5595     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5596     * vCC (a1).  Useful for integer division and modulus.
5597     *
5598     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5599     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5600     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr
5601     */
5602    /* binop/2addr vA, vB */
5603    GET_OPA4(rOBJ)                         #  rOBJ <- A+
5604    GET_OPB(a3)                            #  a3 <- B
5605    GET_VREG(a0, rOBJ)                     #  a0 <- vA
5606    GET_VREG(a1, a3)                       #  a1 <- vB
5607    .if 0
5608    # is second operand zero?
5609    beqz      a1, common_errDivideByZero
5610    .endif
5611    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
5612
5613                                  #  optional op
5614    addu a0, a0, a1                                 #  a0 <- op, a0-a3 changed
5615    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
5616    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
5617    /* 10-13 instructions */
5618
5619
5620/* ------------------------------ */
5621    .balign 128
5622.L_op_sub_int_2addr: /* 0xb1 */
5623/* File: mips/op_sub_int_2addr.S */
5624/* File: mips/binop2addr.S */
5625    /*
5626     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5627     * that specifies an instruction that performs "result = a0 op a1".
5628     * This could be an MIPS instruction or a function call.
5629     *
5630     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5631     * vCC (a1).  Useful for integer division and modulus.
5632     *
5633     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5634     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5635     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr
5636     */
5637    /* binop/2addr vA, vB */
5638    GET_OPA4(rOBJ)                         #  rOBJ <- A+
5639    GET_OPB(a3)                            #  a3 <- B
5640    GET_VREG(a0, rOBJ)                     #  a0 <- vA
5641    GET_VREG(a1, a3)                       #  a1 <- vB
5642    .if 0
5643    # is second operand zero?
5644    beqz      a1, common_errDivideByZero
5645    .endif
5646    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
5647
5648                                  #  optional op
5649    subu a0, a0, a1                                 #  a0 <- op, a0-a3 changed
5650    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
5651    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
5652    /* 10-13 instructions */
5653
5654
5655/* ------------------------------ */
5656    .balign 128
5657.L_op_mul_int_2addr: /* 0xb2 */
5658/* File: mips/op_mul_int_2addr.S */
5659/* File: mips/binop2addr.S */
5660    /*
5661     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5662     * that specifies an instruction that performs "result = a0 op a1".
5663     * This could be an MIPS instruction or a function call.
5664     *
5665     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5666     * vCC (a1).  Useful for integer division and modulus.
5667     *
5668     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5669     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5670     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr
5671     */
5672    /* binop/2addr vA, vB */
5673    GET_OPA4(rOBJ)                         #  rOBJ <- A+
5674    GET_OPB(a3)                            #  a3 <- B
5675    GET_VREG(a0, rOBJ)                     #  a0 <- vA
5676    GET_VREG(a1, a3)                       #  a1 <- vB
5677    .if 0
5678    # is second operand zero?
5679    beqz      a1, common_errDivideByZero
5680    .endif
5681    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
5682
5683                                  #  optional op
5684    mul a0, a0, a1                                 #  a0 <- op, a0-a3 changed
5685    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
5686    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
5687    /* 10-13 instructions */
5688
5689
5690/* ------------------------------ */
5691    .balign 128
5692.L_op_div_int_2addr: /* 0xb3 */
5693/* File: mips/op_div_int_2addr.S */
5694#ifdef MIPS32REVGE6
5695/* File: mips/binop2addr.S */
5696    /*
5697     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5698     * that specifies an instruction that performs "result = a0 op a1".
5699     * This could be an MIPS instruction or a function call.
5700     *
5701     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5702     * vCC (a1).  Useful for integer division and modulus.
5703     *
5704     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5705     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5706     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr
5707     */
5708    /* binop/2addr vA, vB */
5709    GET_OPA4(rOBJ)                         #  rOBJ <- A+
5710    GET_OPB(a3)                            #  a3 <- B
5711    GET_VREG(a0, rOBJ)                     #  a0 <- vA
5712    GET_VREG(a1, a3)                       #  a1 <- vB
5713    .if 1
5714    # is second operand zero?
5715    beqz      a1, common_errDivideByZero
5716    .endif
5717    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
5718
5719                                  #  optional op
5720    div a0, a0, a1                                 #  a0 <- op, a0-a3 changed
5721    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
5722    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
5723    /* 10-13 instructions */
5724
5725#else
5726/* File: mips/binop2addr.S */
5727    /*
5728     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5729     * that specifies an instruction that performs "result = a0 op a1".
5730     * This could be an MIPS instruction or a function call.
5731     *
5732     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5733     * vCC (a1).  Useful for integer division and modulus.
5734     *
5735     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5736     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5737     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr
5738     */
5739    /* binop/2addr vA, vB */
5740    GET_OPA4(rOBJ)                         #  rOBJ <- A+
5741    GET_OPB(a3)                            #  a3 <- B
5742    GET_VREG(a0, rOBJ)                     #  a0 <- vA
5743    GET_VREG(a1, a3)                       #  a1 <- vB
5744    .if 1
5745    # is second operand zero?
5746    beqz      a1, common_errDivideByZero
5747    .endif
5748    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
5749
5750    div zero, a0, a1                              #  optional op
5751    mflo a0                                 #  a0 <- op, a0-a3 changed
5752    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
5753    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
5754    /* 10-13 instructions */
5755
5756#endif
5757
5758/* ------------------------------ */
5759    .balign 128
5760.L_op_rem_int_2addr: /* 0xb4 */
5761/* File: mips/op_rem_int_2addr.S */
5762#ifdef MIPS32REVGE6
5763/* File: mips/binop2addr.S */
5764    /*
5765     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5766     * that specifies an instruction that performs "result = a0 op a1".
5767     * This could be an MIPS instruction or a function call.
5768     *
5769     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5770     * vCC (a1).  Useful for integer division and modulus.
5771     *
5772     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5773     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5774     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr
5775     */
5776    /* binop/2addr vA, vB */
5777    GET_OPA4(rOBJ)                         #  rOBJ <- A+
5778    GET_OPB(a3)                            #  a3 <- B
5779    GET_VREG(a0, rOBJ)                     #  a0 <- vA
5780    GET_VREG(a1, a3)                       #  a1 <- vB
5781    .if 1
5782    # is second operand zero?
5783    beqz      a1, common_errDivideByZero
5784    .endif
5785    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
5786
5787                                  #  optional op
5788    mod a0, a0, a1                                 #  a0 <- op, a0-a3 changed
5789    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
5790    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
5791    /* 10-13 instructions */
5792
5793#else
5794/* File: mips/binop2addr.S */
5795    /*
5796     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5797     * that specifies an instruction that performs "result = a0 op a1".
5798     * This could be an MIPS instruction or a function call.
5799     *
5800     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5801     * vCC (a1).  Useful for integer division and modulus.
5802     *
5803     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5804     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5805     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr
5806     */
5807    /* binop/2addr vA, vB */
5808    GET_OPA4(rOBJ)                         #  rOBJ <- A+
5809    GET_OPB(a3)                            #  a3 <- B
5810    GET_VREG(a0, rOBJ)                     #  a0 <- vA
5811    GET_VREG(a1, a3)                       #  a1 <- vB
5812    .if 1
5813    # is second operand zero?
5814    beqz      a1, common_errDivideByZero
5815    .endif
5816    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
5817
5818    div zero, a0, a1                              #  optional op
5819    mfhi a0                                 #  a0 <- op, a0-a3 changed
5820    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
5821    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
5822    /* 10-13 instructions */
5823
5824#endif
5825
5826/* ------------------------------ */
5827    .balign 128
5828.L_op_and_int_2addr: /* 0xb5 */
5829/* File: mips/op_and_int_2addr.S */
5830/* File: mips/binop2addr.S */
5831    /*
5832     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5833     * that specifies an instruction that performs "result = a0 op a1".
5834     * This could be an MIPS instruction or a function call.
5835     *
5836     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5837     * vCC (a1).  Useful for integer division and modulus.
5838     *
5839     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5840     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5841     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr
5842     */
5843    /* binop/2addr vA, vB */
5844    GET_OPA4(rOBJ)                         #  rOBJ <- A+
5845    GET_OPB(a3)                            #  a3 <- B
5846    GET_VREG(a0, rOBJ)                     #  a0 <- vA
5847    GET_VREG(a1, a3)                       #  a1 <- vB
5848    .if 0
5849    # is second operand zero?
5850    beqz      a1, common_errDivideByZero
5851    .endif
5852    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
5853
5854                                  #  optional op
5855    and a0, a0, a1                                 #  a0 <- op, a0-a3 changed
5856    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
5857    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
5858    /* 10-13 instructions */
5859
5860
5861/* ------------------------------ */
5862    .balign 128
5863.L_op_or_int_2addr: /* 0xb6 */
5864/* File: mips/op_or_int_2addr.S */
5865/* File: mips/binop2addr.S */
5866    /*
5867     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5868     * that specifies an instruction that performs "result = a0 op a1".
5869     * This could be an MIPS instruction or a function call.
5870     *
5871     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5872     * vCC (a1).  Useful for integer division and modulus.
5873     *
5874     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5875     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5876     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr
5877     */
5878    /* binop/2addr vA, vB */
5879    GET_OPA4(rOBJ)                         #  rOBJ <- A+
5880    GET_OPB(a3)                            #  a3 <- B
5881    GET_VREG(a0, rOBJ)                     #  a0 <- vA
5882    GET_VREG(a1, a3)                       #  a1 <- vB
5883    .if 0
5884    # is second operand zero?
5885    beqz      a1, common_errDivideByZero
5886    .endif
5887    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
5888
5889                                  #  optional op
5890    or a0, a0, a1                                 #  a0 <- op, a0-a3 changed
5891    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
5892    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
5893    /* 10-13 instructions */
5894
5895
5896/* ------------------------------ */
5897    .balign 128
5898.L_op_xor_int_2addr: /* 0xb7 */
5899/* File: mips/op_xor_int_2addr.S */
5900/* File: mips/binop2addr.S */
5901    /*
5902     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5903     * that specifies an instruction that performs "result = a0 op a1".
5904     * This could be an MIPS instruction or a function call.
5905     *
5906     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5907     * vCC (a1).  Useful for integer division and modulus.
5908     *
5909     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5910     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5911     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr
5912     */
5913    /* binop/2addr vA, vB */
5914    GET_OPA4(rOBJ)                         #  rOBJ <- A+
5915    GET_OPB(a3)                            #  a3 <- B
5916    GET_VREG(a0, rOBJ)                     #  a0 <- vA
5917    GET_VREG(a1, a3)                       #  a1 <- vB
5918    .if 0
5919    # is second operand zero?
5920    beqz      a1, common_errDivideByZero
5921    .endif
5922    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
5923
5924                                  #  optional op
5925    xor a0, a0, a1                                 #  a0 <- op, a0-a3 changed
5926    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
5927    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
5928    /* 10-13 instructions */
5929
5930
5931/* ------------------------------ */
5932    .balign 128
5933.L_op_shl_int_2addr: /* 0xb8 */
5934/* File: mips/op_shl_int_2addr.S */
5935/* File: mips/binop2addr.S */
5936    /*
5937     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5938     * that specifies an instruction that performs "result = a0 op a1".
5939     * This could be an MIPS instruction or a function call.
5940     *
5941     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5942     * vCC (a1).  Useful for integer division and modulus.
5943     *
5944     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5945     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5946     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr
5947     */
5948    /* binop/2addr vA, vB */
5949    GET_OPA4(rOBJ)                         #  rOBJ <- A+
5950    GET_OPB(a3)                            #  a3 <- B
5951    GET_VREG(a0, rOBJ)                     #  a0 <- vA
5952    GET_VREG(a1, a3)                       #  a1 <- vB
5953    .if 0
5954    # is second operand zero?
5955    beqz      a1, common_errDivideByZero
5956    .endif
5957    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
5958
5959                                  #  optional op
5960    sll a0, a0, a1                                 #  a0 <- op, a0-a3 changed
5961    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
5962    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
5963    /* 10-13 instructions */
5964
5965
5966/* ------------------------------ */
5967    .balign 128
5968.L_op_shr_int_2addr: /* 0xb9 */
5969/* File: mips/op_shr_int_2addr.S */
5970/* File: mips/binop2addr.S */
5971    /*
5972     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5973     * that specifies an instruction that performs "result = a0 op a1".
5974     * This could be an MIPS instruction or a function call.
5975     *
5976     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5977     * vCC (a1).  Useful for integer division and modulus.
5978     *
5979     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5980     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5981     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr
5982     */
5983    /* binop/2addr vA, vB */
5984    GET_OPA4(rOBJ)                         #  rOBJ <- A+
5985    GET_OPB(a3)                            #  a3 <- B
5986    GET_VREG(a0, rOBJ)                     #  a0 <- vA
5987    GET_VREG(a1, a3)                       #  a1 <- vB
5988    .if 0
5989    # is second operand zero?
5990    beqz      a1, common_errDivideByZero
5991    .endif
5992    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
5993
5994                                  #  optional op
5995    sra a0, a0, a1                                 #  a0 <- op, a0-a3 changed
5996    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
5997    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
5998    /* 10-13 instructions */
5999
6000
6001/* ------------------------------ */
6002    .balign 128
6003.L_op_ushr_int_2addr: /* 0xba */
6004/* File: mips/op_ushr_int_2addr.S */
6005/* File: mips/binop2addr.S */
6006    /*
6007     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
6008     * that specifies an instruction that performs "result = a0 op a1".
6009     * This could be an MIPS instruction or a function call.
6010     *
6011     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6012     * vCC (a1).  Useful for integer division and modulus.
6013     *
6014     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6015     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6016     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr
6017     */
6018    /* binop/2addr vA, vB */
6019    GET_OPA4(rOBJ)                         #  rOBJ <- A+
6020    GET_OPB(a3)                            #  a3 <- B
6021    GET_VREG(a0, rOBJ)                     #  a0 <- vA
6022    GET_VREG(a1, a3)                       #  a1 <- vB
6023    .if 0
6024    # is second operand zero?
6025    beqz      a1, common_errDivideByZero
6026    .endif
6027    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
6028
6029                                  #  optional op
6030    srl a0, a0, a1                                  #  a0 <- op, a0-a3 changed
6031    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
6032    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
6033    /* 10-13 instructions */
6034
6035
6036/* ------------------------------ */
6037    .balign 128
6038.L_op_add_long_2addr: /* 0xbb */
6039/* File: mips/op_add_long_2addr.S */
6040/*
6041 * See op_add_long.S for details
6042 */
6043/* File: mips/binopWide2addr.S */
6044    /*
6045     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6046     * that specifies an instruction that performs "result = a0-a1 op a2-a3".
6047     * This could be a MIPS instruction or a function call.  (If the result
6048     * comes back in a register other than a0, you can override "result".)
6049     *
6050     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6051     * vCC (a1).  Useful for integer division and modulus.
6052     *
6053     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6054     *      and-long/2addr, or-long/2addr, xor-long/2addr
6055     *      rem-double/2addr
6056     */
6057    /* binop/2addr vA, vB */
6058    GET_OPA4(rOBJ)                         #  rOBJ <- A+
6059    GET_OPB(a1)                            #  a1 <- B
6060    EAS2(a1, rFP, a1)                      #  a1 <- &fp[B]
6061    EAS2(t0, rFP, rOBJ)                    #  t0 <- &fp[A]
6062    LOAD64(a2, a3, a1)               #  a2/a3 <- vBB/vBB+1
6063    LOAD64(a0, a1, t0)               #  a0/a1 <- vAA/vAA+1
6064    .if 0
6065    or        t0, a2, a3             #  second arg (a2-a3) is zero?
6066    beqz      t0, common_errDivideByZero
6067    .endif
6068    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
6069
6070    addu v0, a2, a0                              #  optional op
6071    addu a1, a3, a1; sltu v1, v0, a2; addu v1, v1, a1                                 #  result <- op, a0-a3 changed
6072    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
6073    SET_VREG64(v0, v1, rOBJ)   #  vAA/vAA+1 <- v0/v1
6074    GOTO_OPCODE(t0)                        #  jump to next instruction
6075    /* 12-15 instructions */
6076
6077
6078/* ------------------------------ */
6079    .balign 128
6080.L_op_sub_long_2addr: /* 0xbc */
6081/* File: mips/op_sub_long_2addr.S */
6082/*
6083 * See op_sub_long.S for more details
6084 */
6085/* File: mips/binopWide2addr.S */
6086    /*
6087     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6088     * that specifies an instruction that performs "result = a0-a1 op a2-a3".
6089     * This could be a MIPS instruction or a function call.  (If the result
6090     * comes back in a register other than a0, you can override "result".)
6091     *
6092     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6093     * vCC (a1).  Useful for integer division and modulus.
6094     *
6095     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6096     *      and-long/2addr, or-long/2addr, xor-long/2addr
6097     *      rem-double/2addr
6098     */
6099    /* binop/2addr vA, vB */
6100    GET_OPA4(rOBJ)                         #  rOBJ <- A+
6101    GET_OPB(a1)                            #  a1 <- B
6102    EAS2(a1, rFP, a1)                      #  a1 <- &fp[B]
6103    EAS2(t0, rFP, rOBJ)                    #  t0 <- &fp[A]
6104    LOAD64(a2, a3, a1)               #  a2/a3 <- vBB/vBB+1
6105    LOAD64(a0, a1, t0)               #  a0/a1 <- vAA/vAA+1
6106    .if 0
6107    or        t0, a2, a3             #  second arg (a2-a3) is zero?
6108    beqz      t0, common_errDivideByZero
6109    .endif
6110    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
6111
6112    subu v0, a0, a2                              #  optional op
6113    subu v1, a1, a3; sltu a0, a0, v0; subu v1, v1, a0                                 #  result <- op, a0-a3 changed
6114    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
6115    SET_VREG64(v0, v1, rOBJ)   #  vAA/vAA+1 <- v0/v1
6116    GOTO_OPCODE(t0)                        #  jump to next instruction
6117    /* 12-15 instructions */
6118
6119
6120/* ------------------------------ */
6121    .balign 128
6122.L_op_mul_long_2addr: /* 0xbd */
6123/* File: mips/op_mul_long_2addr.S */
6124    /*
6125     * See op_mul_long.S for more details
6126     */
6127    /* mul-long/2addr vA, vB */
6128    GET_OPA4(rOBJ)                         #  rOBJ <- A+
6129
6130    EAS2(t0, rFP, rOBJ)                    #  t0 <- &fp[A]
6131    LOAD64(a0, a1, t0)                     #  vAA.low / high
6132
6133    GET_OPB(t1)                            #  t1 <- B
6134    EAS2(t1, rFP, t1)                      #  t1 <- &fp[B]
6135    LOAD64(a2, a3, t1)                     #  vBB.low / high
6136
6137    mul       v1, a3, a0                   #  v1= a3a0
6138#ifdef MIPS32REVGE6
6139    mulu      v0, a2, a0                   #  v0= a2a0
6140    muhu      t1, a2, a0
6141#else
6142    multu     a2, a0
6143    mfhi      t1
6144    mflo      v0                           #  v0= a2a0
6145 #endif
6146    mul       t2, a2, a1                   #  t2= a2a1
6147    addu      v1, v1, t1                   #  v1= a3a0 + hi(a2a0)
6148    addu      v1, v1, t2                   #  v1= v1 + a2a1;
6149
6150    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
6151    GET_INST_OPCODE(t1)                    #  extract opcode from rINST
6152    # vAA <- v0 (low)
6153    SET_VREG64(v0, v1, rOBJ)               #  vAA+1 <- v1 (high)
6154    GOTO_OPCODE(t1)                        #  jump to next instruction
6155
6156/* ------------------------------ */
6157    .balign 128
6158.L_op_div_long_2addr: /* 0xbe */
6159/* File: mips/op_div_long_2addr.S */
6160/* File: mips/binopWide2addr.S */
6161    /*
6162     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6163     * that specifies an instruction that performs "result = a0-a1 op a2-a3".
6164     * This could be a MIPS instruction or a function call.  (If the result
6165     * comes back in a register other than a0, you can override "result".)
6166     *
6167     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6168     * vCC (a1).  Useful for integer division and modulus.
6169     *
6170     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6171     *      and-long/2addr, or-long/2addr, xor-long/2addr
6172     *      rem-double/2addr
6173     */
6174    /* binop/2addr vA, vB */
6175    GET_OPA4(rOBJ)                         #  rOBJ <- A+
6176    GET_OPB(a1)                            #  a1 <- B
6177    EAS2(a1, rFP, a1)                      #  a1 <- &fp[B]
6178    EAS2(t0, rFP, rOBJ)                    #  t0 <- &fp[A]
6179    LOAD64(a2, a3, a1)               #  a2/a3 <- vBB/vBB+1
6180    LOAD64(a0, a1, t0)               #  a0/a1 <- vAA/vAA+1
6181    .if 1
6182    or        t0, a2, a3             #  second arg (a2-a3) is zero?
6183    beqz      t0, common_errDivideByZero
6184    .endif
6185    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
6186
6187                                  #  optional op
6188    JAL(__divdi3)                                 #  result <- op, a0-a3 changed
6189    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
6190    SET_VREG64(v0, v1, rOBJ)   #  vAA/vAA+1 <- v0/v1
6191    GOTO_OPCODE(t0)                        #  jump to next instruction
6192    /* 12-15 instructions */
6193
6194
6195/* ------------------------------ */
6196    .balign 128
6197.L_op_rem_long_2addr: /* 0xbf */
6198/* File: mips/op_rem_long_2addr.S */
6199/* File: mips/binopWide2addr.S */
6200    /*
6201     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6202     * that specifies an instruction that performs "result = a0-a1 op a2-a3".
6203     * This could be a MIPS instruction or a function call.  (If the result
6204     * comes back in a register other than a0, you can override "result".)
6205     *
6206     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6207     * vCC (a1).  Useful for integer division and modulus.
6208     *
6209     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6210     *      and-long/2addr, or-long/2addr, xor-long/2addr
6211     *      rem-double/2addr
6212     */
6213    /* binop/2addr vA, vB */
6214    GET_OPA4(rOBJ)                         #  rOBJ <- A+
6215    GET_OPB(a1)                            #  a1 <- B
6216    EAS2(a1, rFP, a1)                      #  a1 <- &fp[B]
6217    EAS2(t0, rFP, rOBJ)                    #  t0 <- &fp[A]
6218    LOAD64(a2, a3, a1)               #  a2/a3 <- vBB/vBB+1
6219    LOAD64(a0, a1, t0)               #  a0/a1 <- vAA/vAA+1
6220    .if 1
6221    or        t0, a2, a3             #  second arg (a2-a3) is zero?
6222    beqz      t0, common_errDivideByZero
6223    .endif
6224    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
6225
6226                                  #  optional op
6227    JAL(__moddi3)                                 #  result <- op, a0-a3 changed
6228    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
6229    SET_VREG64(v0, v1, rOBJ)   #  vAA/vAA+1 <- v0/v1
6230    GOTO_OPCODE(t0)                        #  jump to next instruction
6231    /* 12-15 instructions */
6232
6233
6234/* ------------------------------ */
6235    .balign 128
6236.L_op_and_long_2addr: /* 0xc0 */
6237/* File: mips/op_and_long_2addr.S */
6238/* File: mips/binopWide2addr.S */
6239    /*
6240     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6241     * that specifies an instruction that performs "result = a0-a1 op a2-a3".
6242     * This could be a MIPS instruction or a function call.  (If the result
6243     * comes back in a register other than a0, you can override "result".)
6244     *
6245     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6246     * vCC (a1).  Useful for integer division and modulus.
6247     *
6248     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6249     *      and-long/2addr, or-long/2addr, xor-long/2addr
6250     *      rem-double/2addr
6251     */
6252    /* binop/2addr vA, vB */
6253    GET_OPA4(rOBJ)                         #  rOBJ <- A+
6254    GET_OPB(a1)                            #  a1 <- B
6255    EAS2(a1, rFP, a1)                      #  a1 <- &fp[B]
6256    EAS2(t0, rFP, rOBJ)                    #  t0 <- &fp[A]
6257    LOAD64(a2, a3, a1)               #  a2/a3 <- vBB/vBB+1
6258    LOAD64(a0, a1, t0)               #  a0/a1 <- vAA/vAA+1
6259    .if 0
6260    or        t0, a2, a3             #  second arg (a2-a3) is zero?
6261    beqz      t0, common_errDivideByZero
6262    .endif
6263    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
6264
6265    and a0, a0, a2                              #  optional op
6266    and a1, a1, a3                                 #  result <- op, a0-a3 changed
6267    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
6268    SET_VREG64(a0, a1, rOBJ)   #  vAA/vAA+1 <- a0/a1
6269    GOTO_OPCODE(t0)                        #  jump to next instruction
6270    /* 12-15 instructions */
6271
6272
6273/* ------------------------------ */
6274    .balign 128
6275.L_op_or_long_2addr: /* 0xc1 */
6276/* File: mips/op_or_long_2addr.S */
6277/* File: mips/binopWide2addr.S */
6278    /*
6279     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6280     * that specifies an instruction that performs "result = a0-a1 op a2-a3".
6281     * This could be a MIPS instruction or a function call.  (If the result
6282     * comes back in a register other than a0, you can override "result".)
6283     *
6284     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6285     * vCC (a1).  Useful for integer division and modulus.
6286     *
6287     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6288     *      and-long/2addr, or-long/2addr, xor-long/2addr
6289     *      rem-double/2addr
6290     */
6291    /* binop/2addr vA, vB */
6292    GET_OPA4(rOBJ)                         #  rOBJ <- A+
6293    GET_OPB(a1)                            #  a1 <- B
6294    EAS2(a1, rFP, a1)                      #  a1 <- &fp[B]
6295    EAS2(t0, rFP, rOBJ)                    #  t0 <- &fp[A]
6296    LOAD64(a2, a3, a1)               #  a2/a3 <- vBB/vBB+1
6297    LOAD64(a0, a1, t0)               #  a0/a1 <- vAA/vAA+1
6298    .if 0
6299    or        t0, a2, a3             #  second arg (a2-a3) is zero?
6300    beqz      t0, common_errDivideByZero
6301    .endif
6302    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
6303
6304    or a0, a0, a2                              #  optional op
6305    or a1, a1, a3                                 #  result <- op, a0-a3 changed
6306    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
6307    SET_VREG64(a0, a1, rOBJ)   #  vAA/vAA+1 <- a0/a1
6308    GOTO_OPCODE(t0)                        #  jump to next instruction
6309    /* 12-15 instructions */
6310
6311
6312/* ------------------------------ */
6313    .balign 128
6314.L_op_xor_long_2addr: /* 0xc2 */
6315/* File: mips/op_xor_long_2addr.S */
6316/* File: mips/binopWide2addr.S */
6317    /*
6318     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6319     * that specifies an instruction that performs "result = a0-a1 op a2-a3".
6320     * This could be a MIPS instruction or a function call.  (If the result
6321     * comes back in a register other than a0, you can override "result".)
6322     *
6323     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6324     * vCC (a1).  Useful for integer division and modulus.
6325     *
6326     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6327     *      and-long/2addr, or-long/2addr, xor-long/2addr
6328     *      rem-double/2addr
6329     */
6330    /* binop/2addr vA, vB */
6331    GET_OPA4(rOBJ)                         #  rOBJ <- A+
6332    GET_OPB(a1)                            #  a1 <- B
6333    EAS2(a1, rFP, a1)                      #  a1 <- &fp[B]
6334    EAS2(t0, rFP, rOBJ)                    #  t0 <- &fp[A]
6335    LOAD64(a2, a3, a1)               #  a2/a3 <- vBB/vBB+1
6336    LOAD64(a0, a1, t0)               #  a0/a1 <- vAA/vAA+1
6337    .if 0
6338    or        t0, a2, a3             #  second arg (a2-a3) is zero?
6339    beqz      t0, common_errDivideByZero
6340    .endif
6341    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
6342
6343    xor a0, a0, a2                              #  optional op
6344    xor a1, a1, a3                                 #  result <- op, a0-a3 changed
6345    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
6346    SET_VREG64(a0, a1, rOBJ)   #  vAA/vAA+1 <- a0/a1
6347    GOTO_OPCODE(t0)                        #  jump to next instruction
6348    /* 12-15 instructions */
6349
6350
6351/* ------------------------------ */
6352    .balign 128
6353.L_op_shl_long_2addr: /* 0xc3 */
6354/* File: mips/op_shl_long_2addr.S */
6355    /*
6356     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
6357     * 32-bit shift distance.
6358     */
6359    /* shl-long/2addr vA, vB */
6360    GET_OPA4(rOBJ)                         #  rOBJ <- A+
6361    GET_OPB(a3)                            #  a3 <- B
6362    GET_VREG(a2, a3)                       #  a2 <- vB
6363    EAS2(t2, rFP, rOBJ)                    #  t2 <- &fp[A]
6364    LOAD64(a0, a1, t2)                     #  a0/a1 <- vAA/vAA+1
6365
6366    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
6367    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
6368
6369    andi    v1, a2, 0x20                   #  shift< shift & 0x20
6370    sll     v0, a0, a2                     #  rlo<- alo << (shift&31)
6371    bnez    v1, .Lop_shl_long_2addr_finish
6372    not     v1, a2                         #  rhi<- 31-shift  (shift is 5b)
6373    srl     a0, 1
6374    srl     a0, v1                         #  alo<- alo >> (32-(shift&31))
6375    sll     v1, a1, a2                     #  rhi<- ahi << (shift&31)
6376    or      v1, a0                         #  rhi<- rhi | alo
6377    SET_VREG64_GOTO(v0, v1, rOBJ, t0)      #  vAA/vAA+1 <- a0/a1
6378
6379/* ------------------------------ */
6380    .balign 128
6381.L_op_shr_long_2addr: /* 0xc4 */
6382/* File: mips/op_shr_long_2addr.S */
6383    /*
6384     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
6385     * 32-bit shift distance.
6386     */
6387    /* shr-long/2addr vA, vB */
6388    GET_OPA4(t2)                           #  t2 <- A+
6389    GET_OPB(a3)                            #  a3 <- B
6390    GET_VREG(a2, a3)                       #  a2 <- vB
6391    EAS2(t0, rFP, t2)                      #  t0 <- &fp[A]
6392    LOAD64(a0, a1, t0)                     #  a0/a1 <- vAA/vAA+1
6393    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
6394    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
6395
6396    andi    v0, a2, 0x20                   #  shift & 0x20
6397    sra     v1, a1, a2                     #  rhi<- ahi >> (shift&31)
6398    bnez    v0, .Lop_shr_long_2addr_finish
6399    srl     v0, a0, a2                     #  rlo<- alo >> (shift&31)
6400    not     a0, a2                         #  alo<- 31-shift (shift is 5b)
6401    sll     a1, 1
6402    sll     a1, a0                         #  ahi<- ahi << (32-(shift&31))
6403    or      v0, a1                         #  rlo<- rlo | ahi
6404    SET_VREG64_GOTO(v0, v1, t2, t0)        #  vAA/vAA+1 <- a0/a1
6405
6406/* ------------------------------ */
6407    .balign 128
6408.L_op_ushr_long_2addr: /* 0xc5 */
6409/* File: mips/op_ushr_long_2addr.S */
6410    /*
6411     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
6412     * 32-bit shift distance.
6413     */
6414    /* ushr-long/2addr vA, vB */
6415    GET_OPA4(t3)                           #  t3 <- A+
6416    GET_OPB(a3)                            #  a3 <- B
6417    GET_VREG(a2, a3)                       #  a2 <- vB
6418    EAS2(t0, rFP, t3)                      #  t0 <- &fp[A]
6419    LOAD64(a0, a1, t0)                     #  a0/a1 <- vAA/vAA+1
6420
6421    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
6422    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
6423
6424    andi      v0, a2, 0x20                 #  shift & 0x20
6425    srl       v1, a1, a2                   #  rhi<- ahi >> (shift&31)
6426    bnez      v0, .Lop_ushr_long_2addr_finish
6427    srl       v0, a0, a2                   #  rlo<- alo >> (shift&31)
6428    not       a0, a2                       #  alo<- 31-n  (shift is 5b)
6429    sll       a1, 1
6430    sll       a1, a0                       #  ahi<- ahi << (32-(shift&31))
6431    or        v0, a1                       #  rlo<- rlo | ahi
6432    SET_VREG64_GOTO(v0, v1, t3, t0)        #  vAA/vAA+1 <- a0/a1
6433
6434/* ------------------------------ */
6435    .balign 128
6436.L_op_add_float_2addr: /* 0xc6 */
6437/* File: mips/op_add_float_2addr.S */
6438/* File: mips/fbinop2addr.S */
6439    /*
6440     * Generic 32-bit "/2addr" binary operation.  Provide an "instr"
6441     * that specifies an instruction that performs "result = a0 op a1".
6442     * This could be an MIPS instruction or a function call.
6443     *
6444     * For: add-float/2addr, sub-float/2addr, mul-float/2addr,
6445     * div-float/2addr, rem-float/2addr
6446     */
6447    /* binop/2addr vA, vB */
6448    GET_OPA4(rOBJ)                         #  t1 <- A+
6449    GET_OPB(a3)                            #  a3 <- B
6450    GET_VREG_F(fa0, rOBJ)
6451    GET_VREG_F(fa1, a3)
6452    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
6453
6454    add.s fv0, fa0, fa1
6455    SET_VREG_F(fv0, rOBJ)                  #  vAA <- result
6456    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
6457    GOTO_OPCODE(t0)                        #  jump to next instruction
6458
6459
6460/* ------------------------------ */
6461    .balign 128
6462.L_op_sub_float_2addr: /* 0xc7 */
6463/* File: mips/op_sub_float_2addr.S */
6464/* File: mips/fbinop2addr.S */
6465    /*
6466     * Generic 32-bit "/2addr" binary operation.  Provide an "instr"
6467     * that specifies an instruction that performs "result = a0 op a1".
6468     * This could be an MIPS instruction or a function call.
6469     *
6470     * For: add-float/2addr, sub-float/2addr, mul-float/2addr,
6471     * div-float/2addr, rem-float/2addr
6472     */
6473    /* binop/2addr vA, vB */
6474    GET_OPA4(rOBJ)                         #  t1 <- A+
6475    GET_OPB(a3)                            #  a3 <- B
6476    GET_VREG_F(fa0, rOBJ)
6477    GET_VREG_F(fa1, a3)
6478    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
6479
6480    sub.s fv0, fa0, fa1
6481    SET_VREG_F(fv0, rOBJ)                  #  vAA <- result
6482    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
6483    GOTO_OPCODE(t0)                        #  jump to next instruction
6484
6485
6486/* ------------------------------ */
6487    .balign 128
6488.L_op_mul_float_2addr: /* 0xc8 */
6489/* File: mips/op_mul_float_2addr.S */
6490/* File: mips/fbinop2addr.S */
6491    /*
6492     * Generic 32-bit "/2addr" binary operation.  Provide an "instr"
6493     * that specifies an instruction that performs "result = a0 op a1".
6494     * This could be an MIPS instruction or a function call.
6495     *
6496     * For: add-float/2addr, sub-float/2addr, mul-float/2addr,
6497     * div-float/2addr, rem-float/2addr
6498     */
6499    /* binop/2addr vA, vB */
6500    GET_OPA4(rOBJ)                         #  t1 <- A+
6501    GET_OPB(a3)                            #  a3 <- B
6502    GET_VREG_F(fa0, rOBJ)
6503    GET_VREG_F(fa1, a3)
6504    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
6505
6506    mul.s fv0, fa0, fa1
6507    SET_VREG_F(fv0, rOBJ)                  #  vAA <- result
6508    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
6509    GOTO_OPCODE(t0)                        #  jump to next instruction
6510
6511
6512/* ------------------------------ */
6513    .balign 128
6514.L_op_div_float_2addr: /* 0xc9 */
6515/* File: mips/op_div_float_2addr.S */
6516/* File: mips/fbinop2addr.S */
6517    /*
6518     * Generic 32-bit "/2addr" binary operation.  Provide an "instr"
6519     * that specifies an instruction that performs "result = a0 op a1".
6520     * This could be an MIPS instruction or a function call.
6521     *
6522     * For: add-float/2addr, sub-float/2addr, mul-float/2addr,
6523     * div-float/2addr, rem-float/2addr
6524     */
6525    /* binop/2addr vA, vB */
6526    GET_OPA4(rOBJ)                         #  t1 <- A+
6527    GET_OPB(a3)                            #  a3 <- B
6528    GET_VREG_F(fa0, rOBJ)
6529    GET_VREG_F(fa1, a3)
6530    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
6531
6532    div.s fv0, fa0, fa1
6533    SET_VREG_F(fv0, rOBJ)                  #  vAA <- result
6534    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
6535    GOTO_OPCODE(t0)                        #  jump to next instruction
6536
6537
6538/* ------------------------------ */
6539    .balign 128
6540.L_op_rem_float_2addr: /* 0xca */
6541/* File: mips/op_rem_float_2addr.S */
6542/* File: mips/fbinop2addr.S */
6543    /*
6544     * Generic 32-bit "/2addr" binary operation.  Provide an "instr"
6545     * that specifies an instruction that performs "result = a0 op a1".
6546     * This could be an MIPS instruction or a function call.
6547     *
6548     * For: add-float/2addr, sub-float/2addr, mul-float/2addr,
6549     * div-float/2addr, rem-float/2addr
6550     */
6551    /* binop/2addr vA, vB */
6552    GET_OPA4(rOBJ)                         #  t1 <- A+
6553    GET_OPB(a3)                            #  a3 <- B
6554    GET_VREG_F(fa0, rOBJ)
6555    GET_VREG_F(fa1, a3)
6556    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
6557
6558    JAL(fmodf)
6559    SET_VREG_F(fv0, rOBJ)                  #  vAA <- result
6560    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
6561    GOTO_OPCODE(t0)                        #  jump to next instruction
6562
6563
6564/* ------------------------------ */
6565    .balign 128
6566.L_op_add_double_2addr: /* 0xcb */
6567/* File: mips/op_add_double_2addr.S */
6568/* File: mips/fbinopWide2addr.S */
6569    /*
6570     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6571     * that specifies an instruction that performs "result = a0-a1 op a2-a3".
6572     * This could be an MIPS instruction or a function call.
6573     *
6574     * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6575     *  div-double/2addr, rem-double/2addr
6576     */
6577    /* binop/2addr vA, vB */
6578    GET_OPA4(rOBJ)                         #  rOBJ <- A+
6579    GET_OPB(a1)                            #  a1 <- B
6580    EAS2(a1, rFP, a1)                      #  a1 <- &fp[B]
6581    EAS2(t0, rFP, rOBJ)                    #  t0 <- &fp[A]
6582    LOAD64_F(fa0, fa0f, t0)
6583    LOAD64_F(fa1, fa1f, a1)
6584
6585    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
6586    add.d fv0, fa0, fa1
6587    SET_VREG64_F(fv0, fv0f, rOBJ)
6588    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
6589    GOTO_OPCODE(t0)                        #  jump to next instruction
6590
6591
6592/* ------------------------------ */
6593    .balign 128
6594.L_op_sub_double_2addr: /* 0xcc */
6595/* File: mips/op_sub_double_2addr.S */
6596/* File: mips/fbinopWide2addr.S */
6597    /*
6598     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6599     * that specifies an instruction that performs "result = a0-a1 op a2-a3".
6600     * This could be an MIPS instruction or a function call.
6601     *
6602     * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6603     *  div-double/2addr, rem-double/2addr
6604     */
6605    /* binop/2addr vA, vB */
6606    GET_OPA4(rOBJ)                         #  rOBJ <- A+
6607    GET_OPB(a1)                            #  a1 <- B
6608    EAS2(a1, rFP, a1)                      #  a1 <- &fp[B]
6609    EAS2(t0, rFP, rOBJ)                    #  t0 <- &fp[A]
6610    LOAD64_F(fa0, fa0f, t0)
6611    LOAD64_F(fa1, fa1f, a1)
6612
6613    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
6614    sub.d fv0, fa0, fa1
6615    SET_VREG64_F(fv0, fv0f, rOBJ)
6616    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
6617    GOTO_OPCODE(t0)                        #  jump to next instruction
6618
6619
6620/* ------------------------------ */
6621    .balign 128
6622.L_op_mul_double_2addr: /* 0xcd */
6623/* File: mips/op_mul_double_2addr.S */
6624/* File: mips/fbinopWide2addr.S */
6625    /*
6626     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6627     * that specifies an instruction that performs "result = a0-a1 op a2-a3".
6628     * This could be an MIPS instruction or a function call.
6629     *
6630     * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6631     *  div-double/2addr, rem-double/2addr
6632     */
6633    /* binop/2addr vA, vB */
6634    GET_OPA4(rOBJ)                         #  rOBJ <- A+
6635    GET_OPB(a1)                            #  a1 <- B
6636    EAS2(a1, rFP, a1)                      #  a1 <- &fp[B]
6637    EAS2(t0, rFP, rOBJ)                    #  t0 <- &fp[A]
6638    LOAD64_F(fa0, fa0f, t0)
6639    LOAD64_F(fa1, fa1f, a1)
6640
6641    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
6642    mul.d fv0, fa0, fa1
6643    SET_VREG64_F(fv0, fv0f, rOBJ)
6644    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
6645    GOTO_OPCODE(t0)                        #  jump to next instruction
6646
6647
6648/* ------------------------------ */
6649    .balign 128
6650.L_op_div_double_2addr: /* 0xce */
6651/* File: mips/op_div_double_2addr.S */
6652/* File: mips/fbinopWide2addr.S */
6653    /*
6654     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6655     * that specifies an instruction that performs "result = a0-a1 op a2-a3".
6656     * This could be an MIPS instruction or a function call.
6657     *
6658     * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6659     *  div-double/2addr, rem-double/2addr
6660     */
6661    /* binop/2addr vA, vB */
6662    GET_OPA4(rOBJ)                         #  rOBJ <- A+
6663    GET_OPB(a1)                            #  a1 <- B
6664    EAS2(a1, rFP, a1)                      #  a1 <- &fp[B]
6665    EAS2(t0, rFP, rOBJ)                    #  t0 <- &fp[A]
6666    LOAD64_F(fa0, fa0f, t0)
6667    LOAD64_F(fa1, fa1f, a1)
6668
6669    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
6670    div.d fv0, fa0, fa1
6671    SET_VREG64_F(fv0, fv0f, rOBJ)
6672    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
6673    GOTO_OPCODE(t0)                        #  jump to next instruction
6674
6675
6676/* ------------------------------ */
6677    .balign 128
6678.L_op_rem_double_2addr: /* 0xcf */
6679/* File: mips/op_rem_double_2addr.S */
6680/* File: mips/fbinopWide2addr.S */
6681    /*
6682     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6683     * that specifies an instruction that performs "result = a0-a1 op a2-a3".
6684     * This could be an MIPS instruction or a function call.
6685     *
6686     * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6687     *  div-double/2addr, rem-double/2addr
6688     */
6689    /* binop/2addr vA, vB */
6690    GET_OPA4(rOBJ)                         #  rOBJ <- A+
6691    GET_OPB(a1)                            #  a1 <- B
6692    EAS2(a1, rFP, a1)                      #  a1 <- &fp[B]
6693    EAS2(t0, rFP, rOBJ)                    #  t0 <- &fp[A]
6694    LOAD64_F(fa0, fa0f, t0)
6695    LOAD64_F(fa1, fa1f, a1)
6696
6697    FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
6698    JAL(fmod)
6699    SET_VREG64_F(fv0, fv0f, rOBJ)
6700    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
6701    GOTO_OPCODE(t0)                        #  jump to next instruction
6702
6703
6704/* ------------------------------ */
6705    .balign 128
6706.L_op_add_int_lit16: /* 0xd0 */
6707/* File: mips/op_add_int_lit16.S */
6708/* File: mips/binopLit16.S */
6709    /*
6710     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6711     * that specifies an instruction that performs "result = a0 op a1".
6712     * This could be an MIPS instruction or a function call.  (If the result
6713     * comes back in a register other than a0, you can override "result".)
6714     *
6715     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6716     * vCC (a1).  Useful for integer division and modulus.
6717     *
6718     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6719     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6720     */
6721    # binop/lit16 vA, vB,                  /* +CCCC */
6722    FETCH_S(a1, 1)                         #  a1 <- ssssCCCC (sign-extended)
6723    GET_OPB(a2)                            #  a2 <- B
6724    GET_OPA(rOBJ)                          #  rOBJ <- A+
6725    GET_VREG(a0, a2)                       #  a0 <- vB
6726    and       rOBJ, rOBJ, 15
6727    .if 0
6728    # cmp a1, 0; is second operand zero?
6729    beqz      a1, common_errDivideByZero
6730    .endif
6731    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
6732
6733                                  #  optional op
6734    addu a0, a0, a1                                 #  a0 <- op, a0-a3 changed
6735    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
6736    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
6737    /* 10-13 instructions */
6738
6739
6740/* ------------------------------ */
6741    .balign 128
6742.L_op_rsub_int: /* 0xd1 */
6743/* File: mips/op_rsub_int.S */
6744/* this op is "rsub-int", but can be thought of as "rsub-int/lit16" */
6745/* File: mips/binopLit16.S */
6746    /*
6747     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6748     * that specifies an instruction that performs "result = a0 op a1".
6749     * This could be an MIPS instruction or a function call.  (If the result
6750     * comes back in a register other than a0, you can override "result".)
6751     *
6752     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6753     * vCC (a1).  Useful for integer division and modulus.
6754     *
6755     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6756     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6757     */
6758    # binop/lit16 vA, vB,                  /* +CCCC */
6759    FETCH_S(a1, 1)                         #  a1 <- ssssCCCC (sign-extended)
6760    GET_OPB(a2)                            #  a2 <- B
6761    GET_OPA(rOBJ)                          #  rOBJ <- A+
6762    GET_VREG(a0, a2)                       #  a0 <- vB
6763    and       rOBJ, rOBJ, 15
6764    .if 0
6765    # cmp a1, 0; is second operand zero?
6766    beqz      a1, common_errDivideByZero
6767    .endif
6768    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
6769
6770                                  #  optional op
6771    subu a0, a1, a0                                 #  a0 <- op, a0-a3 changed
6772    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
6773    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
6774    /* 10-13 instructions */
6775
6776
6777/* ------------------------------ */
6778    .balign 128
6779.L_op_mul_int_lit16: /* 0xd2 */
6780/* File: mips/op_mul_int_lit16.S */
6781/* File: mips/binopLit16.S */
6782    /*
6783     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6784     * that specifies an instruction that performs "result = a0 op a1".
6785     * This could be an MIPS instruction or a function call.  (If the result
6786     * comes back in a register other than a0, you can override "result".)
6787     *
6788     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6789     * vCC (a1).  Useful for integer division and modulus.
6790     *
6791     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6792     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6793     */
6794    # binop/lit16 vA, vB,                  /* +CCCC */
6795    FETCH_S(a1, 1)                         #  a1 <- ssssCCCC (sign-extended)
6796    GET_OPB(a2)                            #  a2 <- B
6797    GET_OPA(rOBJ)                          #  rOBJ <- A+
6798    GET_VREG(a0, a2)                       #  a0 <- vB
6799    and       rOBJ, rOBJ, 15
6800    .if 0
6801    # cmp a1, 0; is second operand zero?
6802    beqz      a1, common_errDivideByZero
6803    .endif
6804    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
6805
6806                                  #  optional op
6807    mul a0, a0, a1                                 #  a0 <- op, a0-a3 changed
6808    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
6809    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
6810    /* 10-13 instructions */
6811
6812
6813/* ------------------------------ */
6814    .balign 128
6815.L_op_div_int_lit16: /* 0xd3 */
6816/* File: mips/op_div_int_lit16.S */
6817#ifdef MIPS32REVGE6
6818/* File: mips/binopLit16.S */
6819    /*
6820     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6821     * that specifies an instruction that performs "result = a0 op a1".
6822     * This could be an MIPS instruction or a function call.  (If the result
6823     * comes back in a register other than a0, you can override "result".)
6824     *
6825     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6826     * vCC (a1).  Useful for integer division and modulus.
6827     *
6828     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6829     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6830     */
6831    # binop/lit16 vA, vB,                  /* +CCCC */
6832    FETCH_S(a1, 1)                         #  a1 <- ssssCCCC (sign-extended)
6833    GET_OPB(a2)                            #  a2 <- B
6834    GET_OPA(rOBJ)                          #  rOBJ <- A+
6835    GET_VREG(a0, a2)                       #  a0 <- vB
6836    and       rOBJ, rOBJ, 15
6837    .if 1
6838    # cmp a1, 0; is second operand zero?
6839    beqz      a1, common_errDivideByZero
6840    .endif
6841    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
6842
6843                                  #  optional op
6844    div a0, a0, a1                                 #  a0 <- op, a0-a3 changed
6845    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
6846    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
6847    /* 10-13 instructions */
6848
6849#else
6850/* File: mips/binopLit16.S */
6851    /*
6852     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6853     * that specifies an instruction that performs "result = a0 op a1".
6854     * This could be an MIPS instruction or a function call.  (If the result
6855     * comes back in a register other than a0, you can override "result".)
6856     *
6857     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6858     * vCC (a1).  Useful for integer division and modulus.
6859     *
6860     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6861     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6862     */
6863    # binop/lit16 vA, vB,                  /* +CCCC */
6864    FETCH_S(a1, 1)                         #  a1 <- ssssCCCC (sign-extended)
6865    GET_OPB(a2)                            #  a2 <- B
6866    GET_OPA(rOBJ)                          #  rOBJ <- A+
6867    GET_VREG(a0, a2)                       #  a0 <- vB
6868    and       rOBJ, rOBJ, 15
6869    .if 1
6870    # cmp a1, 0; is second operand zero?
6871    beqz      a1, common_errDivideByZero
6872    .endif
6873    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
6874
6875    div zero, a0, a1                              #  optional op
6876    mflo a0                                 #  a0 <- op, a0-a3 changed
6877    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
6878    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
6879    /* 10-13 instructions */
6880
6881#endif
6882
6883/* ------------------------------ */
6884    .balign 128
6885.L_op_rem_int_lit16: /* 0xd4 */
6886/* File: mips/op_rem_int_lit16.S */
6887#ifdef MIPS32REVGE6
6888/* File: mips/binopLit16.S */
6889    /*
6890     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6891     * that specifies an instruction that performs "result = a0 op a1".
6892     * This could be an MIPS instruction or a function call.  (If the result
6893     * comes back in a register other than a0, you can override "result".)
6894     *
6895     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6896     * vCC (a1).  Useful for integer division and modulus.
6897     *
6898     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6899     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6900     */
6901    # binop/lit16 vA, vB,                  /* +CCCC */
6902    FETCH_S(a1, 1)                         #  a1 <- ssssCCCC (sign-extended)
6903    GET_OPB(a2)                            #  a2 <- B
6904    GET_OPA(rOBJ)                          #  rOBJ <- A+
6905    GET_VREG(a0, a2)                       #  a0 <- vB
6906    and       rOBJ, rOBJ, 15
6907    .if 1
6908    # cmp a1, 0; is second operand zero?
6909    beqz      a1, common_errDivideByZero
6910    .endif
6911    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
6912
6913                                  #  optional op
6914    mod a0, a0, a1                                 #  a0 <- op, a0-a3 changed
6915    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
6916    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
6917    /* 10-13 instructions */
6918
6919#else
6920/* File: mips/binopLit16.S */
6921    /*
6922     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6923     * that specifies an instruction that performs "result = a0 op a1".
6924     * This could be an MIPS instruction or a function call.  (If the result
6925     * comes back in a register other than a0, you can override "result".)
6926     *
6927     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6928     * vCC (a1).  Useful for integer division and modulus.
6929     *
6930     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6931     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6932     */
6933    # binop/lit16 vA, vB,                  /* +CCCC */
6934    FETCH_S(a1, 1)                         #  a1 <- ssssCCCC (sign-extended)
6935    GET_OPB(a2)                            #  a2 <- B
6936    GET_OPA(rOBJ)                          #  rOBJ <- A+
6937    GET_VREG(a0, a2)                       #  a0 <- vB
6938    and       rOBJ, rOBJ, 15
6939    .if 1
6940    # cmp a1, 0; is second operand zero?
6941    beqz      a1, common_errDivideByZero
6942    .endif
6943    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
6944
6945    div zero, a0, a1                              #  optional op
6946    mfhi a0                                 #  a0 <- op, a0-a3 changed
6947    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
6948    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
6949    /* 10-13 instructions */
6950
6951#endif
6952
6953/* ------------------------------ */
6954    .balign 128
6955.L_op_and_int_lit16: /* 0xd5 */
6956/* File: mips/op_and_int_lit16.S */
6957/* File: mips/binopLit16.S */
6958    /*
6959     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6960     * that specifies an instruction that performs "result = a0 op a1".
6961     * This could be an MIPS instruction or a function call.  (If the result
6962     * comes back in a register other than a0, you can override "result".)
6963     *
6964     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6965     * vCC (a1).  Useful for integer division and modulus.
6966     *
6967     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6968     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6969     */
6970    # binop/lit16 vA, vB,                  /* +CCCC */
6971    FETCH_S(a1, 1)                         #  a1 <- ssssCCCC (sign-extended)
6972    GET_OPB(a2)                            #  a2 <- B
6973    GET_OPA(rOBJ)                          #  rOBJ <- A+
6974    GET_VREG(a0, a2)                       #  a0 <- vB
6975    and       rOBJ, rOBJ, 15
6976    .if 0
6977    # cmp a1, 0; is second operand zero?
6978    beqz      a1, common_errDivideByZero
6979    .endif
6980    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
6981
6982                                  #  optional op
6983    and a0, a0, a1                                 #  a0 <- op, a0-a3 changed
6984    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
6985    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
6986    /* 10-13 instructions */
6987
6988
6989/* ------------------------------ */
6990    .balign 128
6991.L_op_or_int_lit16: /* 0xd6 */
6992/* File: mips/op_or_int_lit16.S */
6993/* File: mips/binopLit16.S */
6994    /*
6995     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6996     * that specifies an instruction that performs "result = a0 op a1".
6997     * This could be an MIPS instruction or a function call.  (If the result
6998     * comes back in a register other than a0, you can override "result".)
6999     *
7000     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7001     * vCC (a1).  Useful for integer division and modulus.
7002     *
7003     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
7004     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
7005     */
7006    # binop/lit16 vA, vB,                  /* +CCCC */
7007    FETCH_S(a1, 1)                         #  a1 <- ssssCCCC (sign-extended)
7008    GET_OPB(a2)                            #  a2 <- B
7009    GET_OPA(rOBJ)                          #  rOBJ <- A+
7010    GET_VREG(a0, a2)                       #  a0 <- vB
7011    and       rOBJ, rOBJ, 15
7012    .if 0
7013    # cmp a1, 0; is second operand zero?
7014    beqz      a1, common_errDivideByZero
7015    .endif
7016    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
7017
7018                                  #  optional op
7019    or a0, a0, a1                                 #  a0 <- op, a0-a3 changed
7020    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
7021    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
7022    /* 10-13 instructions */
7023
7024
7025/* ------------------------------ */
7026    .balign 128
7027.L_op_xor_int_lit16: /* 0xd7 */
7028/* File: mips/op_xor_int_lit16.S */
7029/* File: mips/binopLit16.S */
7030    /*
7031     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
7032     * that specifies an instruction that performs "result = a0 op a1".
7033     * This could be an MIPS instruction or a function call.  (If the result
7034     * comes back in a register other than a0, you can override "result".)
7035     *
7036     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7037     * vCC (a1).  Useful for integer division and modulus.
7038     *
7039     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
7040     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
7041     */
7042    # binop/lit16 vA, vB,                  /* +CCCC */
7043    FETCH_S(a1, 1)                         #  a1 <- ssssCCCC (sign-extended)
7044    GET_OPB(a2)                            #  a2 <- B
7045    GET_OPA(rOBJ)                          #  rOBJ <- A+
7046    GET_VREG(a0, a2)                       #  a0 <- vB
7047    and       rOBJ, rOBJ, 15
7048    .if 0
7049    # cmp a1, 0; is second operand zero?
7050    beqz      a1, common_errDivideByZero
7051    .endif
7052    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
7053
7054                                  #  optional op
7055    xor a0, a0, a1                                 #  a0 <- op, a0-a3 changed
7056    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
7057    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
7058    /* 10-13 instructions */
7059
7060
7061/* ------------------------------ */
7062    .balign 128
7063.L_op_add_int_lit8: /* 0xd8 */
7064/* File: mips/op_add_int_lit8.S */
7065/* File: mips/binopLit8.S */
7066    /*
7067     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7068     * that specifies an instruction that performs "result = a0 op a1".
7069     * This could be an MIPS instruction or a function call.  (If the result
7070     * comes back in a register other than a0, you can override "result".)
7071     *
7072     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7073     * vCC (a1).  Useful for integer division and modulus.
7074     *
7075     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7076     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7077     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7078     */
7079    # binop/lit8 vAA, vBB,                 /* +CC */
7080    FETCH_S(a3, 1)                         #  a3 <- ssssCCBB (sign-extended for CC)
7081    GET_OPA(rOBJ)                          #  rOBJ <- AA
7082    and       a2, a3, 255                  #  a2 <- BB
7083    GET_VREG(a0, a2)                       #  a0 <- vBB
7084    sra       a1, a3, 8                    #  a1 <- ssssssCC (sign extended)
7085    .if 0
7086    # is second operand zero?
7087    beqz      a1, common_errDivideByZero
7088    .endif
7089    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
7090
7091                                  #  optional op
7092    addu a0, a0, a1                                 #  a0 <- op, a0-a3 changed
7093    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
7094    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
7095    /* 10-12 instructions */
7096
7097
7098/* ------------------------------ */
7099    .balign 128
7100.L_op_rsub_int_lit8: /* 0xd9 */
7101/* File: mips/op_rsub_int_lit8.S */
7102/* File: mips/binopLit8.S */
7103    /*
7104     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7105     * that specifies an instruction that performs "result = a0 op a1".
7106     * This could be an MIPS instruction or a function call.  (If the result
7107     * comes back in a register other than a0, you can override "result".)
7108     *
7109     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7110     * vCC (a1).  Useful for integer division and modulus.
7111     *
7112     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7113     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7114     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7115     */
7116    # binop/lit8 vAA, vBB,                 /* +CC */
7117    FETCH_S(a3, 1)                         #  a3 <- ssssCCBB (sign-extended for CC)
7118    GET_OPA(rOBJ)                          #  rOBJ <- AA
7119    and       a2, a3, 255                  #  a2 <- BB
7120    GET_VREG(a0, a2)                       #  a0 <- vBB
7121    sra       a1, a3, 8                    #  a1 <- ssssssCC (sign extended)
7122    .if 0
7123    # is second operand zero?
7124    beqz      a1, common_errDivideByZero
7125    .endif
7126    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
7127
7128                                  #  optional op
7129    subu a0, a1, a0                                 #  a0 <- op, a0-a3 changed
7130    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
7131    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
7132    /* 10-12 instructions */
7133
7134
7135/* ------------------------------ */
7136    .balign 128
7137.L_op_mul_int_lit8: /* 0xda */
7138/* File: mips/op_mul_int_lit8.S */
7139/* File: mips/binopLit8.S */
7140    /*
7141     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7142     * that specifies an instruction that performs "result = a0 op a1".
7143     * This could be an MIPS instruction or a function call.  (If the result
7144     * comes back in a register other than a0, you can override "result".)
7145     *
7146     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7147     * vCC (a1).  Useful for integer division and modulus.
7148     *
7149     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7150     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7151     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7152     */
7153    # binop/lit8 vAA, vBB,                 /* +CC */
7154    FETCH_S(a3, 1)                         #  a3 <- ssssCCBB (sign-extended for CC)
7155    GET_OPA(rOBJ)                          #  rOBJ <- AA
7156    and       a2, a3, 255                  #  a2 <- BB
7157    GET_VREG(a0, a2)                       #  a0 <- vBB
7158    sra       a1, a3, 8                    #  a1 <- ssssssCC (sign extended)
7159    .if 0
7160    # is second operand zero?
7161    beqz      a1, common_errDivideByZero
7162    .endif
7163    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
7164
7165                                  #  optional op
7166    mul a0, a0, a1                                 #  a0 <- op, a0-a3 changed
7167    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
7168    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
7169    /* 10-12 instructions */
7170
7171
7172/* ------------------------------ */
7173    .balign 128
7174.L_op_div_int_lit8: /* 0xdb */
7175/* File: mips/op_div_int_lit8.S */
7176#ifdef MIPS32REVGE6
7177/* File: mips/binopLit8.S */
7178    /*
7179     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7180     * that specifies an instruction that performs "result = a0 op a1".
7181     * This could be an MIPS instruction or a function call.  (If the result
7182     * comes back in a register other than a0, you can override "result".)
7183     *
7184     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7185     * vCC (a1).  Useful for integer division and modulus.
7186     *
7187     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7188     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7189     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7190     */
7191    # binop/lit8 vAA, vBB,                 /* +CC */
7192    FETCH_S(a3, 1)                         #  a3 <- ssssCCBB (sign-extended for CC)
7193    GET_OPA(rOBJ)                          #  rOBJ <- AA
7194    and       a2, a3, 255                  #  a2 <- BB
7195    GET_VREG(a0, a2)                       #  a0 <- vBB
7196    sra       a1, a3, 8                    #  a1 <- ssssssCC (sign extended)
7197    .if 1
7198    # is second operand zero?
7199    beqz      a1, common_errDivideByZero
7200    .endif
7201    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
7202
7203                                  #  optional op
7204    div a0, a0, a1                                 #  a0 <- op, a0-a3 changed
7205    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
7206    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
7207    /* 10-12 instructions */
7208
7209#else
7210/* File: mips/binopLit8.S */
7211    /*
7212     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7213     * that specifies an instruction that performs "result = a0 op a1".
7214     * This could be an MIPS instruction or a function call.  (If the result
7215     * comes back in a register other than a0, you can override "result".)
7216     *
7217     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7218     * vCC (a1).  Useful for integer division and modulus.
7219     *
7220     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7221     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7222     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7223     */
7224    # binop/lit8 vAA, vBB,                 /* +CC */
7225    FETCH_S(a3, 1)                         #  a3 <- ssssCCBB (sign-extended for CC)
7226    GET_OPA(rOBJ)                          #  rOBJ <- AA
7227    and       a2, a3, 255                  #  a2 <- BB
7228    GET_VREG(a0, a2)                       #  a0 <- vBB
7229    sra       a1, a3, 8                    #  a1 <- ssssssCC (sign extended)
7230    .if 1
7231    # is second operand zero?
7232    beqz      a1, common_errDivideByZero
7233    .endif
7234    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
7235
7236    div zero, a0, a1                              #  optional op
7237    mflo a0                                 #  a0 <- op, a0-a3 changed
7238    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
7239    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
7240    /* 10-12 instructions */
7241
7242#endif
7243
7244/* ------------------------------ */
7245    .balign 128
7246.L_op_rem_int_lit8: /* 0xdc */
7247/* File: mips/op_rem_int_lit8.S */
7248#ifdef MIPS32REVGE6
7249/* File: mips/binopLit8.S */
7250    /*
7251     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7252     * that specifies an instruction that performs "result = a0 op a1".
7253     * This could be an MIPS instruction or a function call.  (If the result
7254     * comes back in a register other than a0, you can override "result".)
7255     *
7256     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7257     * vCC (a1).  Useful for integer division and modulus.
7258     *
7259     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7260     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7261     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7262     */
7263    # binop/lit8 vAA, vBB,                 /* +CC */
7264    FETCH_S(a3, 1)                         #  a3 <- ssssCCBB (sign-extended for CC)
7265    GET_OPA(rOBJ)                          #  rOBJ <- AA
7266    and       a2, a3, 255                  #  a2 <- BB
7267    GET_VREG(a0, a2)                       #  a0 <- vBB
7268    sra       a1, a3, 8                    #  a1 <- ssssssCC (sign extended)
7269    .if 1
7270    # is second operand zero?
7271    beqz      a1, common_errDivideByZero
7272    .endif
7273    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
7274
7275                                  #  optional op
7276    mod a0, a0, a1                                 #  a0 <- op, a0-a3 changed
7277    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
7278    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
7279    /* 10-12 instructions */
7280
7281#else
7282/* File: mips/binopLit8.S */
7283    /*
7284     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7285     * that specifies an instruction that performs "result = a0 op a1".
7286     * This could be an MIPS instruction or a function call.  (If the result
7287     * comes back in a register other than a0, you can override "result".)
7288     *
7289     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7290     * vCC (a1).  Useful for integer division and modulus.
7291     *
7292     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7293     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7294     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7295     */
7296    # binop/lit8 vAA, vBB,                 /* +CC */
7297    FETCH_S(a3, 1)                         #  a3 <- ssssCCBB (sign-extended for CC)
7298    GET_OPA(rOBJ)                          #  rOBJ <- AA
7299    and       a2, a3, 255                  #  a2 <- BB
7300    GET_VREG(a0, a2)                       #  a0 <- vBB
7301    sra       a1, a3, 8                    #  a1 <- ssssssCC (sign extended)
7302    .if 1
7303    # is second operand zero?
7304    beqz      a1, common_errDivideByZero
7305    .endif
7306    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
7307
7308    div zero, a0, a1                              #  optional op
7309    mfhi a0                                 #  a0 <- op, a0-a3 changed
7310    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
7311    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
7312    /* 10-12 instructions */
7313
7314#endif
7315
7316/* ------------------------------ */
7317    .balign 128
7318.L_op_and_int_lit8: /* 0xdd */
7319/* File: mips/op_and_int_lit8.S */
7320/* File: mips/binopLit8.S */
7321    /*
7322     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7323     * that specifies an instruction that performs "result = a0 op a1".
7324     * This could be an MIPS instruction or a function call.  (If the result
7325     * comes back in a register other than a0, you can override "result".)
7326     *
7327     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7328     * vCC (a1).  Useful for integer division and modulus.
7329     *
7330     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7331     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7332     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7333     */
7334    # binop/lit8 vAA, vBB,                 /* +CC */
7335    FETCH_S(a3, 1)                         #  a3 <- ssssCCBB (sign-extended for CC)
7336    GET_OPA(rOBJ)                          #  rOBJ <- AA
7337    and       a2, a3, 255                  #  a2 <- BB
7338    GET_VREG(a0, a2)                       #  a0 <- vBB
7339    sra       a1, a3, 8                    #  a1 <- ssssssCC (sign extended)
7340    .if 0
7341    # is second operand zero?
7342    beqz      a1, common_errDivideByZero
7343    .endif
7344    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
7345
7346                                  #  optional op
7347    and a0, a0, a1                                 #  a0 <- op, a0-a3 changed
7348    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
7349    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
7350    /* 10-12 instructions */
7351
7352
7353/* ------------------------------ */
7354    .balign 128
7355.L_op_or_int_lit8: /* 0xde */
7356/* File: mips/op_or_int_lit8.S */
7357/* File: mips/binopLit8.S */
7358    /*
7359     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7360     * that specifies an instruction that performs "result = a0 op a1".
7361     * This could be an MIPS instruction or a function call.  (If the result
7362     * comes back in a register other than a0, you can override "result".)
7363     *
7364     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7365     * vCC (a1).  Useful for integer division and modulus.
7366     *
7367     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7368     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7369     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7370     */
7371    # binop/lit8 vAA, vBB,                 /* +CC */
7372    FETCH_S(a3, 1)                         #  a3 <- ssssCCBB (sign-extended for CC)
7373    GET_OPA(rOBJ)                          #  rOBJ <- AA
7374    and       a2, a3, 255                  #  a2 <- BB
7375    GET_VREG(a0, a2)                       #  a0 <- vBB
7376    sra       a1, a3, 8                    #  a1 <- ssssssCC (sign extended)
7377    .if 0
7378    # is second operand zero?
7379    beqz      a1, common_errDivideByZero
7380    .endif
7381    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
7382
7383                                  #  optional op
7384    or a0, a0, a1                                 #  a0 <- op, a0-a3 changed
7385    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
7386    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
7387    /* 10-12 instructions */
7388
7389
7390/* ------------------------------ */
7391    .balign 128
7392.L_op_xor_int_lit8: /* 0xdf */
7393/* File: mips/op_xor_int_lit8.S */
7394/* File: mips/binopLit8.S */
7395    /*
7396     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7397     * that specifies an instruction that performs "result = a0 op a1".
7398     * This could be an MIPS instruction or a function call.  (If the result
7399     * comes back in a register other than a0, you can override "result".)
7400     *
7401     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7402     * vCC (a1).  Useful for integer division and modulus.
7403     *
7404     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7405     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7406     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7407     */
7408    # binop/lit8 vAA, vBB,                 /* +CC */
7409    FETCH_S(a3, 1)                         #  a3 <- ssssCCBB (sign-extended for CC)
7410    GET_OPA(rOBJ)                          #  rOBJ <- AA
7411    and       a2, a3, 255                  #  a2 <- BB
7412    GET_VREG(a0, a2)                       #  a0 <- vBB
7413    sra       a1, a3, 8                    #  a1 <- ssssssCC (sign extended)
7414    .if 0
7415    # is second operand zero?
7416    beqz      a1, common_errDivideByZero
7417    .endif
7418    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
7419
7420                                  #  optional op
7421    xor a0, a0, a1                                 #  a0 <- op, a0-a3 changed
7422    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
7423    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
7424    /* 10-12 instructions */
7425
7426
7427/* ------------------------------ */
7428    .balign 128
7429.L_op_shl_int_lit8: /* 0xe0 */
7430/* File: mips/op_shl_int_lit8.S */
7431/* File: mips/binopLit8.S */
7432    /*
7433     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7434     * that specifies an instruction that performs "result = a0 op a1".
7435     * This could be an MIPS instruction or a function call.  (If the result
7436     * comes back in a register other than a0, you can override "result".)
7437     *
7438     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7439     * vCC (a1).  Useful for integer division and modulus.
7440     *
7441     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7442     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7443     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7444     */
7445    # binop/lit8 vAA, vBB,                 /* +CC */
7446    FETCH_S(a3, 1)                         #  a3 <- ssssCCBB (sign-extended for CC)
7447    GET_OPA(rOBJ)                          #  rOBJ <- AA
7448    and       a2, a3, 255                  #  a2 <- BB
7449    GET_VREG(a0, a2)                       #  a0 <- vBB
7450    sra       a1, a3, 8                    #  a1 <- ssssssCC (sign extended)
7451    .if 0
7452    # is second operand zero?
7453    beqz      a1, common_errDivideByZero
7454    .endif
7455    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
7456
7457                                  #  optional op
7458    sll a0, a0, a1                                 #  a0 <- op, a0-a3 changed
7459    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
7460    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
7461    /* 10-12 instructions */
7462
7463
7464/* ------------------------------ */
7465    .balign 128
7466.L_op_shr_int_lit8: /* 0xe1 */
7467/* File: mips/op_shr_int_lit8.S */
7468/* File: mips/binopLit8.S */
7469    /*
7470     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7471     * that specifies an instruction that performs "result = a0 op a1".
7472     * This could be an MIPS instruction or a function call.  (If the result
7473     * comes back in a register other than a0, you can override "result".)
7474     *
7475     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7476     * vCC (a1).  Useful for integer division and modulus.
7477     *
7478     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7479     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7480     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7481     */
7482    # binop/lit8 vAA, vBB,                 /* +CC */
7483    FETCH_S(a3, 1)                         #  a3 <- ssssCCBB (sign-extended for CC)
7484    GET_OPA(rOBJ)                          #  rOBJ <- AA
7485    and       a2, a3, 255                  #  a2 <- BB
7486    GET_VREG(a0, a2)                       #  a0 <- vBB
7487    sra       a1, a3, 8                    #  a1 <- ssssssCC (sign extended)
7488    .if 0
7489    # is second operand zero?
7490    beqz      a1, common_errDivideByZero
7491    .endif
7492    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
7493
7494                                  #  optional op
7495    sra a0, a0, a1                                 #  a0 <- op, a0-a3 changed
7496    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
7497    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
7498    /* 10-12 instructions */
7499
7500
7501/* ------------------------------ */
7502    .balign 128
7503.L_op_ushr_int_lit8: /* 0xe2 */
7504/* File: mips/op_ushr_int_lit8.S */
7505/* File: mips/binopLit8.S */
7506    /*
7507     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7508     * that specifies an instruction that performs "result = a0 op a1".
7509     * This could be an MIPS instruction or a function call.  (If the result
7510     * comes back in a register other than a0, you can override "result".)
7511     *
7512     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7513     * vCC (a1).  Useful for integer division and modulus.
7514     *
7515     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7516     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7517     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7518     */
7519    # binop/lit8 vAA, vBB,                 /* +CC */
7520    FETCH_S(a3, 1)                         #  a3 <- ssssCCBB (sign-extended for CC)
7521    GET_OPA(rOBJ)                          #  rOBJ <- AA
7522    and       a2, a3, 255                  #  a2 <- BB
7523    GET_VREG(a0, a2)                       #  a0 <- vBB
7524    sra       a1, a3, 8                    #  a1 <- ssssssCC (sign extended)
7525    .if 0
7526    # is second operand zero?
7527    beqz      a1, common_errDivideByZero
7528    .endif
7529    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
7530
7531                                  #  optional op
7532    srl a0, a0, a1                                 #  a0 <- op, a0-a3 changed
7533    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
7534    SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
7535    /* 10-12 instructions */
7536
7537
7538/* ------------------------------ */
7539    .balign 128
7540.L_op_iget_quick: /* 0xe3 */
7541/* File: mips/op_iget_quick.S */
7542    /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
7543    # op vA, vB, offset                    /* CCCC */
7544    GET_OPB(a2)                            #  a2 <- B
7545    GET_VREG(a3, a2)                       #  a3 <- object we're operating on
7546    FETCH(a1, 1)                           #  a1 <- field byte offset
7547    GET_OPA4(a2)                           #  a2 <- A(+)
7548    # check object for null
7549    beqz      a3, common_errNullObject     #  object was null
7550    addu      t0, a3, a1
7551    lw     a0, 0(t0)                    #  a0 <- obj.field (8/16/32 bits)
7552    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
7553    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
7554    SET_VREG_GOTO(a0, a2, t0)              #  fp[A] <- a0
7555
7556/* ------------------------------ */
7557    .balign 128
7558.L_op_iget_wide_quick: /* 0xe4 */
7559/* File: mips/op_iget_wide_quick.S */
7560    # iget-wide-quick vA, vB, offset       /* CCCC */
7561    GET_OPB(a2)                            #  a2 <- B
7562    GET_VREG(a3, a2)                       #  a3 <- object we're operating on
7563    FETCH(a1, 1)                           #  a1 <- field byte offset
7564    GET_OPA4(a2)                           #  a2 <- A(+)
7565    # check object for null
7566    beqz      a3, common_errNullObject     #  object was null
7567    addu      t0, a3, a1                   #  t0 <- a3 + a1
7568    LOAD64(a0, a1, t0)                     #  a0 <- obj.field (64 bits, aligned)
7569    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
7570    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
7571    SET_VREG64(a0, a1, a2)                 #  fp[A] <- a0/a1
7572    GOTO_OPCODE(t0)                        #  jump to next instruction
7573
7574/* ------------------------------ */
7575    .balign 128
7576.L_op_iget_object_quick: /* 0xe5 */
7577/* File: mips/op_iget_object_quick.S */
7578    /* For: iget-object-quick */
7579    /* op vA, vB, offset@CCCC */
7580    GET_OPB(a2)                            #  a2 <- B
7581    FETCH(a1, 1)                           #  a1 <- field byte offset
7582    EXPORT_PC()
7583    GET_VREG(a0, a2)                       #  a0 <- object we're operating on
7584    JAL(artIGetObjectFromMterp)            #  v0 <- GetObj(obj, offset)
7585    lw   a3, THREAD_EXCEPTION_OFFSET(rSELF)
7586    GET_OPA4(a2)                           #  a2<- A+
7587    PREFETCH_INST(2)                       #  load rINST
7588    bnez a3, MterpPossibleException        #  bail out
7589    SET_VREG_OBJECT(v0, a2)                #  fp[A] <- v0
7590    ADVANCE(2)                             #  advance rPC
7591    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
7592    GOTO_OPCODE(t0)                        #  jump to next instruction
7593
7594/* ------------------------------ */
7595    .balign 128
7596.L_op_iput_quick: /* 0xe6 */
7597/* File: mips/op_iput_quick.S */
7598    /* For: iput-quick, iput-object-quick */
7599    # op vA, vB, offset                    /* CCCC */
7600    GET_OPB(a2)                            #  a2 <- B
7601    GET_VREG(a3, a2)                       #  a3 <- fp[B], the object pointer
7602    FETCH(a1, 1)                           #  a1 <- field byte offset
7603    GET_OPA4(a2)                           #  a2 <- A(+)
7604    beqz      a3, common_errNullObject     #  object was null
7605    GET_VREG(a0, a2)                       #  a0 <- fp[A]
7606    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
7607    addu      t0, a3, a1
7608    sw    a0, 0(t0)                    #  obj.field (8/16/32 bits) <- a0
7609    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
7610    GOTO_OPCODE(t0)                        #  jump to next instruction
7611
7612/* ------------------------------ */
7613    .balign 128
7614.L_op_iput_wide_quick: /* 0xe7 */
7615/* File: mips/op_iput_wide_quick.S */
7616    # iput-wide-quick vA, vB, offset       /* CCCC */
7617    GET_OPA4(a0)                           #  a0 <- A(+)
7618    GET_OPB(a1)                            #  a1 <- B
7619    GET_VREG(a2, a1)                       #  a2 <- fp[B], the object pointer
7620    # check object for null
7621    beqz      a2, common_errNullObject     #  object was null
7622    EAS2(a3, rFP, a0)                      #  a3 <- &fp[A]
7623    LOAD64(a0, a1, a3)                     #  a0/a1 <- fp[A]
7624    FETCH(a3, 1)                           #  a3 <- field byte offset
7625    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
7626    addu      a2, a2, a3                   #  obj.field (64 bits, aligned) <- a0/a1
7627    STORE64(a0, a1, a2)                    #  obj.field (64 bits, aligned) <- a0/a1
7628    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
7629    GOTO_OPCODE(t0)                        #  jump to next instruction
7630
7631/* ------------------------------ */
7632    .balign 128
7633.L_op_iput_object_quick: /* 0xe8 */
7634/* File: mips/op_iput_object_quick.S */
7635    /* For: iput-object-quick */
7636    # op vA, vB, offset                 /* CCCC */
7637    EXPORT_PC()
7638    addu   a0, rFP, OFF_FP_SHADOWFRAME
7639    move   a1, rPC
7640    move   a2, rINST
7641    JAL(MterpIputObjectQuick)
7642    beqz   v0, MterpException
7643    FETCH_ADVANCE_INST(2)               # advance rPC, load rINST
7644    GET_INST_OPCODE(t0)                 # extract opcode from rINST
7645    GOTO_OPCODE(t0)                     # jump to next instruction
7646
7647/* ------------------------------ */
7648    .balign 128
7649.L_op_invoke_virtual_quick: /* 0xe9 */
7650/* File: mips/op_invoke_virtual_quick.S */
7651/* File: mips/invoke.S */
7652    /*
7653     * Generic invoke handler wrapper.
7654     */
7655    # op vB, {vD, vE, vF, vG, vA}, class   /* CCCC */
7656    # op {vCCCC..v(CCCC+AA-1)}, meth       /* BBBB */
7657    .extern MterpInvokeVirtualQuick
7658    EXPORT_PC()
7659    move    a0, rSELF
7660    addu    a1, rFP, OFF_FP_SHADOWFRAME
7661    move    a2, rPC
7662    move    a3, rINST
7663    JAL(MterpInvokeVirtualQuick)
7664    beqz    v0, MterpException
7665    FETCH_ADVANCE_INST(3)
7666    JAL(MterpShouldSwitchInterpreters)
7667    bnez    v0, MterpFallback
7668    GET_INST_OPCODE(t0)
7669    GOTO_OPCODE(t0)
7670
7671
7672/* ------------------------------ */
7673    .balign 128
7674.L_op_invoke_virtual_range_quick: /* 0xea */
7675/* File: mips/op_invoke_virtual_range_quick.S */
7676/* File: mips/invoke.S */
7677    /*
7678     * Generic invoke handler wrapper.
7679     */
7680    # op vB, {vD, vE, vF, vG, vA}, class   /* CCCC */
7681    # op {vCCCC..v(CCCC+AA-1)}, meth       /* BBBB */
7682    .extern MterpInvokeVirtualQuickRange
7683    EXPORT_PC()
7684    move    a0, rSELF
7685    addu    a1, rFP, OFF_FP_SHADOWFRAME
7686    move    a2, rPC
7687    move    a3, rINST
7688    JAL(MterpInvokeVirtualQuickRange)
7689    beqz    v0, MterpException
7690    FETCH_ADVANCE_INST(3)
7691    JAL(MterpShouldSwitchInterpreters)
7692    bnez    v0, MterpFallback
7693    GET_INST_OPCODE(t0)
7694    GOTO_OPCODE(t0)
7695
7696
7697/* ------------------------------ */
7698    .balign 128
7699.L_op_iput_boolean_quick: /* 0xeb */
7700/* File: mips/op_iput_boolean_quick.S */
7701/* File: mips/op_iput_quick.S */
7702    /* For: iput-quick, iput-object-quick */
7703    # op vA, vB, offset                    /* CCCC */
7704    GET_OPB(a2)                            #  a2 <- B
7705    GET_VREG(a3, a2)                       #  a3 <- fp[B], the object pointer
7706    FETCH(a1, 1)                           #  a1 <- field byte offset
7707    GET_OPA4(a2)                           #  a2 <- A(+)
7708    beqz      a3, common_errNullObject     #  object was null
7709    GET_VREG(a0, a2)                       #  a0 <- fp[A]
7710    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
7711    addu      t0, a3, a1
7712    sb    a0, 0(t0)                    #  obj.field (8/16/32 bits) <- a0
7713    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
7714    GOTO_OPCODE(t0)                        #  jump to next instruction
7715
7716
7717/* ------------------------------ */
7718    .balign 128
7719.L_op_iput_byte_quick: /* 0xec */
7720/* File: mips/op_iput_byte_quick.S */
7721/* File: mips/op_iput_quick.S */
7722    /* For: iput-quick, iput-object-quick */
7723    # op vA, vB, offset                    /* CCCC */
7724    GET_OPB(a2)                            #  a2 <- B
7725    GET_VREG(a3, a2)                       #  a3 <- fp[B], the object pointer
7726    FETCH(a1, 1)                           #  a1 <- field byte offset
7727    GET_OPA4(a2)                           #  a2 <- A(+)
7728    beqz      a3, common_errNullObject     #  object was null
7729    GET_VREG(a0, a2)                       #  a0 <- fp[A]
7730    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
7731    addu      t0, a3, a1
7732    sb    a0, 0(t0)                    #  obj.field (8/16/32 bits) <- a0
7733    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
7734    GOTO_OPCODE(t0)                        #  jump to next instruction
7735
7736
7737/* ------------------------------ */
7738    .balign 128
7739.L_op_iput_char_quick: /* 0xed */
7740/* File: mips/op_iput_char_quick.S */
7741/* File: mips/op_iput_quick.S */
7742    /* For: iput-quick, iput-object-quick */
7743    # op vA, vB, offset                    /* CCCC */
7744    GET_OPB(a2)                            #  a2 <- B
7745    GET_VREG(a3, a2)                       #  a3 <- fp[B], the object pointer
7746    FETCH(a1, 1)                           #  a1 <- field byte offset
7747    GET_OPA4(a2)                           #  a2 <- A(+)
7748    beqz      a3, common_errNullObject     #  object was null
7749    GET_VREG(a0, a2)                       #  a0 <- fp[A]
7750    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
7751    addu      t0, a3, a1
7752    sh    a0, 0(t0)                    #  obj.field (8/16/32 bits) <- a0
7753    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
7754    GOTO_OPCODE(t0)                        #  jump to next instruction
7755
7756
7757/* ------------------------------ */
7758    .balign 128
7759.L_op_iput_short_quick: /* 0xee */
7760/* File: mips/op_iput_short_quick.S */
7761/* File: mips/op_iput_quick.S */
7762    /* For: iput-quick, iput-object-quick */
7763    # op vA, vB, offset                    /* CCCC */
7764    GET_OPB(a2)                            #  a2 <- B
7765    GET_VREG(a3, a2)                       #  a3 <- fp[B], the object pointer
7766    FETCH(a1, 1)                           #  a1 <- field byte offset
7767    GET_OPA4(a2)                           #  a2 <- A(+)
7768    beqz      a3, common_errNullObject     #  object was null
7769    GET_VREG(a0, a2)                       #  a0 <- fp[A]
7770    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
7771    addu      t0, a3, a1
7772    sh    a0, 0(t0)                    #  obj.field (8/16/32 bits) <- a0
7773    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
7774    GOTO_OPCODE(t0)                        #  jump to next instruction
7775
7776
7777/* ------------------------------ */
7778    .balign 128
7779.L_op_iget_boolean_quick: /* 0xef */
7780/* File: mips/op_iget_boolean_quick.S */
7781/* File: mips/op_iget_quick.S */
7782    /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
7783    # op vA, vB, offset                    /* CCCC */
7784    GET_OPB(a2)                            #  a2 <- B
7785    GET_VREG(a3, a2)                       #  a3 <- object we're operating on
7786    FETCH(a1, 1)                           #  a1 <- field byte offset
7787    GET_OPA4(a2)                           #  a2 <- A(+)
7788    # check object for null
7789    beqz      a3, common_errNullObject     #  object was null
7790    addu      t0, a3, a1
7791    lbu     a0, 0(t0)                    #  a0 <- obj.field (8/16/32 bits)
7792    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
7793    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
7794    SET_VREG_GOTO(a0, a2, t0)              #  fp[A] <- a0
7795
7796
7797/* ------------------------------ */
7798    .balign 128
7799.L_op_iget_byte_quick: /* 0xf0 */
7800/* File: mips/op_iget_byte_quick.S */
7801/* File: mips/op_iget_quick.S */
7802    /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
7803    # op vA, vB, offset                    /* CCCC */
7804    GET_OPB(a2)                            #  a2 <- B
7805    GET_VREG(a3, a2)                       #  a3 <- object we're operating on
7806    FETCH(a1, 1)                           #  a1 <- field byte offset
7807    GET_OPA4(a2)                           #  a2 <- A(+)
7808    # check object for null
7809    beqz      a3, common_errNullObject     #  object was null
7810    addu      t0, a3, a1
7811    lb     a0, 0(t0)                    #  a0 <- obj.field (8/16/32 bits)
7812    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
7813    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
7814    SET_VREG_GOTO(a0, a2, t0)              #  fp[A] <- a0
7815
7816
7817/* ------------------------------ */
7818    .balign 128
7819.L_op_iget_char_quick: /* 0xf1 */
7820/* File: mips/op_iget_char_quick.S */
7821/* File: mips/op_iget_quick.S */
7822    /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
7823    # op vA, vB, offset                    /* CCCC */
7824    GET_OPB(a2)                            #  a2 <- B
7825    GET_VREG(a3, a2)                       #  a3 <- object we're operating on
7826    FETCH(a1, 1)                           #  a1 <- field byte offset
7827    GET_OPA4(a2)                           #  a2 <- A(+)
7828    # check object for null
7829    beqz      a3, common_errNullObject     #  object was null
7830    addu      t0, a3, a1
7831    lhu     a0, 0(t0)                    #  a0 <- obj.field (8/16/32 bits)
7832    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
7833    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
7834    SET_VREG_GOTO(a0, a2, t0)              #  fp[A] <- a0
7835
7836
7837/* ------------------------------ */
7838    .balign 128
7839.L_op_iget_short_quick: /* 0xf2 */
7840/* File: mips/op_iget_short_quick.S */
7841/* File: mips/op_iget_quick.S */
7842    /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
7843    # op vA, vB, offset                    /* CCCC */
7844    GET_OPB(a2)                            #  a2 <- B
7845    GET_VREG(a3, a2)                       #  a3 <- object we're operating on
7846    FETCH(a1, 1)                           #  a1 <- field byte offset
7847    GET_OPA4(a2)                           #  a2 <- A(+)
7848    # check object for null
7849    beqz      a3, common_errNullObject     #  object was null
7850    addu      t0, a3, a1
7851    lh     a0, 0(t0)                    #  a0 <- obj.field (8/16/32 bits)
7852    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
7853    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
7854    SET_VREG_GOTO(a0, a2, t0)              #  fp[A] <- a0
7855
7856
7857/* ------------------------------ */
7858    .balign 128
7859.L_op_invoke_lambda: /* 0xf3 */
7860/* Transfer stub to alternate interpreter */
7861    b    MterpFallback
7862
7863/* ------------------------------ */
7864    .balign 128
7865.L_op_unused_f4: /* 0xf4 */
7866/* File: mips/op_unused_f4.S */
7867/* File: mips/unused.S */
7868/*
7869 * Bail to reference interpreter to throw.
7870 */
7871  b MterpFallback
7872
7873
7874/* ------------------------------ */
7875    .balign 128
7876.L_op_capture_variable: /* 0xf5 */
7877/* Transfer stub to alternate interpreter */
7878    b    MterpFallback
7879
7880/* ------------------------------ */
7881    .balign 128
7882.L_op_create_lambda: /* 0xf6 */
7883/* Transfer stub to alternate interpreter */
7884    b    MterpFallback
7885
7886/* ------------------------------ */
7887    .balign 128
7888.L_op_liberate_variable: /* 0xf7 */
7889/* Transfer stub to alternate interpreter */
7890    b    MterpFallback
7891
7892/* ------------------------------ */
7893    .balign 128
7894.L_op_box_lambda: /* 0xf8 */
7895/* Transfer stub to alternate interpreter */
7896    b    MterpFallback
7897
7898/* ------------------------------ */
7899    .balign 128
7900.L_op_unbox_lambda: /* 0xf9 */
7901/* Transfer stub to alternate interpreter */
7902    b    MterpFallback
7903
7904/* ------------------------------ */
7905    .balign 128
7906.L_op_unused_fa: /* 0xfa */
7907/* File: mips/op_unused_fa.S */
7908/* File: mips/unused.S */
7909/*
7910 * Bail to reference interpreter to throw.
7911 */
7912  b MterpFallback
7913
7914
7915/* ------------------------------ */
7916    .balign 128
7917.L_op_unused_fb: /* 0xfb */
7918/* File: mips/op_unused_fb.S */
7919/* File: mips/unused.S */
7920/*
7921 * Bail to reference interpreter to throw.
7922 */
7923  b MterpFallback
7924
7925
7926/* ------------------------------ */
7927    .balign 128
7928.L_op_unused_fc: /* 0xfc */
7929/* File: mips/op_unused_fc.S */
7930/* File: mips/unused.S */
7931/*
7932 * Bail to reference interpreter to throw.
7933 */
7934  b MterpFallback
7935
7936
7937/* ------------------------------ */
7938    .balign 128
7939.L_op_unused_fd: /* 0xfd */
7940/* File: mips/op_unused_fd.S */
7941/* File: mips/unused.S */
7942/*
7943 * Bail to reference interpreter to throw.
7944 */
7945  b MterpFallback
7946
7947
7948/* ------------------------------ */
7949    .balign 128
7950.L_op_unused_fe: /* 0xfe */
7951/* File: mips/op_unused_fe.S */
7952/* File: mips/unused.S */
7953/*
7954 * Bail to reference interpreter to throw.
7955 */
7956  b MterpFallback
7957
7958
7959/* ------------------------------ */
7960    .balign 128
7961.L_op_unused_ff: /* 0xff */
7962/* File: mips/op_unused_ff.S */
7963/* File: mips/unused.S */
7964/*
7965 * Bail to reference interpreter to throw.
7966 */
7967  b MterpFallback
7968
7969
7970    .balign 128
7971    .size   artMterpAsmInstructionStart, .-artMterpAsmInstructionStart
7972    .global artMterpAsmInstructionEnd
7973artMterpAsmInstructionEnd:
7974
7975/*
7976 * ===========================================================================
7977 *  Sister implementations
7978 * ===========================================================================
7979 */
7980    .global artMterpAsmSisterStart
7981    .type   artMterpAsmSisterStart, %function
7982    .text
7983    .balign 4
7984artMterpAsmSisterStart:
7985
7986/* continuation for op_packed_switch */
7987
7988.Lop_packed_switch_finish:
7989    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
7990    GOTO_OPCODE(t0)                        #  jump to next instruction
7991
7992/* continuation for op_sparse_switch */
7993
7994.Lop_sparse_switch_finish:
7995    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
7996    GOTO_OPCODE(t0)                        #  jump to next instruction
7997
7998/* continuation for op_cmpl_float */
7999
8000.Lop_cmpl_float_nan:
8001    li rTEMP, -1
8002
8003.Lop_cmpl_float_finish:
8004    GET_OPA(rOBJ)
8005    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
8006    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
8007    SET_VREG_GOTO(rTEMP, rOBJ, t0)         #  vAA <- rTEMP
8008
8009/* continuation for op_cmpg_float */
8010
8011.Lop_cmpg_float_nan:
8012    li rTEMP, 1
8013
8014.Lop_cmpg_float_finish:
8015    GET_OPA(rOBJ)
8016    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
8017    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
8018    SET_VREG_GOTO(rTEMP, rOBJ, t0)         #  vAA <- rTEMP
8019
8020/* continuation for op_cmpl_double */
8021
8022.Lop_cmpl_double_nan:
8023    li rTEMP, -1
8024
8025.Lop_cmpl_double_finish:
8026    GET_OPA(rOBJ)
8027    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
8028    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
8029    SET_VREG_GOTO(rTEMP, rOBJ, t0)         #  vAA <- rTEMP
8030
8031/* continuation for op_cmpg_double */
8032
8033.Lop_cmpg_double_nan:
8034    li rTEMP, 1
8035
8036.Lop_cmpg_double_finish:
8037    GET_OPA(rOBJ)
8038    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
8039    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
8040    SET_VREG_GOTO(rTEMP, rOBJ, t0)         #  vAA <- rTEMP
8041
8042/* continuation for op_if_eq */
8043
8044.L_op_if_eq_finish:
8045    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
8046    GOTO_OPCODE(t0)                        #  jump to next instruction
8047
8048/* continuation for op_if_ne */
8049
8050.L_op_if_ne_finish:
8051    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
8052    GOTO_OPCODE(t0)                        #  jump to next instruction
8053
8054/* continuation for op_if_lt */
8055
8056.L_op_if_lt_finish:
8057    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
8058    GOTO_OPCODE(t0)                        #  jump to next instruction
8059
8060/* continuation for op_if_ge */
8061
8062.L_op_if_ge_finish:
8063    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
8064    GOTO_OPCODE(t0)                        #  jump to next instruction
8065
8066/* continuation for op_if_gt */
8067
8068.L_op_if_gt_finish:
8069    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
8070    GOTO_OPCODE(t0)                        #  jump to next instruction
8071
8072/* continuation for op_if_le */
8073
8074.L_op_if_le_finish:
8075    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
8076    GOTO_OPCODE(t0)                        #  jump to next instruction
8077
8078/* continuation for op_float_to_int */
8079
8080/*
8081 * Not an entry point as it is used only once !!
8082 */
8083f2i_doconv:
8084#ifdef MIPS32REVGE6
8085    l.s       fa1, .LFLOAT_TO_INT_max
8086    cmp.ule.s ft2, fa1, fa0
8087    l.s       fv0, .LFLOAT_TO_INT_ret_max
8088    bc1nez    ft2, .Lop_float_to_int_set_vreg_f
8089
8090    l.s       fa1, .LFLOAT_TO_INT_min
8091    cmp.ule.s ft2, fa0, fa1
8092    l.s       fv0, .LFLOAT_TO_INT_ret_min
8093    bc1nez    ft2, .Lop_float_to_int_set_vreg_f
8094
8095    mov.s     fa1, fa0
8096    cmp.un.s  ft2, fa0, fa1
8097    li.s      fv0, 0
8098    bc1nez    ft2, .Lop_float_to_int_set_vreg_f
8099#else
8100    l.s       fa1, .LFLOAT_TO_INT_max
8101    c.ole.s   fcc0, fa1, fa0
8102    l.s       fv0, .LFLOAT_TO_INT_ret_max
8103    bc1t      .Lop_float_to_int_set_vreg_f
8104
8105    l.s       fa1, .LFLOAT_TO_INT_min
8106    c.ole.s   fcc0, fa0, fa1
8107    l.s       fv0, .LFLOAT_TO_INT_ret_min
8108    bc1t      .Lop_float_to_int_set_vreg_f
8109
8110    mov.s     fa1, fa0
8111    c.un.s    fcc0, fa0, fa1
8112    li.s      fv0, 0
8113    bc1t      .Lop_float_to_int_set_vreg_f
8114#endif
8115
8116    trunc.w.s  fv0, fa0
8117    b         .Lop_float_to_int_set_vreg_f
8118
8119.LFLOAT_TO_INT_max:
8120    .word 0x4f000000
8121.LFLOAT_TO_INT_min:
8122    .word 0xcf000000
8123.LFLOAT_TO_INT_ret_max:
8124    .word 0x7fffffff
8125.LFLOAT_TO_INT_ret_min:
8126    .word 0x80000000
8127
8128/* continuation for op_float_to_long */
8129
8130f2l_doconv:
8131#ifdef MIPS32REVGE6
8132    l.s       fa1, .LLONG_TO_max
8133    cmp.ule.s ft2, fa1, fa0
8134    li        rRESULT0, ~0
8135    li        rRESULT1, ~0x80000000
8136    bc1nez    ft2, .Lop_float_to_long_set_vreg
8137
8138    l.s       fa1, .LLONG_TO_min
8139    cmp.ule.s ft2, fa0, fa1
8140    li        rRESULT0, 0
8141    li        rRESULT1, 0x80000000
8142    bc1nez    ft2, .Lop_float_to_long_set_vreg
8143
8144    mov.s     fa1, fa0
8145    cmp.un.s  ft2, fa0, fa1
8146    li        rRESULT0, 0
8147    li        rRESULT1, 0
8148    bc1nez    ft2, .Lop_float_to_long_set_vreg
8149#else
8150    l.s       fa1, .LLONG_TO_max
8151    c.ole.s   fcc0, fa1, fa0
8152    li        rRESULT0, ~0
8153    li        rRESULT1, ~0x80000000
8154    bc1t      .Lop_float_to_long_set_vreg
8155
8156    l.s       fa1, .LLONG_TO_min
8157    c.ole.s   fcc0, fa0, fa1
8158    li        rRESULT0, 0
8159    li        rRESULT1, 0x80000000
8160    bc1t      .Lop_float_to_long_set_vreg
8161
8162    mov.s     fa1, fa0
8163    c.un.s    fcc0, fa0, fa1
8164    li        rRESULT0, 0
8165    li        rRESULT1, 0
8166    bc1t      .Lop_float_to_long_set_vreg
8167#endif
8168
8169    JAL(__fixsfdi)
8170
8171    b         .Lop_float_to_long_set_vreg
8172
8173.LLONG_TO_max:
8174    .word 0x5f000000
8175
8176.LLONG_TO_min:
8177    .word 0xdf000000
8178
8179/* continuation for op_double_to_int */
8180
8181d2i_doconv:
8182#ifdef MIPS32REVGE6
8183    la        t0, .LDOUBLE_TO_INT_max
8184    LOAD64_F(fa1, fa1f, t0)
8185    cmp.ule.d ft2, fa1, fa0
8186    l.s       fv0, .LDOUBLE_TO_INT_maxret
8187    bc1nez    ft2, .Lop_double_to_int_set_vreg_f
8188
8189    la        t0, .LDOUBLE_TO_INT_min
8190    LOAD64_F(fa1, fa1f, t0)
8191    cmp.ule.d ft2, fa0, fa1
8192    l.s       fv0, .LDOUBLE_TO_INT_minret
8193    bc1nez    ft2, .Lop_double_to_int_set_vreg_f
8194
8195    mov.d     fa1, fa0
8196    cmp.un.d  ft2, fa0, fa1
8197    li.s      fv0, 0
8198    bc1nez    ft2, .Lop_double_to_int_set_vreg_f
8199#else
8200    la        t0, .LDOUBLE_TO_INT_max
8201    LOAD64_F(fa1, fa1f, t0)
8202    c.ole.d   fcc0, fa1, fa0
8203    l.s       fv0, .LDOUBLE_TO_INT_maxret
8204    bc1t      .Lop_double_to_int_set_vreg_f
8205
8206    la        t0, .LDOUBLE_TO_INT_min
8207    LOAD64_F(fa1, fa1f, t0)
8208    c.ole.d   fcc0, fa0, fa1
8209    l.s       fv0, .LDOUBLE_TO_INT_minret
8210    bc1t      .Lop_double_to_int_set_vreg_f
8211
8212    mov.d     fa1, fa0
8213    c.un.d    fcc0, fa0, fa1
8214    li.s      fv0, 0
8215    bc1t      .Lop_double_to_int_set_vreg_f
8216#endif
8217
8218    trunc.w.d  fv0, fa0
8219    b         .Lop_double_to_int_set_vreg_f
8220
8221.LDOUBLE_TO_INT_max:
8222    .dword 0x41dfffffffc00000
8223.LDOUBLE_TO_INT_min:
8224    .dword 0xc1e0000000000000              #  minint, as a double (high word)
8225.LDOUBLE_TO_INT_maxret:
8226    .word 0x7fffffff
8227.LDOUBLE_TO_INT_minret:
8228    .word 0x80000000
8229
8230/* continuation for op_double_to_long */
8231
8232d2l_doconv:
8233#ifdef MIPS32REVGE6
8234    la        t0, .LDOUBLE_TO_LONG_max
8235    LOAD64_F(fa1, fa1f, t0)
8236    cmp.ule.d ft2, fa1, fa0
8237    la        t0, .LDOUBLE_TO_LONG_ret_max
8238    LOAD64(rRESULT0, rRESULT1, t0)
8239    bc1nez    ft2, .Lop_double_to_long_set_vreg
8240
8241    la        t0, .LDOUBLE_TO_LONG_min
8242    LOAD64_F(fa1, fa1f, t0)
8243    cmp.ule.d ft2, fa0, fa1
8244    la        t0, .LDOUBLE_TO_LONG_ret_min
8245    LOAD64(rRESULT0, rRESULT1, t0)
8246    bc1nez    ft2, .Lop_double_to_long_set_vreg
8247
8248    mov.d     fa1, fa0
8249    cmp.un.d  ft2, fa0, fa1
8250    li        rRESULT0, 0
8251    li        rRESULT1, 0
8252    bc1nez    ft2, .Lop_double_to_long_set_vreg
8253#else
8254    la        t0, .LDOUBLE_TO_LONG_max
8255    LOAD64_F(fa1, fa1f, t0)
8256    c.ole.d   fcc0, fa1, fa0
8257    la        t0, .LDOUBLE_TO_LONG_ret_max
8258    LOAD64(rRESULT0, rRESULT1, t0)
8259    bc1t      .Lop_double_to_long_set_vreg
8260
8261    la        t0, .LDOUBLE_TO_LONG_min
8262    LOAD64_F(fa1, fa1f, t0)
8263    c.ole.d   fcc0, fa0, fa1
8264    la        t0, .LDOUBLE_TO_LONG_ret_min
8265    LOAD64(rRESULT0, rRESULT1, t0)
8266    bc1t      .Lop_double_to_long_set_vreg
8267
8268    mov.d     fa1, fa0
8269    c.un.d    fcc0, fa0, fa1
8270    li        rRESULT0, 0
8271    li        rRESULT1, 0
8272    bc1t      .Lop_double_to_long_set_vreg
8273#endif
8274    JAL(__fixdfdi)
8275    b         .Lop_double_to_long_set_vreg
8276
8277.LDOUBLE_TO_LONG_max:
8278    .dword 0x43e0000000000000              #  maxlong, as a double (high word)
8279.LDOUBLE_TO_LONG_min:
8280    .dword 0xc3e0000000000000              #  minlong, as a double (high word)
8281.LDOUBLE_TO_LONG_ret_max:
8282    .dword 0x7fffffffffffffff
8283.LDOUBLE_TO_LONG_ret_min:
8284    .dword 0x8000000000000000
8285
8286/* continuation for op_mul_long */
8287
8288.Lop_mul_long_finish:
8289    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
8290    SET_VREG64(v0, v1, a0)                 #  vAA::vAA+1 <- v0(low) :: v1(high)
8291    GOTO_OPCODE(t0)                        #  jump to next instruction
8292
8293/* continuation for op_shl_long */
8294
8295.Lop_shl_long_finish:
8296    SET_VREG64_GOTO(zero, v0, t2, t0)      #  vAA/vAA+1 <- rlo/rhi
8297
8298/* continuation for op_shr_long */
8299
8300.Lop_shr_long_finish:
8301    sra     a3, a1, 31                     #  a3<- sign(ah)
8302    SET_VREG64_GOTO(v1, a3, t3, t0)        #  vAA/VAA+1 <- rlo/rhi
8303
8304/* continuation for op_ushr_long */
8305
8306.Lop_ushr_long_finish:
8307    SET_VREG64_GOTO(v1, zero, rOBJ, t0)    #  vAA/vAA+1 <- rlo/rhi
8308
8309/* continuation for op_add_double */
8310
8311.Lop_add_double_finish:
8312    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
8313    GOTO_OPCODE(t0)                        #  jump to next instruction
8314
8315/* continuation for op_sub_double */
8316
8317.Lop_sub_double_finish:
8318    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
8319    GOTO_OPCODE(t0)                        #  jump to next instruction
8320
8321/* continuation for op_mul_double */
8322
8323.Lop_mul_double_finish:
8324    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
8325    GOTO_OPCODE(t0)                        #  jump to next instruction
8326
8327/* continuation for op_div_double */
8328
8329.Lop_div_double_finish:
8330    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
8331    GOTO_OPCODE(t0)                        #  jump to next instruction
8332
8333/* continuation for op_rem_double */
8334
8335.Lop_rem_double_finish:
8336    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
8337    GOTO_OPCODE(t0)                        #  jump to next instruction
8338
8339/* continuation for op_shl_long_2addr */
8340
8341.Lop_shl_long_2addr_finish:
8342    SET_VREG64_GOTO(zero, v0, rOBJ, t0)    #  vAA/vAA+1 <- rlo/rhi
8343
8344/* continuation for op_shr_long_2addr */
8345
8346.Lop_shr_long_2addr_finish:
8347    sra     a3, a1, 31                     #  a3<- sign(ah)
8348    SET_VREG64_GOTO(v1, a3, t2, t0)        #  vAA/vAA+1 <- rlo/rhi
8349
8350/* continuation for op_ushr_long_2addr */
8351
8352.Lop_ushr_long_2addr_finish:
8353    SET_VREG64_GOTO(v1, zero, t3, t0)      #  vAA/vAA+1 <- rlo/rhi
8354
8355    .size   artMterpAsmSisterStart, .-artMterpAsmSisterStart
8356    .global artMterpAsmSisterEnd
8357artMterpAsmSisterEnd:
8358
8359
8360    .global artMterpAsmAltInstructionStart
8361    .type   artMterpAsmAltInstructionStart, %function
8362    .text
8363
8364artMterpAsmAltInstructionStart = .L_ALT_op_nop
8365/* ------------------------------ */
8366    .balign 128
8367.L_ALT_op_nop: /* 0x00 */
8368/* File: mips/alt_stub.S */
8369/*
8370 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8371 * any interesting requests and then jump to the real instruction
8372 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
8373 */
8374    .extern MterpCheckBefore
8375    EXPORT_PC()
8376    la     ra, artMterpAsmInstructionStart + (0 * 128)   # Addr of primary handler
8377    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
8378    move   a0, rSELF                    # arg0
8379    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
8380    la     a2, MterpCheckBefore
8381    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
8382
8383/* ------------------------------ */
8384    .balign 128
8385.L_ALT_op_move: /* 0x01 */
8386/* File: mips/alt_stub.S */
8387/*
8388 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8389 * any interesting requests and then jump to the real instruction
8390 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
8391 */
8392    .extern MterpCheckBefore
8393    EXPORT_PC()
8394    la     ra, artMterpAsmInstructionStart + (1 * 128)   # Addr of primary handler
8395    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
8396    move   a0, rSELF                    # arg0
8397    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
8398    la     a2, MterpCheckBefore
8399    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
8400
8401/* ------------------------------ */
8402    .balign 128
8403.L_ALT_op_move_from16: /* 0x02 */
8404/* File: mips/alt_stub.S */
8405/*
8406 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8407 * any interesting requests and then jump to the real instruction
8408 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
8409 */
8410    .extern MterpCheckBefore
8411    EXPORT_PC()
8412    la     ra, artMterpAsmInstructionStart + (2 * 128)   # Addr of primary handler
8413    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
8414    move   a0, rSELF                    # arg0
8415    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
8416    la     a2, MterpCheckBefore
8417    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
8418
8419/* ------------------------------ */
8420    .balign 128
8421.L_ALT_op_move_16: /* 0x03 */
8422/* File: mips/alt_stub.S */
8423/*
8424 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8425 * any interesting requests and then jump to the real instruction
8426 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
8427 */
8428    .extern MterpCheckBefore
8429    EXPORT_PC()
8430    la     ra, artMterpAsmInstructionStart + (3 * 128)   # Addr of primary handler
8431    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
8432    move   a0, rSELF                    # arg0
8433    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
8434    la     a2, MterpCheckBefore
8435    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
8436
8437/* ------------------------------ */
8438    .balign 128
8439.L_ALT_op_move_wide: /* 0x04 */
8440/* File: mips/alt_stub.S */
8441/*
8442 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8443 * any interesting requests and then jump to the real instruction
8444 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
8445 */
8446    .extern MterpCheckBefore
8447    EXPORT_PC()
8448    la     ra, artMterpAsmInstructionStart + (4 * 128)   # Addr of primary handler
8449    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
8450    move   a0, rSELF                    # arg0
8451    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
8452    la     a2, MterpCheckBefore
8453    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
8454
8455/* ------------------------------ */
8456    .balign 128
8457.L_ALT_op_move_wide_from16: /* 0x05 */
8458/* File: mips/alt_stub.S */
8459/*
8460 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8461 * any interesting requests and then jump to the real instruction
8462 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
8463 */
8464    .extern MterpCheckBefore
8465    EXPORT_PC()
8466    la     ra, artMterpAsmInstructionStart + (5 * 128)   # Addr of primary handler
8467    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
8468    move   a0, rSELF                    # arg0
8469    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
8470    la     a2, MterpCheckBefore
8471    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
8472
8473/* ------------------------------ */
8474    .balign 128
8475.L_ALT_op_move_wide_16: /* 0x06 */
8476/* File: mips/alt_stub.S */
8477/*
8478 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8479 * any interesting requests and then jump to the real instruction
8480 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
8481 */
8482    .extern MterpCheckBefore
8483    EXPORT_PC()
8484    la     ra, artMterpAsmInstructionStart + (6 * 128)   # Addr of primary handler
8485    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
8486    move   a0, rSELF                    # arg0
8487    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
8488    la     a2, MterpCheckBefore
8489    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
8490
8491/* ------------------------------ */
8492    .balign 128
8493.L_ALT_op_move_object: /* 0x07 */
8494/* File: mips/alt_stub.S */
8495/*
8496 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8497 * any interesting requests and then jump to the real instruction
8498 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
8499 */
8500    .extern MterpCheckBefore
8501    EXPORT_PC()
8502    la     ra, artMterpAsmInstructionStart + (7 * 128)   # Addr of primary handler
8503    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
8504    move   a0, rSELF                    # arg0
8505    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
8506    la     a2, MterpCheckBefore
8507    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
8508
8509/* ------------------------------ */
8510    .balign 128
8511.L_ALT_op_move_object_from16: /* 0x08 */
8512/* File: mips/alt_stub.S */
8513/*
8514 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8515 * any interesting requests and then jump to the real instruction
8516 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
8517 */
8518    .extern MterpCheckBefore
8519    EXPORT_PC()
8520    la     ra, artMterpAsmInstructionStart + (8 * 128)   # Addr of primary handler
8521    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
8522    move   a0, rSELF                    # arg0
8523    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
8524    la     a2, MterpCheckBefore
8525    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
8526
8527/* ------------------------------ */
8528    .balign 128
8529.L_ALT_op_move_object_16: /* 0x09 */
8530/* File: mips/alt_stub.S */
8531/*
8532 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8533 * any interesting requests and then jump to the real instruction
8534 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
8535 */
8536    .extern MterpCheckBefore
8537    EXPORT_PC()
8538    la     ra, artMterpAsmInstructionStart + (9 * 128)   # Addr of primary handler
8539    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
8540    move   a0, rSELF                    # arg0
8541    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
8542    la     a2, MterpCheckBefore
8543    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
8544
8545/* ------------------------------ */
8546    .balign 128
8547.L_ALT_op_move_result: /* 0x0a */
8548/* File: mips/alt_stub.S */
8549/*
8550 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8551 * any interesting requests and then jump to the real instruction
8552 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
8553 */
8554    .extern MterpCheckBefore
8555    EXPORT_PC()
8556    la     ra, artMterpAsmInstructionStart + (10 * 128)   # Addr of primary handler
8557    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
8558    move   a0, rSELF                    # arg0
8559    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
8560    la     a2, MterpCheckBefore
8561    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
8562
8563/* ------------------------------ */
8564    .balign 128
8565.L_ALT_op_move_result_wide: /* 0x0b */
8566/* File: mips/alt_stub.S */
8567/*
8568 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8569 * any interesting requests and then jump to the real instruction
8570 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
8571 */
8572    .extern MterpCheckBefore
8573    EXPORT_PC()
8574    la     ra, artMterpAsmInstructionStart + (11 * 128)   # Addr of primary handler
8575    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
8576    move   a0, rSELF                    # arg0
8577    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
8578    la     a2, MterpCheckBefore
8579    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
8580
8581/* ------------------------------ */
8582    .balign 128
8583.L_ALT_op_move_result_object: /* 0x0c */
8584/* File: mips/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    la     ra, artMterpAsmInstructionStart + (12 * 128)   # Addr of primary handler
8593    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
8594    move   a0, rSELF                    # arg0
8595    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
8596    la     a2, MterpCheckBefore
8597    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
8598
8599/* ------------------------------ */
8600    .balign 128
8601.L_ALT_op_move_exception: /* 0x0d */
8602/* File: mips/alt_stub.S */
8603/*
8604 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8605 * any interesting requests and then jump to the real instruction
8606 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
8607 */
8608    .extern MterpCheckBefore
8609    EXPORT_PC()
8610    la     ra, artMterpAsmInstructionStart + (13 * 128)   # Addr of primary handler
8611    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
8612    move   a0, rSELF                    # arg0
8613    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
8614    la     a2, MterpCheckBefore
8615    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
8616
8617/* ------------------------------ */
8618    .balign 128
8619.L_ALT_op_return_void: /* 0x0e */
8620/* File: mips/alt_stub.S */
8621/*
8622 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8623 * any interesting requests and then jump to the real instruction
8624 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
8625 */
8626    .extern MterpCheckBefore
8627    EXPORT_PC()
8628    la     ra, artMterpAsmInstructionStart + (14 * 128)   # Addr of primary handler
8629    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
8630    move   a0, rSELF                    # arg0
8631    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
8632    la     a2, MterpCheckBefore
8633    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
8634
8635/* ------------------------------ */
8636    .balign 128
8637.L_ALT_op_return: /* 0x0f */
8638/* File: mips/alt_stub.S */
8639/*
8640 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8641 * any interesting requests and then jump to the real instruction
8642 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
8643 */
8644    .extern MterpCheckBefore
8645    EXPORT_PC()
8646    la     ra, artMterpAsmInstructionStart + (15 * 128)   # Addr of primary handler
8647    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
8648    move   a0, rSELF                    # arg0
8649    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
8650    la     a2, MterpCheckBefore
8651    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
8652
8653/* ------------------------------ */
8654    .balign 128
8655.L_ALT_op_return_wide: /* 0x10 */
8656/* File: mips/alt_stub.S */
8657/*
8658 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8659 * any interesting requests and then jump to the real instruction
8660 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
8661 */
8662    .extern MterpCheckBefore
8663    EXPORT_PC()
8664    la     ra, artMterpAsmInstructionStart + (16 * 128)   # Addr of primary handler
8665    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
8666    move   a0, rSELF                    # arg0
8667    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
8668    la     a2, MterpCheckBefore
8669    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
8670
8671/* ------------------------------ */
8672    .balign 128
8673.L_ALT_op_return_object: /* 0x11 */
8674/* File: mips/alt_stub.S */
8675/*
8676 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8677 * any interesting requests and then jump to the real instruction
8678 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
8679 */
8680    .extern MterpCheckBefore
8681    EXPORT_PC()
8682    la     ra, artMterpAsmInstructionStart + (17 * 128)   # Addr of primary handler
8683    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
8684    move   a0, rSELF                    # arg0
8685    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
8686    la     a2, MterpCheckBefore
8687    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
8688
8689/* ------------------------------ */
8690    .balign 128
8691.L_ALT_op_const_4: /* 0x12 */
8692/* File: mips/alt_stub.S */
8693/*
8694 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8695 * any interesting requests and then jump to the real instruction
8696 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
8697 */
8698    .extern MterpCheckBefore
8699    EXPORT_PC()
8700    la     ra, artMterpAsmInstructionStart + (18 * 128)   # Addr of primary handler
8701    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
8702    move   a0, rSELF                    # arg0
8703    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
8704    la     a2, MterpCheckBefore
8705    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
8706
8707/* ------------------------------ */
8708    .balign 128
8709.L_ALT_op_const_16: /* 0x13 */
8710/* File: mips/alt_stub.S */
8711/*
8712 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8713 * any interesting requests and then jump to the real instruction
8714 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
8715 */
8716    .extern MterpCheckBefore
8717    EXPORT_PC()
8718    la     ra, artMterpAsmInstructionStart + (19 * 128)   # Addr of primary handler
8719    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
8720    move   a0, rSELF                    # arg0
8721    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
8722    la     a2, MterpCheckBefore
8723    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
8724
8725/* ------------------------------ */
8726    .balign 128
8727.L_ALT_op_const: /* 0x14 */
8728/* File: mips/alt_stub.S */
8729/*
8730 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8731 * any interesting requests and then jump to the real instruction
8732 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
8733 */
8734    .extern MterpCheckBefore
8735    EXPORT_PC()
8736    la     ra, artMterpAsmInstructionStart + (20 * 128)   # Addr of primary handler
8737    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
8738    move   a0, rSELF                    # arg0
8739    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
8740    la     a2, MterpCheckBefore
8741    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
8742
8743/* ------------------------------ */
8744    .balign 128
8745.L_ALT_op_const_high16: /* 0x15 */
8746/* File: mips/alt_stub.S */
8747/*
8748 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8749 * any interesting requests and then jump to the real instruction
8750 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
8751 */
8752    .extern MterpCheckBefore
8753    EXPORT_PC()
8754    la     ra, artMterpAsmInstructionStart + (21 * 128)   # Addr of primary handler
8755    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
8756    move   a0, rSELF                    # arg0
8757    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
8758    la     a2, MterpCheckBefore
8759    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
8760
8761/* ------------------------------ */
8762    .balign 128
8763.L_ALT_op_const_wide_16: /* 0x16 */
8764/* File: mips/alt_stub.S */
8765/*
8766 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8767 * any interesting requests and then jump to the real instruction
8768 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
8769 */
8770    .extern MterpCheckBefore
8771    EXPORT_PC()
8772    la     ra, artMterpAsmInstructionStart + (22 * 128)   # Addr of primary handler
8773    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
8774    move   a0, rSELF                    # arg0
8775    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
8776    la     a2, MterpCheckBefore
8777    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
8778
8779/* ------------------------------ */
8780    .balign 128
8781.L_ALT_op_const_wide_32: /* 0x17 */
8782/* File: mips/alt_stub.S */
8783/*
8784 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8785 * any interesting requests and then jump to the real instruction
8786 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
8787 */
8788    .extern MterpCheckBefore
8789    EXPORT_PC()
8790    la     ra, artMterpAsmInstructionStart + (23 * 128)   # Addr of primary handler
8791    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
8792    move   a0, rSELF                    # arg0
8793    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
8794    la     a2, MterpCheckBefore
8795    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
8796
8797/* ------------------------------ */
8798    .balign 128
8799.L_ALT_op_const_wide: /* 0x18 */
8800/* File: mips/alt_stub.S */
8801/*
8802 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8803 * any interesting requests and then jump to the real instruction
8804 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
8805 */
8806    .extern MterpCheckBefore
8807    EXPORT_PC()
8808    la     ra, artMterpAsmInstructionStart + (24 * 128)   # Addr of primary handler
8809    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
8810    move   a0, rSELF                    # arg0
8811    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
8812    la     a2, MterpCheckBefore
8813    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
8814
8815/* ------------------------------ */
8816    .balign 128
8817.L_ALT_op_const_wide_high16: /* 0x19 */
8818/* File: mips/alt_stub.S */
8819/*
8820 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8821 * any interesting requests and then jump to the real instruction
8822 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
8823 */
8824    .extern MterpCheckBefore
8825    EXPORT_PC()
8826    la     ra, artMterpAsmInstructionStart + (25 * 128)   # Addr of primary handler
8827    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
8828    move   a0, rSELF                    # arg0
8829    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
8830    la     a2, MterpCheckBefore
8831    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
8832
8833/* ------------------------------ */
8834    .balign 128
8835.L_ALT_op_const_string: /* 0x1a */
8836/* File: mips/alt_stub.S */
8837/*
8838 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8839 * any interesting requests and then jump to the real instruction
8840 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
8841 */
8842    .extern MterpCheckBefore
8843    EXPORT_PC()
8844    la     ra, artMterpAsmInstructionStart + (26 * 128)   # Addr of primary handler
8845    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
8846    move   a0, rSELF                    # arg0
8847    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
8848    la     a2, MterpCheckBefore
8849    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
8850
8851/* ------------------------------ */
8852    .balign 128
8853.L_ALT_op_const_string_jumbo: /* 0x1b */
8854/* File: mips/alt_stub.S */
8855/*
8856 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8857 * any interesting requests and then jump to the real instruction
8858 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
8859 */
8860    .extern MterpCheckBefore
8861    EXPORT_PC()
8862    la     ra, artMterpAsmInstructionStart + (27 * 128)   # Addr of primary handler
8863    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
8864    move   a0, rSELF                    # arg0
8865    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
8866    la     a2, MterpCheckBefore
8867    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
8868
8869/* ------------------------------ */
8870    .balign 128
8871.L_ALT_op_const_class: /* 0x1c */
8872/* File: mips/alt_stub.S */
8873/*
8874 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8875 * any interesting requests and then jump to the real instruction
8876 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
8877 */
8878    .extern MterpCheckBefore
8879    EXPORT_PC()
8880    la     ra, artMterpAsmInstructionStart + (28 * 128)   # Addr of primary handler
8881    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
8882    move   a0, rSELF                    # arg0
8883    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
8884    la     a2, MterpCheckBefore
8885    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
8886
8887/* ------------------------------ */
8888    .balign 128
8889.L_ALT_op_monitor_enter: /* 0x1d */
8890/* File: mips/alt_stub.S */
8891/*
8892 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8893 * any interesting requests and then jump to the real instruction
8894 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
8895 */
8896    .extern MterpCheckBefore
8897    EXPORT_PC()
8898    la     ra, artMterpAsmInstructionStart + (29 * 128)   # Addr of primary handler
8899    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
8900    move   a0, rSELF                    # arg0
8901    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
8902    la     a2, MterpCheckBefore
8903    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
8904
8905/* ------------------------------ */
8906    .balign 128
8907.L_ALT_op_monitor_exit: /* 0x1e */
8908/* File: mips/alt_stub.S */
8909/*
8910 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8911 * any interesting requests and then jump to the real instruction
8912 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
8913 */
8914    .extern MterpCheckBefore
8915    EXPORT_PC()
8916    la     ra, artMterpAsmInstructionStart + (30 * 128)   # Addr of primary handler
8917    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
8918    move   a0, rSELF                    # arg0
8919    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
8920    la     a2, MterpCheckBefore
8921    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
8922
8923/* ------------------------------ */
8924    .balign 128
8925.L_ALT_op_check_cast: /* 0x1f */
8926/* File: mips/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    la     ra, artMterpAsmInstructionStart + (31 * 128)   # Addr of primary handler
8935    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
8936    move   a0, rSELF                    # arg0
8937    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
8938    la     a2, MterpCheckBefore
8939    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
8940
8941/* ------------------------------ */
8942    .balign 128
8943.L_ALT_op_instance_of: /* 0x20 */
8944/* File: mips/alt_stub.S */
8945/*
8946 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8947 * any interesting requests and then jump to the real instruction
8948 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
8949 */
8950    .extern MterpCheckBefore
8951    EXPORT_PC()
8952    la     ra, artMterpAsmInstructionStart + (32 * 128)   # Addr of primary handler
8953    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
8954    move   a0, rSELF                    # arg0
8955    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
8956    la     a2, MterpCheckBefore
8957    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
8958
8959/* ------------------------------ */
8960    .balign 128
8961.L_ALT_op_array_length: /* 0x21 */
8962/* File: mips/alt_stub.S */
8963/*
8964 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8965 * any interesting requests and then jump to the real instruction
8966 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
8967 */
8968    .extern MterpCheckBefore
8969    EXPORT_PC()
8970    la     ra, artMterpAsmInstructionStart + (33 * 128)   # Addr of primary handler
8971    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
8972    move   a0, rSELF                    # arg0
8973    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
8974    la     a2, MterpCheckBefore
8975    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
8976
8977/* ------------------------------ */
8978    .balign 128
8979.L_ALT_op_new_instance: /* 0x22 */
8980/* File: mips/alt_stub.S */
8981/*
8982 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8983 * any interesting requests and then jump to the real instruction
8984 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
8985 */
8986    .extern MterpCheckBefore
8987    EXPORT_PC()
8988    la     ra, artMterpAsmInstructionStart + (34 * 128)   # Addr of primary handler
8989    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
8990    move   a0, rSELF                    # arg0
8991    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
8992    la     a2, MterpCheckBefore
8993    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
8994
8995/* ------------------------------ */
8996    .balign 128
8997.L_ALT_op_new_array: /* 0x23 */
8998/* File: mips/alt_stub.S */
8999/*
9000 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9001 * any interesting requests and then jump to the real instruction
9002 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9003 */
9004    .extern MterpCheckBefore
9005    EXPORT_PC()
9006    la     ra, artMterpAsmInstructionStart + (35 * 128)   # Addr of primary handler
9007    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9008    move   a0, rSELF                    # arg0
9009    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9010    la     a2, MterpCheckBefore
9011    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9012
9013/* ------------------------------ */
9014    .balign 128
9015.L_ALT_op_filled_new_array: /* 0x24 */
9016/* File: mips/alt_stub.S */
9017/*
9018 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9019 * any interesting requests and then jump to the real instruction
9020 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9021 */
9022    .extern MterpCheckBefore
9023    EXPORT_PC()
9024    la     ra, artMterpAsmInstructionStart + (36 * 128)   # Addr of primary handler
9025    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9026    move   a0, rSELF                    # arg0
9027    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9028    la     a2, MterpCheckBefore
9029    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9030
9031/* ------------------------------ */
9032    .balign 128
9033.L_ALT_op_filled_new_array_range: /* 0x25 */
9034/* File: mips/alt_stub.S */
9035/*
9036 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9037 * any interesting requests and then jump to the real instruction
9038 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9039 */
9040    .extern MterpCheckBefore
9041    EXPORT_PC()
9042    la     ra, artMterpAsmInstructionStart + (37 * 128)   # Addr of primary handler
9043    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9044    move   a0, rSELF                    # arg0
9045    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9046    la     a2, MterpCheckBefore
9047    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9048
9049/* ------------------------------ */
9050    .balign 128
9051.L_ALT_op_fill_array_data: /* 0x26 */
9052/* File: mips/alt_stub.S */
9053/*
9054 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9055 * any interesting requests and then jump to the real instruction
9056 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9057 */
9058    .extern MterpCheckBefore
9059    EXPORT_PC()
9060    la     ra, artMterpAsmInstructionStart + (38 * 128)   # Addr of primary handler
9061    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9062    move   a0, rSELF                    # arg0
9063    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9064    la     a2, MterpCheckBefore
9065    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9066
9067/* ------------------------------ */
9068    .balign 128
9069.L_ALT_op_throw: /* 0x27 */
9070/* File: mips/alt_stub.S */
9071/*
9072 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9073 * any interesting requests and then jump to the real instruction
9074 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9075 */
9076    .extern MterpCheckBefore
9077    EXPORT_PC()
9078    la     ra, artMterpAsmInstructionStart + (39 * 128)   # Addr of primary handler
9079    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9080    move   a0, rSELF                    # arg0
9081    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9082    la     a2, MterpCheckBefore
9083    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9084
9085/* ------------------------------ */
9086    .balign 128
9087.L_ALT_op_goto: /* 0x28 */
9088/* File: mips/alt_stub.S */
9089/*
9090 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9091 * any interesting requests and then jump to the real instruction
9092 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9093 */
9094    .extern MterpCheckBefore
9095    EXPORT_PC()
9096    la     ra, artMterpAsmInstructionStart + (40 * 128)   # Addr of primary handler
9097    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9098    move   a0, rSELF                    # arg0
9099    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9100    la     a2, MterpCheckBefore
9101    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9102
9103/* ------------------------------ */
9104    .balign 128
9105.L_ALT_op_goto_16: /* 0x29 */
9106/* File: mips/alt_stub.S */
9107/*
9108 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9109 * any interesting requests and then jump to the real instruction
9110 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9111 */
9112    .extern MterpCheckBefore
9113    EXPORT_PC()
9114    la     ra, artMterpAsmInstructionStart + (41 * 128)   # Addr of primary handler
9115    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9116    move   a0, rSELF                    # arg0
9117    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9118    la     a2, MterpCheckBefore
9119    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9120
9121/* ------------------------------ */
9122    .balign 128
9123.L_ALT_op_goto_32: /* 0x2a */
9124/* File: mips/alt_stub.S */
9125/*
9126 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9127 * any interesting requests and then jump to the real instruction
9128 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9129 */
9130    .extern MterpCheckBefore
9131    EXPORT_PC()
9132    la     ra, artMterpAsmInstructionStart + (42 * 128)   # Addr of primary handler
9133    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9134    move   a0, rSELF                    # arg0
9135    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9136    la     a2, MterpCheckBefore
9137    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9138
9139/* ------------------------------ */
9140    .balign 128
9141.L_ALT_op_packed_switch: /* 0x2b */
9142/* File: mips/alt_stub.S */
9143/*
9144 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9145 * any interesting requests and then jump to the real instruction
9146 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9147 */
9148    .extern MterpCheckBefore
9149    EXPORT_PC()
9150    la     ra, artMterpAsmInstructionStart + (43 * 128)   # Addr of primary handler
9151    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9152    move   a0, rSELF                    # arg0
9153    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9154    la     a2, MterpCheckBefore
9155    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9156
9157/* ------------------------------ */
9158    .balign 128
9159.L_ALT_op_sparse_switch: /* 0x2c */
9160/* File: mips/alt_stub.S */
9161/*
9162 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9163 * any interesting requests and then jump to the real instruction
9164 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9165 */
9166    .extern MterpCheckBefore
9167    EXPORT_PC()
9168    la     ra, artMterpAsmInstructionStart + (44 * 128)   # Addr of primary handler
9169    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9170    move   a0, rSELF                    # arg0
9171    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9172    la     a2, MterpCheckBefore
9173    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9174
9175/* ------------------------------ */
9176    .balign 128
9177.L_ALT_op_cmpl_float: /* 0x2d */
9178/* File: mips/alt_stub.S */
9179/*
9180 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9181 * any interesting requests and then jump to the real instruction
9182 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9183 */
9184    .extern MterpCheckBefore
9185    EXPORT_PC()
9186    la     ra, artMterpAsmInstructionStart + (45 * 128)   # Addr of primary handler
9187    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9188    move   a0, rSELF                    # arg0
9189    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9190    la     a2, MterpCheckBefore
9191    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9192
9193/* ------------------------------ */
9194    .balign 128
9195.L_ALT_op_cmpg_float: /* 0x2e */
9196/* File: mips/alt_stub.S */
9197/*
9198 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9199 * any interesting requests and then jump to the real instruction
9200 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9201 */
9202    .extern MterpCheckBefore
9203    EXPORT_PC()
9204    la     ra, artMterpAsmInstructionStart + (46 * 128)   # Addr of primary handler
9205    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9206    move   a0, rSELF                    # arg0
9207    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9208    la     a2, MterpCheckBefore
9209    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9210
9211/* ------------------------------ */
9212    .balign 128
9213.L_ALT_op_cmpl_double: /* 0x2f */
9214/* File: mips/alt_stub.S */
9215/*
9216 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9217 * any interesting requests and then jump to the real instruction
9218 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9219 */
9220    .extern MterpCheckBefore
9221    EXPORT_PC()
9222    la     ra, artMterpAsmInstructionStart + (47 * 128)   # Addr of primary handler
9223    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9224    move   a0, rSELF                    # arg0
9225    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9226    la     a2, MterpCheckBefore
9227    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9228
9229/* ------------------------------ */
9230    .balign 128
9231.L_ALT_op_cmpg_double: /* 0x30 */
9232/* File: mips/alt_stub.S */
9233/*
9234 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9235 * any interesting requests and then jump to the real instruction
9236 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9237 */
9238    .extern MterpCheckBefore
9239    EXPORT_PC()
9240    la     ra, artMterpAsmInstructionStart + (48 * 128)   # Addr of primary handler
9241    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9242    move   a0, rSELF                    # arg0
9243    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9244    la     a2, MterpCheckBefore
9245    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9246
9247/* ------------------------------ */
9248    .balign 128
9249.L_ALT_op_cmp_long: /* 0x31 */
9250/* File: mips/alt_stub.S */
9251/*
9252 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9253 * any interesting requests and then jump to the real instruction
9254 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9255 */
9256    .extern MterpCheckBefore
9257    EXPORT_PC()
9258    la     ra, artMterpAsmInstructionStart + (49 * 128)   # Addr of primary handler
9259    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9260    move   a0, rSELF                    # arg0
9261    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9262    la     a2, MterpCheckBefore
9263    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9264
9265/* ------------------------------ */
9266    .balign 128
9267.L_ALT_op_if_eq: /* 0x32 */
9268/* File: mips/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    la     ra, artMterpAsmInstructionStart + (50 * 128)   # Addr of primary handler
9277    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9278    move   a0, rSELF                    # arg0
9279    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9280    la     a2, MterpCheckBefore
9281    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9282
9283/* ------------------------------ */
9284    .balign 128
9285.L_ALT_op_if_ne: /* 0x33 */
9286/* File: mips/alt_stub.S */
9287/*
9288 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9289 * any interesting requests and then jump to the real instruction
9290 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9291 */
9292    .extern MterpCheckBefore
9293    EXPORT_PC()
9294    la     ra, artMterpAsmInstructionStart + (51 * 128)   # Addr of primary handler
9295    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9296    move   a0, rSELF                    # arg0
9297    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9298    la     a2, MterpCheckBefore
9299    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9300
9301/* ------------------------------ */
9302    .balign 128
9303.L_ALT_op_if_lt: /* 0x34 */
9304/* File: mips/alt_stub.S */
9305/*
9306 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9307 * any interesting requests and then jump to the real instruction
9308 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9309 */
9310    .extern MterpCheckBefore
9311    EXPORT_PC()
9312    la     ra, artMterpAsmInstructionStart + (52 * 128)   # Addr of primary handler
9313    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9314    move   a0, rSELF                    # arg0
9315    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9316    la     a2, MterpCheckBefore
9317    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9318
9319/* ------------------------------ */
9320    .balign 128
9321.L_ALT_op_if_ge: /* 0x35 */
9322/* File: mips/alt_stub.S */
9323/*
9324 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9325 * any interesting requests and then jump to the real instruction
9326 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9327 */
9328    .extern MterpCheckBefore
9329    EXPORT_PC()
9330    la     ra, artMterpAsmInstructionStart + (53 * 128)   # Addr of primary handler
9331    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9332    move   a0, rSELF                    # arg0
9333    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9334    la     a2, MterpCheckBefore
9335    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9336
9337/* ------------------------------ */
9338    .balign 128
9339.L_ALT_op_if_gt: /* 0x36 */
9340/* File: mips/alt_stub.S */
9341/*
9342 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9343 * any interesting requests and then jump to the real instruction
9344 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9345 */
9346    .extern MterpCheckBefore
9347    EXPORT_PC()
9348    la     ra, artMterpAsmInstructionStart + (54 * 128)   # Addr of primary handler
9349    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9350    move   a0, rSELF                    # arg0
9351    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9352    la     a2, MterpCheckBefore
9353    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9354
9355/* ------------------------------ */
9356    .balign 128
9357.L_ALT_op_if_le: /* 0x37 */
9358/* File: mips/alt_stub.S */
9359/*
9360 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9361 * any interesting requests and then jump to the real instruction
9362 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9363 */
9364    .extern MterpCheckBefore
9365    EXPORT_PC()
9366    la     ra, artMterpAsmInstructionStart + (55 * 128)   # Addr of primary handler
9367    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9368    move   a0, rSELF                    # arg0
9369    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9370    la     a2, MterpCheckBefore
9371    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9372
9373/* ------------------------------ */
9374    .balign 128
9375.L_ALT_op_if_eqz: /* 0x38 */
9376/* File: mips/alt_stub.S */
9377/*
9378 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9379 * any interesting requests and then jump to the real instruction
9380 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9381 */
9382    .extern MterpCheckBefore
9383    EXPORT_PC()
9384    la     ra, artMterpAsmInstructionStart + (56 * 128)   # Addr of primary handler
9385    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9386    move   a0, rSELF                    # arg0
9387    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9388    la     a2, MterpCheckBefore
9389    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9390
9391/* ------------------------------ */
9392    .balign 128
9393.L_ALT_op_if_nez: /* 0x39 */
9394/* File: mips/alt_stub.S */
9395/*
9396 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9397 * any interesting requests and then jump to the real instruction
9398 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9399 */
9400    .extern MterpCheckBefore
9401    EXPORT_PC()
9402    la     ra, artMterpAsmInstructionStart + (57 * 128)   # Addr of primary handler
9403    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9404    move   a0, rSELF                    # arg0
9405    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9406    la     a2, MterpCheckBefore
9407    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9408
9409/* ------------------------------ */
9410    .balign 128
9411.L_ALT_op_if_ltz: /* 0x3a */
9412/* File: mips/alt_stub.S */
9413/*
9414 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9415 * any interesting requests and then jump to the real instruction
9416 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9417 */
9418    .extern MterpCheckBefore
9419    EXPORT_PC()
9420    la     ra, artMterpAsmInstructionStart + (58 * 128)   # Addr of primary handler
9421    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9422    move   a0, rSELF                    # arg0
9423    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9424    la     a2, MterpCheckBefore
9425    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9426
9427/* ------------------------------ */
9428    .balign 128
9429.L_ALT_op_if_gez: /* 0x3b */
9430/* File: mips/alt_stub.S */
9431/*
9432 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9433 * any interesting requests and then jump to the real instruction
9434 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9435 */
9436    .extern MterpCheckBefore
9437    EXPORT_PC()
9438    la     ra, artMterpAsmInstructionStart + (59 * 128)   # Addr of primary handler
9439    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9440    move   a0, rSELF                    # arg0
9441    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9442    la     a2, MterpCheckBefore
9443    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9444
9445/* ------------------------------ */
9446    .balign 128
9447.L_ALT_op_if_gtz: /* 0x3c */
9448/* File: mips/alt_stub.S */
9449/*
9450 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9451 * any interesting requests and then jump to the real instruction
9452 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9453 */
9454    .extern MterpCheckBefore
9455    EXPORT_PC()
9456    la     ra, artMterpAsmInstructionStart + (60 * 128)   # Addr of primary handler
9457    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9458    move   a0, rSELF                    # arg0
9459    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9460    la     a2, MterpCheckBefore
9461    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9462
9463/* ------------------------------ */
9464    .balign 128
9465.L_ALT_op_if_lez: /* 0x3d */
9466/* File: mips/alt_stub.S */
9467/*
9468 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9469 * any interesting requests and then jump to the real instruction
9470 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9471 */
9472    .extern MterpCheckBefore
9473    EXPORT_PC()
9474    la     ra, artMterpAsmInstructionStart + (61 * 128)   # Addr of primary handler
9475    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9476    move   a0, rSELF                    # arg0
9477    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9478    la     a2, MterpCheckBefore
9479    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9480
9481/* ------------------------------ */
9482    .balign 128
9483.L_ALT_op_unused_3e: /* 0x3e */
9484/* File: mips/alt_stub.S */
9485/*
9486 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9487 * any interesting requests and then jump to the real instruction
9488 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9489 */
9490    .extern MterpCheckBefore
9491    EXPORT_PC()
9492    la     ra, artMterpAsmInstructionStart + (62 * 128)   # Addr of primary handler
9493    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9494    move   a0, rSELF                    # arg0
9495    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9496    la     a2, MterpCheckBefore
9497    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9498
9499/* ------------------------------ */
9500    .balign 128
9501.L_ALT_op_unused_3f: /* 0x3f */
9502/* File: mips/alt_stub.S */
9503/*
9504 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9505 * any interesting requests and then jump to the real instruction
9506 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9507 */
9508    .extern MterpCheckBefore
9509    EXPORT_PC()
9510    la     ra, artMterpAsmInstructionStart + (63 * 128)   # Addr of primary handler
9511    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9512    move   a0, rSELF                    # arg0
9513    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9514    la     a2, MterpCheckBefore
9515    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9516
9517/* ------------------------------ */
9518    .balign 128
9519.L_ALT_op_unused_40: /* 0x40 */
9520/* File: mips/alt_stub.S */
9521/*
9522 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9523 * any interesting requests and then jump to the real instruction
9524 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9525 */
9526    .extern MterpCheckBefore
9527    EXPORT_PC()
9528    la     ra, artMterpAsmInstructionStart + (64 * 128)   # Addr of primary handler
9529    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9530    move   a0, rSELF                    # arg0
9531    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9532    la     a2, MterpCheckBefore
9533    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9534
9535/* ------------------------------ */
9536    .balign 128
9537.L_ALT_op_unused_41: /* 0x41 */
9538/* File: mips/alt_stub.S */
9539/*
9540 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9541 * any interesting requests and then jump to the real instruction
9542 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9543 */
9544    .extern MterpCheckBefore
9545    EXPORT_PC()
9546    la     ra, artMterpAsmInstructionStart + (65 * 128)   # Addr of primary handler
9547    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9548    move   a0, rSELF                    # arg0
9549    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9550    la     a2, MterpCheckBefore
9551    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9552
9553/* ------------------------------ */
9554    .balign 128
9555.L_ALT_op_unused_42: /* 0x42 */
9556/* File: mips/alt_stub.S */
9557/*
9558 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9559 * any interesting requests and then jump to the real instruction
9560 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9561 */
9562    .extern MterpCheckBefore
9563    EXPORT_PC()
9564    la     ra, artMterpAsmInstructionStart + (66 * 128)   # Addr of primary handler
9565    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9566    move   a0, rSELF                    # arg0
9567    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9568    la     a2, MterpCheckBefore
9569    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9570
9571/* ------------------------------ */
9572    .balign 128
9573.L_ALT_op_unused_43: /* 0x43 */
9574/* File: mips/alt_stub.S */
9575/*
9576 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9577 * any interesting requests and then jump to the real instruction
9578 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9579 */
9580    .extern MterpCheckBefore
9581    EXPORT_PC()
9582    la     ra, artMterpAsmInstructionStart + (67 * 128)   # Addr of primary handler
9583    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9584    move   a0, rSELF                    # arg0
9585    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9586    la     a2, MterpCheckBefore
9587    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9588
9589/* ------------------------------ */
9590    .balign 128
9591.L_ALT_op_aget: /* 0x44 */
9592/* File: mips/alt_stub.S */
9593/*
9594 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9595 * any interesting requests and then jump to the real instruction
9596 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9597 */
9598    .extern MterpCheckBefore
9599    EXPORT_PC()
9600    la     ra, artMterpAsmInstructionStart + (68 * 128)   # Addr of primary handler
9601    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9602    move   a0, rSELF                    # arg0
9603    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9604    la     a2, MterpCheckBefore
9605    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9606
9607/* ------------------------------ */
9608    .balign 128
9609.L_ALT_op_aget_wide: /* 0x45 */
9610/* File: mips/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    la     ra, artMterpAsmInstructionStart + (69 * 128)   # Addr of primary handler
9619    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9620    move   a0, rSELF                    # arg0
9621    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9622    la     a2, MterpCheckBefore
9623    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9624
9625/* ------------------------------ */
9626    .balign 128
9627.L_ALT_op_aget_object: /* 0x46 */
9628/* File: mips/alt_stub.S */
9629/*
9630 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9631 * any interesting requests and then jump to the real instruction
9632 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9633 */
9634    .extern MterpCheckBefore
9635    EXPORT_PC()
9636    la     ra, artMterpAsmInstructionStart + (70 * 128)   # Addr of primary handler
9637    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9638    move   a0, rSELF                    # arg0
9639    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9640    la     a2, MterpCheckBefore
9641    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9642
9643/* ------------------------------ */
9644    .balign 128
9645.L_ALT_op_aget_boolean: /* 0x47 */
9646/* File: mips/alt_stub.S */
9647/*
9648 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9649 * any interesting requests and then jump to the real instruction
9650 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9651 */
9652    .extern MterpCheckBefore
9653    EXPORT_PC()
9654    la     ra, artMterpAsmInstructionStart + (71 * 128)   # Addr of primary handler
9655    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9656    move   a0, rSELF                    # arg0
9657    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9658    la     a2, MterpCheckBefore
9659    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9660
9661/* ------------------------------ */
9662    .balign 128
9663.L_ALT_op_aget_byte: /* 0x48 */
9664/* File: mips/alt_stub.S */
9665/*
9666 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9667 * any interesting requests and then jump to the real instruction
9668 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9669 */
9670    .extern MterpCheckBefore
9671    EXPORT_PC()
9672    la     ra, artMterpAsmInstructionStart + (72 * 128)   # Addr of primary handler
9673    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9674    move   a0, rSELF                    # arg0
9675    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9676    la     a2, MterpCheckBefore
9677    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9678
9679/* ------------------------------ */
9680    .balign 128
9681.L_ALT_op_aget_char: /* 0x49 */
9682/* File: mips/alt_stub.S */
9683/*
9684 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9685 * any interesting requests and then jump to the real instruction
9686 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9687 */
9688    .extern MterpCheckBefore
9689    EXPORT_PC()
9690    la     ra, artMterpAsmInstructionStart + (73 * 128)   # Addr of primary handler
9691    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9692    move   a0, rSELF                    # arg0
9693    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9694    la     a2, MterpCheckBefore
9695    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9696
9697/* ------------------------------ */
9698    .balign 128
9699.L_ALT_op_aget_short: /* 0x4a */
9700/* File: mips/alt_stub.S */
9701/*
9702 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9703 * any interesting requests and then jump to the real instruction
9704 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9705 */
9706    .extern MterpCheckBefore
9707    EXPORT_PC()
9708    la     ra, artMterpAsmInstructionStart + (74 * 128)   # Addr of primary handler
9709    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9710    move   a0, rSELF                    # arg0
9711    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9712    la     a2, MterpCheckBefore
9713    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9714
9715/* ------------------------------ */
9716    .balign 128
9717.L_ALT_op_aput: /* 0x4b */
9718/* File: mips/alt_stub.S */
9719/*
9720 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9721 * any interesting requests and then jump to the real instruction
9722 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9723 */
9724    .extern MterpCheckBefore
9725    EXPORT_PC()
9726    la     ra, artMterpAsmInstructionStart + (75 * 128)   # Addr of primary handler
9727    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9728    move   a0, rSELF                    # arg0
9729    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9730    la     a2, MterpCheckBefore
9731    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9732
9733/* ------------------------------ */
9734    .balign 128
9735.L_ALT_op_aput_wide: /* 0x4c */
9736/* File: mips/alt_stub.S */
9737/*
9738 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9739 * any interesting requests and then jump to the real instruction
9740 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9741 */
9742    .extern MterpCheckBefore
9743    EXPORT_PC()
9744    la     ra, artMterpAsmInstructionStart + (76 * 128)   # Addr of primary handler
9745    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9746    move   a0, rSELF                    # arg0
9747    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9748    la     a2, MterpCheckBefore
9749    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9750
9751/* ------------------------------ */
9752    .balign 128
9753.L_ALT_op_aput_object: /* 0x4d */
9754/* File: mips/alt_stub.S */
9755/*
9756 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9757 * any interesting requests and then jump to the real instruction
9758 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9759 */
9760    .extern MterpCheckBefore
9761    EXPORT_PC()
9762    la     ra, artMterpAsmInstructionStart + (77 * 128)   # Addr of primary handler
9763    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9764    move   a0, rSELF                    # arg0
9765    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9766    la     a2, MterpCheckBefore
9767    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9768
9769/* ------------------------------ */
9770    .balign 128
9771.L_ALT_op_aput_boolean: /* 0x4e */
9772/* File: mips/alt_stub.S */
9773/*
9774 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9775 * any interesting requests and then jump to the real instruction
9776 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9777 */
9778    .extern MterpCheckBefore
9779    EXPORT_PC()
9780    la     ra, artMterpAsmInstructionStart + (78 * 128)   # Addr of primary handler
9781    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9782    move   a0, rSELF                    # arg0
9783    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9784    la     a2, MterpCheckBefore
9785    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9786
9787/* ------------------------------ */
9788    .balign 128
9789.L_ALT_op_aput_byte: /* 0x4f */
9790/* File: mips/alt_stub.S */
9791/*
9792 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9793 * any interesting requests and then jump to the real instruction
9794 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9795 */
9796    .extern MterpCheckBefore
9797    EXPORT_PC()
9798    la     ra, artMterpAsmInstructionStart + (79 * 128)   # Addr of primary handler
9799    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9800    move   a0, rSELF                    # arg0
9801    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9802    la     a2, MterpCheckBefore
9803    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9804
9805/* ------------------------------ */
9806    .balign 128
9807.L_ALT_op_aput_char: /* 0x50 */
9808/* File: mips/alt_stub.S */
9809/*
9810 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9811 * any interesting requests and then jump to the real instruction
9812 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9813 */
9814    .extern MterpCheckBefore
9815    EXPORT_PC()
9816    la     ra, artMterpAsmInstructionStart + (80 * 128)   # Addr of primary handler
9817    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9818    move   a0, rSELF                    # arg0
9819    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9820    la     a2, MterpCheckBefore
9821    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9822
9823/* ------------------------------ */
9824    .balign 128
9825.L_ALT_op_aput_short: /* 0x51 */
9826/* File: mips/alt_stub.S */
9827/*
9828 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9829 * any interesting requests and then jump to the real instruction
9830 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9831 */
9832    .extern MterpCheckBefore
9833    EXPORT_PC()
9834    la     ra, artMterpAsmInstructionStart + (81 * 128)   # Addr of primary handler
9835    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9836    move   a0, rSELF                    # arg0
9837    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9838    la     a2, MterpCheckBefore
9839    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9840
9841/* ------------------------------ */
9842    .balign 128
9843.L_ALT_op_iget: /* 0x52 */
9844/* File: mips/alt_stub.S */
9845/*
9846 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9847 * any interesting requests and then jump to the real instruction
9848 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9849 */
9850    .extern MterpCheckBefore
9851    EXPORT_PC()
9852    la     ra, artMterpAsmInstructionStart + (82 * 128)   # Addr of primary handler
9853    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9854    move   a0, rSELF                    # arg0
9855    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9856    la     a2, MterpCheckBefore
9857    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9858
9859/* ------------------------------ */
9860    .balign 128
9861.L_ALT_op_iget_wide: /* 0x53 */
9862/* File: mips/alt_stub.S */
9863/*
9864 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9865 * any interesting requests and then jump to the real instruction
9866 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9867 */
9868    .extern MterpCheckBefore
9869    EXPORT_PC()
9870    la     ra, artMterpAsmInstructionStart + (83 * 128)   # Addr of primary handler
9871    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9872    move   a0, rSELF                    # arg0
9873    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9874    la     a2, MterpCheckBefore
9875    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9876
9877/* ------------------------------ */
9878    .balign 128
9879.L_ALT_op_iget_object: /* 0x54 */
9880/* File: mips/alt_stub.S */
9881/*
9882 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9883 * any interesting requests and then jump to the real instruction
9884 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9885 */
9886    .extern MterpCheckBefore
9887    EXPORT_PC()
9888    la     ra, artMterpAsmInstructionStart + (84 * 128)   # Addr of primary handler
9889    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9890    move   a0, rSELF                    # arg0
9891    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9892    la     a2, MterpCheckBefore
9893    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9894
9895/* ------------------------------ */
9896    .balign 128
9897.L_ALT_op_iget_boolean: /* 0x55 */
9898/* File: mips/alt_stub.S */
9899/*
9900 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9901 * any interesting requests and then jump to the real instruction
9902 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9903 */
9904    .extern MterpCheckBefore
9905    EXPORT_PC()
9906    la     ra, artMterpAsmInstructionStart + (85 * 128)   # Addr of primary handler
9907    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9908    move   a0, rSELF                    # arg0
9909    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9910    la     a2, MterpCheckBefore
9911    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9912
9913/* ------------------------------ */
9914    .balign 128
9915.L_ALT_op_iget_byte: /* 0x56 */
9916/* File: mips/alt_stub.S */
9917/*
9918 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9919 * any interesting requests and then jump to the real instruction
9920 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9921 */
9922    .extern MterpCheckBefore
9923    EXPORT_PC()
9924    la     ra, artMterpAsmInstructionStart + (86 * 128)   # Addr of primary handler
9925    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9926    move   a0, rSELF                    # arg0
9927    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9928    la     a2, MterpCheckBefore
9929    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9930
9931/* ------------------------------ */
9932    .balign 128
9933.L_ALT_op_iget_char: /* 0x57 */
9934/* File: mips/alt_stub.S */
9935/*
9936 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9937 * any interesting requests and then jump to the real instruction
9938 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9939 */
9940    .extern MterpCheckBefore
9941    EXPORT_PC()
9942    la     ra, artMterpAsmInstructionStart + (87 * 128)   # Addr of primary handler
9943    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9944    move   a0, rSELF                    # arg0
9945    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9946    la     a2, MterpCheckBefore
9947    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9948
9949/* ------------------------------ */
9950    .balign 128
9951.L_ALT_op_iget_short: /* 0x58 */
9952/* File: mips/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    la     ra, artMterpAsmInstructionStart + (88 * 128)   # Addr of primary handler
9961    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9962    move   a0, rSELF                    # arg0
9963    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9964    la     a2, MterpCheckBefore
9965    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9966
9967/* ------------------------------ */
9968    .balign 128
9969.L_ALT_op_iput: /* 0x59 */
9970/* File: mips/alt_stub.S */
9971/*
9972 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9973 * any interesting requests and then jump to the real instruction
9974 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9975 */
9976    .extern MterpCheckBefore
9977    EXPORT_PC()
9978    la     ra, artMterpAsmInstructionStart + (89 * 128)   # Addr of primary handler
9979    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9980    move   a0, rSELF                    # arg0
9981    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
9982    la     a2, MterpCheckBefore
9983    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
9984
9985/* ------------------------------ */
9986    .balign 128
9987.L_ALT_op_iput_wide: /* 0x5a */
9988/* File: mips/alt_stub.S */
9989/*
9990 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9991 * any interesting requests and then jump to the real instruction
9992 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
9993 */
9994    .extern MterpCheckBefore
9995    EXPORT_PC()
9996    la     ra, artMterpAsmInstructionStart + (90 * 128)   # Addr of primary handler
9997    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
9998    move   a0, rSELF                    # arg0
9999    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10000    la     a2, MterpCheckBefore
10001    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10002
10003/* ------------------------------ */
10004    .balign 128
10005.L_ALT_op_iput_object: /* 0x5b */
10006/* File: mips/alt_stub.S */
10007/*
10008 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10009 * any interesting requests and then jump to the real instruction
10010 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10011 */
10012    .extern MterpCheckBefore
10013    EXPORT_PC()
10014    la     ra, artMterpAsmInstructionStart + (91 * 128)   # Addr of primary handler
10015    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10016    move   a0, rSELF                    # arg0
10017    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10018    la     a2, MterpCheckBefore
10019    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10020
10021/* ------------------------------ */
10022    .balign 128
10023.L_ALT_op_iput_boolean: /* 0x5c */
10024/* File: mips/alt_stub.S */
10025/*
10026 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10027 * any interesting requests and then jump to the real instruction
10028 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10029 */
10030    .extern MterpCheckBefore
10031    EXPORT_PC()
10032    la     ra, artMterpAsmInstructionStart + (92 * 128)   # Addr of primary handler
10033    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10034    move   a0, rSELF                    # arg0
10035    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10036    la     a2, MterpCheckBefore
10037    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10038
10039/* ------------------------------ */
10040    .balign 128
10041.L_ALT_op_iput_byte: /* 0x5d */
10042/* File: mips/alt_stub.S */
10043/*
10044 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10045 * any interesting requests and then jump to the real instruction
10046 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10047 */
10048    .extern MterpCheckBefore
10049    EXPORT_PC()
10050    la     ra, artMterpAsmInstructionStart + (93 * 128)   # Addr of primary handler
10051    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10052    move   a0, rSELF                    # arg0
10053    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10054    la     a2, MterpCheckBefore
10055    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10056
10057/* ------------------------------ */
10058    .balign 128
10059.L_ALT_op_iput_char: /* 0x5e */
10060/* File: mips/alt_stub.S */
10061/*
10062 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10063 * any interesting requests and then jump to the real instruction
10064 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10065 */
10066    .extern MterpCheckBefore
10067    EXPORT_PC()
10068    la     ra, artMterpAsmInstructionStart + (94 * 128)   # Addr of primary handler
10069    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10070    move   a0, rSELF                    # arg0
10071    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10072    la     a2, MterpCheckBefore
10073    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10074
10075/* ------------------------------ */
10076    .balign 128
10077.L_ALT_op_iput_short: /* 0x5f */
10078/* File: mips/alt_stub.S */
10079/*
10080 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10081 * any interesting requests and then jump to the real instruction
10082 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10083 */
10084    .extern MterpCheckBefore
10085    EXPORT_PC()
10086    la     ra, artMterpAsmInstructionStart + (95 * 128)   # Addr of primary handler
10087    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10088    move   a0, rSELF                    # arg0
10089    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10090    la     a2, MterpCheckBefore
10091    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10092
10093/* ------------------------------ */
10094    .balign 128
10095.L_ALT_op_sget: /* 0x60 */
10096/* File: mips/alt_stub.S */
10097/*
10098 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10099 * any interesting requests and then jump to the real instruction
10100 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10101 */
10102    .extern MterpCheckBefore
10103    EXPORT_PC()
10104    la     ra, artMterpAsmInstructionStart + (96 * 128)   # Addr of primary handler
10105    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10106    move   a0, rSELF                    # arg0
10107    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10108    la     a2, MterpCheckBefore
10109    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10110
10111/* ------------------------------ */
10112    .balign 128
10113.L_ALT_op_sget_wide: /* 0x61 */
10114/* File: mips/alt_stub.S */
10115/*
10116 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10117 * any interesting requests and then jump to the real instruction
10118 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10119 */
10120    .extern MterpCheckBefore
10121    EXPORT_PC()
10122    la     ra, artMterpAsmInstructionStart + (97 * 128)   # Addr of primary handler
10123    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10124    move   a0, rSELF                    # arg0
10125    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10126    la     a2, MterpCheckBefore
10127    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10128
10129/* ------------------------------ */
10130    .balign 128
10131.L_ALT_op_sget_object: /* 0x62 */
10132/* File: mips/alt_stub.S */
10133/*
10134 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10135 * any interesting requests and then jump to the real instruction
10136 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10137 */
10138    .extern MterpCheckBefore
10139    EXPORT_PC()
10140    la     ra, artMterpAsmInstructionStart + (98 * 128)   # Addr of primary handler
10141    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10142    move   a0, rSELF                    # arg0
10143    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10144    la     a2, MterpCheckBefore
10145    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10146
10147/* ------------------------------ */
10148    .balign 128
10149.L_ALT_op_sget_boolean: /* 0x63 */
10150/* File: mips/alt_stub.S */
10151/*
10152 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10153 * any interesting requests and then jump to the real instruction
10154 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10155 */
10156    .extern MterpCheckBefore
10157    EXPORT_PC()
10158    la     ra, artMterpAsmInstructionStart + (99 * 128)   # Addr of primary handler
10159    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10160    move   a0, rSELF                    # arg0
10161    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10162    la     a2, MterpCheckBefore
10163    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10164
10165/* ------------------------------ */
10166    .balign 128
10167.L_ALT_op_sget_byte: /* 0x64 */
10168/* File: mips/alt_stub.S */
10169/*
10170 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10171 * any interesting requests and then jump to the real instruction
10172 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10173 */
10174    .extern MterpCheckBefore
10175    EXPORT_PC()
10176    la     ra, artMterpAsmInstructionStart + (100 * 128)   # Addr of primary handler
10177    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10178    move   a0, rSELF                    # arg0
10179    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10180    la     a2, MterpCheckBefore
10181    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10182
10183/* ------------------------------ */
10184    .balign 128
10185.L_ALT_op_sget_char: /* 0x65 */
10186/* File: mips/alt_stub.S */
10187/*
10188 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10189 * any interesting requests and then jump to the real instruction
10190 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10191 */
10192    .extern MterpCheckBefore
10193    EXPORT_PC()
10194    la     ra, artMterpAsmInstructionStart + (101 * 128)   # Addr of primary handler
10195    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10196    move   a0, rSELF                    # arg0
10197    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10198    la     a2, MterpCheckBefore
10199    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10200
10201/* ------------------------------ */
10202    .balign 128
10203.L_ALT_op_sget_short: /* 0x66 */
10204/* File: mips/alt_stub.S */
10205/*
10206 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10207 * any interesting requests and then jump to the real instruction
10208 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10209 */
10210    .extern MterpCheckBefore
10211    EXPORT_PC()
10212    la     ra, artMterpAsmInstructionStart + (102 * 128)   # Addr of primary handler
10213    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10214    move   a0, rSELF                    # arg0
10215    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10216    la     a2, MterpCheckBefore
10217    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10218
10219/* ------------------------------ */
10220    .balign 128
10221.L_ALT_op_sput: /* 0x67 */
10222/* File: mips/alt_stub.S */
10223/*
10224 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10225 * any interesting requests and then jump to the real instruction
10226 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10227 */
10228    .extern MterpCheckBefore
10229    EXPORT_PC()
10230    la     ra, artMterpAsmInstructionStart + (103 * 128)   # Addr of primary handler
10231    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10232    move   a0, rSELF                    # arg0
10233    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10234    la     a2, MterpCheckBefore
10235    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10236
10237/* ------------------------------ */
10238    .balign 128
10239.L_ALT_op_sput_wide: /* 0x68 */
10240/* File: mips/alt_stub.S */
10241/*
10242 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10243 * any interesting requests and then jump to the real instruction
10244 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10245 */
10246    .extern MterpCheckBefore
10247    EXPORT_PC()
10248    la     ra, artMterpAsmInstructionStart + (104 * 128)   # Addr of primary handler
10249    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10250    move   a0, rSELF                    # arg0
10251    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10252    la     a2, MterpCheckBefore
10253    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10254
10255/* ------------------------------ */
10256    .balign 128
10257.L_ALT_op_sput_object: /* 0x69 */
10258/* File: mips/alt_stub.S */
10259/*
10260 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10261 * any interesting requests and then jump to the real instruction
10262 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10263 */
10264    .extern MterpCheckBefore
10265    EXPORT_PC()
10266    la     ra, artMterpAsmInstructionStart + (105 * 128)   # Addr of primary handler
10267    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10268    move   a0, rSELF                    # arg0
10269    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10270    la     a2, MterpCheckBefore
10271    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10272
10273/* ------------------------------ */
10274    .balign 128
10275.L_ALT_op_sput_boolean: /* 0x6a */
10276/* File: mips/alt_stub.S */
10277/*
10278 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10279 * any interesting requests and then jump to the real instruction
10280 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10281 */
10282    .extern MterpCheckBefore
10283    EXPORT_PC()
10284    la     ra, artMterpAsmInstructionStart + (106 * 128)   # Addr of primary handler
10285    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10286    move   a0, rSELF                    # arg0
10287    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10288    la     a2, MterpCheckBefore
10289    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10290
10291/* ------------------------------ */
10292    .balign 128
10293.L_ALT_op_sput_byte: /* 0x6b */
10294/* File: mips/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    la     ra, artMterpAsmInstructionStart + (107 * 128)   # Addr of primary handler
10303    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10304    move   a0, rSELF                    # arg0
10305    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10306    la     a2, MterpCheckBefore
10307    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10308
10309/* ------------------------------ */
10310    .balign 128
10311.L_ALT_op_sput_char: /* 0x6c */
10312/* File: mips/alt_stub.S */
10313/*
10314 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10315 * any interesting requests and then jump to the real instruction
10316 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10317 */
10318    .extern MterpCheckBefore
10319    EXPORT_PC()
10320    la     ra, artMterpAsmInstructionStart + (108 * 128)   # Addr of primary handler
10321    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10322    move   a0, rSELF                    # arg0
10323    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10324    la     a2, MterpCheckBefore
10325    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10326
10327/* ------------------------------ */
10328    .balign 128
10329.L_ALT_op_sput_short: /* 0x6d */
10330/* File: mips/alt_stub.S */
10331/*
10332 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10333 * any interesting requests and then jump to the real instruction
10334 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10335 */
10336    .extern MterpCheckBefore
10337    EXPORT_PC()
10338    la     ra, artMterpAsmInstructionStart + (109 * 128)   # Addr of primary handler
10339    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10340    move   a0, rSELF                    # arg0
10341    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10342    la     a2, MterpCheckBefore
10343    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10344
10345/* ------------------------------ */
10346    .balign 128
10347.L_ALT_op_invoke_virtual: /* 0x6e */
10348/* File: mips/alt_stub.S */
10349/*
10350 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10351 * any interesting requests and then jump to the real instruction
10352 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10353 */
10354    .extern MterpCheckBefore
10355    EXPORT_PC()
10356    la     ra, artMterpAsmInstructionStart + (110 * 128)   # Addr of primary handler
10357    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10358    move   a0, rSELF                    # arg0
10359    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10360    la     a2, MterpCheckBefore
10361    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10362
10363/* ------------------------------ */
10364    .balign 128
10365.L_ALT_op_invoke_super: /* 0x6f */
10366/* File: mips/alt_stub.S */
10367/*
10368 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10369 * any interesting requests and then jump to the real instruction
10370 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10371 */
10372    .extern MterpCheckBefore
10373    EXPORT_PC()
10374    la     ra, artMterpAsmInstructionStart + (111 * 128)   # Addr of primary handler
10375    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10376    move   a0, rSELF                    # arg0
10377    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10378    la     a2, MterpCheckBefore
10379    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10380
10381/* ------------------------------ */
10382    .balign 128
10383.L_ALT_op_invoke_direct: /* 0x70 */
10384/* File: mips/alt_stub.S */
10385/*
10386 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10387 * any interesting requests and then jump to the real instruction
10388 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10389 */
10390    .extern MterpCheckBefore
10391    EXPORT_PC()
10392    la     ra, artMterpAsmInstructionStart + (112 * 128)   # Addr of primary handler
10393    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10394    move   a0, rSELF                    # arg0
10395    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10396    la     a2, MterpCheckBefore
10397    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10398
10399/* ------------------------------ */
10400    .balign 128
10401.L_ALT_op_invoke_static: /* 0x71 */
10402/* File: mips/alt_stub.S */
10403/*
10404 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10405 * any interesting requests and then jump to the real instruction
10406 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10407 */
10408    .extern MterpCheckBefore
10409    EXPORT_PC()
10410    la     ra, artMterpAsmInstructionStart + (113 * 128)   # Addr of primary handler
10411    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10412    move   a0, rSELF                    # arg0
10413    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10414    la     a2, MterpCheckBefore
10415    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10416
10417/* ------------------------------ */
10418    .balign 128
10419.L_ALT_op_invoke_interface: /* 0x72 */
10420/* File: mips/alt_stub.S */
10421/*
10422 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10423 * any interesting requests and then jump to the real instruction
10424 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10425 */
10426    .extern MterpCheckBefore
10427    EXPORT_PC()
10428    la     ra, artMterpAsmInstructionStart + (114 * 128)   # Addr of primary handler
10429    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10430    move   a0, rSELF                    # arg0
10431    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10432    la     a2, MterpCheckBefore
10433    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10434
10435/* ------------------------------ */
10436    .balign 128
10437.L_ALT_op_return_void_no_barrier: /* 0x73 */
10438/* File: mips/alt_stub.S */
10439/*
10440 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10441 * any interesting requests and then jump to the real instruction
10442 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10443 */
10444    .extern MterpCheckBefore
10445    EXPORT_PC()
10446    la     ra, artMterpAsmInstructionStart + (115 * 128)   # Addr of primary handler
10447    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10448    move   a0, rSELF                    # arg0
10449    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10450    la     a2, MterpCheckBefore
10451    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10452
10453/* ------------------------------ */
10454    .balign 128
10455.L_ALT_op_invoke_virtual_range: /* 0x74 */
10456/* File: mips/alt_stub.S */
10457/*
10458 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10459 * any interesting requests and then jump to the real instruction
10460 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10461 */
10462    .extern MterpCheckBefore
10463    EXPORT_PC()
10464    la     ra, artMterpAsmInstructionStart + (116 * 128)   # Addr of primary handler
10465    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10466    move   a0, rSELF                    # arg0
10467    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10468    la     a2, MterpCheckBefore
10469    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10470
10471/* ------------------------------ */
10472    .balign 128
10473.L_ALT_op_invoke_super_range: /* 0x75 */
10474/* File: mips/alt_stub.S */
10475/*
10476 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10477 * any interesting requests and then jump to the real instruction
10478 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10479 */
10480    .extern MterpCheckBefore
10481    EXPORT_PC()
10482    la     ra, artMterpAsmInstructionStart + (117 * 128)   # Addr of primary handler
10483    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10484    move   a0, rSELF                    # arg0
10485    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10486    la     a2, MterpCheckBefore
10487    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10488
10489/* ------------------------------ */
10490    .balign 128
10491.L_ALT_op_invoke_direct_range: /* 0x76 */
10492/* File: mips/alt_stub.S */
10493/*
10494 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10495 * any interesting requests and then jump to the real instruction
10496 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10497 */
10498    .extern MterpCheckBefore
10499    EXPORT_PC()
10500    la     ra, artMterpAsmInstructionStart + (118 * 128)   # Addr of primary handler
10501    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10502    move   a0, rSELF                    # arg0
10503    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10504    la     a2, MterpCheckBefore
10505    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10506
10507/* ------------------------------ */
10508    .balign 128
10509.L_ALT_op_invoke_static_range: /* 0x77 */
10510/* File: mips/alt_stub.S */
10511/*
10512 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10513 * any interesting requests and then jump to the real instruction
10514 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10515 */
10516    .extern MterpCheckBefore
10517    EXPORT_PC()
10518    la     ra, artMterpAsmInstructionStart + (119 * 128)   # Addr of primary handler
10519    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10520    move   a0, rSELF                    # arg0
10521    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10522    la     a2, MterpCheckBefore
10523    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10524
10525/* ------------------------------ */
10526    .balign 128
10527.L_ALT_op_invoke_interface_range: /* 0x78 */
10528/* File: mips/alt_stub.S */
10529/*
10530 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10531 * any interesting requests and then jump to the real instruction
10532 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10533 */
10534    .extern MterpCheckBefore
10535    EXPORT_PC()
10536    la     ra, artMterpAsmInstructionStart + (120 * 128)   # Addr of primary handler
10537    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10538    move   a0, rSELF                    # arg0
10539    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10540    la     a2, MterpCheckBefore
10541    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10542
10543/* ------------------------------ */
10544    .balign 128
10545.L_ALT_op_unused_79: /* 0x79 */
10546/* File: mips/alt_stub.S */
10547/*
10548 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10549 * any interesting requests and then jump to the real instruction
10550 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10551 */
10552    .extern MterpCheckBefore
10553    EXPORT_PC()
10554    la     ra, artMterpAsmInstructionStart + (121 * 128)   # Addr of primary handler
10555    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10556    move   a0, rSELF                    # arg0
10557    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10558    la     a2, MterpCheckBefore
10559    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10560
10561/* ------------------------------ */
10562    .balign 128
10563.L_ALT_op_unused_7a: /* 0x7a */
10564/* File: mips/alt_stub.S */
10565/*
10566 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10567 * any interesting requests and then jump to the real instruction
10568 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10569 */
10570    .extern MterpCheckBefore
10571    EXPORT_PC()
10572    la     ra, artMterpAsmInstructionStart + (122 * 128)   # Addr of primary handler
10573    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10574    move   a0, rSELF                    # arg0
10575    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10576    la     a2, MterpCheckBefore
10577    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10578
10579/* ------------------------------ */
10580    .balign 128
10581.L_ALT_op_neg_int: /* 0x7b */
10582/* File: mips/alt_stub.S */
10583/*
10584 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10585 * any interesting requests and then jump to the real instruction
10586 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10587 */
10588    .extern MterpCheckBefore
10589    EXPORT_PC()
10590    la     ra, artMterpAsmInstructionStart + (123 * 128)   # Addr of primary handler
10591    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10592    move   a0, rSELF                    # arg0
10593    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10594    la     a2, MterpCheckBefore
10595    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10596
10597/* ------------------------------ */
10598    .balign 128
10599.L_ALT_op_not_int: /* 0x7c */
10600/* File: mips/alt_stub.S */
10601/*
10602 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10603 * any interesting requests and then jump to the real instruction
10604 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10605 */
10606    .extern MterpCheckBefore
10607    EXPORT_PC()
10608    la     ra, artMterpAsmInstructionStart + (124 * 128)   # Addr of primary handler
10609    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10610    move   a0, rSELF                    # arg0
10611    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10612    la     a2, MterpCheckBefore
10613    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10614
10615/* ------------------------------ */
10616    .balign 128
10617.L_ALT_op_neg_long: /* 0x7d */
10618/* File: mips/alt_stub.S */
10619/*
10620 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10621 * any interesting requests and then jump to the real instruction
10622 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10623 */
10624    .extern MterpCheckBefore
10625    EXPORT_PC()
10626    la     ra, artMterpAsmInstructionStart + (125 * 128)   # Addr of primary handler
10627    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10628    move   a0, rSELF                    # arg0
10629    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10630    la     a2, MterpCheckBefore
10631    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10632
10633/* ------------------------------ */
10634    .balign 128
10635.L_ALT_op_not_long: /* 0x7e */
10636/* File: mips/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    la     ra, artMterpAsmInstructionStart + (126 * 128)   # Addr of primary handler
10645    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10646    move   a0, rSELF                    # arg0
10647    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10648    la     a2, MterpCheckBefore
10649    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10650
10651/* ------------------------------ */
10652    .balign 128
10653.L_ALT_op_neg_float: /* 0x7f */
10654/* File: mips/alt_stub.S */
10655/*
10656 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10657 * any interesting requests and then jump to the real instruction
10658 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10659 */
10660    .extern MterpCheckBefore
10661    EXPORT_PC()
10662    la     ra, artMterpAsmInstructionStart + (127 * 128)   # Addr of primary handler
10663    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10664    move   a0, rSELF                    # arg0
10665    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10666    la     a2, MterpCheckBefore
10667    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10668
10669/* ------------------------------ */
10670    .balign 128
10671.L_ALT_op_neg_double: /* 0x80 */
10672/* File: mips/alt_stub.S */
10673/*
10674 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10675 * any interesting requests and then jump to the real instruction
10676 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10677 */
10678    .extern MterpCheckBefore
10679    EXPORT_PC()
10680    la     ra, artMterpAsmInstructionStart + (128 * 128)   # Addr of primary handler
10681    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10682    move   a0, rSELF                    # arg0
10683    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10684    la     a2, MterpCheckBefore
10685    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10686
10687/* ------------------------------ */
10688    .balign 128
10689.L_ALT_op_int_to_long: /* 0x81 */
10690/* File: mips/alt_stub.S */
10691/*
10692 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10693 * any interesting requests and then jump to the real instruction
10694 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10695 */
10696    .extern MterpCheckBefore
10697    EXPORT_PC()
10698    la     ra, artMterpAsmInstructionStart + (129 * 128)   # Addr of primary handler
10699    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10700    move   a0, rSELF                    # arg0
10701    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10702    la     a2, MterpCheckBefore
10703    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10704
10705/* ------------------------------ */
10706    .balign 128
10707.L_ALT_op_int_to_float: /* 0x82 */
10708/* File: mips/alt_stub.S */
10709/*
10710 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10711 * any interesting requests and then jump to the real instruction
10712 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10713 */
10714    .extern MterpCheckBefore
10715    EXPORT_PC()
10716    la     ra, artMterpAsmInstructionStart + (130 * 128)   # Addr of primary handler
10717    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10718    move   a0, rSELF                    # arg0
10719    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10720    la     a2, MterpCheckBefore
10721    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10722
10723/* ------------------------------ */
10724    .balign 128
10725.L_ALT_op_int_to_double: /* 0x83 */
10726/* File: mips/alt_stub.S */
10727/*
10728 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10729 * any interesting requests and then jump to the real instruction
10730 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10731 */
10732    .extern MterpCheckBefore
10733    EXPORT_PC()
10734    la     ra, artMterpAsmInstructionStart + (131 * 128)   # Addr of primary handler
10735    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10736    move   a0, rSELF                    # arg0
10737    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10738    la     a2, MterpCheckBefore
10739    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10740
10741/* ------------------------------ */
10742    .balign 128
10743.L_ALT_op_long_to_int: /* 0x84 */
10744/* File: mips/alt_stub.S */
10745/*
10746 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10747 * any interesting requests and then jump to the real instruction
10748 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10749 */
10750    .extern MterpCheckBefore
10751    EXPORT_PC()
10752    la     ra, artMterpAsmInstructionStart + (132 * 128)   # Addr of primary handler
10753    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10754    move   a0, rSELF                    # arg0
10755    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10756    la     a2, MterpCheckBefore
10757    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10758
10759/* ------------------------------ */
10760    .balign 128
10761.L_ALT_op_long_to_float: /* 0x85 */
10762/* File: mips/alt_stub.S */
10763/*
10764 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10765 * any interesting requests and then jump to the real instruction
10766 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10767 */
10768    .extern MterpCheckBefore
10769    EXPORT_PC()
10770    la     ra, artMterpAsmInstructionStart + (133 * 128)   # Addr of primary handler
10771    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10772    move   a0, rSELF                    # arg0
10773    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10774    la     a2, MterpCheckBefore
10775    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10776
10777/* ------------------------------ */
10778    .balign 128
10779.L_ALT_op_long_to_double: /* 0x86 */
10780/* File: mips/alt_stub.S */
10781/*
10782 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10783 * any interesting requests and then jump to the real instruction
10784 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10785 */
10786    .extern MterpCheckBefore
10787    EXPORT_PC()
10788    la     ra, artMterpAsmInstructionStart + (134 * 128)   # Addr of primary handler
10789    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10790    move   a0, rSELF                    # arg0
10791    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10792    la     a2, MterpCheckBefore
10793    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10794
10795/* ------------------------------ */
10796    .balign 128
10797.L_ALT_op_float_to_int: /* 0x87 */
10798/* File: mips/alt_stub.S */
10799/*
10800 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10801 * any interesting requests and then jump to the real instruction
10802 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10803 */
10804    .extern MterpCheckBefore
10805    EXPORT_PC()
10806    la     ra, artMterpAsmInstructionStart + (135 * 128)   # Addr of primary handler
10807    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10808    move   a0, rSELF                    # arg0
10809    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10810    la     a2, MterpCheckBefore
10811    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10812
10813/* ------------------------------ */
10814    .balign 128
10815.L_ALT_op_float_to_long: /* 0x88 */
10816/* File: mips/alt_stub.S */
10817/*
10818 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10819 * any interesting requests and then jump to the real instruction
10820 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10821 */
10822    .extern MterpCheckBefore
10823    EXPORT_PC()
10824    la     ra, artMterpAsmInstructionStart + (136 * 128)   # Addr of primary handler
10825    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10826    move   a0, rSELF                    # arg0
10827    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10828    la     a2, MterpCheckBefore
10829    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10830
10831/* ------------------------------ */
10832    .balign 128
10833.L_ALT_op_float_to_double: /* 0x89 */
10834/* File: mips/alt_stub.S */
10835/*
10836 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10837 * any interesting requests and then jump to the real instruction
10838 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10839 */
10840    .extern MterpCheckBefore
10841    EXPORT_PC()
10842    la     ra, artMterpAsmInstructionStart + (137 * 128)   # Addr of primary handler
10843    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10844    move   a0, rSELF                    # arg0
10845    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10846    la     a2, MterpCheckBefore
10847    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10848
10849/* ------------------------------ */
10850    .balign 128
10851.L_ALT_op_double_to_int: /* 0x8a */
10852/* File: mips/alt_stub.S */
10853/*
10854 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10855 * any interesting requests and then jump to the real instruction
10856 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10857 */
10858    .extern MterpCheckBefore
10859    EXPORT_PC()
10860    la     ra, artMterpAsmInstructionStart + (138 * 128)   # Addr of primary handler
10861    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10862    move   a0, rSELF                    # arg0
10863    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10864    la     a2, MterpCheckBefore
10865    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10866
10867/* ------------------------------ */
10868    .balign 128
10869.L_ALT_op_double_to_long: /* 0x8b */
10870/* File: mips/alt_stub.S */
10871/*
10872 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10873 * any interesting requests and then jump to the real instruction
10874 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10875 */
10876    .extern MterpCheckBefore
10877    EXPORT_PC()
10878    la     ra, artMterpAsmInstructionStart + (139 * 128)   # Addr of primary handler
10879    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10880    move   a0, rSELF                    # arg0
10881    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10882    la     a2, MterpCheckBefore
10883    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10884
10885/* ------------------------------ */
10886    .balign 128
10887.L_ALT_op_double_to_float: /* 0x8c */
10888/* File: mips/alt_stub.S */
10889/*
10890 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10891 * any interesting requests and then jump to the real instruction
10892 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10893 */
10894    .extern MterpCheckBefore
10895    EXPORT_PC()
10896    la     ra, artMterpAsmInstructionStart + (140 * 128)   # Addr of primary handler
10897    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10898    move   a0, rSELF                    # arg0
10899    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10900    la     a2, MterpCheckBefore
10901    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10902
10903/* ------------------------------ */
10904    .balign 128
10905.L_ALT_op_int_to_byte: /* 0x8d */
10906/* File: mips/alt_stub.S */
10907/*
10908 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10909 * any interesting requests and then jump to the real instruction
10910 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10911 */
10912    .extern MterpCheckBefore
10913    EXPORT_PC()
10914    la     ra, artMterpAsmInstructionStart + (141 * 128)   # Addr of primary handler
10915    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10916    move   a0, rSELF                    # arg0
10917    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10918    la     a2, MterpCheckBefore
10919    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10920
10921/* ------------------------------ */
10922    .balign 128
10923.L_ALT_op_int_to_char: /* 0x8e */
10924/* File: mips/alt_stub.S */
10925/*
10926 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10927 * any interesting requests and then jump to the real instruction
10928 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10929 */
10930    .extern MterpCheckBefore
10931    EXPORT_PC()
10932    la     ra, artMterpAsmInstructionStart + (142 * 128)   # Addr of primary handler
10933    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10934    move   a0, rSELF                    # arg0
10935    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10936    la     a2, MterpCheckBefore
10937    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10938
10939/* ------------------------------ */
10940    .balign 128
10941.L_ALT_op_int_to_short: /* 0x8f */
10942/* File: mips/alt_stub.S */
10943/*
10944 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10945 * any interesting requests and then jump to the real instruction
10946 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10947 */
10948    .extern MterpCheckBefore
10949    EXPORT_PC()
10950    la     ra, artMterpAsmInstructionStart + (143 * 128)   # Addr of primary handler
10951    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10952    move   a0, rSELF                    # arg0
10953    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10954    la     a2, MterpCheckBefore
10955    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10956
10957/* ------------------------------ */
10958    .balign 128
10959.L_ALT_op_add_int: /* 0x90 */
10960/* File: mips/alt_stub.S */
10961/*
10962 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10963 * any interesting requests and then jump to the real instruction
10964 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
10965 */
10966    .extern MterpCheckBefore
10967    EXPORT_PC()
10968    la     ra, artMterpAsmInstructionStart + (144 * 128)   # Addr of primary handler
10969    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10970    move   a0, rSELF                    # arg0
10971    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10972    la     a2, MterpCheckBefore
10973    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10974
10975/* ------------------------------ */
10976    .balign 128
10977.L_ALT_op_sub_int: /* 0x91 */
10978/* File: mips/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    la     ra, artMterpAsmInstructionStart + (145 * 128)   # Addr of primary handler
10987    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
10988    move   a0, rSELF                    # arg0
10989    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
10990    la     a2, MterpCheckBefore
10991    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
10992
10993/* ------------------------------ */
10994    .balign 128
10995.L_ALT_op_mul_int: /* 0x92 */
10996/* File: mips/alt_stub.S */
10997/*
10998 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10999 * any interesting requests and then jump to the real instruction
11000 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11001 */
11002    .extern MterpCheckBefore
11003    EXPORT_PC()
11004    la     ra, artMterpAsmInstructionStart + (146 * 128)   # Addr of primary handler
11005    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11006    move   a0, rSELF                    # arg0
11007    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11008    la     a2, MterpCheckBefore
11009    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11010
11011/* ------------------------------ */
11012    .balign 128
11013.L_ALT_op_div_int: /* 0x93 */
11014/* File: mips/alt_stub.S */
11015/*
11016 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11017 * any interesting requests and then jump to the real instruction
11018 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11019 */
11020    .extern MterpCheckBefore
11021    EXPORT_PC()
11022    la     ra, artMterpAsmInstructionStart + (147 * 128)   # Addr of primary handler
11023    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11024    move   a0, rSELF                    # arg0
11025    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11026    la     a2, MterpCheckBefore
11027    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11028
11029/* ------------------------------ */
11030    .balign 128
11031.L_ALT_op_rem_int: /* 0x94 */
11032/* File: mips/alt_stub.S */
11033/*
11034 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11035 * any interesting requests and then jump to the real instruction
11036 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11037 */
11038    .extern MterpCheckBefore
11039    EXPORT_PC()
11040    la     ra, artMterpAsmInstructionStart + (148 * 128)   # Addr of primary handler
11041    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11042    move   a0, rSELF                    # arg0
11043    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11044    la     a2, MterpCheckBefore
11045    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11046
11047/* ------------------------------ */
11048    .balign 128
11049.L_ALT_op_and_int: /* 0x95 */
11050/* File: mips/alt_stub.S */
11051/*
11052 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11053 * any interesting requests and then jump to the real instruction
11054 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11055 */
11056    .extern MterpCheckBefore
11057    EXPORT_PC()
11058    la     ra, artMterpAsmInstructionStart + (149 * 128)   # Addr of primary handler
11059    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11060    move   a0, rSELF                    # arg0
11061    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11062    la     a2, MterpCheckBefore
11063    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11064
11065/* ------------------------------ */
11066    .balign 128
11067.L_ALT_op_or_int: /* 0x96 */
11068/* File: mips/alt_stub.S */
11069/*
11070 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11071 * any interesting requests and then jump to the real instruction
11072 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11073 */
11074    .extern MterpCheckBefore
11075    EXPORT_PC()
11076    la     ra, artMterpAsmInstructionStart + (150 * 128)   # Addr of primary handler
11077    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11078    move   a0, rSELF                    # arg0
11079    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11080    la     a2, MterpCheckBefore
11081    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11082
11083/* ------------------------------ */
11084    .balign 128
11085.L_ALT_op_xor_int: /* 0x97 */
11086/* File: mips/alt_stub.S */
11087/*
11088 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11089 * any interesting requests and then jump to the real instruction
11090 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11091 */
11092    .extern MterpCheckBefore
11093    EXPORT_PC()
11094    la     ra, artMterpAsmInstructionStart + (151 * 128)   # Addr of primary handler
11095    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11096    move   a0, rSELF                    # arg0
11097    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11098    la     a2, MterpCheckBefore
11099    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11100
11101/* ------------------------------ */
11102    .balign 128
11103.L_ALT_op_shl_int: /* 0x98 */
11104/* File: mips/alt_stub.S */
11105/*
11106 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11107 * any interesting requests and then jump to the real instruction
11108 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11109 */
11110    .extern MterpCheckBefore
11111    EXPORT_PC()
11112    la     ra, artMterpAsmInstructionStart + (152 * 128)   # Addr of primary handler
11113    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11114    move   a0, rSELF                    # arg0
11115    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11116    la     a2, MterpCheckBefore
11117    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11118
11119/* ------------------------------ */
11120    .balign 128
11121.L_ALT_op_shr_int: /* 0x99 */
11122/* File: mips/alt_stub.S */
11123/*
11124 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11125 * any interesting requests and then jump to the real instruction
11126 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11127 */
11128    .extern MterpCheckBefore
11129    EXPORT_PC()
11130    la     ra, artMterpAsmInstructionStart + (153 * 128)   # Addr of primary handler
11131    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11132    move   a0, rSELF                    # arg0
11133    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11134    la     a2, MterpCheckBefore
11135    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11136
11137/* ------------------------------ */
11138    .balign 128
11139.L_ALT_op_ushr_int: /* 0x9a */
11140/* File: mips/alt_stub.S */
11141/*
11142 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11143 * any interesting requests and then jump to the real instruction
11144 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11145 */
11146    .extern MterpCheckBefore
11147    EXPORT_PC()
11148    la     ra, artMterpAsmInstructionStart + (154 * 128)   # Addr of primary handler
11149    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11150    move   a0, rSELF                    # arg0
11151    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11152    la     a2, MterpCheckBefore
11153    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11154
11155/* ------------------------------ */
11156    .balign 128
11157.L_ALT_op_add_long: /* 0x9b */
11158/* File: mips/alt_stub.S */
11159/*
11160 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11161 * any interesting requests and then jump to the real instruction
11162 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11163 */
11164    .extern MterpCheckBefore
11165    EXPORT_PC()
11166    la     ra, artMterpAsmInstructionStart + (155 * 128)   # Addr of primary handler
11167    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11168    move   a0, rSELF                    # arg0
11169    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11170    la     a2, MterpCheckBefore
11171    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11172
11173/* ------------------------------ */
11174    .balign 128
11175.L_ALT_op_sub_long: /* 0x9c */
11176/* File: mips/alt_stub.S */
11177/*
11178 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11179 * any interesting requests and then jump to the real instruction
11180 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11181 */
11182    .extern MterpCheckBefore
11183    EXPORT_PC()
11184    la     ra, artMterpAsmInstructionStart + (156 * 128)   # Addr of primary handler
11185    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11186    move   a0, rSELF                    # arg0
11187    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11188    la     a2, MterpCheckBefore
11189    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11190
11191/* ------------------------------ */
11192    .balign 128
11193.L_ALT_op_mul_long: /* 0x9d */
11194/* File: mips/alt_stub.S */
11195/*
11196 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11197 * any interesting requests and then jump to the real instruction
11198 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11199 */
11200    .extern MterpCheckBefore
11201    EXPORT_PC()
11202    la     ra, artMterpAsmInstructionStart + (157 * 128)   # Addr of primary handler
11203    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11204    move   a0, rSELF                    # arg0
11205    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11206    la     a2, MterpCheckBefore
11207    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11208
11209/* ------------------------------ */
11210    .balign 128
11211.L_ALT_op_div_long: /* 0x9e */
11212/* File: mips/alt_stub.S */
11213/*
11214 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11215 * any interesting requests and then jump to the real instruction
11216 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11217 */
11218    .extern MterpCheckBefore
11219    EXPORT_PC()
11220    la     ra, artMterpAsmInstructionStart + (158 * 128)   # Addr of primary handler
11221    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11222    move   a0, rSELF                    # arg0
11223    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11224    la     a2, MterpCheckBefore
11225    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11226
11227/* ------------------------------ */
11228    .balign 128
11229.L_ALT_op_rem_long: /* 0x9f */
11230/* File: mips/alt_stub.S */
11231/*
11232 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11233 * any interesting requests and then jump to the real instruction
11234 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11235 */
11236    .extern MterpCheckBefore
11237    EXPORT_PC()
11238    la     ra, artMterpAsmInstructionStart + (159 * 128)   # Addr of primary handler
11239    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11240    move   a0, rSELF                    # arg0
11241    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11242    la     a2, MterpCheckBefore
11243    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11244
11245/* ------------------------------ */
11246    .balign 128
11247.L_ALT_op_and_long: /* 0xa0 */
11248/* File: mips/alt_stub.S */
11249/*
11250 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11251 * any interesting requests and then jump to the real instruction
11252 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11253 */
11254    .extern MterpCheckBefore
11255    EXPORT_PC()
11256    la     ra, artMterpAsmInstructionStart + (160 * 128)   # Addr of primary handler
11257    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11258    move   a0, rSELF                    # arg0
11259    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11260    la     a2, MterpCheckBefore
11261    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11262
11263/* ------------------------------ */
11264    .balign 128
11265.L_ALT_op_or_long: /* 0xa1 */
11266/* File: mips/alt_stub.S */
11267/*
11268 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11269 * any interesting requests and then jump to the real instruction
11270 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11271 */
11272    .extern MterpCheckBefore
11273    EXPORT_PC()
11274    la     ra, artMterpAsmInstructionStart + (161 * 128)   # Addr of primary handler
11275    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11276    move   a0, rSELF                    # arg0
11277    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11278    la     a2, MterpCheckBefore
11279    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11280
11281/* ------------------------------ */
11282    .balign 128
11283.L_ALT_op_xor_long: /* 0xa2 */
11284/* File: mips/alt_stub.S */
11285/*
11286 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11287 * any interesting requests and then jump to the real instruction
11288 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11289 */
11290    .extern MterpCheckBefore
11291    EXPORT_PC()
11292    la     ra, artMterpAsmInstructionStart + (162 * 128)   # Addr of primary handler
11293    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11294    move   a0, rSELF                    # arg0
11295    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11296    la     a2, MterpCheckBefore
11297    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11298
11299/* ------------------------------ */
11300    .balign 128
11301.L_ALT_op_shl_long: /* 0xa3 */
11302/* File: mips/alt_stub.S */
11303/*
11304 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11305 * any interesting requests and then jump to the real instruction
11306 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11307 */
11308    .extern MterpCheckBefore
11309    EXPORT_PC()
11310    la     ra, artMterpAsmInstructionStart + (163 * 128)   # Addr of primary handler
11311    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11312    move   a0, rSELF                    # arg0
11313    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11314    la     a2, MterpCheckBefore
11315    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11316
11317/* ------------------------------ */
11318    .balign 128
11319.L_ALT_op_shr_long: /* 0xa4 */
11320/* File: mips/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    la     ra, artMterpAsmInstructionStart + (164 * 128)   # Addr of primary handler
11329    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11330    move   a0, rSELF                    # arg0
11331    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11332    la     a2, MterpCheckBefore
11333    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11334
11335/* ------------------------------ */
11336    .balign 128
11337.L_ALT_op_ushr_long: /* 0xa5 */
11338/* File: mips/alt_stub.S */
11339/*
11340 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11341 * any interesting requests and then jump to the real instruction
11342 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11343 */
11344    .extern MterpCheckBefore
11345    EXPORT_PC()
11346    la     ra, artMterpAsmInstructionStart + (165 * 128)   # Addr of primary handler
11347    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11348    move   a0, rSELF                    # arg0
11349    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11350    la     a2, MterpCheckBefore
11351    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11352
11353/* ------------------------------ */
11354    .balign 128
11355.L_ALT_op_add_float: /* 0xa6 */
11356/* File: mips/alt_stub.S */
11357/*
11358 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11359 * any interesting requests and then jump to the real instruction
11360 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11361 */
11362    .extern MterpCheckBefore
11363    EXPORT_PC()
11364    la     ra, artMterpAsmInstructionStart + (166 * 128)   # Addr of primary handler
11365    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11366    move   a0, rSELF                    # arg0
11367    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11368    la     a2, MterpCheckBefore
11369    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11370
11371/* ------------------------------ */
11372    .balign 128
11373.L_ALT_op_sub_float: /* 0xa7 */
11374/* File: mips/alt_stub.S */
11375/*
11376 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11377 * any interesting requests and then jump to the real instruction
11378 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11379 */
11380    .extern MterpCheckBefore
11381    EXPORT_PC()
11382    la     ra, artMterpAsmInstructionStart + (167 * 128)   # Addr of primary handler
11383    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11384    move   a0, rSELF                    # arg0
11385    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11386    la     a2, MterpCheckBefore
11387    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11388
11389/* ------------------------------ */
11390    .balign 128
11391.L_ALT_op_mul_float: /* 0xa8 */
11392/* File: mips/alt_stub.S */
11393/*
11394 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11395 * any interesting requests and then jump to the real instruction
11396 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11397 */
11398    .extern MterpCheckBefore
11399    EXPORT_PC()
11400    la     ra, artMterpAsmInstructionStart + (168 * 128)   # Addr of primary handler
11401    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11402    move   a0, rSELF                    # arg0
11403    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11404    la     a2, MterpCheckBefore
11405    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11406
11407/* ------------------------------ */
11408    .balign 128
11409.L_ALT_op_div_float: /* 0xa9 */
11410/* File: mips/alt_stub.S */
11411/*
11412 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11413 * any interesting requests and then jump to the real instruction
11414 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11415 */
11416    .extern MterpCheckBefore
11417    EXPORT_PC()
11418    la     ra, artMterpAsmInstructionStart + (169 * 128)   # Addr of primary handler
11419    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11420    move   a0, rSELF                    # arg0
11421    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11422    la     a2, MterpCheckBefore
11423    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11424
11425/* ------------------------------ */
11426    .balign 128
11427.L_ALT_op_rem_float: /* 0xaa */
11428/* File: mips/alt_stub.S */
11429/*
11430 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11431 * any interesting requests and then jump to the real instruction
11432 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11433 */
11434    .extern MterpCheckBefore
11435    EXPORT_PC()
11436    la     ra, artMterpAsmInstructionStart + (170 * 128)   # Addr of primary handler
11437    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11438    move   a0, rSELF                    # arg0
11439    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11440    la     a2, MterpCheckBefore
11441    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11442
11443/* ------------------------------ */
11444    .balign 128
11445.L_ALT_op_add_double: /* 0xab */
11446/* File: mips/alt_stub.S */
11447/*
11448 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11449 * any interesting requests and then jump to the real instruction
11450 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11451 */
11452    .extern MterpCheckBefore
11453    EXPORT_PC()
11454    la     ra, artMterpAsmInstructionStart + (171 * 128)   # Addr of primary handler
11455    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11456    move   a0, rSELF                    # arg0
11457    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11458    la     a2, MterpCheckBefore
11459    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11460
11461/* ------------------------------ */
11462    .balign 128
11463.L_ALT_op_sub_double: /* 0xac */
11464/* File: mips/alt_stub.S */
11465/*
11466 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11467 * any interesting requests and then jump to the real instruction
11468 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11469 */
11470    .extern MterpCheckBefore
11471    EXPORT_PC()
11472    la     ra, artMterpAsmInstructionStart + (172 * 128)   # Addr of primary handler
11473    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11474    move   a0, rSELF                    # arg0
11475    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11476    la     a2, MterpCheckBefore
11477    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11478
11479/* ------------------------------ */
11480    .balign 128
11481.L_ALT_op_mul_double: /* 0xad */
11482/* File: mips/alt_stub.S */
11483/*
11484 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11485 * any interesting requests and then jump to the real instruction
11486 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11487 */
11488    .extern MterpCheckBefore
11489    EXPORT_PC()
11490    la     ra, artMterpAsmInstructionStart + (173 * 128)   # Addr of primary handler
11491    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11492    move   a0, rSELF                    # arg0
11493    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11494    la     a2, MterpCheckBefore
11495    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11496
11497/* ------------------------------ */
11498    .balign 128
11499.L_ALT_op_div_double: /* 0xae */
11500/* File: mips/alt_stub.S */
11501/*
11502 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11503 * any interesting requests and then jump to the real instruction
11504 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11505 */
11506    .extern MterpCheckBefore
11507    EXPORT_PC()
11508    la     ra, artMterpAsmInstructionStart + (174 * 128)   # Addr of primary handler
11509    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11510    move   a0, rSELF                    # arg0
11511    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11512    la     a2, MterpCheckBefore
11513    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11514
11515/* ------------------------------ */
11516    .balign 128
11517.L_ALT_op_rem_double: /* 0xaf */
11518/* File: mips/alt_stub.S */
11519/*
11520 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11521 * any interesting requests and then jump to the real instruction
11522 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11523 */
11524    .extern MterpCheckBefore
11525    EXPORT_PC()
11526    la     ra, artMterpAsmInstructionStart + (175 * 128)   # Addr of primary handler
11527    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11528    move   a0, rSELF                    # arg0
11529    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11530    la     a2, MterpCheckBefore
11531    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11532
11533/* ------------------------------ */
11534    .balign 128
11535.L_ALT_op_add_int_2addr: /* 0xb0 */
11536/* File: mips/alt_stub.S */
11537/*
11538 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11539 * any interesting requests and then jump to the real instruction
11540 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11541 */
11542    .extern MterpCheckBefore
11543    EXPORT_PC()
11544    la     ra, artMterpAsmInstructionStart + (176 * 128)   # Addr of primary handler
11545    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11546    move   a0, rSELF                    # arg0
11547    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11548    la     a2, MterpCheckBefore
11549    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11550
11551/* ------------------------------ */
11552    .balign 128
11553.L_ALT_op_sub_int_2addr: /* 0xb1 */
11554/* File: mips/alt_stub.S */
11555/*
11556 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11557 * any interesting requests and then jump to the real instruction
11558 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11559 */
11560    .extern MterpCheckBefore
11561    EXPORT_PC()
11562    la     ra, artMterpAsmInstructionStart + (177 * 128)   # Addr of primary handler
11563    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11564    move   a0, rSELF                    # arg0
11565    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11566    la     a2, MterpCheckBefore
11567    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11568
11569/* ------------------------------ */
11570    .balign 128
11571.L_ALT_op_mul_int_2addr: /* 0xb2 */
11572/* File: mips/alt_stub.S */
11573/*
11574 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11575 * any interesting requests and then jump to the real instruction
11576 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11577 */
11578    .extern MterpCheckBefore
11579    EXPORT_PC()
11580    la     ra, artMterpAsmInstructionStart + (178 * 128)   # Addr of primary handler
11581    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11582    move   a0, rSELF                    # arg0
11583    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11584    la     a2, MterpCheckBefore
11585    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11586
11587/* ------------------------------ */
11588    .balign 128
11589.L_ALT_op_div_int_2addr: /* 0xb3 */
11590/* File: mips/alt_stub.S */
11591/*
11592 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11593 * any interesting requests and then jump to the real instruction
11594 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11595 */
11596    .extern MterpCheckBefore
11597    EXPORT_PC()
11598    la     ra, artMterpAsmInstructionStart + (179 * 128)   # Addr of primary handler
11599    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11600    move   a0, rSELF                    # arg0
11601    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11602    la     a2, MterpCheckBefore
11603    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11604
11605/* ------------------------------ */
11606    .balign 128
11607.L_ALT_op_rem_int_2addr: /* 0xb4 */
11608/* File: mips/alt_stub.S */
11609/*
11610 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11611 * any interesting requests and then jump to the real instruction
11612 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11613 */
11614    .extern MterpCheckBefore
11615    EXPORT_PC()
11616    la     ra, artMterpAsmInstructionStart + (180 * 128)   # Addr of primary handler
11617    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11618    move   a0, rSELF                    # arg0
11619    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11620    la     a2, MterpCheckBefore
11621    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11622
11623/* ------------------------------ */
11624    .balign 128
11625.L_ALT_op_and_int_2addr: /* 0xb5 */
11626/* File: mips/alt_stub.S */
11627/*
11628 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11629 * any interesting requests and then jump to the real instruction
11630 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11631 */
11632    .extern MterpCheckBefore
11633    EXPORT_PC()
11634    la     ra, artMterpAsmInstructionStart + (181 * 128)   # Addr of primary handler
11635    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11636    move   a0, rSELF                    # arg0
11637    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11638    la     a2, MterpCheckBefore
11639    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11640
11641/* ------------------------------ */
11642    .balign 128
11643.L_ALT_op_or_int_2addr: /* 0xb6 */
11644/* File: mips/alt_stub.S */
11645/*
11646 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11647 * any interesting requests and then jump to the real instruction
11648 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11649 */
11650    .extern MterpCheckBefore
11651    EXPORT_PC()
11652    la     ra, artMterpAsmInstructionStart + (182 * 128)   # Addr of primary handler
11653    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11654    move   a0, rSELF                    # arg0
11655    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11656    la     a2, MterpCheckBefore
11657    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11658
11659/* ------------------------------ */
11660    .balign 128
11661.L_ALT_op_xor_int_2addr: /* 0xb7 */
11662/* File: mips/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    la     ra, artMterpAsmInstructionStart + (183 * 128)   # Addr of primary handler
11671    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11672    move   a0, rSELF                    # arg0
11673    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11674    la     a2, MterpCheckBefore
11675    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11676
11677/* ------------------------------ */
11678    .balign 128
11679.L_ALT_op_shl_int_2addr: /* 0xb8 */
11680/* File: mips/alt_stub.S */
11681/*
11682 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11683 * any interesting requests and then jump to the real instruction
11684 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11685 */
11686    .extern MterpCheckBefore
11687    EXPORT_PC()
11688    la     ra, artMterpAsmInstructionStart + (184 * 128)   # Addr of primary handler
11689    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11690    move   a0, rSELF                    # arg0
11691    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11692    la     a2, MterpCheckBefore
11693    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11694
11695/* ------------------------------ */
11696    .balign 128
11697.L_ALT_op_shr_int_2addr: /* 0xb9 */
11698/* File: mips/alt_stub.S */
11699/*
11700 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11701 * any interesting requests and then jump to the real instruction
11702 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11703 */
11704    .extern MterpCheckBefore
11705    EXPORT_PC()
11706    la     ra, artMterpAsmInstructionStart + (185 * 128)   # Addr of primary handler
11707    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11708    move   a0, rSELF                    # arg0
11709    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11710    la     a2, MterpCheckBefore
11711    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11712
11713/* ------------------------------ */
11714    .balign 128
11715.L_ALT_op_ushr_int_2addr: /* 0xba */
11716/* File: mips/alt_stub.S */
11717/*
11718 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11719 * any interesting requests and then jump to the real instruction
11720 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11721 */
11722    .extern MterpCheckBefore
11723    EXPORT_PC()
11724    la     ra, artMterpAsmInstructionStart + (186 * 128)   # Addr of primary handler
11725    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11726    move   a0, rSELF                    # arg0
11727    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11728    la     a2, MterpCheckBefore
11729    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11730
11731/* ------------------------------ */
11732    .balign 128
11733.L_ALT_op_add_long_2addr: /* 0xbb */
11734/* File: mips/alt_stub.S */
11735/*
11736 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11737 * any interesting requests and then jump to the real instruction
11738 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11739 */
11740    .extern MterpCheckBefore
11741    EXPORT_PC()
11742    la     ra, artMterpAsmInstructionStart + (187 * 128)   # Addr of primary handler
11743    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11744    move   a0, rSELF                    # arg0
11745    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11746    la     a2, MterpCheckBefore
11747    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11748
11749/* ------------------------------ */
11750    .balign 128
11751.L_ALT_op_sub_long_2addr: /* 0xbc */
11752/* File: mips/alt_stub.S */
11753/*
11754 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11755 * any interesting requests and then jump to the real instruction
11756 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11757 */
11758    .extern MterpCheckBefore
11759    EXPORT_PC()
11760    la     ra, artMterpAsmInstructionStart + (188 * 128)   # Addr of primary handler
11761    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11762    move   a0, rSELF                    # arg0
11763    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11764    la     a2, MterpCheckBefore
11765    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11766
11767/* ------------------------------ */
11768    .balign 128
11769.L_ALT_op_mul_long_2addr: /* 0xbd */
11770/* File: mips/alt_stub.S */
11771/*
11772 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11773 * any interesting requests and then jump to the real instruction
11774 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11775 */
11776    .extern MterpCheckBefore
11777    EXPORT_PC()
11778    la     ra, artMterpAsmInstructionStart + (189 * 128)   # Addr of primary handler
11779    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11780    move   a0, rSELF                    # arg0
11781    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11782    la     a2, MterpCheckBefore
11783    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11784
11785/* ------------------------------ */
11786    .balign 128
11787.L_ALT_op_div_long_2addr: /* 0xbe */
11788/* File: mips/alt_stub.S */
11789/*
11790 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11791 * any interesting requests and then jump to the real instruction
11792 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11793 */
11794    .extern MterpCheckBefore
11795    EXPORT_PC()
11796    la     ra, artMterpAsmInstructionStart + (190 * 128)   # Addr of primary handler
11797    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11798    move   a0, rSELF                    # arg0
11799    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11800    la     a2, MterpCheckBefore
11801    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11802
11803/* ------------------------------ */
11804    .balign 128
11805.L_ALT_op_rem_long_2addr: /* 0xbf */
11806/* File: mips/alt_stub.S */
11807/*
11808 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11809 * any interesting requests and then jump to the real instruction
11810 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11811 */
11812    .extern MterpCheckBefore
11813    EXPORT_PC()
11814    la     ra, artMterpAsmInstructionStart + (191 * 128)   # Addr of primary handler
11815    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11816    move   a0, rSELF                    # arg0
11817    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11818    la     a2, MterpCheckBefore
11819    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11820
11821/* ------------------------------ */
11822    .balign 128
11823.L_ALT_op_and_long_2addr: /* 0xc0 */
11824/* File: mips/alt_stub.S */
11825/*
11826 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11827 * any interesting requests and then jump to the real instruction
11828 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11829 */
11830    .extern MterpCheckBefore
11831    EXPORT_PC()
11832    la     ra, artMterpAsmInstructionStart + (192 * 128)   # Addr of primary handler
11833    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11834    move   a0, rSELF                    # arg0
11835    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11836    la     a2, MterpCheckBefore
11837    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11838
11839/* ------------------------------ */
11840    .balign 128
11841.L_ALT_op_or_long_2addr: /* 0xc1 */
11842/* File: mips/alt_stub.S */
11843/*
11844 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11845 * any interesting requests and then jump to the real instruction
11846 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11847 */
11848    .extern MterpCheckBefore
11849    EXPORT_PC()
11850    la     ra, artMterpAsmInstructionStart + (193 * 128)   # Addr of primary handler
11851    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11852    move   a0, rSELF                    # arg0
11853    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11854    la     a2, MterpCheckBefore
11855    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11856
11857/* ------------------------------ */
11858    .balign 128
11859.L_ALT_op_xor_long_2addr: /* 0xc2 */
11860/* File: mips/alt_stub.S */
11861/*
11862 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11863 * any interesting requests and then jump to the real instruction
11864 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11865 */
11866    .extern MterpCheckBefore
11867    EXPORT_PC()
11868    la     ra, artMterpAsmInstructionStart + (194 * 128)   # Addr of primary handler
11869    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11870    move   a0, rSELF                    # arg0
11871    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11872    la     a2, MterpCheckBefore
11873    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11874
11875/* ------------------------------ */
11876    .balign 128
11877.L_ALT_op_shl_long_2addr: /* 0xc3 */
11878/* File: mips/alt_stub.S */
11879/*
11880 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11881 * any interesting requests and then jump to the real instruction
11882 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11883 */
11884    .extern MterpCheckBefore
11885    EXPORT_PC()
11886    la     ra, artMterpAsmInstructionStart + (195 * 128)   # Addr of primary handler
11887    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11888    move   a0, rSELF                    # arg0
11889    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11890    la     a2, MterpCheckBefore
11891    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11892
11893/* ------------------------------ */
11894    .balign 128
11895.L_ALT_op_shr_long_2addr: /* 0xc4 */
11896/* File: mips/alt_stub.S */
11897/*
11898 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11899 * any interesting requests and then jump to the real instruction
11900 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11901 */
11902    .extern MterpCheckBefore
11903    EXPORT_PC()
11904    la     ra, artMterpAsmInstructionStart + (196 * 128)   # Addr of primary handler
11905    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11906    move   a0, rSELF                    # arg0
11907    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11908    la     a2, MterpCheckBefore
11909    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11910
11911/* ------------------------------ */
11912    .balign 128
11913.L_ALT_op_ushr_long_2addr: /* 0xc5 */
11914/* File: mips/alt_stub.S */
11915/*
11916 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11917 * any interesting requests and then jump to the real instruction
11918 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11919 */
11920    .extern MterpCheckBefore
11921    EXPORT_PC()
11922    la     ra, artMterpAsmInstructionStart + (197 * 128)   # Addr of primary handler
11923    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11924    move   a0, rSELF                    # arg0
11925    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11926    la     a2, MterpCheckBefore
11927    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11928
11929/* ------------------------------ */
11930    .balign 128
11931.L_ALT_op_add_float_2addr: /* 0xc6 */
11932/* File: mips/alt_stub.S */
11933/*
11934 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11935 * any interesting requests and then jump to the real instruction
11936 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11937 */
11938    .extern MterpCheckBefore
11939    EXPORT_PC()
11940    la     ra, artMterpAsmInstructionStart + (198 * 128)   # Addr of primary handler
11941    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11942    move   a0, rSELF                    # arg0
11943    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11944    la     a2, MterpCheckBefore
11945    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11946
11947/* ------------------------------ */
11948    .balign 128
11949.L_ALT_op_sub_float_2addr: /* 0xc7 */
11950/* File: mips/alt_stub.S */
11951/*
11952 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11953 * any interesting requests and then jump to the real instruction
11954 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11955 */
11956    .extern MterpCheckBefore
11957    EXPORT_PC()
11958    la     ra, artMterpAsmInstructionStart + (199 * 128)   # Addr of primary handler
11959    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11960    move   a0, rSELF                    # arg0
11961    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11962    la     a2, MterpCheckBefore
11963    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11964
11965/* ------------------------------ */
11966    .balign 128
11967.L_ALT_op_mul_float_2addr: /* 0xc8 */
11968/* File: mips/alt_stub.S */
11969/*
11970 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11971 * any interesting requests and then jump to the real instruction
11972 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11973 */
11974    .extern MterpCheckBefore
11975    EXPORT_PC()
11976    la     ra, artMterpAsmInstructionStart + (200 * 128)   # Addr of primary handler
11977    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11978    move   a0, rSELF                    # arg0
11979    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11980    la     a2, MterpCheckBefore
11981    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
11982
11983/* ------------------------------ */
11984    .balign 128
11985.L_ALT_op_div_float_2addr: /* 0xc9 */
11986/* File: mips/alt_stub.S */
11987/*
11988 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11989 * any interesting requests and then jump to the real instruction
11990 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
11991 */
11992    .extern MterpCheckBefore
11993    EXPORT_PC()
11994    la     ra, artMterpAsmInstructionStart + (201 * 128)   # Addr of primary handler
11995    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
11996    move   a0, rSELF                    # arg0
11997    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
11998    la     a2, MterpCheckBefore
11999    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12000
12001/* ------------------------------ */
12002    .balign 128
12003.L_ALT_op_rem_float_2addr: /* 0xca */
12004/* File: mips/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    la     ra, artMterpAsmInstructionStart + (202 * 128)   # Addr of primary handler
12013    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12014    move   a0, rSELF                    # arg0
12015    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12016    la     a2, MterpCheckBefore
12017    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12018
12019/* ------------------------------ */
12020    .balign 128
12021.L_ALT_op_add_double_2addr: /* 0xcb */
12022/* File: mips/alt_stub.S */
12023/*
12024 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12025 * any interesting requests and then jump to the real instruction
12026 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12027 */
12028    .extern MterpCheckBefore
12029    EXPORT_PC()
12030    la     ra, artMterpAsmInstructionStart + (203 * 128)   # Addr of primary handler
12031    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12032    move   a0, rSELF                    # arg0
12033    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12034    la     a2, MterpCheckBefore
12035    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12036
12037/* ------------------------------ */
12038    .balign 128
12039.L_ALT_op_sub_double_2addr: /* 0xcc */
12040/* File: mips/alt_stub.S */
12041/*
12042 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12043 * any interesting requests and then jump to the real instruction
12044 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12045 */
12046    .extern MterpCheckBefore
12047    EXPORT_PC()
12048    la     ra, artMterpAsmInstructionStart + (204 * 128)   # Addr of primary handler
12049    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12050    move   a0, rSELF                    # arg0
12051    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12052    la     a2, MterpCheckBefore
12053    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12054
12055/* ------------------------------ */
12056    .balign 128
12057.L_ALT_op_mul_double_2addr: /* 0xcd */
12058/* File: mips/alt_stub.S */
12059/*
12060 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12061 * any interesting requests and then jump to the real instruction
12062 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12063 */
12064    .extern MterpCheckBefore
12065    EXPORT_PC()
12066    la     ra, artMterpAsmInstructionStart + (205 * 128)   # Addr of primary handler
12067    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12068    move   a0, rSELF                    # arg0
12069    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12070    la     a2, MterpCheckBefore
12071    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12072
12073/* ------------------------------ */
12074    .balign 128
12075.L_ALT_op_div_double_2addr: /* 0xce */
12076/* File: mips/alt_stub.S */
12077/*
12078 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12079 * any interesting requests and then jump to the real instruction
12080 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12081 */
12082    .extern MterpCheckBefore
12083    EXPORT_PC()
12084    la     ra, artMterpAsmInstructionStart + (206 * 128)   # Addr of primary handler
12085    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12086    move   a0, rSELF                    # arg0
12087    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12088    la     a2, MterpCheckBefore
12089    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12090
12091/* ------------------------------ */
12092    .balign 128
12093.L_ALT_op_rem_double_2addr: /* 0xcf */
12094/* File: mips/alt_stub.S */
12095/*
12096 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12097 * any interesting requests and then jump to the real instruction
12098 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12099 */
12100    .extern MterpCheckBefore
12101    EXPORT_PC()
12102    la     ra, artMterpAsmInstructionStart + (207 * 128)   # Addr of primary handler
12103    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12104    move   a0, rSELF                    # arg0
12105    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12106    la     a2, MterpCheckBefore
12107    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12108
12109/* ------------------------------ */
12110    .balign 128
12111.L_ALT_op_add_int_lit16: /* 0xd0 */
12112/* File: mips/alt_stub.S */
12113/*
12114 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12115 * any interesting requests and then jump to the real instruction
12116 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12117 */
12118    .extern MterpCheckBefore
12119    EXPORT_PC()
12120    la     ra, artMterpAsmInstructionStart + (208 * 128)   # Addr of primary handler
12121    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12122    move   a0, rSELF                    # arg0
12123    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12124    la     a2, MterpCheckBefore
12125    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12126
12127/* ------------------------------ */
12128    .balign 128
12129.L_ALT_op_rsub_int: /* 0xd1 */
12130/* File: mips/alt_stub.S */
12131/*
12132 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12133 * any interesting requests and then jump to the real instruction
12134 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12135 */
12136    .extern MterpCheckBefore
12137    EXPORT_PC()
12138    la     ra, artMterpAsmInstructionStart + (209 * 128)   # Addr of primary handler
12139    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12140    move   a0, rSELF                    # arg0
12141    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12142    la     a2, MterpCheckBefore
12143    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12144
12145/* ------------------------------ */
12146    .balign 128
12147.L_ALT_op_mul_int_lit16: /* 0xd2 */
12148/* File: mips/alt_stub.S */
12149/*
12150 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12151 * any interesting requests and then jump to the real instruction
12152 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12153 */
12154    .extern MterpCheckBefore
12155    EXPORT_PC()
12156    la     ra, artMterpAsmInstructionStart + (210 * 128)   # Addr of primary handler
12157    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12158    move   a0, rSELF                    # arg0
12159    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12160    la     a2, MterpCheckBefore
12161    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12162
12163/* ------------------------------ */
12164    .balign 128
12165.L_ALT_op_div_int_lit16: /* 0xd3 */
12166/* File: mips/alt_stub.S */
12167/*
12168 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12169 * any interesting requests and then jump to the real instruction
12170 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12171 */
12172    .extern MterpCheckBefore
12173    EXPORT_PC()
12174    la     ra, artMterpAsmInstructionStart + (211 * 128)   # Addr of primary handler
12175    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12176    move   a0, rSELF                    # arg0
12177    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12178    la     a2, MterpCheckBefore
12179    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12180
12181/* ------------------------------ */
12182    .balign 128
12183.L_ALT_op_rem_int_lit16: /* 0xd4 */
12184/* File: mips/alt_stub.S */
12185/*
12186 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12187 * any interesting requests and then jump to the real instruction
12188 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12189 */
12190    .extern MterpCheckBefore
12191    EXPORT_PC()
12192    la     ra, artMterpAsmInstructionStart + (212 * 128)   # Addr of primary handler
12193    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12194    move   a0, rSELF                    # arg0
12195    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12196    la     a2, MterpCheckBefore
12197    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12198
12199/* ------------------------------ */
12200    .balign 128
12201.L_ALT_op_and_int_lit16: /* 0xd5 */
12202/* File: mips/alt_stub.S */
12203/*
12204 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12205 * any interesting requests and then jump to the real instruction
12206 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12207 */
12208    .extern MterpCheckBefore
12209    EXPORT_PC()
12210    la     ra, artMterpAsmInstructionStart + (213 * 128)   # Addr of primary handler
12211    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12212    move   a0, rSELF                    # arg0
12213    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12214    la     a2, MterpCheckBefore
12215    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12216
12217/* ------------------------------ */
12218    .balign 128
12219.L_ALT_op_or_int_lit16: /* 0xd6 */
12220/* File: mips/alt_stub.S */
12221/*
12222 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12223 * any interesting requests and then jump to the real instruction
12224 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12225 */
12226    .extern MterpCheckBefore
12227    EXPORT_PC()
12228    la     ra, artMterpAsmInstructionStart + (214 * 128)   # Addr of primary handler
12229    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12230    move   a0, rSELF                    # arg0
12231    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12232    la     a2, MterpCheckBefore
12233    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12234
12235/* ------------------------------ */
12236    .balign 128
12237.L_ALT_op_xor_int_lit16: /* 0xd7 */
12238/* File: mips/alt_stub.S */
12239/*
12240 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12241 * any interesting requests and then jump to the real instruction
12242 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12243 */
12244    .extern MterpCheckBefore
12245    EXPORT_PC()
12246    la     ra, artMterpAsmInstructionStart + (215 * 128)   # Addr of primary handler
12247    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12248    move   a0, rSELF                    # arg0
12249    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12250    la     a2, MterpCheckBefore
12251    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12252
12253/* ------------------------------ */
12254    .balign 128
12255.L_ALT_op_add_int_lit8: /* 0xd8 */
12256/* File: mips/alt_stub.S */
12257/*
12258 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12259 * any interesting requests and then jump to the real instruction
12260 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12261 */
12262    .extern MterpCheckBefore
12263    EXPORT_PC()
12264    la     ra, artMterpAsmInstructionStart + (216 * 128)   # Addr of primary handler
12265    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12266    move   a0, rSELF                    # arg0
12267    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12268    la     a2, MterpCheckBefore
12269    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12270
12271/* ------------------------------ */
12272    .balign 128
12273.L_ALT_op_rsub_int_lit8: /* 0xd9 */
12274/* File: mips/alt_stub.S */
12275/*
12276 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12277 * any interesting requests and then jump to the real instruction
12278 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12279 */
12280    .extern MterpCheckBefore
12281    EXPORT_PC()
12282    la     ra, artMterpAsmInstructionStart + (217 * 128)   # Addr of primary handler
12283    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12284    move   a0, rSELF                    # arg0
12285    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12286    la     a2, MterpCheckBefore
12287    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12288
12289/* ------------------------------ */
12290    .balign 128
12291.L_ALT_op_mul_int_lit8: /* 0xda */
12292/* File: mips/alt_stub.S */
12293/*
12294 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12295 * any interesting requests and then jump to the real instruction
12296 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12297 */
12298    .extern MterpCheckBefore
12299    EXPORT_PC()
12300    la     ra, artMterpAsmInstructionStart + (218 * 128)   # Addr of primary handler
12301    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12302    move   a0, rSELF                    # arg0
12303    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12304    la     a2, MterpCheckBefore
12305    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12306
12307/* ------------------------------ */
12308    .balign 128
12309.L_ALT_op_div_int_lit8: /* 0xdb */
12310/* File: mips/alt_stub.S */
12311/*
12312 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12313 * any interesting requests and then jump to the real instruction
12314 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12315 */
12316    .extern MterpCheckBefore
12317    EXPORT_PC()
12318    la     ra, artMterpAsmInstructionStart + (219 * 128)   # Addr of primary handler
12319    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12320    move   a0, rSELF                    # arg0
12321    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12322    la     a2, MterpCheckBefore
12323    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12324
12325/* ------------------------------ */
12326    .balign 128
12327.L_ALT_op_rem_int_lit8: /* 0xdc */
12328/* File: mips/alt_stub.S */
12329/*
12330 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12331 * any interesting requests and then jump to the real instruction
12332 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12333 */
12334    .extern MterpCheckBefore
12335    EXPORT_PC()
12336    la     ra, artMterpAsmInstructionStart + (220 * 128)   # Addr of primary handler
12337    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12338    move   a0, rSELF                    # arg0
12339    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12340    la     a2, MterpCheckBefore
12341    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12342
12343/* ------------------------------ */
12344    .balign 128
12345.L_ALT_op_and_int_lit8: /* 0xdd */
12346/* File: mips/alt_stub.S */
12347/*
12348 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12349 * any interesting requests and then jump to the real instruction
12350 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12351 */
12352    .extern MterpCheckBefore
12353    EXPORT_PC()
12354    la     ra, artMterpAsmInstructionStart + (221 * 128)   # Addr of primary handler
12355    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12356    move   a0, rSELF                    # arg0
12357    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12358    la     a2, MterpCheckBefore
12359    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12360
12361/* ------------------------------ */
12362    .balign 128
12363.L_ALT_op_or_int_lit8: /* 0xde */
12364/* File: mips/alt_stub.S */
12365/*
12366 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12367 * any interesting requests and then jump to the real instruction
12368 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12369 */
12370    .extern MterpCheckBefore
12371    EXPORT_PC()
12372    la     ra, artMterpAsmInstructionStart + (222 * 128)   # Addr of primary handler
12373    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12374    move   a0, rSELF                    # arg0
12375    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12376    la     a2, MterpCheckBefore
12377    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12378
12379/* ------------------------------ */
12380    .balign 128
12381.L_ALT_op_xor_int_lit8: /* 0xdf */
12382/* File: mips/alt_stub.S */
12383/*
12384 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12385 * any interesting requests and then jump to the real instruction
12386 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12387 */
12388    .extern MterpCheckBefore
12389    EXPORT_PC()
12390    la     ra, artMterpAsmInstructionStart + (223 * 128)   # Addr of primary handler
12391    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12392    move   a0, rSELF                    # arg0
12393    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12394    la     a2, MterpCheckBefore
12395    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12396
12397/* ------------------------------ */
12398    .balign 128
12399.L_ALT_op_shl_int_lit8: /* 0xe0 */
12400/* File: mips/alt_stub.S */
12401/*
12402 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12403 * any interesting requests and then jump to the real instruction
12404 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12405 */
12406    .extern MterpCheckBefore
12407    EXPORT_PC()
12408    la     ra, artMterpAsmInstructionStart + (224 * 128)   # Addr of primary handler
12409    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12410    move   a0, rSELF                    # arg0
12411    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12412    la     a2, MterpCheckBefore
12413    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12414
12415/* ------------------------------ */
12416    .balign 128
12417.L_ALT_op_shr_int_lit8: /* 0xe1 */
12418/* File: mips/alt_stub.S */
12419/*
12420 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12421 * any interesting requests and then jump to the real instruction
12422 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12423 */
12424    .extern MterpCheckBefore
12425    EXPORT_PC()
12426    la     ra, artMterpAsmInstructionStart + (225 * 128)   # Addr of primary handler
12427    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12428    move   a0, rSELF                    # arg0
12429    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12430    la     a2, MterpCheckBefore
12431    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12432
12433/* ------------------------------ */
12434    .balign 128
12435.L_ALT_op_ushr_int_lit8: /* 0xe2 */
12436/* File: mips/alt_stub.S */
12437/*
12438 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12439 * any interesting requests and then jump to the real instruction
12440 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12441 */
12442    .extern MterpCheckBefore
12443    EXPORT_PC()
12444    la     ra, artMterpAsmInstructionStart + (226 * 128)   # Addr of primary handler
12445    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12446    move   a0, rSELF                    # arg0
12447    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12448    la     a2, MterpCheckBefore
12449    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12450
12451/* ------------------------------ */
12452    .balign 128
12453.L_ALT_op_iget_quick: /* 0xe3 */
12454/* File: mips/alt_stub.S */
12455/*
12456 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12457 * any interesting requests and then jump to the real instruction
12458 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12459 */
12460    .extern MterpCheckBefore
12461    EXPORT_PC()
12462    la     ra, artMterpAsmInstructionStart + (227 * 128)   # Addr of primary handler
12463    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12464    move   a0, rSELF                    # arg0
12465    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12466    la     a2, MterpCheckBefore
12467    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12468
12469/* ------------------------------ */
12470    .balign 128
12471.L_ALT_op_iget_wide_quick: /* 0xe4 */
12472/* File: mips/alt_stub.S */
12473/*
12474 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12475 * any interesting requests and then jump to the real instruction
12476 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12477 */
12478    .extern MterpCheckBefore
12479    EXPORT_PC()
12480    la     ra, artMterpAsmInstructionStart + (228 * 128)   # Addr of primary handler
12481    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12482    move   a0, rSELF                    # arg0
12483    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12484    la     a2, MterpCheckBefore
12485    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12486
12487/* ------------------------------ */
12488    .balign 128
12489.L_ALT_op_iget_object_quick: /* 0xe5 */
12490/* File: mips/alt_stub.S */
12491/*
12492 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12493 * any interesting requests and then jump to the real instruction
12494 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12495 */
12496    .extern MterpCheckBefore
12497    EXPORT_PC()
12498    la     ra, artMterpAsmInstructionStart + (229 * 128)   # Addr of primary handler
12499    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12500    move   a0, rSELF                    # arg0
12501    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12502    la     a2, MterpCheckBefore
12503    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12504
12505/* ------------------------------ */
12506    .balign 128
12507.L_ALT_op_iput_quick: /* 0xe6 */
12508/* File: mips/alt_stub.S */
12509/*
12510 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12511 * any interesting requests and then jump to the real instruction
12512 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12513 */
12514    .extern MterpCheckBefore
12515    EXPORT_PC()
12516    la     ra, artMterpAsmInstructionStart + (230 * 128)   # Addr of primary handler
12517    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12518    move   a0, rSELF                    # arg0
12519    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12520    la     a2, MterpCheckBefore
12521    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12522
12523/* ------------------------------ */
12524    .balign 128
12525.L_ALT_op_iput_wide_quick: /* 0xe7 */
12526/* File: mips/alt_stub.S */
12527/*
12528 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12529 * any interesting requests and then jump to the real instruction
12530 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12531 */
12532    .extern MterpCheckBefore
12533    EXPORT_PC()
12534    la     ra, artMterpAsmInstructionStart + (231 * 128)   # Addr of primary handler
12535    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12536    move   a0, rSELF                    # arg0
12537    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12538    la     a2, MterpCheckBefore
12539    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12540
12541/* ------------------------------ */
12542    .balign 128
12543.L_ALT_op_iput_object_quick: /* 0xe8 */
12544/* File: mips/alt_stub.S */
12545/*
12546 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12547 * any interesting requests and then jump to the real instruction
12548 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12549 */
12550    .extern MterpCheckBefore
12551    EXPORT_PC()
12552    la     ra, artMterpAsmInstructionStart + (232 * 128)   # Addr of primary handler
12553    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12554    move   a0, rSELF                    # arg0
12555    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12556    la     a2, MterpCheckBefore
12557    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12558
12559/* ------------------------------ */
12560    .balign 128
12561.L_ALT_op_invoke_virtual_quick: /* 0xe9 */
12562/* File: mips/alt_stub.S */
12563/*
12564 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12565 * any interesting requests and then jump to the real instruction
12566 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12567 */
12568    .extern MterpCheckBefore
12569    EXPORT_PC()
12570    la     ra, artMterpAsmInstructionStart + (233 * 128)   # Addr of primary handler
12571    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12572    move   a0, rSELF                    # arg0
12573    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12574    la     a2, MterpCheckBefore
12575    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12576
12577/* ------------------------------ */
12578    .balign 128
12579.L_ALT_op_invoke_virtual_range_quick: /* 0xea */
12580/* File: mips/alt_stub.S */
12581/*
12582 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12583 * any interesting requests and then jump to the real instruction
12584 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12585 */
12586    .extern MterpCheckBefore
12587    EXPORT_PC()
12588    la     ra, artMterpAsmInstructionStart + (234 * 128)   # Addr of primary handler
12589    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12590    move   a0, rSELF                    # arg0
12591    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12592    la     a2, MterpCheckBefore
12593    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12594
12595/* ------------------------------ */
12596    .balign 128
12597.L_ALT_op_iput_boolean_quick: /* 0xeb */
12598/* File: mips/alt_stub.S */
12599/*
12600 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12601 * any interesting requests and then jump to the real instruction
12602 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12603 */
12604    .extern MterpCheckBefore
12605    EXPORT_PC()
12606    la     ra, artMterpAsmInstructionStart + (235 * 128)   # Addr of primary handler
12607    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12608    move   a0, rSELF                    # arg0
12609    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12610    la     a2, MterpCheckBefore
12611    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12612
12613/* ------------------------------ */
12614    .balign 128
12615.L_ALT_op_iput_byte_quick: /* 0xec */
12616/* File: mips/alt_stub.S */
12617/*
12618 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12619 * any interesting requests and then jump to the real instruction
12620 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12621 */
12622    .extern MterpCheckBefore
12623    EXPORT_PC()
12624    la     ra, artMterpAsmInstructionStart + (236 * 128)   # Addr of primary handler
12625    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12626    move   a0, rSELF                    # arg0
12627    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12628    la     a2, MterpCheckBefore
12629    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12630
12631/* ------------------------------ */
12632    .balign 128
12633.L_ALT_op_iput_char_quick: /* 0xed */
12634/* File: mips/alt_stub.S */
12635/*
12636 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12637 * any interesting requests and then jump to the real instruction
12638 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12639 */
12640    .extern MterpCheckBefore
12641    EXPORT_PC()
12642    la     ra, artMterpAsmInstructionStart + (237 * 128)   # Addr of primary handler
12643    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12644    move   a0, rSELF                    # arg0
12645    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12646    la     a2, MterpCheckBefore
12647    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12648
12649/* ------------------------------ */
12650    .balign 128
12651.L_ALT_op_iput_short_quick: /* 0xee */
12652/* File: mips/alt_stub.S */
12653/*
12654 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12655 * any interesting requests and then jump to the real instruction
12656 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12657 */
12658    .extern MterpCheckBefore
12659    EXPORT_PC()
12660    la     ra, artMterpAsmInstructionStart + (238 * 128)   # Addr of primary handler
12661    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12662    move   a0, rSELF                    # arg0
12663    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12664    la     a2, MterpCheckBefore
12665    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12666
12667/* ------------------------------ */
12668    .balign 128
12669.L_ALT_op_iget_boolean_quick: /* 0xef */
12670/* File: mips/alt_stub.S */
12671/*
12672 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12673 * any interesting requests and then jump to the real instruction
12674 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12675 */
12676    .extern MterpCheckBefore
12677    EXPORT_PC()
12678    la     ra, artMterpAsmInstructionStart + (239 * 128)   # Addr of primary handler
12679    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12680    move   a0, rSELF                    # arg0
12681    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12682    la     a2, MterpCheckBefore
12683    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12684
12685/* ------------------------------ */
12686    .balign 128
12687.L_ALT_op_iget_byte_quick: /* 0xf0 */
12688/* File: mips/alt_stub.S */
12689/*
12690 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12691 * any interesting requests and then jump to the real instruction
12692 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12693 */
12694    .extern MterpCheckBefore
12695    EXPORT_PC()
12696    la     ra, artMterpAsmInstructionStart + (240 * 128)   # Addr of primary handler
12697    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12698    move   a0, rSELF                    # arg0
12699    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12700    la     a2, MterpCheckBefore
12701    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12702
12703/* ------------------------------ */
12704    .balign 128
12705.L_ALT_op_iget_char_quick: /* 0xf1 */
12706/* File: mips/alt_stub.S */
12707/*
12708 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12709 * any interesting requests and then jump to the real instruction
12710 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12711 */
12712    .extern MterpCheckBefore
12713    EXPORT_PC()
12714    la     ra, artMterpAsmInstructionStart + (241 * 128)   # Addr of primary handler
12715    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12716    move   a0, rSELF                    # arg0
12717    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12718    la     a2, MterpCheckBefore
12719    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12720
12721/* ------------------------------ */
12722    .balign 128
12723.L_ALT_op_iget_short_quick: /* 0xf2 */
12724/* File: mips/alt_stub.S */
12725/*
12726 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12727 * any interesting requests and then jump to the real instruction
12728 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12729 */
12730    .extern MterpCheckBefore
12731    EXPORT_PC()
12732    la     ra, artMterpAsmInstructionStart + (242 * 128)   # Addr of primary handler
12733    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12734    move   a0, rSELF                    # arg0
12735    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12736    la     a2, MterpCheckBefore
12737    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12738
12739/* ------------------------------ */
12740    .balign 128
12741.L_ALT_op_invoke_lambda: /* 0xf3 */
12742/* File: mips/alt_stub.S */
12743/*
12744 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12745 * any interesting requests and then jump to the real instruction
12746 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12747 */
12748    .extern MterpCheckBefore
12749    EXPORT_PC()
12750    la     ra, artMterpAsmInstructionStart + (243 * 128)   # Addr of primary handler
12751    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12752    move   a0, rSELF                    # arg0
12753    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12754    la     a2, MterpCheckBefore
12755    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12756
12757/* ------------------------------ */
12758    .balign 128
12759.L_ALT_op_unused_f4: /* 0xf4 */
12760/* File: mips/alt_stub.S */
12761/*
12762 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12763 * any interesting requests and then jump to the real instruction
12764 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12765 */
12766    .extern MterpCheckBefore
12767    EXPORT_PC()
12768    la     ra, artMterpAsmInstructionStart + (244 * 128)   # Addr of primary handler
12769    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12770    move   a0, rSELF                    # arg0
12771    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12772    la     a2, MterpCheckBefore
12773    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12774
12775/* ------------------------------ */
12776    .balign 128
12777.L_ALT_op_capture_variable: /* 0xf5 */
12778/* File: mips/alt_stub.S */
12779/*
12780 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12781 * any interesting requests and then jump to the real instruction
12782 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12783 */
12784    .extern MterpCheckBefore
12785    EXPORT_PC()
12786    la     ra, artMterpAsmInstructionStart + (245 * 128)   # Addr of primary handler
12787    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12788    move   a0, rSELF                    # arg0
12789    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12790    la     a2, MterpCheckBefore
12791    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12792
12793/* ------------------------------ */
12794    .balign 128
12795.L_ALT_op_create_lambda: /* 0xf6 */
12796/* File: mips/alt_stub.S */
12797/*
12798 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12799 * any interesting requests and then jump to the real instruction
12800 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12801 */
12802    .extern MterpCheckBefore
12803    EXPORT_PC()
12804    la     ra, artMterpAsmInstructionStart + (246 * 128)   # Addr of primary handler
12805    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12806    move   a0, rSELF                    # arg0
12807    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12808    la     a2, MterpCheckBefore
12809    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12810
12811/* ------------------------------ */
12812    .balign 128
12813.L_ALT_op_liberate_variable: /* 0xf7 */
12814/* File: mips/alt_stub.S */
12815/*
12816 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12817 * any interesting requests and then jump to the real instruction
12818 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12819 */
12820    .extern MterpCheckBefore
12821    EXPORT_PC()
12822    la     ra, artMterpAsmInstructionStart + (247 * 128)   # Addr of primary handler
12823    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12824    move   a0, rSELF                    # arg0
12825    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12826    la     a2, MterpCheckBefore
12827    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12828
12829/* ------------------------------ */
12830    .balign 128
12831.L_ALT_op_box_lambda: /* 0xf8 */
12832/* File: mips/alt_stub.S */
12833/*
12834 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12835 * any interesting requests and then jump to the real instruction
12836 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12837 */
12838    .extern MterpCheckBefore
12839    EXPORT_PC()
12840    la     ra, artMterpAsmInstructionStart + (248 * 128)   # Addr of primary handler
12841    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12842    move   a0, rSELF                    # arg0
12843    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12844    la     a2, MterpCheckBefore
12845    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12846
12847/* ------------------------------ */
12848    .balign 128
12849.L_ALT_op_unbox_lambda: /* 0xf9 */
12850/* File: mips/alt_stub.S */
12851/*
12852 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12853 * any interesting requests and then jump to the real instruction
12854 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12855 */
12856    .extern MterpCheckBefore
12857    EXPORT_PC()
12858    la     ra, artMterpAsmInstructionStart + (249 * 128)   # Addr of primary handler
12859    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12860    move   a0, rSELF                    # arg0
12861    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12862    la     a2, MterpCheckBefore
12863    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12864
12865/* ------------------------------ */
12866    .balign 128
12867.L_ALT_op_unused_fa: /* 0xfa */
12868/* File: mips/alt_stub.S */
12869/*
12870 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12871 * any interesting requests and then jump to the real instruction
12872 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12873 */
12874    .extern MterpCheckBefore
12875    EXPORT_PC()
12876    la     ra, artMterpAsmInstructionStart + (250 * 128)   # Addr of primary handler
12877    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12878    move   a0, rSELF                    # arg0
12879    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12880    la     a2, MterpCheckBefore
12881    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12882
12883/* ------------------------------ */
12884    .balign 128
12885.L_ALT_op_unused_fb: /* 0xfb */
12886/* File: mips/alt_stub.S */
12887/*
12888 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12889 * any interesting requests and then jump to the real instruction
12890 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12891 */
12892    .extern MterpCheckBefore
12893    EXPORT_PC()
12894    la     ra, artMterpAsmInstructionStart + (251 * 128)   # Addr of primary handler
12895    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12896    move   a0, rSELF                    # arg0
12897    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12898    la     a2, MterpCheckBefore
12899    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12900
12901/* ------------------------------ */
12902    .balign 128
12903.L_ALT_op_unused_fc: /* 0xfc */
12904/* File: mips/alt_stub.S */
12905/*
12906 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12907 * any interesting requests and then jump to the real instruction
12908 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12909 */
12910    .extern MterpCheckBefore
12911    EXPORT_PC()
12912    la     ra, artMterpAsmInstructionStart + (252 * 128)   # Addr of primary handler
12913    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12914    move   a0, rSELF                    # arg0
12915    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12916    la     a2, MterpCheckBefore
12917    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12918
12919/* ------------------------------ */
12920    .balign 128
12921.L_ALT_op_unused_fd: /* 0xfd */
12922/* File: mips/alt_stub.S */
12923/*
12924 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12925 * any interesting requests and then jump to the real instruction
12926 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12927 */
12928    .extern MterpCheckBefore
12929    EXPORT_PC()
12930    la     ra, artMterpAsmInstructionStart + (253 * 128)   # Addr of primary handler
12931    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12932    move   a0, rSELF                    # arg0
12933    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12934    la     a2, MterpCheckBefore
12935    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12936
12937/* ------------------------------ */
12938    .balign 128
12939.L_ALT_op_unused_fe: /* 0xfe */
12940/* File: mips/alt_stub.S */
12941/*
12942 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12943 * any interesting requests and then jump to the real instruction
12944 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12945 */
12946    .extern MterpCheckBefore
12947    EXPORT_PC()
12948    la     ra, artMterpAsmInstructionStart + (254 * 128)   # Addr of primary handler
12949    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12950    move   a0, rSELF                    # arg0
12951    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12952    la     a2, MterpCheckBefore
12953    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12954
12955/* ------------------------------ */
12956    .balign 128
12957.L_ALT_op_unused_ff: /* 0xff */
12958/* File: mips/alt_stub.S */
12959/*
12960 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
12961 * any interesting requests and then jump to the real instruction
12962 * handler.    Note that the call to MterpCheckBefore is done as a tail call.
12963 */
12964    .extern MterpCheckBefore
12965    EXPORT_PC()
12966    la     ra, artMterpAsmInstructionStart + (255 * 128)   # Addr of primary handler
12967    lw     rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)           # refresh IBASE
12968    move   a0, rSELF                    # arg0
12969    addu   a1, rFP, OFF_FP_SHADOWFRAME  # arg1
12970    la     a2, MterpCheckBefore
12971    jalr   zero, a2                     # Tail call to Mterp(self, shadow_frame)
12972
12973    .balign 128
12974    .size   artMterpAsmAltInstructionStart, .-artMterpAsmAltInstructionStart
12975    .global artMterpAsmAltInstructionEnd
12976artMterpAsmAltInstructionEnd:
12977/* File: mips/footer.S */
12978/*
12979 * ===========================================================================
12980 *  Common subroutines and data
12981 * ===========================================================================
12982 */
12983
12984    .text
12985    .align 2
12986
12987/*
12988 * We've detected a condition that will result in an exception, but the exception
12989 * has not yet been thrown.  Just bail out to the reference interpreter to deal with it.
12990 * TUNING: for consistency, we may want to just go ahead and handle these here.
12991 */
12992common_errDivideByZero:
12993    EXPORT_PC()
12994#if MTERP_LOGGING
12995    move  a0, rSELF
12996    addu  a1, rFP, OFF_FP_SHADOWFRAME
12997    JAL(MterpLogDivideByZeroException)
12998#endif
12999    b MterpCommonFallback
13000
13001common_errArrayIndex:
13002    EXPORT_PC()
13003#if MTERP_LOGGING
13004    move  a0, rSELF
13005    addu  a1, rFP, OFF_FP_SHADOWFRAME
13006    JAL(MterpLogArrayIndexException)
13007#endif
13008    b MterpCommonFallback
13009
13010common_errNegativeArraySize:
13011    EXPORT_PC()
13012#if MTERP_LOGGING
13013    move  a0, rSELF
13014    addu  a1, rFP, OFF_FP_SHADOWFRAME
13015    JAL(MterpLogNegativeArraySizeException)
13016#endif
13017    b MterpCommonFallback
13018
13019common_errNoSuchMethod:
13020    EXPORT_PC()
13021#if MTERP_LOGGING
13022    move  a0, rSELF
13023    addu  a1, rFP, OFF_FP_SHADOWFRAME
13024    JAL(MterpLogNoSuchMethodException)
13025#endif
13026    b MterpCommonFallback
13027
13028common_errNullObject:
13029    EXPORT_PC()
13030#if MTERP_LOGGING
13031    move  a0, rSELF
13032    addu  a1, rFP, OFF_FP_SHADOWFRAME
13033    JAL(MterpLogNullObjectException)
13034#endif
13035    b MterpCommonFallback
13036
13037common_exceptionThrown:
13038    EXPORT_PC()
13039#if MTERP_LOGGING
13040    move  a0, rSELF
13041    addu  a1, rFP, OFF_FP_SHADOWFRAME
13042    JAL(MterpLogExceptionThrownException)
13043#endif
13044    b MterpCommonFallback
13045
13046MterpSuspendFallback:
13047    EXPORT_PC()
13048#if MTERP_LOGGING
13049    move  a0, rSELF
13050    addu  a1, rFP, OFF_FP_SHADOWFRAME
13051    lw    a2, THREAD_FLAGS_OFFSET(rSELF)
13052    JAL(MterpLogSuspendFallback)
13053#endif
13054    b MterpCommonFallback
13055
13056/*
13057 * If we're here, something is out of the ordinary.  If there is a pending
13058 * exception, handle it.  Otherwise, roll back and retry with the reference
13059 * interpreter.
13060 */
13061MterpPossibleException:
13062    lw      a0, THREAD_EXCEPTION_OFFSET(rSELF)
13063    beqz    a0, MterpFallback          # If exception, fall back to reference interpreter.
13064    /* intentional fallthrough - handle pending exception. */
13065/*
13066 * On return from a runtime helper routine, we've found a pending exception.
13067 * Can we handle it here - or need to bail out to caller?
13068 *
13069 */
13070MterpException:
13071    move    a0, rSELF
13072    addu    a1, rFP, OFF_FP_SHADOWFRAME
13073    JAL(MterpHandleException)                    # (self, shadow_frame)
13074    beqz    v0, MterpExceptionReturn             # no local catch, back to caller.
13075    lw      a0, OFF_FP_CODE_ITEM(rFP)
13076    lw      a1, OFF_FP_DEX_PC(rFP)
13077    lw      rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)
13078    addu    rPC, a0, CODEITEM_INSNS_OFFSET
13079    sll     a1, a1, 1
13080    addu    rPC, rPC, a1                         # generate new dex_pc_ptr
13081    /* Do we need to switch interpreters? */
13082    JAL(MterpShouldSwitchInterpreters)
13083    bnez    v0, MterpFallback
13084    /* resume execution at catch block */
13085    EXPORT_PC()
13086    FETCH_INST()
13087    GET_INST_OPCODE(t0)
13088    GOTO_OPCODE(t0)
13089    /* NOTE: no fallthrough */
13090
13091/*
13092 * Check for suspend check request.  Assumes rINST already loaded, rPC advanced and
13093 * still needs to get the opcode and branch to it, and flags are in lr.
13094 */
13095MterpCheckSuspendAndContinue:
13096    lw      rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)  # refresh rIBASE
13097    and     ra, (THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
13098    bnez    ra, 1f
13099    GET_INST_OPCODE(t0)                 # extract opcode from rINST
13100    GOTO_OPCODE(t0)                     # jump to next instruction
131011:
13102    EXPORT_PC()
13103    move    a0, rSELF
13104    JAL(MterpSuspendCheck)              # (self)
13105    bnez    v0, MterpFallback
13106    GET_INST_OPCODE(t0)                 # extract opcode from rINST
13107    GOTO_OPCODE(t0)                     # jump to next instruction
13108
13109/*
13110 * On-stack replacement has happened, and now we've returned from the compiled method.
13111 */
13112MterpOnStackReplacement:
13113#if MTERP_LOGGING
13114    move    a0, rSELF
13115    addu    a1, rFP, OFF_FP_SHADOWFRAME
13116    move    a2, rINST
13117    JAL(MterpLogOSR)
13118#endif
13119    li      v0, 1                       # Signal normal return
13120    b       MterpDone
13121
13122/*
13123 * Bail out to reference interpreter.
13124 */
13125MterpFallback:
13126    EXPORT_PC()
13127#if MTERP_LOGGING
13128    move  a0, rSELF
13129    addu  a1, rFP, OFF_FP_SHADOWFRAME
13130    JAL(MterpLogFallback)
13131#endif
13132MterpCommonFallback:
13133    move    v0, zero                    # signal retry with reference interpreter.
13134    b       MterpDone
13135/*
13136 * We pushed some registers on the stack in ExecuteMterpImpl, then saved
13137 * SP and LR.  Here we restore SP, restore the registers, and then restore
13138 * LR to PC.
13139 *
13140 * On entry:
13141 *  uint32_t* rFP  (should still be live, pointer to base of vregs)
13142 */
13143MterpExceptionReturn:
13144    li      v0, 1                       # signal return to caller.
13145    b       MterpDone
13146MterpReturn:
13147    lw      a2, OFF_FP_RESULT_REGISTER(rFP)
13148    sw      v0, 0(a2)
13149    sw      v1, 4(a2)
13150    li      v0, 1                       # signal return to caller.
13151MterpDone:
13152/* Restore from the stack and return. Frame size = STACK_SIZE */
13153    STACK_LOAD_FULL()
13154    jalr    zero, ra
13155
13156    .end ExecuteMterpImpl
13157
13158