blob: 29a12bfd3199be25a4d7760a8d9fa394ad4df976 [file] [log] [blame]
Alexey Frunze00b53b72016-02-02 20:25:45 -08001/*
2 * This file was generated automatically by gen-mterp.py for 'mips64'.
3 *
4 * --> DO NOT EDIT <--
5 */
6
7/* File: mips64/header.S */
8/*
9 * Copyright (C) 2016 The Android Open Source Project
10 *
11 * Licensed under the Apache License, Version 2.0 (the "License");
12 * you may not use this file except in compliance with the License.
13 * You may obtain a copy of the License at
14 *
15 * http://www.apache.org/licenses/LICENSE-2.0
16 *
17 * Unless required by applicable law or agreed to in writing, software
18 * distributed under the License is distributed on an "AS IS" BASIS,
19 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20 * See the License for the specific language governing permissions and
21 * limitations under the License.
22 */
23
24#include <machine/regdef.h>
25
26/* TODO: add the missing file and use its FP register definitions. */
27/* #include <machine/fpregdef.h> */
28/* FP register definitions */
29#define f0 $f0
30#define f1 $f1
31#define f2 $f2
32#define f3 $f3
33#define f12 $f12
34#define f13 $f13
35
36/*
37 * It looks like the GNU assembler currently does not support the blec and bgtc
38 * idioms, which should translate into bgec and bltc respectively with swapped
39 * left and right register operands.
40 * TODO: remove these macros when the assembler is fixed.
41 */
42.macro blec lreg, rreg, target
43 bgec \rreg, \lreg, \target
44.endm
45.macro bgtc lreg, rreg, target
46 bltc \rreg, \lreg, \target
47.endm
48
49/*
50Mterp and MIPS64 notes:
51
52The following registers have fixed assignments:
53
54 reg nick purpose
55 s0 rPC interpreted program counter, used for fetching instructions
56 s1 rFP interpreted frame pointer, used for accessing locals and args
57 s2 rSELF self (Thread) pointer
58 s3 rINST first 16-bit code unit of current instruction
59 s4 rIBASE interpreted instruction base pointer, used for computed goto
60 s5 rREFS base of object references in shadow frame (ideally, we'll get rid of this later).
Douglas Leung020b18a2016-06-03 18:05:35 -070061 s6 rPROFILE jit profile hotness countdown
Alexey Frunze00b53b72016-02-02 20:25:45 -080062*/
63
64/* During bringup, we'll use the shadow frame model instead of rFP */
65/* single-purpose registers, given names for clarity */
Douglas Leung020b18a2016-06-03 18:05:35 -070066#define rPC s0
67#define rFP s1
68#define rSELF s2
69#define rINST s3
70#define rIBASE s4
71#define rREFS s5
72#define rPROFILE s6
Alexey Frunze00b53b72016-02-02 20:25:45 -080073
74/*
75 * This is a #include, not a %include, because we want the C pre-processor
76 * to expand the macros into assembler assignment statements.
77 */
78#include "asm_support.h"
79
80/*
81 * Instead of holding a pointer to the shadow frame, we keep rFP at the base of the vregs. So,
82 * to access other shadow frame fields, we need to use a backwards offset. Define those here.
83 */
84#define OFF_FP(a) (a - SHADOWFRAME_VREGS_OFFSET)
85#define OFF_FP_NUMBER_OF_VREGS OFF_FP(SHADOWFRAME_NUMBER_OF_VREGS_OFFSET)
86#define OFF_FP_DEX_PC OFF_FP(SHADOWFRAME_DEX_PC_OFFSET)
87#define OFF_FP_LINK OFF_FP(SHADOWFRAME_LINK_OFFSET)
88#define OFF_FP_METHOD OFF_FP(SHADOWFRAME_METHOD_OFFSET)
89#define OFF_FP_RESULT_REGISTER OFF_FP(SHADOWFRAME_RESULT_REGISTER_OFFSET)
90#define OFF_FP_DEX_PC_PTR OFF_FP(SHADOWFRAME_DEX_PC_PTR_OFFSET)
91#define OFF_FP_CODE_ITEM OFF_FP(SHADOWFRAME_CODE_ITEM_OFFSET)
Douglas Leung020b18a2016-06-03 18:05:35 -070092#define OFF_FP_SHADOWFRAME OFF_FP(0)
Alexey Frunze00b53b72016-02-02 20:25:45 -080093
Alexey Frunzedb045be2016-03-03 17:50:48 -080094#define MTERP_PROFILE_BRANCHES 1
Alexey Frunze00b53b72016-02-02 20:25:45 -080095#define MTERP_LOGGING 0
96
97/*
98 * "export" the PC to dex_pc field in the shadow frame, f/b/o future exception objects. Must
99 * be done *before* something throws.
100 *
101 * It's okay to do this more than once.
102 *
103 * NOTE: the fast interpreter keeps track of dex pc as a direct pointer to the mapped
104 * dex byte codes. However, the rest of the runtime expects dex pc to be an instruction
105 * offset into the code_items_[] array. For effiency, we will "export" the
106 * current dex pc as a direct pointer using the EXPORT_PC macro, and rely on GetDexPC
107 * to convert to a dex pc when needed.
108 */
109.macro EXPORT_PC
110 sd rPC, OFF_FP_DEX_PC_PTR(rFP)
111.endm
112
113/*
114 * Refresh handler table.
115 */
116.macro REFRESH_IBASE
117 ld rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)
118.endm
119
120/*
121 * Fetch the next instruction from rPC into rINST. Does not advance rPC.
122 */
123.macro FETCH_INST
124 lhu rINST, 0(rPC)
125.endm
126
127/* Advance rPC by some number of code units. */
128.macro ADVANCE count
129 daddu rPC, rPC, (\count) * 2
130.endm
131
132/*
Douglas Leung020b18a2016-06-03 18:05:35 -0700133 * Fetch the next instruction from an offset specified by _reg and advance xPC.
134 * xPC to point to the next instruction. "_reg" must specify the distance
135 * in bytes, *not* 16-bit code units, and may be a signed value. Must not set flags.
136 *
137 */
138.macro FETCH_ADVANCE_INST_RB reg
139 daddu rPC, rPC, \reg
140 FETCH_INST
141.endm
142
143/*
Alexey Frunze00b53b72016-02-02 20:25:45 -0800144 * Fetch the next instruction from the specified offset. Advances rPC
145 * to point to the next instruction.
146 *
147 * This must come AFTER anything that can throw an exception, or the
148 * exception catch may miss. (This also implies that it must come after
149 * EXPORT_PC.)
150 */
151.macro FETCH_ADVANCE_INST count
152 ADVANCE \count
153 FETCH_INST
154.endm
155
156/*
157 * Similar to FETCH_ADVANCE_INST, but does not update rPC. Used to load
158 * rINST ahead of possible exception point. Be sure to manually advance rPC
159 * later.
160 */
161.macro PREFETCH_INST count
162 lhu rINST, ((\count) * 2)(rPC)
163.endm
164
165/*
166 * Put the instruction's opcode field into the specified register.
167 */
168.macro GET_INST_OPCODE reg
169 and \reg, rINST, 255
170.endm
171
172/*
173 * Begin executing the opcode in _reg.
174 */
175.macro GOTO_OPCODE reg
176 .set noat
177 sll AT, \reg, 7
178 daddu AT, rIBASE, AT
179 jic AT, 0
180 .set at
181.endm
182
183/*
184 * Get/set the 32-bit value from a Dalvik register.
185 * Note, GET_VREG does sign extension to 64 bits while
186 * GET_VREG_U does zero extension to 64 bits.
187 * One is useful for arithmetic while the other is
188 * useful for storing the result value as 64-bit.
189 */
190.macro GET_VREG reg, vreg
191 .set noat
192 dlsa AT, \vreg, rFP, 2
193 lw \reg, 0(AT)
194 .set at
195.endm
196.macro GET_VREG_U reg, vreg
197 .set noat
198 dlsa AT, \vreg, rFP, 2
199 lwu \reg, 0(AT)
200 .set at
201.endm
202.macro GET_VREG_FLOAT reg, vreg
203 .set noat
204 dlsa AT, \vreg, rFP, 2
205 lwc1 \reg, 0(AT)
206 .set at
207.endm
208.macro SET_VREG reg, vreg
209 .set noat
210 dlsa AT, \vreg, rFP, 2
211 sw \reg, 0(AT)
212 dlsa AT, \vreg, rREFS, 2
213 sw zero, 0(AT)
214 .set at
215.endm
216.macro SET_VREG_OBJECT reg, vreg
217 .set noat
218 dlsa AT, \vreg, rFP, 2
219 sw \reg, 0(AT)
220 dlsa AT, \vreg, rREFS, 2
221 sw \reg, 0(AT)
222 .set at
223.endm
224.macro SET_VREG_FLOAT reg, vreg
225 .set noat
226 dlsa AT, \vreg, rFP, 2
227 swc1 \reg, 0(AT)
228 dlsa AT, \vreg, rREFS, 2
229 sw zero, 0(AT)
230 .set at
231.endm
232
233/*
234 * Get/set the 64-bit value from a Dalvik register.
235 * Avoid unaligned memory accesses.
236 * Note, SET_VREG_WIDE clobbers the register containing the value being stored.
237 * Note, SET_VREG_DOUBLE clobbers the register containing the Dalvik register number.
238 */
239.macro GET_VREG_WIDE reg, vreg
240 .set noat
241 dlsa AT, \vreg, rFP, 2
242 lw \reg, 0(AT)
243 lw AT, 4(AT)
244 dinsu \reg, AT, 32, 32
245 .set at
246.endm
247.macro GET_VREG_DOUBLE reg, vreg
248 .set noat
249 dlsa AT, \vreg, rFP, 2
250 lwc1 \reg, 0(AT)
251 lw AT, 4(AT)
252 mthc1 AT, \reg
253 .set at
254.endm
255.macro SET_VREG_WIDE reg, vreg
256 .set noat
257 dlsa AT, \vreg, rFP, 2
258 sw \reg, 0(AT)
259 drotr32 \reg, \reg, 0
260 sw \reg, 4(AT)
261 dlsa AT, \vreg, rREFS, 2
262 sw zero, 0(AT)
263 sw zero, 4(AT)
264 .set at
265.endm
266.macro SET_VREG_DOUBLE reg, vreg
267 .set noat
268 dlsa AT, \vreg, rREFS, 2
269 sw zero, 0(AT)
270 sw zero, 4(AT)
271 dlsa AT, \vreg, rFP, 2
272 swc1 \reg, 0(AT)
273 mfhc1 \vreg, \reg
274 sw \vreg, 4(AT)
275 .set at
276.endm
277
278/*
279 * On-stack offsets for spilling/unspilling callee-saved registers
280 * and the frame size.
281 */
282#define STACK_OFFSET_RA 0
283#define STACK_OFFSET_GP 8
284#define STACK_OFFSET_S0 16
285#define STACK_OFFSET_S1 24
286#define STACK_OFFSET_S2 32
287#define STACK_OFFSET_S3 40
288#define STACK_OFFSET_S4 48
289#define STACK_OFFSET_S5 56
Douglas Leung020b18a2016-06-03 18:05:35 -0700290#define STACK_OFFSET_S6 64
291#define STACK_SIZE 80 /* needs 16 byte alignment */
Alexey Frunze00b53b72016-02-02 20:25:45 -0800292
293/* Constants for float/double_to_int/long conversions */
294#define INT_MIN 0x80000000
295#define INT_MIN_AS_FLOAT 0xCF000000
296#define INT_MIN_AS_DOUBLE 0xC1E0000000000000
297#define LONG_MIN 0x8000000000000000
298#define LONG_MIN_AS_FLOAT 0xDF000000
299#define LONG_MIN_AS_DOUBLE 0xC3E0000000000000
300
301/* File: mips64/entry.S */
302/*
303 * Copyright (C) 2016 The Android Open Source Project
304 *
305 * Licensed under the Apache License, Version 2.0 (the "License");
306 * you may not use this file except in compliance with the License.
307 * You may obtain a copy of the License at
308 *
309 * http://www.apache.org/licenses/LICENSE-2.0
310 *
311 * Unless required by applicable law or agreed to in writing, software
312 * distributed under the License is distributed on an "AS IS" BASIS,
313 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
314 * See the License for the specific language governing permissions and
315 * limitations under the License.
316 */
317
318/*
319 * Interpreter entry point.
320 */
321
322 .set reorder
323
324 .text
325 .global ExecuteMterpImpl
326 .type ExecuteMterpImpl, %function
327 .balign 16
328/*
329 * On entry:
330 * a0 Thread* self
331 * a1 code_item
332 * a2 ShadowFrame
333 * a3 JValue* result_register
334 *
335 */
336ExecuteMterpImpl:
337 .cfi_startproc
338 .cpsetup t9, t8, ExecuteMterpImpl
339
340 .cfi_def_cfa sp, 0
341 daddu sp, sp, -STACK_SIZE
342 .cfi_adjust_cfa_offset STACK_SIZE
343
344 sd t8, STACK_OFFSET_GP(sp)
345 .cfi_rel_offset 28, STACK_OFFSET_GP
346 sd ra, STACK_OFFSET_RA(sp)
347 .cfi_rel_offset 31, STACK_OFFSET_RA
348
349 sd s0, STACK_OFFSET_S0(sp)
350 .cfi_rel_offset 16, STACK_OFFSET_S0
351 sd s1, STACK_OFFSET_S1(sp)
352 .cfi_rel_offset 17, STACK_OFFSET_S1
353 sd s2, STACK_OFFSET_S2(sp)
354 .cfi_rel_offset 18, STACK_OFFSET_S2
355 sd s3, STACK_OFFSET_S3(sp)
356 .cfi_rel_offset 19, STACK_OFFSET_S3
357 sd s4, STACK_OFFSET_S4(sp)
358 .cfi_rel_offset 20, STACK_OFFSET_S4
359 sd s5, STACK_OFFSET_S5(sp)
360 .cfi_rel_offset 21, STACK_OFFSET_S5
Douglas Leung020b18a2016-06-03 18:05:35 -0700361 sd s6, STACK_OFFSET_S6(sp)
362 .cfi_rel_offset 22, STACK_OFFSET_S6
Alexey Frunze00b53b72016-02-02 20:25:45 -0800363
364 /* Remember the return register */
365 sd a3, SHADOWFRAME_RESULT_REGISTER_OFFSET(a2)
366
367 /* Remember the code_item */
368 sd a1, SHADOWFRAME_CODE_ITEM_OFFSET(a2)
369
370 /* set up "named" registers */
371 move rSELF, a0
372 daddu rFP, a2, SHADOWFRAME_VREGS_OFFSET
373 lw v0, SHADOWFRAME_NUMBER_OF_VREGS_OFFSET(a2)
374 dlsa rREFS, v0, rFP, 2
375 daddu rPC, a1, CODEITEM_INSNS_OFFSET
376 lw v0, SHADOWFRAME_DEX_PC_OFFSET(a2)
377 dlsa rPC, v0, rPC, 1
378 EXPORT_PC
379
380 /* Starting ibase */
381 REFRESH_IBASE
382
Douglas Leung020b18a2016-06-03 18:05:35 -0700383 /* Set up for backwards branches & osr profiling */
384 ld a0, OFF_FP_METHOD(rFP)
385 daddu a1, rFP, OFF_FP_SHADOWFRAME
386 jal MterpSetUpHotnessCountdown
387 move rPROFILE, v0 # Starting hotness countdown to rPROFILE
388
Alexey Frunze00b53b72016-02-02 20:25:45 -0800389 /* start executing the instruction at rPC */
390 FETCH_INST
391 GET_INST_OPCODE v0
392 GOTO_OPCODE v0
393
394 /* NOTE: no fallthrough */
395
396
397 .global artMterpAsmInstructionStart
398 .type artMterpAsmInstructionStart, %function
399artMterpAsmInstructionStart = .L_op_nop
400 .text
401
402/* ------------------------------ */
403 .balign 128
404.L_op_nop: /* 0x00 */
405/* File: mips64/op_nop.S */
406 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
407 GET_INST_OPCODE v0 # extract opcode from rINST
408 GOTO_OPCODE v0 # jump to next instruction
409
410/* ------------------------------ */
411 .balign 128
412.L_op_move: /* 0x01 */
413/* File: mips64/op_move.S */
414 /* for move, move-object, long-to-int */
415 /* op vA, vB */
416 ext a2, rINST, 8, 4 # a2 <- A
417 ext a3, rINST, 12, 4 # a3 <- B
418 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
419 GET_VREG a0, a3 # a0 <- vB
420 GET_INST_OPCODE v0 # extract opcode from rINST
421 .if 0
422 SET_VREG_OBJECT a0, a2 # vA <- vB
423 .else
424 SET_VREG a0, a2 # vA <- vB
425 .endif
426 GOTO_OPCODE v0 # jump to next instruction
427
428/* ------------------------------ */
429 .balign 128
430.L_op_move_from16: /* 0x02 */
431/* File: mips64/op_move_from16.S */
432 /* for: move/from16, move-object/from16 */
433 /* op vAA, vBBBB */
434 lhu a3, 2(rPC) # a3 <- BBBB
435 srl a2, rINST, 8 # a2 <- AA
436 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
437 GET_VREG a0, a3 # a0 <- vBBBB
438 GET_INST_OPCODE v0 # extract opcode from rINST
439 .if 0
440 SET_VREG_OBJECT a0, a2 # vAA <- vBBBB
441 .else
442 SET_VREG a0, a2 # vAA <- vBBBB
443 .endif
444 GOTO_OPCODE v0 # jump to next instruction
445
446/* ------------------------------ */
447 .balign 128
448.L_op_move_16: /* 0x03 */
449/* File: mips64/op_move_16.S */
450 /* for: move/16, move-object/16 */
451 /* op vAAAA, vBBBB */
452 lhu a3, 4(rPC) # a3 <- BBBB
453 lhu a2, 2(rPC) # a2 <- AAAA
454 FETCH_ADVANCE_INST 3 # advance rPC, load rINST
455 GET_VREG a0, a3 # a0 <- vBBBB
456 GET_INST_OPCODE v0 # extract opcode from rINST
457 .if 0
458 SET_VREG_OBJECT a0, a2 # vAAAA <- vBBBB
459 .else
460 SET_VREG a0, a2 # vAAAA <- vBBBB
461 .endif
462 GOTO_OPCODE v0 # jump to next instruction
463
464/* ------------------------------ */
465 .balign 128
466.L_op_move_wide: /* 0x04 */
467/* File: mips64/op_move_wide.S */
468 /* move-wide vA, vB */
469 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
470 ext a3, rINST, 12, 4 # a3 <- B
471 ext a2, rINST, 8, 4 # a2 <- A
472 GET_VREG_WIDE a0, a3 # a0 <- vB
473 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
474 GET_INST_OPCODE v0 # extract opcode from rINST
475 SET_VREG_WIDE a0, a2 # vA <- vB
476 GOTO_OPCODE v0 # jump to next instruction
477
478/* ------------------------------ */
479 .balign 128
480.L_op_move_wide_from16: /* 0x05 */
481/* File: mips64/op_move_wide_from16.S */
482 /* move-wide/from16 vAA, vBBBB */
483 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
484 lhu a3, 2(rPC) # a3 <- BBBB
485 srl a2, rINST, 8 # a2 <- AA
486 GET_VREG_WIDE a0, a3 # a0 <- vBBBB
487 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
488 GET_INST_OPCODE v0 # extract opcode from rINST
489 SET_VREG_WIDE a0, a2 # vAA <- vBBBB
490 GOTO_OPCODE v0 # jump to next instruction
491
492/* ------------------------------ */
493 .balign 128
494.L_op_move_wide_16: /* 0x06 */
495/* File: mips64/op_move_wide_16.S */
496 /* move-wide/16 vAAAA, vBBBB */
497 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
498 lhu a3, 4(rPC) # a3 <- BBBB
499 lhu a2, 2(rPC) # a2 <- AAAA
500 GET_VREG_WIDE a0, a3 # a0 <- vBBBB
501 FETCH_ADVANCE_INST 3 # advance rPC, load rINST
502 GET_INST_OPCODE v0 # extract opcode from rINST
503 SET_VREG_WIDE a0, a2 # vAAAA <- vBBBB
504 GOTO_OPCODE v0 # jump to next instruction
505
506/* ------------------------------ */
507 .balign 128
508.L_op_move_object: /* 0x07 */
509/* File: mips64/op_move_object.S */
510/* File: mips64/op_move.S */
511 /* for move, move-object, long-to-int */
512 /* op vA, vB */
513 ext a2, rINST, 8, 4 # a2 <- A
514 ext a3, rINST, 12, 4 # a3 <- B
515 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
516 GET_VREG a0, a3 # a0 <- vB
517 GET_INST_OPCODE v0 # extract opcode from rINST
518 .if 1
519 SET_VREG_OBJECT a0, a2 # vA <- vB
520 .else
521 SET_VREG a0, a2 # vA <- vB
522 .endif
523 GOTO_OPCODE v0 # jump to next instruction
524
525
526/* ------------------------------ */
527 .balign 128
528.L_op_move_object_from16: /* 0x08 */
529/* File: mips64/op_move_object_from16.S */
530/* File: mips64/op_move_from16.S */
531 /* for: move/from16, move-object/from16 */
532 /* op vAA, vBBBB */
533 lhu a3, 2(rPC) # a3 <- BBBB
534 srl a2, rINST, 8 # a2 <- AA
535 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
536 GET_VREG a0, a3 # a0 <- vBBBB
537 GET_INST_OPCODE v0 # extract opcode from rINST
538 .if 1
539 SET_VREG_OBJECT a0, a2 # vAA <- vBBBB
540 .else
541 SET_VREG a0, a2 # vAA <- vBBBB
542 .endif
543 GOTO_OPCODE v0 # jump to next instruction
544
545
546/* ------------------------------ */
547 .balign 128
548.L_op_move_object_16: /* 0x09 */
549/* File: mips64/op_move_object_16.S */
550/* File: mips64/op_move_16.S */
551 /* for: move/16, move-object/16 */
552 /* op vAAAA, vBBBB */
553 lhu a3, 4(rPC) # a3 <- BBBB
554 lhu a2, 2(rPC) # a2 <- AAAA
555 FETCH_ADVANCE_INST 3 # advance rPC, load rINST
556 GET_VREG a0, a3 # a0 <- vBBBB
557 GET_INST_OPCODE v0 # extract opcode from rINST
558 .if 1
559 SET_VREG_OBJECT a0, a2 # vAAAA <- vBBBB
560 .else
561 SET_VREG a0, a2 # vAAAA <- vBBBB
562 .endif
563 GOTO_OPCODE v0 # jump to next instruction
564
565
566/* ------------------------------ */
567 .balign 128
568.L_op_move_result: /* 0x0a */
569/* File: mips64/op_move_result.S */
570 /* for: move-result, move-result-object */
571 /* op vAA */
572 srl a2, rINST, 8 # a2 <- AA
573 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
574 ld a0, OFF_FP_RESULT_REGISTER(rFP) # get pointer to result JType
575 lw a0, 0(a0) # a0 <- result.i
576 GET_INST_OPCODE v0 # extract opcode from rINST
577 .if 0
578 SET_VREG_OBJECT a0, a2 # vAA <- result
579 .else
580 SET_VREG a0, a2 # vAA <- result
581 .endif
582 GOTO_OPCODE v0 # jump to next instruction
583
584/* ------------------------------ */
585 .balign 128
586.L_op_move_result_wide: /* 0x0b */
587/* File: mips64/op_move_result_wide.S */
588 /* for: move-result-wide */
589 /* op vAA */
590 srl a2, rINST, 8 # a2 <- AA
591 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
592 ld a0, OFF_FP_RESULT_REGISTER(rFP) # get pointer to result JType
593 ld a0, 0(a0) # a0 <- result.j
594 GET_INST_OPCODE v0 # extract opcode from rINST
595 SET_VREG_WIDE a0, a2 # vAA <- result
596 GOTO_OPCODE v0 # jump to next instruction
597
598/* ------------------------------ */
599 .balign 128
600.L_op_move_result_object: /* 0x0c */
601/* File: mips64/op_move_result_object.S */
602/* File: mips64/op_move_result.S */
603 /* for: move-result, move-result-object */
604 /* op vAA */
605 srl a2, rINST, 8 # a2 <- AA
606 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
607 ld a0, OFF_FP_RESULT_REGISTER(rFP) # get pointer to result JType
608 lw a0, 0(a0) # a0 <- result.i
609 GET_INST_OPCODE v0 # extract opcode from rINST
610 .if 1
611 SET_VREG_OBJECT a0, a2 # vAA <- result
612 .else
613 SET_VREG a0, a2 # vAA <- result
614 .endif
615 GOTO_OPCODE v0 # jump to next instruction
616
617
618/* ------------------------------ */
619 .balign 128
620.L_op_move_exception: /* 0x0d */
621/* File: mips64/op_move_exception.S */
622 /* move-exception vAA */
623 srl a2, rINST, 8 # a2 <- AA
624 ld a0, THREAD_EXCEPTION_OFFSET(rSELF) # load exception obj
625 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
626 SET_VREG_OBJECT a0, a2 # vAA <- exception obj
627 GET_INST_OPCODE v0 # extract opcode from rINST
628 sd zero, THREAD_EXCEPTION_OFFSET(rSELF) # clear exception
629 GOTO_OPCODE v0 # jump to next instruction
630
631/* ------------------------------ */
632 .balign 128
633.L_op_return_void: /* 0x0e */
634/* File: mips64/op_return_void.S */
635 .extern MterpThreadFenceForConstructor
636 .extern MterpSuspendCheck
637 jal MterpThreadFenceForConstructor
638 lw ra, THREAD_FLAGS_OFFSET(rSELF)
639 move a0, rSELF
640 and ra, ra, (THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
641 beqzc ra, 1f
642 jal MterpSuspendCheck # (self)
6431:
644 li a0, 0
645 b MterpReturn
646
647/* ------------------------------ */
648 .balign 128
649.L_op_return: /* 0x0f */
650/* File: mips64/op_return.S */
651 /*
652 * Return a 32-bit value.
653 *
654 * for: return, return-object
655 */
656 /* op vAA */
657 .extern MterpThreadFenceForConstructor
658 .extern MterpSuspendCheck
659 jal MterpThreadFenceForConstructor
660 lw ra, THREAD_FLAGS_OFFSET(rSELF)
661 move a0, rSELF
662 and ra, ra, (THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
663 beqzc ra, 1f
664 jal MterpSuspendCheck # (self)
6651:
666 srl a2, rINST, 8 # a2 <- AA
667 GET_VREG_U a0, a2 # a0 <- vAA
668 b MterpReturn
669
670/* ------------------------------ */
671 .balign 128
672.L_op_return_wide: /* 0x10 */
673/* File: mips64/op_return_wide.S */
674 /*
675 * Return a 64-bit value.
676 */
677 /* return-wide vAA */
678 /* op vAA */
679 .extern MterpThreadFenceForConstructor
680 .extern MterpSuspendCheck
681 jal MterpThreadFenceForConstructor
682 lw ra, THREAD_FLAGS_OFFSET(rSELF)
683 move a0, rSELF
684 and ra, ra, (THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
685 beqzc ra, 1f
686 jal MterpSuspendCheck # (self)
6871:
688 srl a2, rINST, 8 # a2 <- AA
689 GET_VREG_WIDE a0, a2 # a0 <- vAA
690 b MterpReturn
691
692/* ------------------------------ */
693 .balign 128
694.L_op_return_object: /* 0x11 */
695/* File: mips64/op_return_object.S */
696/* File: mips64/op_return.S */
697 /*
698 * Return a 32-bit value.
699 *
700 * for: return, return-object
701 */
702 /* op vAA */
703 .extern MterpThreadFenceForConstructor
704 .extern MterpSuspendCheck
705 jal MterpThreadFenceForConstructor
706 lw ra, THREAD_FLAGS_OFFSET(rSELF)
707 move a0, rSELF
708 and ra, ra, (THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
709 beqzc ra, 1f
710 jal MterpSuspendCheck # (self)
7111:
712 srl a2, rINST, 8 # a2 <- AA
713 GET_VREG_U a0, a2 # a0 <- vAA
714 b MterpReturn
715
716
717/* ------------------------------ */
718 .balign 128
719.L_op_const_4: /* 0x12 */
720/* File: mips64/op_const_4.S */
721 /* const/4 vA, #+B */
722 ext a2, rINST, 8, 4 # a2 <- A
723 seh a0, rINST # sign extend B in rINST
724 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
725 sra a0, a0, 12 # shift B into its final position
726 GET_INST_OPCODE v0 # extract opcode from rINST
727 SET_VREG a0, a2 # vA <- +B
728 GOTO_OPCODE v0 # jump to next instruction
729
730/* ------------------------------ */
731 .balign 128
732.L_op_const_16: /* 0x13 */
733/* File: mips64/op_const_16.S */
734 /* const/16 vAA, #+BBBB */
735 srl a2, rINST, 8 # a2 <- AA
736 lh a0, 2(rPC) # a0 <- sign-extended BBBB
737 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
738 GET_INST_OPCODE v0 # extract opcode from rINST
739 SET_VREG a0, a2 # vAA <- +BBBB
740 GOTO_OPCODE v0 # jump to next instruction
741
742/* ------------------------------ */
743 .balign 128
744.L_op_const: /* 0x14 */
745/* File: mips64/op_const.S */
746 /* const vAA, #+BBBBbbbb */
747 srl a2, rINST, 8 # a2 <- AA
748 lh a0, 2(rPC) # a0 <- bbbb (low)
749 lh a1, 4(rPC) # a1 <- BBBB (high)
750 FETCH_ADVANCE_INST 3 # advance rPC, load rINST
751 ins a0, a1, 16, 16 # a0 = BBBBbbbb
752 GET_INST_OPCODE v0 # extract opcode from rINST
753 SET_VREG a0, a2 # vAA <- +BBBBbbbb
754 GOTO_OPCODE v0 # jump to next instruction
755
756/* ------------------------------ */
757 .balign 128
758.L_op_const_high16: /* 0x15 */
759/* File: mips64/op_const_high16.S */
760 /* const/high16 vAA, #+BBBB0000 */
761 srl a2, rINST, 8 # a2 <- AA
762 lh a0, 2(rPC) # a0 <- BBBB
763 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
764 sll a0, a0, 16 # a0 <- BBBB0000
765 GET_INST_OPCODE v0 # extract opcode from rINST
766 SET_VREG a0, a2 # vAA <- +BBBB0000
767 GOTO_OPCODE v0 # jump to next instruction
768
769/* ------------------------------ */
770 .balign 128
771.L_op_const_wide_16: /* 0x16 */
772/* File: mips64/op_const_wide_16.S */
773 /* const-wide/16 vAA, #+BBBB */
774 srl a2, rINST, 8 # a2 <- AA
775 lh a0, 2(rPC) # a0 <- sign-extended BBBB
776 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
777 GET_INST_OPCODE v0 # extract opcode from rINST
778 SET_VREG_WIDE a0, a2 # vAA <- +BBBB
779 GOTO_OPCODE v0 # jump to next instruction
780
781/* ------------------------------ */
782 .balign 128
783.L_op_const_wide_32: /* 0x17 */
784/* File: mips64/op_const_wide_32.S */
785 /* const-wide/32 vAA, #+BBBBbbbb */
786 srl a2, rINST, 8 # a2 <- AA
787 lh a0, 2(rPC) # a0 <- bbbb (low)
788 lh a1, 4(rPC) # a1 <- BBBB (high)
789 FETCH_ADVANCE_INST 3 # advance rPC, load rINST
790 ins a0, a1, 16, 16 # a0 = BBBBbbbb
791 GET_INST_OPCODE v0 # extract opcode from rINST
792 SET_VREG_WIDE a0, a2 # vAA <- +BBBBbbbb
793 GOTO_OPCODE v0 # jump to next instruction
794
795/* ------------------------------ */
796 .balign 128
797.L_op_const_wide: /* 0x18 */
798/* File: mips64/op_const_wide.S */
799 /* const-wide vAA, #+HHHHhhhhBBBBbbbb */
800 srl a4, rINST, 8 # a4 <- AA
801 lh a0, 2(rPC) # a0 <- bbbb (low)
802 lh a1, 4(rPC) # a1 <- BBBB (low middle)
803 lh a2, 6(rPC) # a2 <- hhhh (high middle)
804 lh a3, 8(rPC) # a3 <- HHHH (high)
805 FETCH_ADVANCE_INST 5 # advance rPC, load rINST
806 ins a0, a1, 16, 16 # a0 = BBBBbbbb
807 ins a2, a3, 16, 16 # a2 = HHHHhhhh
808 dinsu a0, a2, 32, 32 # a0 = HHHHhhhhBBBBbbbb
809 GET_INST_OPCODE v0 # extract opcode from rINST
810 SET_VREG_WIDE a0, a4 # vAA <- +HHHHhhhhBBBBbbbb
811 GOTO_OPCODE v0 # jump to next instruction
812
813/* ------------------------------ */
814 .balign 128
815.L_op_const_wide_high16: /* 0x19 */
816/* File: mips64/op_const_wide_high16.S */
817 /* const-wide/high16 vAA, #+BBBB000000000000 */
818 srl a2, rINST, 8 # a2 <- AA
819 lh a0, 2(rPC) # a0 <- BBBB
820 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
821 dsll32 a0, a0, 16 # a0 <- BBBB000000000000
822 GET_INST_OPCODE v0 # extract opcode from rINST
823 SET_VREG_WIDE a0, a2 # vAA <- +BBBB000000000000
824 GOTO_OPCODE v0 # jump to next instruction
825
826/* ------------------------------ */
827 .balign 128
828.L_op_const_string: /* 0x1a */
829/* File: mips64/op_const_string.S */
830 /* const/string vAA, String//BBBB */
831 .extern MterpConstString
832 EXPORT_PC
833 lhu a0, 2(rPC) # a0 <- BBBB
834 srl a1, rINST, 8 # a1 <- AA
835 daddu a2, rFP, OFF_FP_SHADOWFRAME
836 move a3, rSELF
837 jal MterpConstString # (index, tgt_reg, shadow_frame, self)
838 PREFETCH_INST 2 # load rINST
839 bnez v0, MterpPossibleException # let reference interpreter deal with it.
840 ADVANCE 2 # advance rPC
841 GET_INST_OPCODE v0 # extract opcode from rINST
842 GOTO_OPCODE v0 # jump to next instruction
843
844/* ------------------------------ */
845 .balign 128
846.L_op_const_string_jumbo: /* 0x1b */
847/* File: mips64/op_const_string_jumbo.S */
848 /* const/string vAA, String//BBBBBBBB */
849 .extern MterpConstString
850 EXPORT_PC
851 lh a0, 2(rPC) # a0 <- bbbb (low)
852 lh a4, 4(rPC) # a4 <- BBBB (high)
853 srl a1, rINST, 8 # a1 <- AA
854 ins a0, a4, 16, 16 # a0 <- BBBBbbbb
855 daddu a2, rFP, OFF_FP_SHADOWFRAME
856 move a3, rSELF
857 jal MterpConstString # (index, tgt_reg, shadow_frame, self)
858 PREFETCH_INST 3 # load rINST
859 bnez v0, MterpPossibleException # let reference interpreter deal with it.
860 ADVANCE 3 # advance rPC
861 GET_INST_OPCODE v0 # extract opcode from rINST
862 GOTO_OPCODE v0 # jump to next instruction
863
864/* ------------------------------ */
865 .balign 128
866.L_op_const_class: /* 0x1c */
867/* File: mips64/op_const_class.S */
868 /* const/class vAA, Class//BBBB */
869 .extern MterpConstClass
870 EXPORT_PC
871 lhu a0, 2(rPC) # a0 <- BBBB
872 srl a1, rINST, 8 # a1 <- AA
873 daddu a2, rFP, OFF_FP_SHADOWFRAME
874 move a3, rSELF
875 jal MterpConstClass # (index, tgt_reg, shadow_frame, self)
876 PREFETCH_INST 2 # load rINST
877 bnez v0, MterpPossibleException # let reference interpreter deal with it.
878 ADVANCE 2 # advance rPC
879 GET_INST_OPCODE v0 # extract opcode from rINST
880 GOTO_OPCODE v0 # jump to next instruction
881
882/* ------------------------------ */
883 .balign 128
884.L_op_monitor_enter: /* 0x1d */
885/* File: mips64/op_monitor_enter.S */
886 /*
887 * Synchronize on an object.
888 */
889 /* monitor-enter vAA */
890 .extern artLockObjectFromCode
891 EXPORT_PC
892 srl a2, rINST, 8 # a2 <- AA
893 GET_VREG_U a0, a2 # a0 <- vAA (object)
894 move a1, rSELF # a1 <- self
895 jal artLockObjectFromCode
896 bnezc v0, MterpException
897 FETCH_ADVANCE_INST 1
898 GET_INST_OPCODE v0 # extract opcode from rINST
899 GOTO_OPCODE v0 # jump to next instruction
900
901/* ------------------------------ */
902 .balign 128
903.L_op_monitor_exit: /* 0x1e */
904/* File: mips64/op_monitor_exit.S */
905 /*
906 * Unlock an object.
907 *
908 * Exceptions that occur when unlocking a monitor need to appear as
909 * if they happened at the following instruction. See the Dalvik
910 * instruction spec.
911 */
912 /* monitor-exit vAA */
913 .extern artUnlockObjectFromCode
914 EXPORT_PC
915 srl a2, rINST, 8 # a2 <- AA
916 GET_VREG_U a0, a2 # a0 <- vAA (object)
917 move a1, rSELF # a1 <- self
918 jal artUnlockObjectFromCode # v0 <- success for unlock(self, obj)
919 bnezc v0, MterpException
920 FETCH_ADVANCE_INST 1 # before throw: advance rPC, load rINST
921 GET_INST_OPCODE v0 # extract opcode from rINST
922 GOTO_OPCODE v0 # jump to next instruction
923
924/* ------------------------------ */
925 .balign 128
926.L_op_check_cast: /* 0x1f */
927/* File: mips64/op_check_cast.S */
928 /*
929 * Check to see if a cast from one class to another is allowed.
930 */
931 /* check-cast vAA, class//BBBB */
932 .extern MterpCheckCast
933 EXPORT_PC
934 lhu a0, 2(rPC) # a0 <- BBBB
935 srl a1, rINST, 8 # a1 <- AA
936 dlsa a1, a1, rFP, 2 # a1 <- &object
937 ld a2, OFF_FP_METHOD(rFP) # a2 <- method
938 move a3, rSELF # a3 <- self
939 jal MterpCheckCast # (index, &obj, method, self)
940 PREFETCH_INST 2
941 bnez v0, MterpPossibleException
942 ADVANCE 2
943 GET_INST_OPCODE v0 # extract opcode from rINST
944 GOTO_OPCODE v0 # jump to next instruction
945
946/* ------------------------------ */
947 .balign 128
948.L_op_instance_of: /* 0x20 */
949/* File: mips64/op_instance_of.S */
950 /*
951 * Check to see if an object reference is an instance of a class.
952 *
953 * Most common situation is a non-null object, being compared against
954 * an already-resolved class.
955 */
956 /* instance-of vA, vB, class//CCCC */
957 .extern MterpInstanceOf
958 EXPORT_PC
959 lhu a0, 2(rPC) # a0 <- CCCC
960 srl a1, rINST, 12 # a1 <- B
961 dlsa a1, a1, rFP, 2 # a1 <- &object
962 ld a2, OFF_FP_METHOD(rFP) # a2 <- method
963 move a3, rSELF # a3 <- self
964 jal MterpInstanceOf # (index, &obj, method, self)
965 ld a1, THREAD_EXCEPTION_OFFSET(rSELF)
966 ext a2, rINST, 8, 4 # a2 <- A
967 PREFETCH_INST 2
968 bnez a1, MterpException
969 ADVANCE 2 # advance rPC
970 SET_VREG v0, a2 # vA <- v0
971 GET_INST_OPCODE v0 # extract opcode from rINST
972 GOTO_OPCODE v0 # jump to next instruction
973
974/* ------------------------------ */
975 .balign 128
976.L_op_array_length: /* 0x21 */
977/* File: mips64/op_array_length.S */
978 /*
979 * Return the length of an array.
980 */
981 srl a1, rINST, 12 # a1 <- B
982 GET_VREG_U a0, a1 # a0 <- vB (object ref)
983 ext a2, rINST, 8, 4 # a2 <- A
984 beqz a0, common_errNullObject # yup, fail
985 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
986 lw a3, MIRROR_ARRAY_LENGTH_OFFSET(a0) # a3 <- array length
987 GET_INST_OPCODE v0 # extract opcode from rINST
988 SET_VREG a3, a2 # vB <- length
989 GOTO_OPCODE v0 # jump to next instruction
990
991/* ------------------------------ */
992 .balign 128
993.L_op_new_instance: /* 0x22 */
994/* File: mips64/op_new_instance.S */
995 /*
996 * Create a new instance of a class.
997 */
998 /* new-instance vAA, class//BBBB */
999 .extern MterpNewInstance
1000 EXPORT_PC
1001 daddu a0, rFP, OFF_FP_SHADOWFRAME
1002 move a1, rSELF
1003 move a2, rINST
1004 jal MterpNewInstance # (shadow_frame, self, inst_data)
1005 beqzc v0, MterpPossibleException
1006 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
1007 GET_INST_OPCODE v0 # extract opcode from rINST
1008 GOTO_OPCODE v0 # jump to next instruction
1009
1010/* ------------------------------ */
1011 .balign 128
1012.L_op_new_array: /* 0x23 */
1013/* File: mips64/op_new_array.S */
1014 /*
1015 * Allocate an array of objects, specified with the array class
1016 * and a count.
1017 *
1018 * The verifier guarantees that this is an array class, so we don't
1019 * check for it here.
1020 */
1021 /* new-array vA, vB, class//CCCC */
1022 .extern MterpNewArray
1023 EXPORT_PC
1024 daddu a0, rFP, OFF_FP_SHADOWFRAME
1025 move a1, rPC
1026 move a2, rINST
1027 move a3, rSELF
1028 jal MterpNewArray
1029 beqzc v0, MterpPossibleException
1030 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
1031 GET_INST_OPCODE v0 # extract opcode from rINST
1032 GOTO_OPCODE v0 # jump to next instruction
1033
1034/* ------------------------------ */
1035 .balign 128
1036.L_op_filled_new_array: /* 0x24 */
1037/* File: mips64/op_filled_new_array.S */
1038 /*
1039 * Create a new array with elements filled from registers.
1040 *
1041 * for: filled-new-array, filled-new-array/range
1042 */
1043 /* op vB, {vD, vE, vF, vG, vA}, class//CCCC */
1044 /* op {vCCCC..v(CCCC+AA-1)}, type//BBBB */
1045 .extern MterpFilledNewArray
1046 EXPORT_PC
1047 daddu a0, rFP, OFF_FP_SHADOWFRAME
1048 move a1, rPC
1049 move a2, rSELF
1050 jal MterpFilledNewArray
1051 beqzc v0, MterpPossibleException
1052 FETCH_ADVANCE_INST 3 # advance rPC, load rINST
1053 GET_INST_OPCODE v0 # extract opcode from rINST
1054 GOTO_OPCODE v0 # jump to next instruction
1055
1056/* ------------------------------ */
1057 .balign 128
1058.L_op_filled_new_array_range: /* 0x25 */
1059/* File: mips64/op_filled_new_array_range.S */
1060/* File: mips64/op_filled_new_array.S */
1061 /*
1062 * Create a new array with elements filled from registers.
1063 *
1064 * for: filled-new-array, filled-new-array/range
1065 */
1066 /* op vB, {vD, vE, vF, vG, vA}, class//CCCC */
1067 /* op {vCCCC..v(CCCC+AA-1)}, type//BBBB */
1068 .extern MterpFilledNewArrayRange
1069 EXPORT_PC
1070 daddu a0, rFP, OFF_FP_SHADOWFRAME
1071 move a1, rPC
1072 move a2, rSELF
1073 jal MterpFilledNewArrayRange
1074 beqzc v0, MterpPossibleException
1075 FETCH_ADVANCE_INST 3 # advance rPC, load rINST
1076 GET_INST_OPCODE v0 # extract opcode from rINST
1077 GOTO_OPCODE v0 # jump to next instruction
1078
1079
1080/* ------------------------------ */
1081 .balign 128
1082.L_op_fill_array_data: /* 0x26 */
1083/* File: mips64/op_fill_array_data.S */
1084 /* fill-array-data vAA, +BBBBBBBB */
1085 .extern MterpFillArrayData
1086 EXPORT_PC
1087 lh a1, 2(rPC) # a1 <- bbbb (lo)
1088 lh a0, 4(rPC) # a0 <- BBBB (hi)
1089 srl a3, rINST, 8 # a3 <- AA
1090 ins a1, a0, 16, 16 # a1 <- BBBBbbbb
1091 GET_VREG_U a0, a3 # a0 <- vAA (array object)
1092 dlsa a1, a1, rPC, 1 # a1 <- PC + BBBBbbbb*2 (array data off.)
1093 jal MterpFillArrayData # (obj, payload)
1094 beqzc v0, MterpPossibleException # exception?
1095 FETCH_ADVANCE_INST 3 # advance rPC, load rINST
1096 GET_INST_OPCODE v0 # extract opcode from rINST
1097 GOTO_OPCODE v0 # jump to next instruction
1098
1099/* ------------------------------ */
1100 .balign 128
1101.L_op_throw: /* 0x27 */
1102/* File: mips64/op_throw.S */
1103 /*
1104 * Throw an exception object in the current thread.
1105 */
1106 /* throw vAA */
1107 EXPORT_PC
1108 srl a2, rINST, 8 # a2 <- AA
1109 GET_VREG_U a0, a2 # a0 <- vAA (exception object)
1110 beqzc a0, common_errNullObject
1111 sd a0, THREAD_EXCEPTION_OFFSET(rSELF) # thread->exception <- obj
1112 b MterpException
1113
1114/* ------------------------------ */
1115 .balign 128
1116.L_op_goto: /* 0x28 */
1117/* File: mips64/op_goto.S */
1118 /*
1119 * Unconditional branch, 8-bit offset.
1120 *
1121 * The branch distance is a signed code-unit offset, which we need to
1122 * double to get a byte offset.
1123 */
1124 /* goto +AA */
Alexey Frunzedb045be2016-03-03 17:50:48 -08001125 srl rINST, rINST, 8
1126 seb rINST, rINST # rINST <- offset (sign-extended AA)
Douglas Leung020b18a2016-06-03 18:05:35 -07001127 b MterpCommonTakenBranchNoFlags
Alexey Frunze00b53b72016-02-02 20:25:45 -08001128
1129/* ------------------------------ */
1130 .balign 128
1131.L_op_goto_16: /* 0x29 */
1132/* File: mips64/op_goto_16.S */
1133 /*
1134 * Unconditional branch, 16-bit offset.
1135 *
1136 * The branch distance is a signed code-unit offset, which we need to
1137 * double to get a byte offset.
1138 */
1139 /* goto/16 +AAAA */
Alexey Frunzedb045be2016-03-03 17:50:48 -08001140 lh rINST, 2(rPC) # rINST <- offset (sign-extended AAAA)
Douglas Leung020b18a2016-06-03 18:05:35 -07001141 b MterpCommonTakenBranchNoFlags
Alexey Frunze00b53b72016-02-02 20:25:45 -08001142
1143/* ------------------------------ */
1144 .balign 128
1145.L_op_goto_32: /* 0x2a */
1146/* File: mips64/op_goto_32.S */
1147 /*
1148 * Unconditional branch, 32-bit offset.
1149 *
1150 * The branch distance is a signed code-unit offset, which we need to
1151 * double to get a byte offset.
1152 *
1153 * Unlike most opcodes, this one is allowed to branch to itself, so
1154 * our "backward branch" test must be "<=0" instead of "<0".
1155 */
1156 /* goto/32 +AAAAAAAA */
Alexey Frunzedb045be2016-03-03 17:50:48 -08001157 lh rINST, 2(rPC) # rINST <- aaaa (low)
Alexey Frunze00b53b72016-02-02 20:25:45 -08001158 lh a1, 4(rPC) # a1 <- AAAA (high)
Alexey Frunzedb045be2016-03-03 17:50:48 -08001159 ins rINST, a1, 16, 16 # rINST <- offset (sign-extended AAAAaaaa)
Douglas Leung020b18a2016-06-03 18:05:35 -07001160 b MterpCommonTakenBranchNoFlags
Alexey Frunze00b53b72016-02-02 20:25:45 -08001161
1162/* ------------------------------ */
1163 .balign 128
1164.L_op_packed_switch: /* 0x2b */
1165/* File: mips64/op_packed_switch.S */
1166 /*
1167 * Handle a packed-switch or sparse-switch instruction. In both cases
1168 * we decode it and hand it off to a helper function.
1169 *
1170 * We don't really expect backward branches in a switch statement, but
1171 * they're perfectly legal, so we check for them here.
1172 *
1173 * for: packed-switch, sparse-switch
1174 */
1175 /* op vAA, +BBBBBBBB */
1176 .extern MterpDoPackedSwitch
Alexey Frunzedb045be2016-03-03 17:50:48 -08001177 .extern MterpProfileBranch
Alexey Frunze00b53b72016-02-02 20:25:45 -08001178 lh a0, 2(rPC) # a0 <- bbbb (lo)
1179 lh a1, 4(rPC) # a1 <- BBBB (hi)
1180 srl a3, rINST, 8 # a3 <- AA
1181 ins a0, a1, 16, 16 # a0 <- BBBBbbbb
1182 GET_VREG a1, a3 # a1 <- vAA
1183 dlsa a0, a0, rPC, 1 # a0 <- PC + BBBBbbbb*2
1184 jal MterpDoPackedSwitch # v0 <- code-unit branch offset
Alexey Frunzedb045be2016-03-03 17:50:48 -08001185 move rINST, v0
Douglas Leung020b18a2016-06-03 18:05:35 -07001186 b MterpCommonTakenBranchNoFlags
Alexey Frunze00b53b72016-02-02 20:25:45 -08001187
1188/* ------------------------------ */
1189 .balign 128
1190.L_op_sparse_switch: /* 0x2c */
1191/* File: mips64/op_sparse_switch.S */
1192/* File: mips64/op_packed_switch.S */
1193 /*
1194 * Handle a packed-switch or sparse-switch instruction. In both cases
1195 * we decode it and hand it off to a helper function.
1196 *
1197 * We don't really expect backward branches in a switch statement, but
1198 * they're perfectly legal, so we check for them here.
1199 *
1200 * for: packed-switch, sparse-switch
1201 */
1202 /* op vAA, +BBBBBBBB */
1203 .extern MterpDoSparseSwitch
Alexey Frunzedb045be2016-03-03 17:50:48 -08001204 .extern MterpProfileBranch
Alexey Frunze00b53b72016-02-02 20:25:45 -08001205 lh a0, 2(rPC) # a0 <- bbbb (lo)
1206 lh a1, 4(rPC) # a1 <- BBBB (hi)
1207 srl a3, rINST, 8 # a3 <- AA
1208 ins a0, a1, 16, 16 # a0 <- BBBBbbbb
1209 GET_VREG a1, a3 # a1 <- vAA
1210 dlsa a0, a0, rPC, 1 # a0 <- PC + BBBBbbbb*2
1211 jal MterpDoSparseSwitch # v0 <- code-unit branch offset
Alexey Frunzedb045be2016-03-03 17:50:48 -08001212 move rINST, v0
Douglas Leung020b18a2016-06-03 18:05:35 -07001213 b MterpCommonTakenBranchNoFlags
Alexey Frunze00b53b72016-02-02 20:25:45 -08001214
1215
1216/* ------------------------------ */
1217 .balign 128
1218.L_op_cmpl_float: /* 0x2d */
1219/* File: mips64/op_cmpl_float.S */
1220/* File: mips64/fcmp.S */
1221 /*
1222 * Compare two floating-point values. Puts 0, 1, or -1 into the
1223 * destination register based on the results of the comparison.
1224 *
1225 * For: cmpl-float, cmpg-float
1226 */
1227 /* op vAA, vBB, vCC */
1228 srl a4, rINST, 8 # a4 <- AA
1229 lbu a2, 2(rPC) # a2 <- BB
1230 lbu a3, 3(rPC) # a3 <- CC
1231 GET_VREG_FLOAT f0, a2 # f0 <- vBB
1232 GET_VREG_FLOAT f1, a3 # f1 <- vCC
1233 cmp.eq.s f2, f0, f1
1234 li a0, 0
1235 bc1nez f2, 1f # done if vBB == vCC (ordered)
1236 .if 0
1237 cmp.lt.s f2, f0, f1
1238 li a0, -1
1239 bc1nez f2, 1f # done if vBB < vCC (ordered)
1240 li a0, 1 # vBB > vCC or unordered
1241 .else
1242 cmp.lt.s f2, f1, f0
1243 li a0, 1
1244 bc1nez f2, 1f # done if vBB > vCC (ordered)
1245 li a0, -1 # vBB < vCC or unordered
1246 .endif
12471:
1248 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
1249 GET_INST_OPCODE v0 # extract opcode from rINST
1250 SET_VREG a0, a4 # vAA <- a0
1251 GOTO_OPCODE v0 # jump to next instruction
1252
1253
1254/* ------------------------------ */
1255 .balign 128
1256.L_op_cmpg_float: /* 0x2e */
1257/* File: mips64/op_cmpg_float.S */
1258/* File: mips64/fcmp.S */
1259 /*
1260 * Compare two floating-point values. Puts 0, 1, or -1 into the
1261 * destination register based on the results of the comparison.
1262 *
1263 * For: cmpl-float, cmpg-float
1264 */
1265 /* op vAA, vBB, vCC */
1266 srl a4, rINST, 8 # a4 <- AA
1267 lbu a2, 2(rPC) # a2 <- BB
1268 lbu a3, 3(rPC) # a3 <- CC
1269 GET_VREG_FLOAT f0, a2 # f0 <- vBB
1270 GET_VREG_FLOAT f1, a3 # f1 <- vCC
1271 cmp.eq.s f2, f0, f1
1272 li a0, 0
1273 bc1nez f2, 1f # done if vBB == vCC (ordered)
1274 .if 1
1275 cmp.lt.s f2, f0, f1
1276 li a0, -1
1277 bc1nez f2, 1f # done if vBB < vCC (ordered)
1278 li a0, 1 # vBB > vCC or unordered
1279 .else
1280 cmp.lt.s f2, f1, f0
1281 li a0, 1
1282 bc1nez f2, 1f # done if vBB > vCC (ordered)
1283 li a0, -1 # vBB < vCC or unordered
1284 .endif
12851:
1286 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
1287 GET_INST_OPCODE v0 # extract opcode from rINST
1288 SET_VREG a0, a4 # vAA <- a0
1289 GOTO_OPCODE v0 # jump to next instruction
1290
1291
1292/* ------------------------------ */
1293 .balign 128
1294.L_op_cmpl_double: /* 0x2f */
1295/* File: mips64/op_cmpl_double.S */
1296/* File: mips64/fcmpWide.S */
1297 /*
1298 * Compare two floating-point values. Puts 0, 1, or -1 into the
1299 * destination register based on the results of the comparison.
1300 *
1301 * For: cmpl-double, cmpg-double
1302 */
1303 /* op vAA, vBB, vCC */
1304 srl a4, rINST, 8 # a4 <- AA
1305 lbu a2, 2(rPC) # a2 <- BB
1306 lbu a3, 3(rPC) # a3 <- CC
1307 GET_VREG_DOUBLE f0, a2 # f0 <- vBB
1308 GET_VREG_DOUBLE f1, a3 # f1 <- vCC
1309 cmp.eq.d f2, f0, f1
1310 li a0, 0
1311 bc1nez f2, 1f # done if vBB == vCC (ordered)
1312 .if 0
1313 cmp.lt.d f2, f0, f1
1314 li a0, -1
1315 bc1nez f2, 1f # done if vBB < vCC (ordered)
1316 li a0, 1 # vBB > vCC or unordered
1317 .else
1318 cmp.lt.d f2, f1, f0
1319 li a0, 1
1320 bc1nez f2, 1f # done if vBB > vCC (ordered)
1321 li a0, -1 # vBB < vCC or unordered
1322 .endif
13231:
1324 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
1325 GET_INST_OPCODE v0 # extract opcode from rINST
1326 SET_VREG a0, a4 # vAA <- a0
1327 GOTO_OPCODE v0 # jump to next instruction
1328
1329
1330/* ------------------------------ */
1331 .balign 128
1332.L_op_cmpg_double: /* 0x30 */
1333/* File: mips64/op_cmpg_double.S */
1334/* File: mips64/fcmpWide.S */
1335 /*
1336 * Compare two floating-point values. Puts 0, 1, or -1 into the
1337 * destination register based on the results of the comparison.
1338 *
1339 * For: cmpl-double, cmpg-double
1340 */
1341 /* op vAA, vBB, vCC */
1342 srl a4, rINST, 8 # a4 <- AA
1343 lbu a2, 2(rPC) # a2 <- BB
1344 lbu a3, 3(rPC) # a3 <- CC
1345 GET_VREG_DOUBLE f0, a2 # f0 <- vBB
1346 GET_VREG_DOUBLE f1, a3 # f1 <- vCC
1347 cmp.eq.d f2, f0, f1
1348 li a0, 0
1349 bc1nez f2, 1f # done if vBB == vCC (ordered)
1350 .if 1
1351 cmp.lt.d f2, f0, f1
1352 li a0, -1
1353 bc1nez f2, 1f # done if vBB < vCC (ordered)
1354 li a0, 1 # vBB > vCC or unordered
1355 .else
1356 cmp.lt.d f2, f1, f0
1357 li a0, 1
1358 bc1nez f2, 1f # done if vBB > vCC (ordered)
1359 li a0, -1 # vBB < vCC or unordered
1360 .endif
13611:
1362 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
1363 GET_INST_OPCODE v0 # extract opcode from rINST
1364 SET_VREG a0, a4 # vAA <- a0
1365 GOTO_OPCODE v0 # jump to next instruction
1366
1367
1368/* ------------------------------ */
1369 .balign 128
1370.L_op_cmp_long: /* 0x31 */
1371/* File: mips64/op_cmp_long.S */
1372 /* cmp-long vAA, vBB, vCC */
1373 lbu a2, 2(rPC) # a2 <- BB
1374 lbu a3, 3(rPC) # a3 <- CC
1375 srl a4, rINST, 8 # a4 <- AA
1376 GET_VREG_WIDE a0, a2 # a0 <- vBB
1377 GET_VREG_WIDE a1, a3 # a1 <- vCC
1378 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
1379 slt a2, a0, a1
1380 slt a0, a1, a0
1381 subu a0, a0, a2
1382 GET_INST_OPCODE v0 # extract opcode from rINST
1383 SET_VREG a0, a4 # vAA <- result
1384 GOTO_OPCODE v0 # jump to next instruction
1385
1386/* ------------------------------ */
1387 .balign 128
1388.L_op_if_eq: /* 0x32 */
1389/* File: mips64/op_if_eq.S */
1390/* File: mips64/bincmp.S */
1391 /*
1392 * Generic two-operand compare-and-branch operation. Provide a "condition"
1393 * fragment that specifies the comparison to perform, e.g. for
1394 * "if-le" you would use "le".
1395 *
1396 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1397 */
1398 /* if-cmp vA, vB, +CCCC */
Alexey Frunzedb045be2016-03-03 17:50:48 -08001399 .extern MterpProfileBranch
Alexey Frunze00b53b72016-02-02 20:25:45 -08001400 ext a2, rINST, 8, 4 # a2 <- A
1401 ext a3, rINST, 12, 4 # a3 <- B
Alexey Frunzedb045be2016-03-03 17:50:48 -08001402 lh rINST, 2(rPC) # rINST <- offset (sign-extended CCCC)
Alexey Frunze00b53b72016-02-02 20:25:45 -08001403 GET_VREG a0, a2 # a0 <- vA
1404 GET_VREG a1, a3 # a1 <- vB
Douglas Leung020b18a2016-06-03 18:05:35 -07001405 beqc a0, a1, MterpCommonTakenBranchNoFlags
1406 li v0, JIT_CHECK_OSR # possible OSR re-entry?
1407 beqc rPROFILE, v0, .L_check_not_taken_osr
1408 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
Alexey Frunze00b53b72016-02-02 20:25:45 -08001409 GET_INST_OPCODE v0 # extract opcode from rINST
1410 GOTO_OPCODE v0 # jump to next instruction
1411
1412
1413/* ------------------------------ */
1414 .balign 128
1415.L_op_if_ne: /* 0x33 */
1416/* File: mips64/op_if_ne.S */
1417/* File: mips64/bincmp.S */
1418 /*
1419 * Generic two-operand compare-and-branch operation. Provide a "condition"
1420 * fragment that specifies the comparison to perform, e.g. for
1421 * "if-le" you would use "le".
1422 *
1423 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1424 */
1425 /* if-cmp vA, vB, +CCCC */
Alexey Frunzedb045be2016-03-03 17:50:48 -08001426 .extern MterpProfileBranch
Alexey Frunze00b53b72016-02-02 20:25:45 -08001427 ext a2, rINST, 8, 4 # a2 <- A
1428 ext a3, rINST, 12, 4 # a3 <- B
Alexey Frunzedb045be2016-03-03 17:50:48 -08001429 lh rINST, 2(rPC) # rINST <- offset (sign-extended CCCC)
Alexey Frunze00b53b72016-02-02 20:25:45 -08001430 GET_VREG a0, a2 # a0 <- vA
1431 GET_VREG a1, a3 # a1 <- vB
Douglas Leung020b18a2016-06-03 18:05:35 -07001432 bnec a0, a1, MterpCommonTakenBranchNoFlags
1433 li v0, JIT_CHECK_OSR # possible OSR re-entry?
1434 beqc rPROFILE, v0, .L_check_not_taken_osr
1435 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
Alexey Frunze00b53b72016-02-02 20:25:45 -08001436 GET_INST_OPCODE v0 # extract opcode from rINST
1437 GOTO_OPCODE v0 # jump to next instruction
1438
1439
1440/* ------------------------------ */
1441 .balign 128
1442.L_op_if_lt: /* 0x34 */
1443/* File: mips64/op_if_lt.S */
1444/* File: mips64/bincmp.S */
1445 /*
1446 * Generic two-operand compare-and-branch operation. Provide a "condition"
1447 * fragment that specifies the comparison to perform, e.g. for
1448 * "if-le" you would use "le".
1449 *
1450 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1451 */
1452 /* if-cmp vA, vB, +CCCC */
Alexey Frunzedb045be2016-03-03 17:50:48 -08001453 .extern MterpProfileBranch
Alexey Frunze00b53b72016-02-02 20:25:45 -08001454 ext a2, rINST, 8, 4 # a2 <- A
1455 ext a3, rINST, 12, 4 # a3 <- B
Alexey Frunzedb045be2016-03-03 17:50:48 -08001456 lh rINST, 2(rPC) # rINST <- offset (sign-extended CCCC)
Alexey Frunze00b53b72016-02-02 20:25:45 -08001457 GET_VREG a0, a2 # a0 <- vA
1458 GET_VREG a1, a3 # a1 <- vB
Douglas Leung020b18a2016-06-03 18:05:35 -07001459 bltc a0, a1, MterpCommonTakenBranchNoFlags
1460 li v0, JIT_CHECK_OSR # possible OSR re-entry?
1461 beqc rPROFILE, v0, .L_check_not_taken_osr
1462 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
Alexey Frunze00b53b72016-02-02 20:25:45 -08001463 GET_INST_OPCODE v0 # extract opcode from rINST
1464 GOTO_OPCODE v0 # jump to next instruction
1465
1466
1467/* ------------------------------ */
1468 .balign 128
1469.L_op_if_ge: /* 0x35 */
1470/* File: mips64/op_if_ge.S */
1471/* File: mips64/bincmp.S */
1472 /*
1473 * Generic two-operand compare-and-branch operation. Provide a "condition"
1474 * fragment that specifies the comparison to perform, e.g. for
1475 * "if-le" you would use "le".
1476 *
1477 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1478 */
1479 /* if-cmp vA, vB, +CCCC */
Alexey Frunzedb045be2016-03-03 17:50:48 -08001480 .extern MterpProfileBranch
Alexey Frunze00b53b72016-02-02 20:25:45 -08001481 ext a2, rINST, 8, 4 # a2 <- A
1482 ext a3, rINST, 12, 4 # a3 <- B
Alexey Frunzedb045be2016-03-03 17:50:48 -08001483 lh rINST, 2(rPC) # rINST <- offset (sign-extended CCCC)
Alexey Frunze00b53b72016-02-02 20:25:45 -08001484 GET_VREG a0, a2 # a0 <- vA
1485 GET_VREG a1, a3 # a1 <- vB
Douglas Leung020b18a2016-06-03 18:05:35 -07001486 bgec a0, a1, MterpCommonTakenBranchNoFlags
1487 li v0, JIT_CHECK_OSR # possible OSR re-entry?
1488 beqc rPROFILE, v0, .L_check_not_taken_osr
1489 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
Alexey Frunze00b53b72016-02-02 20:25:45 -08001490 GET_INST_OPCODE v0 # extract opcode from rINST
1491 GOTO_OPCODE v0 # jump to next instruction
1492
1493
1494/* ------------------------------ */
1495 .balign 128
1496.L_op_if_gt: /* 0x36 */
1497/* File: mips64/op_if_gt.S */
1498/* File: mips64/bincmp.S */
1499 /*
1500 * Generic two-operand compare-and-branch operation. Provide a "condition"
1501 * fragment that specifies the comparison to perform, e.g. for
1502 * "if-le" you would use "le".
1503 *
1504 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1505 */
1506 /* if-cmp vA, vB, +CCCC */
Alexey Frunzedb045be2016-03-03 17:50:48 -08001507 .extern MterpProfileBranch
Alexey Frunze00b53b72016-02-02 20:25:45 -08001508 ext a2, rINST, 8, 4 # a2 <- A
1509 ext a3, rINST, 12, 4 # a3 <- B
Alexey Frunzedb045be2016-03-03 17:50:48 -08001510 lh rINST, 2(rPC) # rINST <- offset (sign-extended CCCC)
Alexey Frunze00b53b72016-02-02 20:25:45 -08001511 GET_VREG a0, a2 # a0 <- vA
1512 GET_VREG a1, a3 # a1 <- vB
Douglas Leung020b18a2016-06-03 18:05:35 -07001513 bgtc a0, a1, MterpCommonTakenBranchNoFlags
1514 li v0, JIT_CHECK_OSR # possible OSR re-entry?
1515 beqc rPROFILE, v0, .L_check_not_taken_osr
1516 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
Alexey Frunze00b53b72016-02-02 20:25:45 -08001517 GET_INST_OPCODE v0 # extract opcode from rINST
1518 GOTO_OPCODE v0 # jump to next instruction
1519
1520
1521/* ------------------------------ */
1522 .balign 128
1523.L_op_if_le: /* 0x37 */
1524/* File: mips64/op_if_le.S */
1525/* File: mips64/bincmp.S */
1526 /*
1527 * Generic two-operand compare-and-branch operation. Provide a "condition"
1528 * fragment that specifies the comparison to perform, e.g. for
1529 * "if-le" you would use "le".
1530 *
1531 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1532 */
1533 /* if-cmp vA, vB, +CCCC */
Alexey Frunzedb045be2016-03-03 17:50:48 -08001534 .extern MterpProfileBranch
Alexey Frunze00b53b72016-02-02 20:25:45 -08001535 ext a2, rINST, 8, 4 # a2 <- A
1536 ext a3, rINST, 12, 4 # a3 <- B
Alexey Frunzedb045be2016-03-03 17:50:48 -08001537 lh rINST, 2(rPC) # rINST <- offset (sign-extended CCCC)
Alexey Frunze00b53b72016-02-02 20:25:45 -08001538 GET_VREG a0, a2 # a0 <- vA
1539 GET_VREG a1, a3 # a1 <- vB
Douglas Leung020b18a2016-06-03 18:05:35 -07001540 blec a0, a1, MterpCommonTakenBranchNoFlags
1541 li v0, JIT_CHECK_OSR # possible OSR re-entry?
1542 beqc rPROFILE, v0, .L_check_not_taken_osr
1543 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
Alexey Frunze00b53b72016-02-02 20:25:45 -08001544 GET_INST_OPCODE v0 # extract opcode from rINST
1545 GOTO_OPCODE v0 # jump to next instruction
1546
1547
1548/* ------------------------------ */
1549 .balign 128
1550.L_op_if_eqz: /* 0x38 */
1551/* File: mips64/op_if_eqz.S */
1552/* File: mips64/zcmp.S */
1553 /*
1554 * Generic one-operand compare-and-branch operation. Provide a "condition"
1555 * fragment that specifies the comparison to perform, e.g. for
1556 * "if-lez" you would use "le".
1557 *
1558 * For: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1559 */
1560 /* if-cmp vAA, +BBBB */
Alexey Frunze00b53b72016-02-02 20:25:45 -08001561 srl a2, rINST, 8 # a2 <- AA
Alexey Frunzedb045be2016-03-03 17:50:48 -08001562 lh rINST, 2(rPC) # rINST <- offset (sign-extended BBBB)
Alexey Frunze00b53b72016-02-02 20:25:45 -08001563 GET_VREG a0, a2 # a0 <- vAA
Douglas Leung020b18a2016-06-03 18:05:35 -07001564 beqzc a0, MterpCommonTakenBranchNoFlags
1565 li v0, JIT_CHECK_OSR # possible OSR re-entry?
1566 beqc rPROFILE, v0, .L_check_not_taken_osr
1567 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
Alexey Frunze00b53b72016-02-02 20:25:45 -08001568 GET_INST_OPCODE v0 # extract opcode from rINST
1569 GOTO_OPCODE v0 # jump to next instruction
1570
1571
1572/* ------------------------------ */
1573 .balign 128
1574.L_op_if_nez: /* 0x39 */
1575/* File: mips64/op_if_nez.S */
1576/* File: mips64/zcmp.S */
1577 /*
1578 * Generic one-operand compare-and-branch operation. Provide a "condition"
1579 * fragment that specifies the comparison to perform, e.g. for
1580 * "if-lez" you would use "le".
1581 *
1582 * For: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1583 */
1584 /* if-cmp vAA, +BBBB */
Alexey Frunze00b53b72016-02-02 20:25:45 -08001585 srl a2, rINST, 8 # a2 <- AA
Alexey Frunzedb045be2016-03-03 17:50:48 -08001586 lh rINST, 2(rPC) # rINST <- offset (sign-extended BBBB)
Alexey Frunze00b53b72016-02-02 20:25:45 -08001587 GET_VREG a0, a2 # a0 <- vAA
Douglas Leung020b18a2016-06-03 18:05:35 -07001588 bnezc a0, MterpCommonTakenBranchNoFlags
1589 li v0, JIT_CHECK_OSR # possible OSR re-entry?
1590 beqc rPROFILE, v0, .L_check_not_taken_osr
1591 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
Alexey Frunze00b53b72016-02-02 20:25:45 -08001592 GET_INST_OPCODE v0 # extract opcode from rINST
1593 GOTO_OPCODE v0 # jump to next instruction
1594
1595
1596/* ------------------------------ */
1597 .balign 128
1598.L_op_if_ltz: /* 0x3a */
1599/* File: mips64/op_if_ltz.S */
1600/* File: mips64/zcmp.S */
1601 /*
1602 * Generic one-operand compare-and-branch operation. Provide a "condition"
1603 * fragment that specifies the comparison to perform, e.g. for
1604 * "if-lez" you would use "le".
1605 *
1606 * For: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1607 */
1608 /* if-cmp vAA, +BBBB */
Alexey Frunze00b53b72016-02-02 20:25:45 -08001609 srl a2, rINST, 8 # a2 <- AA
Alexey Frunzedb045be2016-03-03 17:50:48 -08001610 lh rINST, 2(rPC) # rINST <- offset (sign-extended BBBB)
Alexey Frunze00b53b72016-02-02 20:25:45 -08001611 GET_VREG a0, a2 # a0 <- vAA
Douglas Leung020b18a2016-06-03 18:05:35 -07001612 bltzc a0, MterpCommonTakenBranchNoFlags
1613 li v0, JIT_CHECK_OSR # possible OSR re-entry?
1614 beqc rPROFILE, v0, .L_check_not_taken_osr
1615 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
Alexey Frunze00b53b72016-02-02 20:25:45 -08001616 GET_INST_OPCODE v0 # extract opcode from rINST
1617 GOTO_OPCODE v0 # jump to next instruction
1618
1619
1620/* ------------------------------ */
1621 .balign 128
1622.L_op_if_gez: /* 0x3b */
1623/* File: mips64/op_if_gez.S */
1624/* File: mips64/zcmp.S */
1625 /*
1626 * Generic one-operand compare-and-branch operation. Provide a "condition"
1627 * fragment that specifies the comparison to perform, e.g. for
1628 * "if-lez" you would use "le".
1629 *
1630 * For: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1631 */
1632 /* if-cmp vAA, +BBBB */
Alexey Frunze00b53b72016-02-02 20:25:45 -08001633 srl a2, rINST, 8 # a2 <- AA
Alexey Frunzedb045be2016-03-03 17:50:48 -08001634 lh rINST, 2(rPC) # rINST <- offset (sign-extended BBBB)
Alexey Frunze00b53b72016-02-02 20:25:45 -08001635 GET_VREG a0, a2 # a0 <- vAA
Douglas Leung020b18a2016-06-03 18:05:35 -07001636 bgezc a0, MterpCommonTakenBranchNoFlags
1637 li v0, JIT_CHECK_OSR # possible OSR re-entry?
1638 beqc rPROFILE, v0, .L_check_not_taken_osr
1639 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
Alexey Frunze00b53b72016-02-02 20:25:45 -08001640 GET_INST_OPCODE v0 # extract opcode from rINST
1641 GOTO_OPCODE v0 # jump to next instruction
1642
1643
1644/* ------------------------------ */
1645 .balign 128
1646.L_op_if_gtz: /* 0x3c */
1647/* File: mips64/op_if_gtz.S */
1648/* File: mips64/zcmp.S */
1649 /*
1650 * Generic one-operand compare-and-branch operation. Provide a "condition"
1651 * fragment that specifies the comparison to perform, e.g. for
1652 * "if-lez" you would use "le".
1653 *
1654 * For: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1655 */
1656 /* if-cmp vAA, +BBBB */
Alexey Frunze00b53b72016-02-02 20:25:45 -08001657 srl a2, rINST, 8 # a2 <- AA
Alexey Frunzedb045be2016-03-03 17:50:48 -08001658 lh rINST, 2(rPC) # rINST <- offset (sign-extended BBBB)
Alexey Frunze00b53b72016-02-02 20:25:45 -08001659 GET_VREG a0, a2 # a0 <- vAA
Douglas Leung020b18a2016-06-03 18:05:35 -07001660 bgtzc a0, MterpCommonTakenBranchNoFlags
1661 li v0, JIT_CHECK_OSR # possible OSR re-entry?
1662 beqc rPROFILE, v0, .L_check_not_taken_osr
1663 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
Alexey Frunze00b53b72016-02-02 20:25:45 -08001664 GET_INST_OPCODE v0 # extract opcode from rINST
1665 GOTO_OPCODE v0 # jump to next instruction
1666
1667
1668/* ------------------------------ */
1669 .balign 128
1670.L_op_if_lez: /* 0x3d */
1671/* File: mips64/op_if_lez.S */
1672/* File: mips64/zcmp.S */
1673 /*
1674 * Generic one-operand compare-and-branch operation. Provide a "condition"
1675 * fragment that specifies the comparison to perform, e.g. for
1676 * "if-lez" you would use "le".
1677 *
1678 * For: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1679 */
1680 /* if-cmp vAA, +BBBB */
Alexey Frunze00b53b72016-02-02 20:25:45 -08001681 srl a2, rINST, 8 # a2 <- AA
Alexey Frunzedb045be2016-03-03 17:50:48 -08001682 lh rINST, 2(rPC) # rINST <- offset (sign-extended BBBB)
Alexey Frunze00b53b72016-02-02 20:25:45 -08001683 GET_VREG a0, a2 # a0 <- vAA
Douglas Leung020b18a2016-06-03 18:05:35 -07001684 blezc a0, MterpCommonTakenBranchNoFlags
1685 li v0, JIT_CHECK_OSR # possible OSR re-entry?
1686 beqc rPROFILE, v0, .L_check_not_taken_osr
1687 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
Alexey Frunze00b53b72016-02-02 20:25:45 -08001688 GET_INST_OPCODE v0 # extract opcode from rINST
1689 GOTO_OPCODE v0 # jump to next instruction
1690
1691
1692/* ------------------------------ */
1693 .balign 128
1694.L_op_unused_3e: /* 0x3e */
1695/* File: mips64/op_unused_3e.S */
1696/* File: mips64/unused.S */
1697/*
1698 * Bail to reference interpreter to throw.
1699 */
1700 b MterpFallback
1701
1702
1703/* ------------------------------ */
1704 .balign 128
1705.L_op_unused_3f: /* 0x3f */
1706/* File: mips64/op_unused_3f.S */
1707/* File: mips64/unused.S */
1708/*
1709 * Bail to reference interpreter to throw.
1710 */
1711 b MterpFallback
1712
1713
1714/* ------------------------------ */
1715 .balign 128
1716.L_op_unused_40: /* 0x40 */
1717/* File: mips64/op_unused_40.S */
1718/* File: mips64/unused.S */
1719/*
1720 * Bail to reference interpreter to throw.
1721 */
1722 b MterpFallback
1723
1724
1725/* ------------------------------ */
1726 .balign 128
1727.L_op_unused_41: /* 0x41 */
1728/* File: mips64/op_unused_41.S */
1729/* File: mips64/unused.S */
1730/*
1731 * Bail to reference interpreter to throw.
1732 */
1733 b MterpFallback
1734
1735
1736/* ------------------------------ */
1737 .balign 128
1738.L_op_unused_42: /* 0x42 */
1739/* File: mips64/op_unused_42.S */
1740/* File: mips64/unused.S */
1741/*
1742 * Bail to reference interpreter to throw.
1743 */
1744 b MterpFallback
1745
1746
1747/* ------------------------------ */
1748 .balign 128
1749.L_op_unused_43: /* 0x43 */
1750/* File: mips64/op_unused_43.S */
1751/* File: mips64/unused.S */
1752/*
1753 * Bail to reference interpreter to throw.
1754 */
1755 b MterpFallback
1756
1757
1758/* ------------------------------ */
1759 .balign 128
1760.L_op_aget: /* 0x44 */
1761/* File: mips64/op_aget.S */
1762 /*
1763 * Array get, 32 bits or less. vAA <- vBB[vCC].
1764 *
1765 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1766 *
1767 * NOTE: assumes data offset for arrays is the same for all non-wide types.
1768 * If this changes, specialize.
1769 */
1770 /* op vAA, vBB, vCC */
1771 lbu a2, 2(rPC) # a2 <- BB
1772 lbu a3, 3(rPC) # a3 <- CC
1773 srl a4, rINST, 8 # a4 <- AA
1774 GET_VREG_U a0, a2 # a0 <- vBB (array object)
1775 GET_VREG a1, a3 # a1 <- vCC (requested index)
1776 beqz a0, common_errNullObject # bail if null array object
1777 lw a3, MIRROR_ARRAY_LENGTH_OFFSET(a0) # a3 <- arrayObj->length
1778 .if 2
1779 # [d]lsa does not support shift count of 0.
1780 dlsa a0, a1, a0, 2 # a0 <- arrayObj + index*width
1781 .else
1782 daddu a0, a1, a0 # a0 <- arrayObj + index*width
1783 .endif
1784 bgeu a1, a3, common_errArrayIndex # unsigned compare: index >= length, bail
1785 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
1786 lw a2, MIRROR_INT_ARRAY_DATA_OFFSET(a0) # a2 <- vBB[vCC]
1787 GET_INST_OPCODE v0 # extract opcode from rINST
1788 SET_VREG a2, a4 # vAA <- a2
1789 GOTO_OPCODE v0 # jump to next instruction
1790
1791/* ------------------------------ */
1792 .balign 128
1793.L_op_aget_wide: /* 0x45 */
1794/* File: mips64/op_aget_wide.S */
1795 /*
1796 * Array get, 64 bits. vAA <- vBB[vCC].
1797 *
1798 */
1799 /* aget-wide vAA, vBB, vCC */
1800 lbu a2, 2(rPC) # a2 <- BB
1801 lbu a3, 3(rPC) # a3 <- CC
1802 srl a4, rINST, 8 # a4 <- AA
1803 GET_VREG_U a0, a2 # a0 <- vBB (array object)
1804 GET_VREG a1, a3 # a1 <- vCC (requested index)
1805 beqz a0, common_errNullObject # bail if null array object
1806 lw a3, MIRROR_ARRAY_LENGTH_OFFSET(a0) # a3 <- arrayObj->length
1807 dlsa a0, a1, a0, 3 # a0 <- arrayObj + index*width
1808 bgeu a1, a3, common_errArrayIndex # unsigned compare: index >= length, bail
1809 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
1810 lw a2, MIRROR_WIDE_ARRAY_DATA_OFFSET(a0)
1811 lw a3, (MIRROR_WIDE_ARRAY_DATA_OFFSET+4)(a0)
1812 dinsu a2, a3, 32, 32 # a2 <- vBB[vCC]
1813 GET_INST_OPCODE v0 # extract opcode from rINST
1814 SET_VREG_WIDE a2, a4 # vAA <- a2
1815 GOTO_OPCODE v0 # jump to next instruction
1816
1817/* ------------------------------ */
1818 .balign 128
1819.L_op_aget_object: /* 0x46 */
1820/* File: mips64/op_aget_object.S */
1821 /*
1822 * Array object get. vAA <- vBB[vCC].
1823 *
1824 * for: aget-object
1825 */
1826 /* op vAA, vBB, vCC */
1827 .extern artAGetObjectFromMterp
1828 lbu a2, 2(rPC) # a2 <- BB
1829 lbu a3, 3(rPC) # a3 <- CC
1830 EXPORT_PC
1831 GET_VREG_U a0, a2 # a0 <- vBB (array object)
1832 GET_VREG a1, a3 # a1 <- vCC (requested index)
1833 jal artAGetObjectFromMterp # (array, index)
1834 ld a1, THREAD_EXCEPTION_OFFSET(rSELF)
1835 srl a4, rINST, 8 # a4 <- AA
1836 PREFETCH_INST 2
1837 bnez a1, MterpException
1838 SET_VREG_OBJECT v0, a4 # vAA <- v0
1839 ADVANCE 2
1840 GET_INST_OPCODE v0 # extract opcode from rINST
1841 GOTO_OPCODE v0 # jump to next instruction
1842
1843/* ------------------------------ */
1844 .balign 128
1845.L_op_aget_boolean: /* 0x47 */
1846/* File: mips64/op_aget_boolean.S */
1847/* File: mips64/op_aget.S */
1848 /*
1849 * Array get, 32 bits or less. vAA <- vBB[vCC].
1850 *
1851 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1852 *
1853 * NOTE: assumes data offset for arrays is the same for all non-wide types.
1854 * If this changes, specialize.
1855 */
1856 /* op vAA, vBB, vCC */
1857 lbu a2, 2(rPC) # a2 <- BB
1858 lbu a3, 3(rPC) # a3 <- CC
1859 srl a4, rINST, 8 # a4 <- AA
1860 GET_VREG_U a0, a2 # a0 <- vBB (array object)
1861 GET_VREG a1, a3 # a1 <- vCC (requested index)
1862 beqz a0, common_errNullObject # bail if null array object
1863 lw a3, MIRROR_ARRAY_LENGTH_OFFSET(a0) # a3 <- arrayObj->length
1864 .if 0
1865 # [d]lsa does not support shift count of 0.
1866 dlsa a0, a1, a0, 0 # a0 <- arrayObj + index*width
1867 .else
1868 daddu a0, a1, a0 # a0 <- arrayObj + index*width
1869 .endif
1870 bgeu a1, a3, common_errArrayIndex # unsigned compare: index >= length, bail
1871 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
1872 lbu a2, MIRROR_BOOLEAN_ARRAY_DATA_OFFSET(a0) # a2 <- vBB[vCC]
1873 GET_INST_OPCODE v0 # extract opcode from rINST
1874 SET_VREG a2, a4 # vAA <- a2
1875 GOTO_OPCODE v0 # jump to next instruction
1876
1877
1878/* ------------------------------ */
1879 .balign 128
1880.L_op_aget_byte: /* 0x48 */
1881/* File: mips64/op_aget_byte.S */
1882/* File: mips64/op_aget.S */
1883 /*
1884 * Array get, 32 bits or less. vAA <- vBB[vCC].
1885 *
1886 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1887 *
1888 * NOTE: assumes data offset for arrays is the same for all non-wide types.
1889 * If this changes, specialize.
1890 */
1891 /* op vAA, vBB, vCC */
1892 lbu a2, 2(rPC) # a2 <- BB
1893 lbu a3, 3(rPC) # a3 <- CC
1894 srl a4, rINST, 8 # a4 <- AA
1895 GET_VREG_U a0, a2 # a0 <- vBB (array object)
1896 GET_VREG a1, a3 # a1 <- vCC (requested index)
1897 beqz a0, common_errNullObject # bail if null array object
1898 lw a3, MIRROR_ARRAY_LENGTH_OFFSET(a0) # a3 <- arrayObj->length
1899 .if 0
1900 # [d]lsa does not support shift count of 0.
1901 dlsa a0, a1, a0, 0 # a0 <- arrayObj + index*width
1902 .else
1903 daddu a0, a1, a0 # a0 <- arrayObj + index*width
1904 .endif
1905 bgeu a1, a3, common_errArrayIndex # unsigned compare: index >= length, bail
1906 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
1907 lb a2, MIRROR_BYTE_ARRAY_DATA_OFFSET(a0) # a2 <- vBB[vCC]
1908 GET_INST_OPCODE v0 # extract opcode from rINST
1909 SET_VREG a2, a4 # vAA <- a2
1910 GOTO_OPCODE v0 # jump to next instruction
1911
1912
1913/* ------------------------------ */
1914 .balign 128
1915.L_op_aget_char: /* 0x49 */
1916/* File: mips64/op_aget_char.S */
1917/* File: mips64/op_aget.S */
1918 /*
1919 * Array get, 32 bits or less. vAA <- vBB[vCC].
1920 *
1921 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1922 *
1923 * NOTE: assumes data offset for arrays is the same for all non-wide types.
1924 * If this changes, specialize.
1925 */
1926 /* op vAA, vBB, vCC */
1927 lbu a2, 2(rPC) # a2 <- BB
1928 lbu a3, 3(rPC) # a3 <- CC
1929 srl a4, rINST, 8 # a4 <- AA
1930 GET_VREG_U a0, a2 # a0 <- vBB (array object)
1931 GET_VREG a1, a3 # a1 <- vCC (requested index)
1932 beqz a0, common_errNullObject # bail if null array object
1933 lw a3, MIRROR_ARRAY_LENGTH_OFFSET(a0) # a3 <- arrayObj->length
1934 .if 1
1935 # [d]lsa does not support shift count of 0.
1936 dlsa a0, a1, a0, 1 # a0 <- arrayObj + index*width
1937 .else
1938 daddu a0, a1, a0 # a0 <- arrayObj + index*width
1939 .endif
1940 bgeu a1, a3, common_errArrayIndex # unsigned compare: index >= length, bail
1941 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
1942 lhu a2, MIRROR_CHAR_ARRAY_DATA_OFFSET(a0) # a2 <- vBB[vCC]
1943 GET_INST_OPCODE v0 # extract opcode from rINST
1944 SET_VREG a2, a4 # vAA <- a2
1945 GOTO_OPCODE v0 # jump to next instruction
1946
1947
1948/* ------------------------------ */
1949 .balign 128
1950.L_op_aget_short: /* 0x4a */
1951/* File: mips64/op_aget_short.S */
1952/* File: mips64/op_aget.S */
1953 /*
1954 * Array get, 32 bits or less. vAA <- vBB[vCC].
1955 *
1956 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1957 *
1958 * NOTE: assumes data offset for arrays is the same for all non-wide types.
1959 * If this changes, specialize.
1960 */
1961 /* op vAA, vBB, vCC */
1962 lbu a2, 2(rPC) # a2 <- BB
1963 lbu a3, 3(rPC) # a3 <- CC
1964 srl a4, rINST, 8 # a4 <- AA
1965 GET_VREG_U a0, a2 # a0 <- vBB (array object)
1966 GET_VREG a1, a3 # a1 <- vCC (requested index)
1967 beqz a0, common_errNullObject # bail if null array object
1968 lw a3, MIRROR_ARRAY_LENGTH_OFFSET(a0) # a3 <- arrayObj->length
1969 .if 1
1970 # [d]lsa does not support shift count of 0.
1971 dlsa a0, a1, a0, 1 # a0 <- arrayObj + index*width
1972 .else
1973 daddu a0, a1, a0 # a0 <- arrayObj + index*width
1974 .endif
1975 bgeu a1, a3, common_errArrayIndex # unsigned compare: index >= length, bail
1976 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
1977 lh a2, MIRROR_SHORT_ARRAY_DATA_OFFSET(a0) # a2 <- vBB[vCC]
1978 GET_INST_OPCODE v0 # extract opcode from rINST
1979 SET_VREG a2, a4 # vAA <- a2
1980 GOTO_OPCODE v0 # jump to next instruction
1981
1982
1983/* ------------------------------ */
1984 .balign 128
1985.L_op_aput: /* 0x4b */
1986/* File: mips64/op_aput.S */
1987 /*
1988 * Array put, 32 bits or less. vBB[vCC] <- vAA.
1989 *
1990 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
1991 *
1992 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
1993 * If this changes, specialize.
1994 */
1995 /* op vAA, vBB, vCC */
1996 lbu a2, 2(rPC) # a2 <- BB
1997 lbu a3, 3(rPC) # a3 <- CC
1998 srl a4, rINST, 8 # a4 <- AA
1999 GET_VREG_U a0, a2 # a0 <- vBB (array object)
2000 GET_VREG a1, a3 # a1 <- vCC (requested index)
2001 beqz a0, common_errNullObject # bail if null array object
2002 lw a3, MIRROR_ARRAY_LENGTH_OFFSET(a0) # a3 <- arrayObj->length
2003 .if 2
2004 # [d]lsa does not support shift count of 0.
2005 dlsa a0, a1, a0, 2 # a0 <- arrayObj + index*width
2006 .else
2007 daddu a0, a1, a0 # a0 <- arrayObj + index*width
2008 .endif
2009 bgeu a1, a3, common_errArrayIndex # unsigned compare: index >= length, bail
2010 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
2011 GET_VREG a2, a4 # a2 <- vAA
2012 GET_INST_OPCODE v0 # extract opcode from rINST
2013 sw a2, MIRROR_INT_ARRAY_DATA_OFFSET(a0) # vBB[vCC] <- a2
2014 GOTO_OPCODE v0 # jump to next instruction
2015
2016/* ------------------------------ */
2017 .balign 128
2018.L_op_aput_wide: /* 0x4c */
2019/* File: mips64/op_aput_wide.S */
2020 /*
2021 * Array put, 64 bits. vBB[vCC] <- vAA.
2022 *
2023 */
2024 /* aput-wide vAA, vBB, vCC */
2025 lbu a2, 2(rPC) # a2 <- BB
2026 lbu a3, 3(rPC) # a3 <- CC
2027 srl a4, rINST, 8 # a4 <- AA
2028 GET_VREG_U a0, a2 # a0 <- vBB (array object)
2029 GET_VREG a1, a3 # a1 <- vCC (requested index)
2030 beqz a0, common_errNullObject # bail if null array object
2031 lw a3, MIRROR_ARRAY_LENGTH_OFFSET(a0) # a3 <- arrayObj->length
2032 dlsa a0, a1, a0, 3 # a0 <- arrayObj + index*width
2033 bgeu a1, a3, common_errArrayIndex # unsigned compare: index >= length, bail
2034 GET_VREG_WIDE a2, a4 # a2 <- vAA
2035 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
2036 GET_INST_OPCODE v0 # extract opcode from rINST
2037 sw a2, MIRROR_WIDE_ARRAY_DATA_OFFSET(a0)
2038 dsrl32 a2, a2, 0
2039 sw a2, (MIRROR_WIDE_ARRAY_DATA_OFFSET+4)(a0) # vBB[vCC] <- a2
2040 GOTO_OPCODE v0 # jump to next instruction
2041
2042/* ------------------------------ */
2043 .balign 128
2044.L_op_aput_object: /* 0x4d */
2045/* File: mips64/op_aput_object.S */
2046 /*
2047 * Store an object into an array. vBB[vCC] <- vAA.
2048 */
2049 /* op vAA, vBB, vCC */
2050 .extern MterpAputObject
2051 EXPORT_PC
2052 daddu a0, rFP, OFF_FP_SHADOWFRAME
2053 move a1, rPC
2054 move a2, rINST
2055 jal MterpAputObject
2056 beqzc v0, MterpPossibleException
2057 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
2058 GET_INST_OPCODE v0 # extract opcode from rINST
2059 GOTO_OPCODE v0 # jump to next instruction
2060
2061/* ------------------------------ */
2062 .balign 128
2063.L_op_aput_boolean: /* 0x4e */
2064/* File: mips64/op_aput_boolean.S */
2065/* File: mips64/op_aput.S */
2066 /*
2067 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2068 *
2069 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2070 *
2071 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2072 * If this changes, specialize.
2073 */
2074 /* op vAA, vBB, vCC */
2075 lbu a2, 2(rPC) # a2 <- BB
2076 lbu a3, 3(rPC) # a3 <- CC
2077 srl a4, rINST, 8 # a4 <- AA
2078 GET_VREG_U a0, a2 # a0 <- vBB (array object)
2079 GET_VREG a1, a3 # a1 <- vCC (requested index)
2080 beqz a0, common_errNullObject # bail if null array object
2081 lw a3, MIRROR_ARRAY_LENGTH_OFFSET(a0) # a3 <- arrayObj->length
2082 .if 0
2083 # [d]lsa does not support shift count of 0.
2084 dlsa a0, a1, a0, 0 # a0 <- arrayObj + index*width
2085 .else
2086 daddu a0, a1, a0 # a0 <- arrayObj + index*width
2087 .endif
2088 bgeu a1, a3, common_errArrayIndex # unsigned compare: index >= length, bail
2089 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
2090 GET_VREG a2, a4 # a2 <- vAA
2091 GET_INST_OPCODE v0 # extract opcode from rINST
2092 sb a2, MIRROR_BOOLEAN_ARRAY_DATA_OFFSET(a0) # vBB[vCC] <- a2
2093 GOTO_OPCODE v0 # jump to next instruction
2094
2095
2096/* ------------------------------ */
2097 .balign 128
2098.L_op_aput_byte: /* 0x4f */
2099/* File: mips64/op_aput_byte.S */
2100/* File: mips64/op_aput.S */
2101 /*
2102 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2103 *
2104 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2105 *
2106 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2107 * If this changes, specialize.
2108 */
2109 /* op vAA, vBB, vCC */
2110 lbu a2, 2(rPC) # a2 <- BB
2111 lbu a3, 3(rPC) # a3 <- CC
2112 srl a4, rINST, 8 # a4 <- AA
2113 GET_VREG_U a0, a2 # a0 <- vBB (array object)
2114 GET_VREG a1, a3 # a1 <- vCC (requested index)
2115 beqz a0, common_errNullObject # bail if null array object
2116 lw a3, MIRROR_ARRAY_LENGTH_OFFSET(a0) # a3 <- arrayObj->length
2117 .if 0
2118 # [d]lsa does not support shift count of 0.
2119 dlsa a0, a1, a0, 0 # a0 <- arrayObj + index*width
2120 .else
2121 daddu a0, a1, a0 # a0 <- arrayObj + index*width
2122 .endif
2123 bgeu a1, a3, common_errArrayIndex # unsigned compare: index >= length, bail
2124 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
2125 GET_VREG a2, a4 # a2 <- vAA
2126 GET_INST_OPCODE v0 # extract opcode from rINST
2127 sb a2, MIRROR_BYTE_ARRAY_DATA_OFFSET(a0) # vBB[vCC] <- a2
2128 GOTO_OPCODE v0 # jump to next instruction
2129
2130
2131/* ------------------------------ */
2132 .balign 128
2133.L_op_aput_char: /* 0x50 */
2134/* File: mips64/op_aput_char.S */
2135/* File: mips64/op_aput.S */
2136 /*
2137 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2138 *
2139 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2140 *
2141 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2142 * If this changes, specialize.
2143 */
2144 /* op vAA, vBB, vCC */
2145 lbu a2, 2(rPC) # a2 <- BB
2146 lbu a3, 3(rPC) # a3 <- CC
2147 srl a4, rINST, 8 # a4 <- AA
2148 GET_VREG_U a0, a2 # a0 <- vBB (array object)
2149 GET_VREG a1, a3 # a1 <- vCC (requested index)
2150 beqz a0, common_errNullObject # bail if null array object
2151 lw a3, MIRROR_ARRAY_LENGTH_OFFSET(a0) # a3 <- arrayObj->length
2152 .if 1
2153 # [d]lsa does not support shift count of 0.
2154 dlsa a0, a1, a0, 1 # a0 <- arrayObj + index*width
2155 .else
2156 daddu a0, a1, a0 # a0 <- arrayObj + index*width
2157 .endif
2158 bgeu a1, a3, common_errArrayIndex # unsigned compare: index >= length, bail
2159 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
2160 GET_VREG a2, a4 # a2 <- vAA
2161 GET_INST_OPCODE v0 # extract opcode from rINST
2162 sh a2, MIRROR_CHAR_ARRAY_DATA_OFFSET(a0) # vBB[vCC] <- a2
2163 GOTO_OPCODE v0 # jump to next instruction
2164
2165
2166/* ------------------------------ */
2167 .balign 128
2168.L_op_aput_short: /* 0x51 */
2169/* File: mips64/op_aput_short.S */
2170/* File: mips64/op_aput.S */
2171 /*
2172 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2173 *
2174 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2175 *
2176 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2177 * If this changes, specialize.
2178 */
2179 /* op vAA, vBB, vCC */
2180 lbu a2, 2(rPC) # a2 <- BB
2181 lbu a3, 3(rPC) # a3 <- CC
2182 srl a4, rINST, 8 # a4 <- AA
2183 GET_VREG_U a0, a2 # a0 <- vBB (array object)
2184 GET_VREG a1, a3 # a1 <- vCC (requested index)
2185 beqz a0, common_errNullObject # bail if null array object
2186 lw a3, MIRROR_ARRAY_LENGTH_OFFSET(a0) # a3 <- arrayObj->length
2187 .if 1
2188 # [d]lsa does not support shift count of 0.
2189 dlsa a0, a1, a0, 1 # a0 <- arrayObj + index*width
2190 .else
2191 daddu a0, a1, a0 # a0 <- arrayObj + index*width
2192 .endif
2193 bgeu a1, a3, common_errArrayIndex # unsigned compare: index >= length, bail
2194 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
2195 GET_VREG a2, a4 # a2 <- vAA
2196 GET_INST_OPCODE v0 # extract opcode from rINST
2197 sh a2, MIRROR_SHORT_ARRAY_DATA_OFFSET(a0) # vBB[vCC] <- a2
2198 GOTO_OPCODE v0 # jump to next instruction
2199
2200
2201/* ------------------------------ */
2202 .balign 128
2203.L_op_iget: /* 0x52 */
2204/* File: mips64/op_iget.S */
2205 /*
2206 * General instance field get.
2207 *
2208 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2209 */
2210 .extern artGet32InstanceFromCode
2211 EXPORT_PC
2212 lhu a0, 2(rPC) # a0 <- field ref CCCC
2213 srl a1, rINST, 12 # a1 <- B
2214 GET_VREG_U a1, a1 # a1 <- fp[B], the object pointer
2215 ld a2, OFF_FP_METHOD(rFP) # a2 <- referrer
2216 move a3, rSELF # a3 <- self
2217 jal artGet32InstanceFromCode
2218 ld a3, THREAD_EXCEPTION_OFFSET(rSELF)
2219 ext a2, rINST, 8, 4 # a2 <- A
2220 PREFETCH_INST 2
2221 bnez a3, MterpPossibleException # bail out
2222 .if 0
2223 SET_VREG_OBJECT v0, a2 # fp[A] <- v0
2224 .else
2225 SET_VREG v0, a2 # fp[A] <- v0
2226 .endif
2227 ADVANCE 2
2228 GET_INST_OPCODE v0 # extract opcode from rINST
2229 GOTO_OPCODE v0 # jump to next instruction
2230
2231/* ------------------------------ */
2232 .balign 128
2233.L_op_iget_wide: /* 0x53 */
2234/* File: mips64/op_iget_wide.S */
2235 /*
2236 * 64-bit instance field get.
2237 *
2238 * for: iget-wide
2239 */
2240 .extern artGet64InstanceFromCode
2241 EXPORT_PC
2242 lhu a0, 2(rPC) # a0 <- field ref CCCC
2243 srl a1, rINST, 12 # a1 <- B
2244 GET_VREG_U a1, a1 # a1 <- fp[B], the object pointer
2245 ld a2, OFF_FP_METHOD(rFP) # a2 <- referrer
2246 move a3, rSELF # a3 <- self
2247 jal artGet64InstanceFromCode
2248 ld a3, THREAD_EXCEPTION_OFFSET(rSELF)
2249 ext a2, rINST, 8, 4 # a2 <- A
2250 PREFETCH_INST 2
2251 bnez a3, MterpPossibleException # bail out
2252 SET_VREG_WIDE v0, a2 # fp[A] <- v0
2253 ADVANCE 2
2254 GET_INST_OPCODE v0 # extract opcode from rINST
2255 GOTO_OPCODE v0 # jump to next instruction
2256
2257/* ------------------------------ */
2258 .balign 128
2259.L_op_iget_object: /* 0x54 */
2260/* File: mips64/op_iget_object.S */
2261/* File: mips64/op_iget.S */
2262 /*
2263 * General instance field get.
2264 *
2265 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2266 */
2267 .extern artGetObjInstanceFromCode
2268 EXPORT_PC
2269 lhu a0, 2(rPC) # a0 <- field ref CCCC
2270 srl a1, rINST, 12 # a1 <- B
2271 GET_VREG_U a1, a1 # a1 <- fp[B], the object pointer
2272 ld a2, OFF_FP_METHOD(rFP) # a2 <- referrer
2273 move a3, rSELF # a3 <- self
2274 jal artGetObjInstanceFromCode
2275 ld a3, THREAD_EXCEPTION_OFFSET(rSELF)
2276 ext a2, rINST, 8, 4 # a2 <- A
2277 PREFETCH_INST 2
2278 bnez a3, MterpPossibleException # bail out
2279 .if 1
2280 SET_VREG_OBJECT v0, a2 # fp[A] <- v0
2281 .else
2282 SET_VREG v0, a2 # fp[A] <- v0
2283 .endif
2284 ADVANCE 2
2285 GET_INST_OPCODE v0 # extract opcode from rINST
2286 GOTO_OPCODE v0 # jump to next instruction
2287
2288
2289/* ------------------------------ */
2290 .balign 128
2291.L_op_iget_boolean: /* 0x55 */
2292/* File: mips64/op_iget_boolean.S */
2293/* File: mips64/op_iget.S */
2294 /*
2295 * General instance field get.
2296 *
2297 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2298 */
2299 .extern artGetBooleanInstanceFromCode
2300 EXPORT_PC
2301 lhu a0, 2(rPC) # a0 <- field ref CCCC
2302 srl a1, rINST, 12 # a1 <- B
2303 GET_VREG_U a1, a1 # a1 <- fp[B], the object pointer
2304 ld a2, OFF_FP_METHOD(rFP) # a2 <- referrer
2305 move a3, rSELF # a3 <- self
2306 jal artGetBooleanInstanceFromCode
2307 ld a3, THREAD_EXCEPTION_OFFSET(rSELF)
2308 ext a2, rINST, 8, 4 # a2 <- A
2309 PREFETCH_INST 2
2310 bnez a3, MterpPossibleException # bail out
2311 .if 0
2312 SET_VREG_OBJECT v0, a2 # fp[A] <- v0
2313 .else
2314 SET_VREG v0, a2 # fp[A] <- v0
2315 .endif
2316 ADVANCE 2
2317 GET_INST_OPCODE v0 # extract opcode from rINST
2318 GOTO_OPCODE v0 # jump to next instruction
2319
2320
2321/* ------------------------------ */
2322 .balign 128
2323.L_op_iget_byte: /* 0x56 */
2324/* File: mips64/op_iget_byte.S */
2325/* File: mips64/op_iget.S */
2326 /*
2327 * General instance field get.
2328 *
2329 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2330 */
2331 .extern artGetByteInstanceFromCode
2332 EXPORT_PC
2333 lhu a0, 2(rPC) # a0 <- field ref CCCC
2334 srl a1, rINST, 12 # a1 <- B
2335 GET_VREG_U a1, a1 # a1 <- fp[B], the object pointer
2336 ld a2, OFF_FP_METHOD(rFP) # a2 <- referrer
2337 move a3, rSELF # a3 <- self
2338 jal artGetByteInstanceFromCode
2339 ld a3, THREAD_EXCEPTION_OFFSET(rSELF)
2340 ext a2, rINST, 8, 4 # a2 <- A
2341 PREFETCH_INST 2
2342 bnez a3, MterpPossibleException # bail out
2343 .if 0
2344 SET_VREG_OBJECT v0, a2 # fp[A] <- v0
2345 .else
2346 SET_VREG v0, a2 # fp[A] <- v0
2347 .endif
2348 ADVANCE 2
2349 GET_INST_OPCODE v0 # extract opcode from rINST
2350 GOTO_OPCODE v0 # jump to next instruction
2351
2352
2353/* ------------------------------ */
2354 .balign 128
2355.L_op_iget_char: /* 0x57 */
2356/* File: mips64/op_iget_char.S */
2357/* File: mips64/op_iget.S */
2358 /*
2359 * General instance field get.
2360 *
2361 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2362 */
2363 .extern artGetCharInstanceFromCode
2364 EXPORT_PC
2365 lhu a0, 2(rPC) # a0 <- field ref CCCC
2366 srl a1, rINST, 12 # a1 <- B
2367 GET_VREG_U a1, a1 # a1 <- fp[B], the object pointer
2368 ld a2, OFF_FP_METHOD(rFP) # a2 <- referrer
2369 move a3, rSELF # a3 <- self
2370 jal artGetCharInstanceFromCode
2371 ld a3, THREAD_EXCEPTION_OFFSET(rSELF)
2372 ext a2, rINST, 8, 4 # a2 <- A
2373 PREFETCH_INST 2
2374 bnez a3, MterpPossibleException # bail out
2375 .if 0
2376 SET_VREG_OBJECT v0, a2 # fp[A] <- v0
2377 .else
2378 SET_VREG v0, a2 # fp[A] <- v0
2379 .endif
2380 ADVANCE 2
2381 GET_INST_OPCODE v0 # extract opcode from rINST
2382 GOTO_OPCODE v0 # jump to next instruction
2383
2384
2385/* ------------------------------ */
2386 .balign 128
2387.L_op_iget_short: /* 0x58 */
2388/* File: mips64/op_iget_short.S */
2389/* File: mips64/op_iget.S */
2390 /*
2391 * General instance field get.
2392 *
2393 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2394 */
2395 .extern artGetShortInstanceFromCode
2396 EXPORT_PC
2397 lhu a0, 2(rPC) # a0 <- field ref CCCC
2398 srl a1, rINST, 12 # a1 <- B
2399 GET_VREG_U a1, a1 # a1 <- fp[B], the object pointer
2400 ld a2, OFF_FP_METHOD(rFP) # a2 <- referrer
2401 move a3, rSELF # a3 <- self
2402 jal artGetShortInstanceFromCode
2403 ld a3, THREAD_EXCEPTION_OFFSET(rSELF)
2404 ext a2, rINST, 8, 4 # a2 <- A
2405 PREFETCH_INST 2
2406 bnez a3, MterpPossibleException # bail out
2407 .if 0
2408 SET_VREG_OBJECT v0, a2 # fp[A] <- v0
2409 .else
2410 SET_VREG v0, a2 # fp[A] <- v0
2411 .endif
2412 ADVANCE 2
2413 GET_INST_OPCODE v0 # extract opcode from rINST
2414 GOTO_OPCODE v0 # jump to next instruction
2415
2416
2417/* ------------------------------ */
2418 .balign 128
2419.L_op_iput: /* 0x59 */
2420/* File: mips64/op_iput.S */
2421 /*
2422 * General 32-bit instance field put.
2423 *
2424 * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2425 */
2426 /* op vA, vB, field//CCCC */
2427 .extern artSet32InstanceFromMterp
2428 EXPORT_PC
2429 lhu a0, 2(rPC) # a0 <- field ref CCCC
2430 srl a1, rINST, 12 # a1 <- B
2431 GET_VREG_U a1, a1 # a1 <- fp[B], the object pointer
2432 ext a2, rINST, 8, 4 # a2 <- A
2433 GET_VREG a2, a2 # a2 <- fp[A]
2434 ld a3, OFF_FP_METHOD(rFP) # a3 <- referrer
2435 PREFETCH_INST 2
2436 jal artSet32InstanceFromMterp
2437 bnez v0, MterpPossibleException # bail out
2438 ADVANCE 2
2439 GET_INST_OPCODE v0 # extract opcode from rINST
2440 GOTO_OPCODE v0 # jump to next instruction
2441
2442/* ------------------------------ */
2443 .balign 128
2444.L_op_iput_wide: /* 0x5a */
2445/* File: mips64/op_iput_wide.S */
2446 /* iput-wide vA, vB, field//CCCC */
2447 .extern artSet64InstanceFromMterp
2448 EXPORT_PC
2449 lhu a0, 2(rPC) # a0 <- field ref CCCC
2450 srl a1, rINST, 12 # a1 <- B
2451 GET_VREG_U a1, a1 # a1 <- fp[B], the object pointer
2452 ext a2, rINST, 8, 4 # a2 <- A
2453 dlsa a2, a2, rFP, 2 # a2 <- &fp[A]
2454 ld a3, OFF_FP_METHOD(rFP) # a3 <- referrer
2455 PREFETCH_INST 2
2456 jal artSet64InstanceFromMterp
2457 bnez v0, MterpPossibleException # bail out
2458 ADVANCE 2
2459 GET_INST_OPCODE v0 # extract opcode from rINST
2460 GOTO_OPCODE v0 # jump to next instruction
2461
2462/* ------------------------------ */
2463 .balign 128
2464.L_op_iput_object: /* 0x5b */
2465/* File: mips64/op_iput_object.S */
2466 .extern MterpIputObject
2467 EXPORT_PC
2468 daddu a0, rFP, OFF_FP_SHADOWFRAME
2469 move a1, rPC
2470 move a2, rINST
2471 move a3, rSELF
2472 jal MterpIputObject
2473 beqzc v0, MterpException
2474 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
2475 GET_INST_OPCODE v0 # extract opcode from rINST
2476 GOTO_OPCODE v0 # jump to next instruction
2477
2478/* ------------------------------ */
2479 .balign 128
2480.L_op_iput_boolean: /* 0x5c */
2481/* File: mips64/op_iput_boolean.S */
2482/* File: mips64/op_iput.S */
2483 /*
2484 * General 32-bit instance field put.
2485 *
2486 * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2487 */
2488 /* op vA, vB, field//CCCC */
2489 .extern artSet8InstanceFromMterp
2490 EXPORT_PC
2491 lhu a0, 2(rPC) # a0 <- field ref CCCC
2492 srl a1, rINST, 12 # a1 <- B
2493 GET_VREG_U a1, a1 # a1 <- fp[B], the object pointer
2494 ext a2, rINST, 8, 4 # a2 <- A
2495 GET_VREG a2, a2 # a2 <- fp[A]
2496 ld a3, OFF_FP_METHOD(rFP) # a3 <- referrer
2497 PREFETCH_INST 2
2498 jal artSet8InstanceFromMterp
2499 bnez v0, MterpPossibleException # bail out
2500 ADVANCE 2
2501 GET_INST_OPCODE v0 # extract opcode from rINST
2502 GOTO_OPCODE v0 # jump to next instruction
2503
2504
2505/* ------------------------------ */
2506 .balign 128
2507.L_op_iput_byte: /* 0x5d */
2508/* File: mips64/op_iput_byte.S */
2509/* File: mips64/op_iput.S */
2510 /*
2511 * General 32-bit instance field put.
2512 *
2513 * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2514 */
2515 /* op vA, vB, field//CCCC */
2516 .extern artSet8InstanceFromMterp
2517 EXPORT_PC
2518 lhu a0, 2(rPC) # a0 <- field ref CCCC
2519 srl a1, rINST, 12 # a1 <- B
2520 GET_VREG_U a1, a1 # a1 <- fp[B], the object pointer
2521 ext a2, rINST, 8, 4 # a2 <- A
2522 GET_VREG a2, a2 # a2 <- fp[A]
2523 ld a3, OFF_FP_METHOD(rFP) # a3 <- referrer
2524 PREFETCH_INST 2
2525 jal artSet8InstanceFromMterp
2526 bnez v0, MterpPossibleException # bail out
2527 ADVANCE 2
2528 GET_INST_OPCODE v0 # extract opcode from rINST
2529 GOTO_OPCODE v0 # jump to next instruction
2530
2531
2532/* ------------------------------ */
2533 .balign 128
2534.L_op_iput_char: /* 0x5e */
2535/* File: mips64/op_iput_char.S */
2536/* File: mips64/op_iput.S */
2537 /*
2538 * General 32-bit instance field put.
2539 *
2540 * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2541 */
2542 /* op vA, vB, field//CCCC */
2543 .extern artSet16InstanceFromMterp
2544 EXPORT_PC
2545 lhu a0, 2(rPC) # a0 <- field ref CCCC
2546 srl a1, rINST, 12 # a1 <- B
2547 GET_VREG_U a1, a1 # a1 <- fp[B], the object pointer
2548 ext a2, rINST, 8, 4 # a2 <- A
2549 GET_VREG a2, a2 # a2 <- fp[A]
2550 ld a3, OFF_FP_METHOD(rFP) # a3 <- referrer
2551 PREFETCH_INST 2
2552 jal artSet16InstanceFromMterp
2553 bnez v0, MterpPossibleException # bail out
2554 ADVANCE 2
2555 GET_INST_OPCODE v0 # extract opcode from rINST
2556 GOTO_OPCODE v0 # jump to next instruction
2557
2558
2559/* ------------------------------ */
2560 .balign 128
2561.L_op_iput_short: /* 0x5f */
2562/* File: mips64/op_iput_short.S */
2563/* File: mips64/op_iput.S */
2564 /*
2565 * General 32-bit instance field put.
2566 *
2567 * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2568 */
2569 /* op vA, vB, field//CCCC */
2570 .extern artSet16InstanceFromMterp
2571 EXPORT_PC
2572 lhu a0, 2(rPC) # a0 <- field ref CCCC
2573 srl a1, rINST, 12 # a1 <- B
2574 GET_VREG_U a1, a1 # a1 <- fp[B], the object pointer
2575 ext a2, rINST, 8, 4 # a2 <- A
2576 GET_VREG a2, a2 # a2 <- fp[A]
2577 ld a3, OFF_FP_METHOD(rFP) # a3 <- referrer
2578 PREFETCH_INST 2
2579 jal artSet16InstanceFromMterp
2580 bnez v0, MterpPossibleException # bail out
2581 ADVANCE 2
2582 GET_INST_OPCODE v0 # extract opcode from rINST
2583 GOTO_OPCODE v0 # jump to next instruction
2584
2585
2586/* ------------------------------ */
2587 .balign 128
2588.L_op_sget: /* 0x60 */
2589/* File: mips64/op_sget.S */
2590 /*
2591 * General SGET handler wrapper.
2592 *
2593 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2594 */
2595 /* op vAA, field//BBBB */
2596 .extern artGet32StaticFromCode
2597 EXPORT_PC
2598 lhu a0, 2(rPC) # a0 <- field ref BBBB
2599 ld a1, OFF_FP_METHOD(rFP)
2600 move a2, rSELF
2601 jal artGet32StaticFromCode
2602 ld a3, THREAD_EXCEPTION_OFFSET(rSELF)
2603 srl a2, rINST, 8 # a2 <- AA
2604
2605 PREFETCH_INST 2
2606 bnez a3, MterpException # bail out
2607 .if 0
2608 SET_VREG_OBJECT v0, a2 # fp[AA] <- v0
2609 .else
2610 SET_VREG v0, a2 # fp[AA] <- v0
2611 .endif
2612 ADVANCE 2
2613 GET_INST_OPCODE v0 # extract opcode from rINST
2614 GOTO_OPCODE v0
2615
2616/* ------------------------------ */
2617 .balign 128
2618.L_op_sget_wide: /* 0x61 */
2619/* File: mips64/op_sget_wide.S */
2620 /*
2621 * SGET_WIDE handler wrapper.
2622 *
2623 */
2624 /* sget-wide vAA, field//BBBB */
2625 .extern artGet64StaticFromCode
2626 EXPORT_PC
2627 lhu a0, 2(rPC) # a0 <- field ref BBBB
2628 ld a1, OFF_FP_METHOD(rFP)
2629 move a2, rSELF
2630 jal artGet64StaticFromCode
2631 ld a3, THREAD_EXCEPTION_OFFSET(rSELF)
2632 srl a4, rINST, 8 # a4 <- AA
2633 bnez a3, MterpException # bail out
2634 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
2635 SET_VREG_WIDE v0, a4
2636 GET_INST_OPCODE v0 # extract opcode from rINST
2637 GOTO_OPCODE v0 # jump to next instruction
2638
2639/* ------------------------------ */
2640 .balign 128
2641.L_op_sget_object: /* 0x62 */
2642/* File: mips64/op_sget_object.S */
2643/* File: mips64/op_sget.S */
2644 /*
2645 * General SGET handler wrapper.
2646 *
2647 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2648 */
2649 /* op vAA, field//BBBB */
2650 .extern artGetObjStaticFromCode
2651 EXPORT_PC
2652 lhu a0, 2(rPC) # a0 <- field ref BBBB
2653 ld a1, OFF_FP_METHOD(rFP)
2654 move a2, rSELF
2655 jal artGetObjStaticFromCode
2656 ld a3, THREAD_EXCEPTION_OFFSET(rSELF)
2657 srl a2, rINST, 8 # a2 <- AA
2658
2659 PREFETCH_INST 2
2660 bnez a3, MterpException # bail out
2661 .if 1
2662 SET_VREG_OBJECT v0, a2 # fp[AA] <- v0
2663 .else
2664 SET_VREG v0, a2 # fp[AA] <- v0
2665 .endif
2666 ADVANCE 2
2667 GET_INST_OPCODE v0 # extract opcode from rINST
2668 GOTO_OPCODE v0
2669
2670
2671/* ------------------------------ */
2672 .balign 128
2673.L_op_sget_boolean: /* 0x63 */
2674/* File: mips64/op_sget_boolean.S */
2675/* File: mips64/op_sget.S */
2676 /*
2677 * General SGET handler wrapper.
2678 *
2679 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2680 */
2681 /* op vAA, field//BBBB */
2682 .extern artGetBooleanStaticFromCode
2683 EXPORT_PC
2684 lhu a0, 2(rPC) # a0 <- field ref BBBB
2685 ld a1, OFF_FP_METHOD(rFP)
2686 move a2, rSELF
2687 jal artGetBooleanStaticFromCode
2688 ld a3, THREAD_EXCEPTION_OFFSET(rSELF)
2689 srl a2, rINST, 8 # a2 <- AA
2690 and v0, v0, 0xff
2691 PREFETCH_INST 2
2692 bnez a3, MterpException # bail out
2693 .if 0
2694 SET_VREG_OBJECT v0, a2 # fp[AA] <- v0
2695 .else
2696 SET_VREG v0, a2 # fp[AA] <- v0
2697 .endif
2698 ADVANCE 2
2699 GET_INST_OPCODE v0 # extract opcode from rINST
2700 GOTO_OPCODE v0
2701
2702
2703/* ------------------------------ */
2704 .balign 128
2705.L_op_sget_byte: /* 0x64 */
2706/* File: mips64/op_sget_byte.S */
2707/* File: mips64/op_sget.S */
2708 /*
2709 * General SGET handler wrapper.
2710 *
2711 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2712 */
2713 /* op vAA, field//BBBB */
2714 .extern artGetByteStaticFromCode
2715 EXPORT_PC
2716 lhu a0, 2(rPC) # a0 <- field ref BBBB
2717 ld a1, OFF_FP_METHOD(rFP)
2718 move a2, rSELF
2719 jal artGetByteStaticFromCode
2720 ld a3, THREAD_EXCEPTION_OFFSET(rSELF)
2721 srl a2, rINST, 8 # a2 <- AA
2722 seb v0, v0
2723 PREFETCH_INST 2
2724 bnez a3, MterpException # bail out
2725 .if 0
2726 SET_VREG_OBJECT v0, a2 # fp[AA] <- v0
2727 .else
2728 SET_VREG v0, a2 # fp[AA] <- v0
2729 .endif
2730 ADVANCE 2
2731 GET_INST_OPCODE v0 # extract opcode from rINST
2732 GOTO_OPCODE v0
2733
2734
2735/* ------------------------------ */
2736 .balign 128
2737.L_op_sget_char: /* 0x65 */
2738/* File: mips64/op_sget_char.S */
2739/* File: mips64/op_sget.S */
2740 /*
2741 * General SGET handler wrapper.
2742 *
2743 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2744 */
2745 /* op vAA, field//BBBB */
2746 .extern artGetCharStaticFromCode
2747 EXPORT_PC
2748 lhu a0, 2(rPC) # a0 <- field ref BBBB
2749 ld a1, OFF_FP_METHOD(rFP)
2750 move a2, rSELF
2751 jal artGetCharStaticFromCode
2752 ld a3, THREAD_EXCEPTION_OFFSET(rSELF)
2753 srl a2, rINST, 8 # a2 <- AA
2754 and v0, v0, 0xffff
2755 PREFETCH_INST 2
2756 bnez a3, MterpException # bail out
2757 .if 0
2758 SET_VREG_OBJECT v0, a2 # fp[AA] <- v0
2759 .else
2760 SET_VREG v0, a2 # fp[AA] <- v0
2761 .endif
2762 ADVANCE 2
2763 GET_INST_OPCODE v0 # extract opcode from rINST
2764 GOTO_OPCODE v0
2765
2766
2767/* ------------------------------ */
2768 .balign 128
2769.L_op_sget_short: /* 0x66 */
2770/* File: mips64/op_sget_short.S */
2771/* File: mips64/op_sget.S */
2772 /*
2773 * General SGET handler wrapper.
2774 *
2775 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2776 */
2777 /* op vAA, field//BBBB */
2778 .extern artGetShortStaticFromCode
2779 EXPORT_PC
2780 lhu a0, 2(rPC) # a0 <- field ref BBBB
2781 ld a1, OFF_FP_METHOD(rFP)
2782 move a2, rSELF
2783 jal artGetShortStaticFromCode
2784 ld a3, THREAD_EXCEPTION_OFFSET(rSELF)
2785 srl a2, rINST, 8 # a2 <- AA
2786 seh v0, v0
2787 PREFETCH_INST 2
2788 bnez a3, MterpException # bail out
2789 .if 0
2790 SET_VREG_OBJECT v0, a2 # fp[AA] <- v0
2791 .else
2792 SET_VREG v0, a2 # fp[AA] <- v0
2793 .endif
2794 ADVANCE 2
2795 GET_INST_OPCODE v0 # extract opcode from rINST
2796 GOTO_OPCODE v0
2797
2798
2799/* ------------------------------ */
2800 .balign 128
2801.L_op_sput: /* 0x67 */
2802/* File: mips64/op_sput.S */
2803 /*
2804 * General SPUT handler wrapper.
2805 *
2806 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2807 */
2808 /* op vAA, field//BBBB */
2809 .extern artSet32StaticFromCode
2810 EXPORT_PC
2811 lhu a0, 2(rPC) # a0 <- field ref BBBB
2812 srl a3, rINST, 8 # a3 <- AA
2813 GET_VREG a1, a3 # a1 <- fp[AA]
2814 ld a2, OFF_FP_METHOD(rFP)
2815 move a3, rSELF
2816 PREFETCH_INST 2 # Get next inst, but don't advance rPC
2817 jal artSet32StaticFromCode
2818 bnezc v0, MterpException # 0 on success
2819 ADVANCE 2 # Past exception point - now advance rPC
2820 GET_INST_OPCODE v0 # extract opcode from rINST
2821 GOTO_OPCODE v0 # jump to next instruction
2822
2823/* ------------------------------ */
2824 .balign 128
2825.L_op_sput_wide: /* 0x68 */
2826/* File: mips64/op_sput_wide.S */
2827 /*
2828 * SPUT_WIDE handler wrapper.
2829 *
2830 */
2831 /* sput-wide vAA, field//BBBB */
2832 .extern artSet64IndirectStaticFromMterp
2833 EXPORT_PC
2834 lhu a0, 2(rPC) # a0 <- field ref BBBB
2835 ld a1, OFF_FP_METHOD(rFP)
2836 srl a2, rINST, 8 # a2 <- AA
2837 dlsa a2, a2, rFP, 2
2838 move a3, rSELF
2839 PREFETCH_INST 2 # Get next inst, but don't advance rPC
2840 jal artSet64IndirectStaticFromMterp
2841 bnezc v0, MterpException # 0 on success, -1 on failure
2842 ADVANCE 2 # Past exception point - now advance rPC
2843 GET_INST_OPCODE v0 # extract opcode from rINST
2844 GOTO_OPCODE v0 # jump to next instruction
2845
2846/* ------------------------------ */
2847 .balign 128
2848.L_op_sput_object: /* 0x69 */
2849/* File: mips64/op_sput_object.S */
2850 .extern MterpSputObject
2851 EXPORT_PC
2852 daddu a0, rFP, OFF_FP_SHADOWFRAME
2853 move a1, rPC
2854 move a2, rINST
2855 move a3, rSELF
2856 jal MterpSputObject
2857 beqzc v0, MterpException
2858 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
2859 GET_INST_OPCODE v0 # extract opcode from rINST
2860 GOTO_OPCODE v0 # jump to next instruction
2861
2862/* ------------------------------ */
2863 .balign 128
2864.L_op_sput_boolean: /* 0x6a */
2865/* File: mips64/op_sput_boolean.S */
2866/* File: mips64/op_sput.S */
2867 /*
2868 * General SPUT handler wrapper.
2869 *
2870 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2871 */
2872 /* op vAA, field//BBBB */
2873 .extern artSet8StaticFromCode
2874 EXPORT_PC
2875 lhu a0, 2(rPC) # a0 <- field ref BBBB
2876 srl a3, rINST, 8 # a3 <- AA
2877 GET_VREG a1, a3 # a1 <- fp[AA]
2878 ld a2, OFF_FP_METHOD(rFP)
2879 move a3, rSELF
2880 PREFETCH_INST 2 # Get next inst, but don't advance rPC
2881 jal artSet8StaticFromCode
2882 bnezc v0, MterpException # 0 on success
2883 ADVANCE 2 # Past exception point - now advance rPC
2884 GET_INST_OPCODE v0 # extract opcode from rINST
2885 GOTO_OPCODE v0 # jump to next instruction
2886
2887
2888/* ------------------------------ */
2889 .balign 128
2890.L_op_sput_byte: /* 0x6b */
2891/* File: mips64/op_sput_byte.S */
2892/* File: mips64/op_sput.S */
2893 /*
2894 * General SPUT handler wrapper.
2895 *
2896 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2897 */
2898 /* op vAA, field//BBBB */
2899 .extern artSet8StaticFromCode
2900 EXPORT_PC
2901 lhu a0, 2(rPC) # a0 <- field ref BBBB
2902 srl a3, rINST, 8 # a3 <- AA
2903 GET_VREG a1, a3 # a1 <- fp[AA]
2904 ld a2, OFF_FP_METHOD(rFP)
2905 move a3, rSELF
2906 PREFETCH_INST 2 # Get next inst, but don't advance rPC
2907 jal artSet8StaticFromCode
2908 bnezc v0, MterpException # 0 on success
2909 ADVANCE 2 # Past exception point - now advance rPC
2910 GET_INST_OPCODE v0 # extract opcode from rINST
2911 GOTO_OPCODE v0 # jump to next instruction
2912
2913
2914/* ------------------------------ */
2915 .balign 128
2916.L_op_sput_char: /* 0x6c */
2917/* File: mips64/op_sput_char.S */
2918/* File: mips64/op_sput.S */
2919 /*
2920 * General SPUT handler wrapper.
2921 *
2922 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2923 */
2924 /* op vAA, field//BBBB */
2925 .extern artSet16StaticFromCode
2926 EXPORT_PC
2927 lhu a0, 2(rPC) # a0 <- field ref BBBB
2928 srl a3, rINST, 8 # a3 <- AA
2929 GET_VREG a1, a3 # a1 <- fp[AA]
2930 ld a2, OFF_FP_METHOD(rFP)
2931 move a3, rSELF
2932 PREFETCH_INST 2 # Get next inst, but don't advance rPC
2933 jal artSet16StaticFromCode
2934 bnezc v0, MterpException # 0 on success
2935 ADVANCE 2 # Past exception point - now advance rPC
2936 GET_INST_OPCODE v0 # extract opcode from rINST
2937 GOTO_OPCODE v0 # jump to next instruction
2938
2939
2940/* ------------------------------ */
2941 .balign 128
2942.L_op_sput_short: /* 0x6d */
2943/* File: mips64/op_sput_short.S */
2944/* File: mips64/op_sput.S */
2945 /*
2946 * General SPUT handler wrapper.
2947 *
2948 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2949 */
2950 /* op vAA, field//BBBB */
2951 .extern artSet16StaticFromCode
2952 EXPORT_PC
2953 lhu a0, 2(rPC) # a0 <- field ref BBBB
2954 srl a3, rINST, 8 # a3 <- AA
2955 GET_VREG a1, a3 # a1 <- fp[AA]
2956 ld a2, OFF_FP_METHOD(rFP)
2957 move a3, rSELF
2958 PREFETCH_INST 2 # Get next inst, but don't advance rPC
2959 jal artSet16StaticFromCode
2960 bnezc v0, MterpException # 0 on success
2961 ADVANCE 2 # Past exception point - now advance rPC
2962 GET_INST_OPCODE v0 # extract opcode from rINST
2963 GOTO_OPCODE v0 # jump to next instruction
2964
2965
2966/* ------------------------------ */
2967 .balign 128
2968.L_op_invoke_virtual: /* 0x6e */
2969/* File: mips64/op_invoke_virtual.S */
2970/* File: mips64/invoke.S */
2971 /*
2972 * Generic invoke handler wrapper.
2973 */
2974 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2975 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2976 .extern MterpInvokeVirtual
Alexey Frunzedb045be2016-03-03 17:50:48 -08002977 .extern MterpShouldSwitchInterpreters
Alexey Frunze00b53b72016-02-02 20:25:45 -08002978 EXPORT_PC
2979 move a0, rSELF
2980 daddu a1, rFP, OFF_FP_SHADOWFRAME
2981 move a2, rPC
2982 move a3, rINST
2983 jal MterpInvokeVirtual
2984 beqzc v0, MterpException
2985 FETCH_ADVANCE_INST 3
Alexey Frunzedb045be2016-03-03 17:50:48 -08002986 jal MterpShouldSwitchInterpreters
2987 bnezc v0, MterpFallback
Alexey Frunze00b53b72016-02-02 20:25:45 -08002988 GET_INST_OPCODE v0
2989 GOTO_OPCODE v0
2990
2991 /*
2992 * Handle a virtual method call.
2993 *
2994 * for: invoke-virtual, invoke-virtual/range
2995 */
2996 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2997 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2998
2999/* ------------------------------ */
3000 .balign 128
3001.L_op_invoke_super: /* 0x6f */
3002/* File: mips64/op_invoke_super.S */
3003/* File: mips64/invoke.S */
3004 /*
3005 * Generic invoke handler wrapper.
3006 */
3007 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3008 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3009 .extern MterpInvokeSuper
Alexey Frunzedb045be2016-03-03 17:50:48 -08003010 .extern MterpShouldSwitchInterpreters
Alexey Frunze00b53b72016-02-02 20:25:45 -08003011 EXPORT_PC
3012 move a0, rSELF
3013 daddu a1, rFP, OFF_FP_SHADOWFRAME
3014 move a2, rPC
3015 move a3, rINST
3016 jal MterpInvokeSuper
3017 beqzc v0, MterpException
3018 FETCH_ADVANCE_INST 3
Alexey Frunzedb045be2016-03-03 17:50:48 -08003019 jal MterpShouldSwitchInterpreters
3020 bnezc v0, MterpFallback
Alexey Frunze00b53b72016-02-02 20:25:45 -08003021 GET_INST_OPCODE v0
3022 GOTO_OPCODE v0
3023
3024 /*
3025 * Handle a "super" method call.
3026 *
3027 * for: invoke-super, invoke-super/range
3028 */
3029 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3030 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3031
3032/* ------------------------------ */
3033 .balign 128
3034.L_op_invoke_direct: /* 0x70 */
3035/* File: mips64/op_invoke_direct.S */
3036/* File: mips64/invoke.S */
3037 /*
3038 * Generic invoke handler wrapper.
3039 */
3040 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3041 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3042 .extern MterpInvokeDirect
Alexey Frunzedb045be2016-03-03 17:50:48 -08003043 .extern MterpShouldSwitchInterpreters
Alexey Frunze00b53b72016-02-02 20:25:45 -08003044 EXPORT_PC
3045 move a0, rSELF
3046 daddu a1, rFP, OFF_FP_SHADOWFRAME
3047 move a2, rPC
3048 move a3, rINST
3049 jal MterpInvokeDirect
3050 beqzc v0, MterpException
3051 FETCH_ADVANCE_INST 3
Alexey Frunzedb045be2016-03-03 17:50:48 -08003052 jal MterpShouldSwitchInterpreters
3053 bnezc v0, MterpFallback
Alexey Frunze00b53b72016-02-02 20:25:45 -08003054 GET_INST_OPCODE v0
3055 GOTO_OPCODE v0
3056
3057
3058/* ------------------------------ */
3059 .balign 128
3060.L_op_invoke_static: /* 0x71 */
3061/* File: mips64/op_invoke_static.S */
3062/* File: mips64/invoke.S */
3063 /*
3064 * Generic invoke handler wrapper.
3065 */
3066 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3067 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3068 .extern MterpInvokeStatic
Alexey Frunzedb045be2016-03-03 17:50:48 -08003069 .extern MterpShouldSwitchInterpreters
Alexey Frunze00b53b72016-02-02 20:25:45 -08003070 EXPORT_PC
3071 move a0, rSELF
3072 daddu a1, rFP, OFF_FP_SHADOWFRAME
3073 move a2, rPC
3074 move a3, rINST
3075 jal MterpInvokeStatic
3076 beqzc v0, MterpException
3077 FETCH_ADVANCE_INST 3
Alexey Frunzedb045be2016-03-03 17:50:48 -08003078 jal MterpShouldSwitchInterpreters
3079 bnezc v0, MterpFallback
Alexey Frunze00b53b72016-02-02 20:25:45 -08003080 GET_INST_OPCODE v0
3081 GOTO_OPCODE v0
3082
3083
3084/* ------------------------------ */
3085 .balign 128
3086.L_op_invoke_interface: /* 0x72 */
3087/* File: mips64/op_invoke_interface.S */
3088/* File: mips64/invoke.S */
3089 /*
3090 * Generic invoke handler wrapper.
3091 */
3092 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3093 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3094 .extern MterpInvokeInterface
Alexey Frunzedb045be2016-03-03 17:50:48 -08003095 .extern MterpShouldSwitchInterpreters
Alexey Frunze00b53b72016-02-02 20:25:45 -08003096 EXPORT_PC
3097 move a0, rSELF
3098 daddu a1, rFP, OFF_FP_SHADOWFRAME
3099 move a2, rPC
3100 move a3, rINST
3101 jal MterpInvokeInterface
3102 beqzc v0, MterpException
3103 FETCH_ADVANCE_INST 3
Alexey Frunzedb045be2016-03-03 17:50:48 -08003104 jal MterpShouldSwitchInterpreters
3105 bnezc v0, MterpFallback
Alexey Frunze00b53b72016-02-02 20:25:45 -08003106 GET_INST_OPCODE v0
3107 GOTO_OPCODE v0
3108
3109 /*
3110 * Handle an interface method call.
3111 *
3112 * for: invoke-interface, invoke-interface/range
3113 */
3114 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3115 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3116
3117/* ------------------------------ */
3118 .balign 128
3119.L_op_return_void_no_barrier: /* 0x73 */
3120/* File: mips64/op_return_void_no_barrier.S */
3121 .extern MterpSuspendCheck
3122 lw ra, THREAD_FLAGS_OFFSET(rSELF)
3123 move a0, rSELF
3124 and ra, ra, (THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
3125 beqzc ra, 1f
3126 jal MterpSuspendCheck # (self)
31271:
3128 li a0, 0
3129 b MterpReturn
3130
3131/* ------------------------------ */
3132 .balign 128
3133.L_op_invoke_virtual_range: /* 0x74 */
3134/* File: mips64/op_invoke_virtual_range.S */
3135/* File: mips64/invoke.S */
3136 /*
3137 * Generic invoke handler wrapper.
3138 */
3139 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3140 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3141 .extern MterpInvokeVirtualRange
Alexey Frunzedb045be2016-03-03 17:50:48 -08003142 .extern MterpShouldSwitchInterpreters
Alexey Frunze00b53b72016-02-02 20:25:45 -08003143 EXPORT_PC
3144 move a0, rSELF
3145 daddu a1, rFP, OFF_FP_SHADOWFRAME
3146 move a2, rPC
3147 move a3, rINST
3148 jal MterpInvokeVirtualRange
3149 beqzc v0, MterpException
3150 FETCH_ADVANCE_INST 3
Alexey Frunzedb045be2016-03-03 17:50:48 -08003151 jal MterpShouldSwitchInterpreters
3152 bnezc v0, MterpFallback
Alexey Frunze00b53b72016-02-02 20:25:45 -08003153 GET_INST_OPCODE v0
3154 GOTO_OPCODE v0
3155
3156
3157/* ------------------------------ */
3158 .balign 128
3159.L_op_invoke_super_range: /* 0x75 */
3160/* File: mips64/op_invoke_super_range.S */
3161/* File: mips64/invoke.S */
3162 /*
3163 * Generic invoke handler wrapper.
3164 */
3165 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3166 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3167 .extern MterpInvokeSuperRange
Alexey Frunzedb045be2016-03-03 17:50:48 -08003168 .extern MterpShouldSwitchInterpreters
Alexey Frunze00b53b72016-02-02 20:25:45 -08003169 EXPORT_PC
3170 move a0, rSELF
3171 daddu a1, rFP, OFF_FP_SHADOWFRAME
3172 move a2, rPC
3173 move a3, rINST
3174 jal MterpInvokeSuperRange
3175 beqzc v0, MterpException
3176 FETCH_ADVANCE_INST 3
Alexey Frunzedb045be2016-03-03 17:50:48 -08003177 jal MterpShouldSwitchInterpreters
3178 bnezc v0, MterpFallback
Alexey Frunze00b53b72016-02-02 20:25:45 -08003179 GET_INST_OPCODE v0
3180 GOTO_OPCODE v0
3181
3182
3183/* ------------------------------ */
3184 .balign 128
3185.L_op_invoke_direct_range: /* 0x76 */
3186/* File: mips64/op_invoke_direct_range.S */
3187/* File: mips64/invoke.S */
3188 /*
3189 * Generic invoke handler wrapper.
3190 */
3191 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3192 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3193 .extern MterpInvokeDirectRange
Alexey Frunzedb045be2016-03-03 17:50:48 -08003194 .extern MterpShouldSwitchInterpreters
Alexey Frunze00b53b72016-02-02 20:25:45 -08003195 EXPORT_PC
3196 move a0, rSELF
3197 daddu a1, rFP, OFF_FP_SHADOWFRAME
3198 move a2, rPC
3199 move a3, rINST
3200 jal MterpInvokeDirectRange
3201 beqzc v0, MterpException
3202 FETCH_ADVANCE_INST 3
Alexey Frunzedb045be2016-03-03 17:50:48 -08003203 jal MterpShouldSwitchInterpreters
3204 bnezc v0, MterpFallback
Alexey Frunze00b53b72016-02-02 20:25:45 -08003205 GET_INST_OPCODE v0
3206 GOTO_OPCODE v0
3207
3208
3209/* ------------------------------ */
3210 .balign 128
3211.L_op_invoke_static_range: /* 0x77 */
3212/* File: mips64/op_invoke_static_range.S */
3213/* File: mips64/invoke.S */
3214 /*
3215 * Generic invoke handler wrapper.
3216 */
3217 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3218 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3219 .extern MterpInvokeStaticRange
Alexey Frunzedb045be2016-03-03 17:50:48 -08003220 .extern MterpShouldSwitchInterpreters
Alexey Frunze00b53b72016-02-02 20:25:45 -08003221 EXPORT_PC
3222 move a0, rSELF
3223 daddu a1, rFP, OFF_FP_SHADOWFRAME
3224 move a2, rPC
3225 move a3, rINST
3226 jal MterpInvokeStaticRange
3227 beqzc v0, MterpException
3228 FETCH_ADVANCE_INST 3
Alexey Frunzedb045be2016-03-03 17:50:48 -08003229 jal MterpShouldSwitchInterpreters
3230 bnezc v0, MterpFallback
Alexey Frunze00b53b72016-02-02 20:25:45 -08003231 GET_INST_OPCODE v0
3232 GOTO_OPCODE v0
3233
3234
3235/* ------------------------------ */
3236 .balign 128
3237.L_op_invoke_interface_range: /* 0x78 */
3238/* File: mips64/op_invoke_interface_range.S */
3239/* File: mips64/invoke.S */
3240 /*
3241 * Generic invoke handler wrapper.
3242 */
3243 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3244 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3245 .extern MterpInvokeInterfaceRange
Alexey Frunzedb045be2016-03-03 17:50:48 -08003246 .extern MterpShouldSwitchInterpreters
Alexey Frunze00b53b72016-02-02 20:25:45 -08003247 EXPORT_PC
3248 move a0, rSELF
3249 daddu a1, rFP, OFF_FP_SHADOWFRAME
3250 move a2, rPC
3251 move a3, rINST
3252 jal MterpInvokeInterfaceRange
3253 beqzc v0, MterpException
3254 FETCH_ADVANCE_INST 3
Alexey Frunzedb045be2016-03-03 17:50:48 -08003255 jal MterpShouldSwitchInterpreters
3256 bnezc v0, MterpFallback
Alexey Frunze00b53b72016-02-02 20:25:45 -08003257 GET_INST_OPCODE v0
3258 GOTO_OPCODE v0
3259
3260
3261/* ------------------------------ */
3262 .balign 128
3263.L_op_unused_79: /* 0x79 */
3264/* File: mips64/op_unused_79.S */
3265/* File: mips64/unused.S */
3266/*
3267 * Bail to reference interpreter to throw.
3268 */
3269 b MterpFallback
3270
3271
3272/* ------------------------------ */
3273 .balign 128
3274.L_op_unused_7a: /* 0x7a */
3275/* File: mips64/op_unused_7a.S */
3276/* File: mips64/unused.S */
3277/*
3278 * Bail to reference interpreter to throw.
3279 */
3280 b MterpFallback
3281
3282
3283/* ------------------------------ */
3284 .balign 128
3285.L_op_neg_int: /* 0x7b */
3286/* File: mips64/op_neg_int.S */
3287/* File: mips64/unop.S */
3288 /*
3289 * Generic 32-bit unary operation. Provide an "instr" line that
3290 * specifies an instruction that performs "a0 = op a0".
3291 *
3292 * for: int-to-byte, int-to-char, int-to-short,
3293 * not-int, neg-int
3294 */
3295 /* unop vA, vB */
3296 ext a3, rINST, 12, 4 # a3 <- B
3297 GET_VREG a0, a3 # a0 <- vB
3298 ext a2, rINST, 8, 4 # a2 <- A
3299 # optional op
3300 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
3301 subu a0, zero, a0 # a0 <- op, a0-a3 changed
3302 GET_INST_OPCODE v0 # extract opcode from rINST
3303 SET_VREG a0, a2 # vA <- a0
3304 GOTO_OPCODE v0 # jump to next instruction
3305
3306
3307/* ------------------------------ */
3308 .balign 128
3309.L_op_not_int: /* 0x7c */
3310/* File: mips64/op_not_int.S */
3311/* File: mips64/unop.S */
3312 /*
3313 * Generic 32-bit unary operation. Provide an "instr" line that
3314 * specifies an instruction that performs "a0 = op a0".
3315 *
3316 * for: int-to-byte, int-to-char, int-to-short,
3317 * not-int, neg-int
3318 */
3319 /* unop vA, vB */
3320 ext a3, rINST, 12, 4 # a3 <- B
3321 GET_VREG a0, a3 # a0 <- vB
3322 ext a2, rINST, 8, 4 # a2 <- A
3323 # optional op
3324 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
3325 nor a0, zero, a0 # a0 <- op, a0-a3 changed
3326 GET_INST_OPCODE v0 # extract opcode from rINST
3327 SET_VREG a0, a2 # vA <- a0
3328 GOTO_OPCODE v0 # jump to next instruction
3329
3330
3331/* ------------------------------ */
3332 .balign 128
3333.L_op_neg_long: /* 0x7d */
3334/* File: mips64/op_neg_long.S */
3335/* File: mips64/unopWide.S */
3336 /*
3337 * Generic 64-bit unary operation. Provide an "instr" line that
3338 * specifies an instruction that performs "a0 = op a0".
3339 *
3340 * For: not-long, neg-long
3341 */
3342 /* unop vA, vB */
3343 ext a3, rINST, 12, 4 # a3 <- B
3344 GET_VREG_WIDE a0, a3 # a0 <- vB
3345 ext a2, rINST, 8, 4 # a2 <- A
3346 # optional op
3347 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
3348 dsubu a0, zero, a0 # a0 <- op, a0-a3 changed
3349 GET_INST_OPCODE v0 # extract opcode from rINST
3350 SET_VREG_WIDE a0, a2 # vA <- a0
3351 GOTO_OPCODE v0 # jump to next instruction
3352
3353
3354/* ------------------------------ */
3355 .balign 128
3356.L_op_not_long: /* 0x7e */
3357/* File: mips64/op_not_long.S */
3358/* File: mips64/unopWide.S */
3359 /*
3360 * Generic 64-bit unary operation. Provide an "instr" line that
3361 * specifies an instruction that performs "a0 = op a0".
3362 *
3363 * For: not-long, neg-long
3364 */
3365 /* unop vA, vB */
3366 ext a3, rINST, 12, 4 # a3 <- B
3367 GET_VREG_WIDE a0, a3 # a0 <- vB
3368 ext a2, rINST, 8, 4 # a2 <- A
3369 # optional op
3370 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
3371 nor a0, zero, a0 # a0 <- op, a0-a3 changed
3372 GET_INST_OPCODE v0 # extract opcode from rINST
3373 SET_VREG_WIDE a0, a2 # vA <- a0
3374 GOTO_OPCODE v0 # jump to next instruction
3375
3376
3377/* ------------------------------ */
3378 .balign 128
3379.L_op_neg_float: /* 0x7f */
3380/* File: mips64/op_neg_float.S */
3381/* File: mips64/fcvtHeader.S */
3382 /*
3383 * Loads a specified register from vB. Used primarily for conversions
3384 * from or to a floating-point type.
3385 *
3386 * Sets up a1 = A and a2 = B. a2 is later used by fcvtFooter.S to
3387 * store the result in vA and jump to the next instruction.
3388 *
3389 * For: int-to-float, int-to-double, long-to-float, long-to-double,
3390 * float-to-int, float-to-long, float-to-double, double-to-int,
3391 * double-to-long, double-to-float, neg-float, neg-double.
3392 */
3393 ext a1, rINST, 8, 4 # a1 <- A
3394 srl a2, rINST, 12 # a2 <- B
3395 GET_VREG_FLOAT f0, a2
3396 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
3397
3398 neg.s f0, f0
3399/* File: mips64/fcvtFooter.S */
3400 /*
3401 * Stores a specified register containing the result of conversion
3402 * from or to a floating-point type and jumps to the next instruction.
3403 *
3404 * Expects a1 to contain the destination Dalvik register number.
3405 * a1 is set up by fcvtHeader.S.
3406 *
3407 * For: int-to-float, int-to-double, long-to-float, long-to-double,
3408 * float-to-int, float-to-long, float-to-double, double-to-int,
3409 * double-to-long, double-to-float, neg-float, neg-double.
3410 *
3411 * Note that this file can't be included after a break in other files
3412 * and in those files its contents appear as a copy.
3413 * See: float-to-int, float-to-long, double-to-int, double-to-long.
3414 */
3415 GET_INST_OPCODE v0 # extract opcode from rINST
3416 SET_VREG_FLOAT f0, a1
3417 GOTO_OPCODE v0 # jump to next instruction
3418
3419
3420/* ------------------------------ */
3421 .balign 128
3422.L_op_neg_double: /* 0x80 */
3423/* File: mips64/op_neg_double.S */
3424/* File: mips64/fcvtHeader.S */
3425 /*
3426 * Loads a specified register from vB. Used primarily for conversions
3427 * from or to a floating-point type.
3428 *
3429 * Sets up a1 = A and a2 = B. a2 is later used by fcvtFooter.S to
3430 * store the result in vA and jump to the next instruction.
3431 *
3432 * For: int-to-float, int-to-double, long-to-float, long-to-double,
3433 * float-to-int, float-to-long, float-to-double, double-to-int,
3434 * double-to-long, double-to-float, neg-float, neg-double.
3435 */
3436 ext a1, rINST, 8, 4 # a1 <- A
3437 srl a2, rINST, 12 # a2 <- B
3438 GET_VREG_DOUBLE f0, a2
3439 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
3440
3441 neg.d f0, f0
3442/* File: mips64/fcvtFooter.S */
3443 /*
3444 * Stores a specified register containing the result of conversion
3445 * from or to a floating-point type and jumps to the next instruction.
3446 *
3447 * Expects a1 to contain the destination Dalvik register number.
3448 * a1 is set up by fcvtHeader.S.
3449 *
3450 * For: int-to-float, int-to-double, long-to-float, long-to-double,
3451 * float-to-int, float-to-long, float-to-double, double-to-int,
3452 * double-to-long, double-to-float, neg-float, neg-double.
3453 *
3454 * Note that this file can't be included after a break in other files
3455 * and in those files its contents appear as a copy.
3456 * See: float-to-int, float-to-long, double-to-int, double-to-long.
3457 */
3458 GET_INST_OPCODE v0 # extract opcode from rINST
3459 SET_VREG_DOUBLE f0, a1
3460 GOTO_OPCODE v0 # jump to next instruction
3461
3462
3463/* ------------------------------ */
3464 .balign 128
3465.L_op_int_to_long: /* 0x81 */
3466/* File: mips64/op_int_to_long.S */
3467 /* int-to-long vA, vB */
3468 ext a3, rINST, 12, 4 # a3 <- B
3469 GET_VREG a0, a3 # a0 <- vB (sign-extended to 64 bits)
3470 ext a2, rINST, 8, 4 # a2 <- A
3471 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
3472 GET_INST_OPCODE v0 # extract opcode from rINST
3473 SET_VREG_WIDE a0, a2 # vA <- vB
3474 GOTO_OPCODE v0 # jump to next instruction
3475
3476/* ------------------------------ */
3477 .balign 128
3478.L_op_int_to_float: /* 0x82 */
3479/* File: mips64/op_int_to_float.S */
3480 /*
3481 * Conversion from or to floating-point happens in a floating-point register.
3482 * Therefore we load the input and store the output into or from a
3483 * floating-point register irrespective of the type.
3484 */
3485/* File: mips64/fcvtHeader.S */
3486 /*
3487 * Loads a specified register from vB. Used primarily for conversions
3488 * from or to a floating-point type.
3489 *
3490 * Sets up a1 = A and a2 = B. a2 is later used by fcvtFooter.S to
3491 * store the result in vA and jump to the next instruction.
3492 *
3493 * For: int-to-float, int-to-double, long-to-float, long-to-double,
3494 * float-to-int, float-to-long, float-to-double, double-to-int,
3495 * double-to-long, double-to-float, neg-float, neg-double.
3496 */
3497 ext a1, rINST, 8, 4 # a1 <- A
3498 srl a2, rINST, 12 # a2 <- B
3499 GET_VREG_FLOAT f0, a2
3500 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
3501
3502 cvt.s.w f0, f0
3503/* File: mips64/fcvtFooter.S */
3504 /*
3505 * Stores a specified register containing the result of conversion
3506 * from or to a floating-point type and jumps to the next instruction.
3507 *
3508 * Expects a1 to contain the destination Dalvik register number.
3509 * a1 is set up by fcvtHeader.S.
3510 *
3511 * For: int-to-float, int-to-double, long-to-float, long-to-double,
3512 * float-to-int, float-to-long, float-to-double, double-to-int,
3513 * double-to-long, double-to-float, neg-float, neg-double.
3514 *
3515 * Note that this file can't be included after a break in other files
3516 * and in those files its contents appear as a copy.
3517 * See: float-to-int, float-to-long, double-to-int, double-to-long.
3518 */
3519 GET_INST_OPCODE v0 # extract opcode from rINST
3520 SET_VREG_FLOAT f0, a1
3521 GOTO_OPCODE v0 # jump to next instruction
3522
3523
3524/* ------------------------------ */
3525 .balign 128
3526.L_op_int_to_double: /* 0x83 */
3527/* File: mips64/op_int_to_double.S */
3528 /*
3529 * Conversion from or to floating-point happens in a floating-point register.
3530 * Therefore we load the input and store the output into or from a
3531 * floating-point register irrespective of the type.
3532 */
3533/* File: mips64/fcvtHeader.S */
3534 /*
3535 * Loads a specified register from vB. Used primarily for conversions
3536 * from or to a floating-point type.
3537 *
3538 * Sets up a1 = A and a2 = B. a2 is later used by fcvtFooter.S to
3539 * store the result in vA and jump to the next instruction.
3540 *
3541 * For: int-to-float, int-to-double, long-to-float, long-to-double,
3542 * float-to-int, float-to-long, float-to-double, double-to-int,
3543 * double-to-long, double-to-float, neg-float, neg-double.
3544 */
3545 ext a1, rINST, 8, 4 # a1 <- A
3546 srl a2, rINST, 12 # a2 <- B
3547 GET_VREG_FLOAT f0, a2
3548 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
3549
3550 cvt.d.w f0, f0
3551/* File: mips64/fcvtFooter.S */
3552 /*
3553 * Stores a specified register containing the result of conversion
3554 * from or to a floating-point type and jumps to the next instruction.
3555 *
3556 * Expects a1 to contain the destination Dalvik register number.
3557 * a1 is set up by fcvtHeader.S.
3558 *
3559 * For: int-to-float, int-to-double, long-to-float, long-to-double,
3560 * float-to-int, float-to-long, float-to-double, double-to-int,
3561 * double-to-long, double-to-float, neg-float, neg-double.
3562 *
3563 * Note that this file can't be included after a break in other files
3564 * and in those files its contents appear as a copy.
3565 * See: float-to-int, float-to-long, double-to-int, double-to-long.
3566 */
3567 GET_INST_OPCODE v0 # extract opcode from rINST
3568 SET_VREG_DOUBLE f0, a1
3569 GOTO_OPCODE v0 # jump to next instruction
3570
3571
3572/* ------------------------------ */
3573 .balign 128
3574.L_op_long_to_int: /* 0x84 */
3575/* File: mips64/op_long_to_int.S */
3576/* we ignore the high word, making this equivalent to a 32-bit reg move */
3577/* File: mips64/op_move.S */
3578 /* for move, move-object, long-to-int */
3579 /* op vA, vB */
3580 ext a2, rINST, 8, 4 # a2 <- A
3581 ext a3, rINST, 12, 4 # a3 <- B
3582 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
3583 GET_VREG a0, a3 # a0 <- vB
3584 GET_INST_OPCODE v0 # extract opcode from rINST
3585 .if 0
3586 SET_VREG_OBJECT a0, a2 # vA <- vB
3587 .else
3588 SET_VREG a0, a2 # vA <- vB
3589 .endif
3590 GOTO_OPCODE v0 # jump to next instruction
3591
3592
3593/* ------------------------------ */
3594 .balign 128
3595.L_op_long_to_float: /* 0x85 */
3596/* File: mips64/op_long_to_float.S */
3597 /*
3598 * Conversion from or to floating-point happens in a floating-point register.
3599 * Therefore we load the input and store the output into or from a
3600 * floating-point register irrespective of the type.
3601 */
3602/* File: mips64/fcvtHeader.S */
3603 /*
3604 * Loads a specified register from vB. Used primarily for conversions
3605 * from or to a floating-point type.
3606 *
3607 * Sets up a1 = A and a2 = B. a2 is later used by fcvtFooter.S to
3608 * store the result in vA and jump to the next instruction.
3609 *
3610 * For: int-to-float, int-to-double, long-to-float, long-to-double,
3611 * float-to-int, float-to-long, float-to-double, double-to-int,
3612 * double-to-long, double-to-float, neg-float, neg-double.
3613 */
3614 ext a1, rINST, 8, 4 # a1 <- A
3615 srl a2, rINST, 12 # a2 <- B
3616 GET_VREG_DOUBLE f0, a2
3617 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
3618
3619 cvt.s.l f0, f0
3620/* File: mips64/fcvtFooter.S */
3621 /*
3622 * Stores a specified register containing the result of conversion
3623 * from or to a floating-point type and jumps to the next instruction.
3624 *
3625 * Expects a1 to contain the destination Dalvik register number.
3626 * a1 is set up by fcvtHeader.S.
3627 *
3628 * For: int-to-float, int-to-double, long-to-float, long-to-double,
3629 * float-to-int, float-to-long, float-to-double, double-to-int,
3630 * double-to-long, double-to-float, neg-float, neg-double.
3631 *
3632 * Note that this file can't be included after a break in other files
3633 * and in those files its contents appear as a copy.
3634 * See: float-to-int, float-to-long, double-to-int, double-to-long.
3635 */
3636 GET_INST_OPCODE v0 # extract opcode from rINST
3637 SET_VREG_FLOAT f0, a1
3638 GOTO_OPCODE v0 # jump to next instruction
3639
3640
3641/* ------------------------------ */
3642 .balign 128
3643.L_op_long_to_double: /* 0x86 */
3644/* File: mips64/op_long_to_double.S */
3645 /*
3646 * Conversion from or to floating-point happens in a floating-point register.
3647 * Therefore we load the input and store the output into or from a
3648 * floating-point register irrespective of the type.
3649 */
3650/* File: mips64/fcvtHeader.S */
3651 /*
3652 * Loads a specified register from vB. Used primarily for conversions
3653 * from or to a floating-point type.
3654 *
3655 * Sets up a1 = A and a2 = B. a2 is later used by fcvtFooter.S to
3656 * store the result in vA and jump to the next instruction.
3657 *
3658 * For: int-to-float, int-to-double, long-to-float, long-to-double,
3659 * float-to-int, float-to-long, float-to-double, double-to-int,
3660 * double-to-long, double-to-float, neg-float, neg-double.
3661 */
3662 ext a1, rINST, 8, 4 # a1 <- A
3663 srl a2, rINST, 12 # a2 <- B
3664 GET_VREG_DOUBLE f0, a2
3665 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
3666
3667 cvt.d.l f0, f0
3668/* File: mips64/fcvtFooter.S */
3669 /*
3670 * Stores a specified register containing the result of conversion
3671 * from or to a floating-point type and jumps to the next instruction.
3672 *
3673 * Expects a1 to contain the destination Dalvik register number.
3674 * a1 is set up by fcvtHeader.S.
3675 *
3676 * For: int-to-float, int-to-double, long-to-float, long-to-double,
3677 * float-to-int, float-to-long, float-to-double, double-to-int,
3678 * double-to-long, double-to-float, neg-float, neg-double.
3679 *
3680 * Note that this file can't be included after a break in other files
3681 * and in those files its contents appear as a copy.
3682 * See: float-to-int, float-to-long, double-to-int, double-to-long.
3683 */
3684 GET_INST_OPCODE v0 # extract opcode from rINST
3685 SET_VREG_DOUBLE f0, a1
3686 GOTO_OPCODE v0 # jump to next instruction
3687
3688
3689/* ------------------------------ */
3690 .balign 128
3691.L_op_float_to_int: /* 0x87 */
3692/* File: mips64/op_float_to_int.S */
3693/* File: mips64/fcvtHeader.S */
3694 /*
3695 * Loads a specified register from vB. Used primarily for conversions
3696 * from or to a floating-point type.
3697 *
3698 * Sets up a1 = A and a2 = B. a2 is later used by fcvtFooter.S to
3699 * store the result in vA and jump to the next instruction.
3700 *
3701 * For: int-to-float, int-to-double, long-to-float, long-to-double,
3702 * float-to-int, float-to-long, float-to-double, double-to-int,
3703 * double-to-long, double-to-float, neg-float, neg-double.
3704 */
3705 ext a1, rINST, 8, 4 # a1 <- A
3706 srl a2, rINST, 12 # a2 <- B
3707 GET_VREG_FLOAT f0, a2
3708 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
3709
3710 /*
3711 * TODO: simplify this when the MIPS64R6 emulator
3712 * supports NAN2008=1.
3713 */
3714 li t0, INT_MIN_AS_FLOAT
3715 mtc1 t0, f1
3716 cmp.le.s f1, f1, f0
3717 bc1nez f1, .Lop_float_to_int_trunc
3718 cmp.eq.s f1, f0, f0
3719 li t0, INT_MIN
3720 mfc1 t1, f1
3721 and t0, t0, t1
3722 b .Lop_float_to_int_done
3723
3724/* ------------------------------ */
3725 .balign 128
3726.L_op_float_to_long: /* 0x88 */
3727/* File: mips64/op_float_to_long.S */
3728/* File: mips64/fcvtHeader.S */
3729 /*
3730 * Loads a specified register from vB. Used primarily for conversions
3731 * from or to a floating-point type.
3732 *
3733 * Sets up a1 = A and a2 = B. a2 is later used by fcvtFooter.S to
3734 * store the result in vA and jump to the next instruction.
3735 *
3736 * For: int-to-float, int-to-double, long-to-float, long-to-double,
3737 * float-to-int, float-to-long, float-to-double, double-to-int,
3738 * double-to-long, double-to-float, neg-float, neg-double.
3739 */
3740 ext a1, rINST, 8, 4 # a1 <- A
3741 srl a2, rINST, 12 # a2 <- B
3742 GET_VREG_FLOAT f0, a2
3743 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
3744
3745 /*
3746 * TODO: simplify this when the MIPS64R6 emulator
3747 * supports NAN2008=1.
3748 */
3749 li t0, LONG_MIN_AS_FLOAT
3750 mtc1 t0, f1
3751 cmp.le.s f1, f1, f0
3752 bc1nez f1, .Lop_float_to_long_trunc
3753 cmp.eq.s f1, f0, f0
3754 dli t0, LONG_MIN
3755 mfc1 t1, f1
3756 and t0, t0, t1
3757 b .Lop_float_to_long_done
3758
3759/* ------------------------------ */
3760 .balign 128
3761.L_op_float_to_double: /* 0x89 */
3762/* File: mips64/op_float_to_double.S */
3763 /*
3764 * Conversion from or to floating-point happens in a floating-point register.
3765 * Therefore we load the input and store the output into or from a
3766 * floating-point register irrespective of the type.
3767 */
3768/* File: mips64/fcvtHeader.S */
3769 /*
3770 * Loads a specified register from vB. Used primarily for conversions
3771 * from or to a floating-point type.
3772 *
3773 * Sets up a1 = A and a2 = B. a2 is later used by fcvtFooter.S to
3774 * store the result in vA and jump to the next instruction.
3775 *
3776 * For: int-to-float, int-to-double, long-to-float, long-to-double,
3777 * float-to-int, float-to-long, float-to-double, double-to-int,
3778 * double-to-long, double-to-float, neg-float, neg-double.
3779 */
3780 ext a1, rINST, 8, 4 # a1 <- A
3781 srl a2, rINST, 12 # a2 <- B
3782 GET_VREG_FLOAT f0, a2
3783 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
3784
3785 cvt.d.s f0, f0
3786/* File: mips64/fcvtFooter.S */
3787 /*
3788 * Stores a specified register containing the result of conversion
3789 * from or to a floating-point type and jumps to the next instruction.
3790 *
3791 * Expects a1 to contain the destination Dalvik register number.
3792 * a1 is set up by fcvtHeader.S.
3793 *
3794 * For: int-to-float, int-to-double, long-to-float, long-to-double,
3795 * float-to-int, float-to-long, float-to-double, double-to-int,
3796 * double-to-long, double-to-float, neg-float, neg-double.
3797 *
3798 * Note that this file can't be included after a break in other files
3799 * and in those files its contents appear as a copy.
3800 * See: float-to-int, float-to-long, double-to-int, double-to-long.
3801 */
3802 GET_INST_OPCODE v0 # extract opcode from rINST
3803 SET_VREG_DOUBLE f0, a1
3804 GOTO_OPCODE v0 # jump to next instruction
3805
3806
3807/* ------------------------------ */
3808 .balign 128
3809.L_op_double_to_int: /* 0x8a */
3810/* File: mips64/op_double_to_int.S */
3811/* File: mips64/fcvtHeader.S */
3812 /*
3813 * Loads a specified register from vB. Used primarily for conversions
3814 * from or to a floating-point type.
3815 *
3816 * Sets up a1 = A and a2 = B. a2 is later used by fcvtFooter.S to
3817 * store the result in vA and jump to the next instruction.
3818 *
3819 * For: int-to-float, int-to-double, long-to-float, long-to-double,
3820 * float-to-int, float-to-long, float-to-double, double-to-int,
3821 * double-to-long, double-to-float, neg-float, neg-double.
3822 */
3823 ext a1, rINST, 8, 4 # a1 <- A
3824 srl a2, rINST, 12 # a2 <- B
3825 GET_VREG_DOUBLE f0, a2
3826 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
3827
3828 /*
3829 * TODO: simplify this when the MIPS64R6 emulator
3830 * supports NAN2008=1.
3831 */
3832 dli t0, INT_MIN_AS_DOUBLE
3833 dmtc1 t0, f1
3834 cmp.le.d f1, f1, f0
3835 bc1nez f1, .Lop_double_to_int_trunc
3836 cmp.eq.d f1, f0, f0
3837 li t0, INT_MIN
3838 mfc1 t1, f1
3839 and t0, t0, t1
3840 b .Lop_double_to_int_done
3841
3842/* ------------------------------ */
3843 .balign 128
3844.L_op_double_to_long: /* 0x8b */
3845/* File: mips64/op_double_to_long.S */
3846/* File: mips64/fcvtHeader.S */
3847 /*
3848 * Loads a specified register from vB. Used primarily for conversions
3849 * from or to a floating-point type.
3850 *
3851 * Sets up a1 = A and a2 = B. a2 is later used by fcvtFooter.S to
3852 * store the result in vA and jump to the next instruction.
3853 *
3854 * For: int-to-float, int-to-double, long-to-float, long-to-double,
3855 * float-to-int, float-to-long, float-to-double, double-to-int,
3856 * double-to-long, double-to-float, neg-float, neg-double.
3857 */
3858 ext a1, rINST, 8, 4 # a1 <- A
3859 srl a2, rINST, 12 # a2 <- B
3860 GET_VREG_DOUBLE f0, a2
3861 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
3862
3863 /*
3864 * TODO: simplify this when the MIPS64R6 emulator
3865 * supports NAN2008=1.
3866 */
3867 dli t0, LONG_MIN_AS_DOUBLE
3868 dmtc1 t0, f1
3869 cmp.le.d f1, f1, f0
3870 bc1nez f1, .Lop_double_to_long_trunc
3871 cmp.eq.d f1, f0, f0
3872 dli t0, LONG_MIN
3873 mfc1 t1, f1
3874 and t0, t0, t1
3875 b .Lop_double_to_long_done
3876
3877/* ------------------------------ */
3878 .balign 128
3879.L_op_double_to_float: /* 0x8c */
3880/* File: mips64/op_double_to_float.S */
3881 /*
3882 * Conversion from or to floating-point happens in a floating-point register.
3883 * Therefore we load the input and store the output into or from a
3884 * floating-point register irrespective of the type.
3885 */
3886/* File: mips64/fcvtHeader.S */
3887 /*
3888 * Loads a specified register from vB. Used primarily for conversions
3889 * from or to a floating-point type.
3890 *
3891 * Sets up a1 = A and a2 = B. a2 is later used by fcvtFooter.S to
3892 * store the result in vA and jump to the next instruction.
3893 *
3894 * For: int-to-float, int-to-double, long-to-float, long-to-double,
3895 * float-to-int, float-to-long, float-to-double, double-to-int,
3896 * double-to-long, double-to-float, neg-float, neg-double.
3897 */
3898 ext a1, rINST, 8, 4 # a1 <- A
3899 srl a2, rINST, 12 # a2 <- B
3900 GET_VREG_DOUBLE f0, a2
3901 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
3902
3903 cvt.s.d f0, f0
3904/* File: mips64/fcvtFooter.S */
3905 /*
3906 * Stores a specified register containing the result of conversion
3907 * from or to a floating-point type and jumps to the next instruction.
3908 *
3909 * Expects a1 to contain the destination Dalvik register number.
3910 * a1 is set up by fcvtHeader.S.
3911 *
3912 * For: int-to-float, int-to-double, long-to-float, long-to-double,
3913 * float-to-int, float-to-long, float-to-double, double-to-int,
3914 * double-to-long, double-to-float, neg-float, neg-double.
3915 *
3916 * Note that this file can't be included after a break in other files
3917 * and in those files its contents appear as a copy.
3918 * See: float-to-int, float-to-long, double-to-int, double-to-long.
3919 */
3920 GET_INST_OPCODE v0 # extract opcode from rINST
3921 SET_VREG_FLOAT f0, a1
3922 GOTO_OPCODE v0 # jump to next instruction
3923
3924
3925/* ------------------------------ */
3926 .balign 128
3927.L_op_int_to_byte: /* 0x8d */
3928/* File: mips64/op_int_to_byte.S */
3929/* File: mips64/unop.S */
3930 /*
3931 * Generic 32-bit unary operation. Provide an "instr" line that
3932 * specifies an instruction that performs "a0 = op a0".
3933 *
3934 * for: int-to-byte, int-to-char, int-to-short,
3935 * not-int, neg-int
3936 */
3937 /* unop vA, vB */
3938 ext a3, rINST, 12, 4 # a3 <- B
3939 GET_VREG a0, a3 # a0 <- vB
3940 ext a2, rINST, 8, 4 # a2 <- A
3941 # optional op
3942 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
3943 seb a0, a0 # a0 <- op, a0-a3 changed
3944 GET_INST_OPCODE v0 # extract opcode from rINST
3945 SET_VREG a0, a2 # vA <- a0
3946 GOTO_OPCODE v0 # jump to next instruction
3947
3948
3949/* ------------------------------ */
3950 .balign 128
3951.L_op_int_to_char: /* 0x8e */
3952/* File: mips64/op_int_to_char.S */
3953/* File: mips64/unop.S */
3954 /*
3955 * Generic 32-bit unary operation. Provide an "instr" line that
3956 * specifies an instruction that performs "a0 = op a0".
3957 *
3958 * for: int-to-byte, int-to-char, int-to-short,
3959 * not-int, neg-int
3960 */
3961 /* unop vA, vB */
3962 ext a3, rINST, 12, 4 # a3 <- B
3963 GET_VREG a0, a3 # a0 <- vB
3964 ext a2, rINST, 8, 4 # a2 <- A
3965 # optional op
3966 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
3967 and a0, a0, 0xffff # a0 <- op, a0-a3 changed
3968 GET_INST_OPCODE v0 # extract opcode from rINST
3969 SET_VREG a0, a2 # vA <- a0
3970 GOTO_OPCODE v0 # jump to next instruction
3971
3972
3973/* ------------------------------ */
3974 .balign 128
3975.L_op_int_to_short: /* 0x8f */
3976/* File: mips64/op_int_to_short.S */
3977/* File: mips64/unop.S */
3978 /*
3979 * Generic 32-bit unary operation. Provide an "instr" line that
3980 * specifies an instruction that performs "a0 = op a0".
3981 *
3982 * for: int-to-byte, int-to-char, int-to-short,
3983 * not-int, neg-int
3984 */
3985 /* unop vA, vB */
3986 ext a3, rINST, 12, 4 # a3 <- B
3987 GET_VREG a0, a3 # a0 <- vB
3988 ext a2, rINST, 8, 4 # a2 <- A
3989 # optional op
3990 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
3991 seh a0, a0 # a0 <- op, a0-a3 changed
3992 GET_INST_OPCODE v0 # extract opcode from rINST
3993 SET_VREG a0, a2 # vA <- a0
3994 GOTO_OPCODE v0 # jump to next instruction
3995
3996
3997/* ------------------------------ */
3998 .balign 128
3999.L_op_add_int: /* 0x90 */
4000/* File: mips64/op_add_int.S */
4001/* File: mips64/binop.S */
4002 /*
4003 * Generic 32-bit binary operation. Provide an "instr" line that
4004 * specifies an instruction that performs "result = a0 op a1".
4005 * This could be a MIPS instruction or a function call. (If the result
4006 * comes back in a register other than a0, you can override "result".)
4007 *
4008 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4009 * vCC (a1). Useful for integer division and modulus. Note that we
4010 * *don't* check for (INT_MIN / -1) here, because the CPU handles it
4011 * correctly.
4012 *
4013 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4014 * xor-int, shl-int, shr-int, ushr-int
4015 */
4016 /* binop vAA, vBB, vCC */
4017 srl a4, rINST, 8 # a4 <- AA
4018 lbu a2, 2(rPC) # a2 <- BB
4019 lbu a3, 3(rPC) # a3 <- CC
4020 GET_VREG a0, a2 # a0 <- vBB
4021 GET_VREG a1, a3 # a1 <- vCC
4022 .if 0
4023 beqz a1, common_errDivideByZero # is second operand zero?
4024 .endif
4025 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
4026 # optional op
4027 addu a0, a0, a1 # a0 <- op, a0-a3 changed
4028 GET_INST_OPCODE v0 # extract opcode from rINST
4029 SET_VREG a0, a4 # vAA <- a0
4030 GOTO_OPCODE v0 # jump to next instruction
4031
4032
4033/* ------------------------------ */
4034 .balign 128
4035.L_op_sub_int: /* 0x91 */
4036/* File: mips64/op_sub_int.S */
4037/* File: mips64/binop.S */
4038 /*
4039 * Generic 32-bit binary operation. Provide an "instr" line that
4040 * specifies an instruction that performs "result = a0 op a1".
4041 * This could be a MIPS instruction or a function call. (If the result
4042 * comes back in a register other than a0, you can override "result".)
4043 *
4044 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4045 * vCC (a1). Useful for integer division and modulus. Note that we
4046 * *don't* check for (INT_MIN / -1) here, because the CPU handles it
4047 * correctly.
4048 *
4049 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4050 * xor-int, shl-int, shr-int, ushr-int
4051 */
4052 /* binop vAA, vBB, vCC */
4053 srl a4, rINST, 8 # a4 <- AA
4054 lbu a2, 2(rPC) # a2 <- BB
4055 lbu a3, 3(rPC) # a3 <- CC
4056 GET_VREG a0, a2 # a0 <- vBB
4057 GET_VREG a1, a3 # a1 <- vCC
4058 .if 0
4059 beqz a1, common_errDivideByZero # is second operand zero?
4060 .endif
4061 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
4062 # optional op
4063 subu a0, a0, a1 # a0 <- op, a0-a3 changed
4064 GET_INST_OPCODE v0 # extract opcode from rINST
4065 SET_VREG a0, a4 # vAA <- a0
4066 GOTO_OPCODE v0 # jump to next instruction
4067
4068
4069/* ------------------------------ */
4070 .balign 128
4071.L_op_mul_int: /* 0x92 */
4072/* File: mips64/op_mul_int.S */
4073/* File: mips64/binop.S */
4074 /*
4075 * Generic 32-bit binary operation. Provide an "instr" line that
4076 * specifies an instruction that performs "result = a0 op a1".
4077 * This could be a MIPS instruction or a function call. (If the result
4078 * comes back in a register other than a0, you can override "result".)
4079 *
4080 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4081 * vCC (a1). Useful for integer division and modulus. Note that we
4082 * *don't* check for (INT_MIN / -1) here, because the CPU handles it
4083 * correctly.
4084 *
4085 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4086 * xor-int, shl-int, shr-int, ushr-int
4087 */
4088 /* binop vAA, vBB, vCC */
4089 srl a4, rINST, 8 # a4 <- AA
4090 lbu a2, 2(rPC) # a2 <- BB
4091 lbu a3, 3(rPC) # a3 <- CC
4092 GET_VREG a0, a2 # a0 <- vBB
4093 GET_VREG a1, a3 # a1 <- vCC
4094 .if 0
4095 beqz a1, common_errDivideByZero # is second operand zero?
4096 .endif
4097 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
4098 # optional op
4099 mul a0, a0, a1 # a0 <- op, a0-a3 changed
4100 GET_INST_OPCODE v0 # extract opcode from rINST
4101 SET_VREG a0, a4 # vAA <- a0
4102 GOTO_OPCODE v0 # jump to next instruction
4103
4104
4105/* ------------------------------ */
4106 .balign 128
4107.L_op_div_int: /* 0x93 */
4108/* File: mips64/op_div_int.S */
4109/* File: mips64/binop.S */
4110 /*
4111 * Generic 32-bit binary operation. Provide an "instr" line that
4112 * specifies an instruction that performs "result = a0 op a1".
4113 * This could be a MIPS instruction or a function call. (If the result
4114 * comes back in a register other than a0, you can override "result".)
4115 *
4116 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4117 * vCC (a1). Useful for integer division and modulus. Note that we
4118 * *don't* check for (INT_MIN / -1) here, because the CPU handles it
4119 * correctly.
4120 *
4121 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4122 * xor-int, shl-int, shr-int, ushr-int
4123 */
4124 /* binop vAA, vBB, vCC */
4125 srl a4, rINST, 8 # a4 <- AA
4126 lbu a2, 2(rPC) # a2 <- BB
4127 lbu a3, 3(rPC) # a3 <- CC
4128 GET_VREG a0, a2 # a0 <- vBB
4129 GET_VREG a1, a3 # a1 <- vCC
4130 .if 1
4131 beqz a1, common_errDivideByZero # is second operand zero?
4132 .endif
4133 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
4134 # optional op
4135 div a0, a0, a1 # a0 <- op, a0-a3 changed
4136 GET_INST_OPCODE v0 # extract opcode from rINST
4137 SET_VREG a0, a4 # vAA <- a0
4138 GOTO_OPCODE v0 # jump to next instruction
4139
4140
4141/* ------------------------------ */
4142 .balign 128
4143.L_op_rem_int: /* 0x94 */
4144/* File: mips64/op_rem_int.S */
4145/* File: mips64/binop.S */
4146 /*
4147 * Generic 32-bit binary operation. Provide an "instr" line that
4148 * specifies an instruction that performs "result = a0 op a1".
4149 * This could be a MIPS instruction or a function call. (If the result
4150 * comes back in a register other than a0, you can override "result".)
4151 *
4152 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4153 * vCC (a1). Useful for integer division and modulus. Note that we
4154 * *don't* check for (INT_MIN / -1) here, because the CPU handles it
4155 * correctly.
4156 *
4157 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4158 * xor-int, shl-int, shr-int, ushr-int
4159 */
4160 /* binop vAA, vBB, vCC */
4161 srl a4, rINST, 8 # a4 <- AA
4162 lbu a2, 2(rPC) # a2 <- BB
4163 lbu a3, 3(rPC) # a3 <- CC
4164 GET_VREG a0, a2 # a0 <- vBB
4165 GET_VREG a1, a3 # a1 <- vCC
4166 .if 1
4167 beqz a1, common_errDivideByZero # is second operand zero?
4168 .endif
4169 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
4170 # optional op
4171 mod a0, a0, a1 # a0 <- op, a0-a3 changed
4172 GET_INST_OPCODE v0 # extract opcode from rINST
4173 SET_VREG a0, a4 # vAA <- a0
4174 GOTO_OPCODE v0 # jump to next instruction
4175
4176
4177/* ------------------------------ */
4178 .balign 128
4179.L_op_and_int: /* 0x95 */
4180/* File: mips64/op_and_int.S */
4181/* File: mips64/binop.S */
4182 /*
4183 * Generic 32-bit binary operation. Provide an "instr" line that
4184 * specifies an instruction that performs "result = a0 op a1".
4185 * This could be a MIPS instruction or a function call. (If the result
4186 * comes back in a register other than a0, you can override "result".)
4187 *
4188 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4189 * vCC (a1). Useful for integer division and modulus. Note that we
4190 * *don't* check for (INT_MIN / -1) here, because the CPU handles it
4191 * correctly.
4192 *
4193 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4194 * xor-int, shl-int, shr-int, ushr-int
4195 */
4196 /* binop vAA, vBB, vCC */
4197 srl a4, rINST, 8 # a4 <- AA
4198 lbu a2, 2(rPC) # a2 <- BB
4199 lbu a3, 3(rPC) # a3 <- CC
4200 GET_VREG a0, a2 # a0 <- vBB
4201 GET_VREG a1, a3 # a1 <- vCC
4202 .if 0
4203 beqz a1, common_errDivideByZero # is second operand zero?
4204 .endif
4205 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
4206 # optional op
4207 and a0, a0, a1 # a0 <- op, a0-a3 changed
4208 GET_INST_OPCODE v0 # extract opcode from rINST
4209 SET_VREG a0, a4 # vAA <- a0
4210 GOTO_OPCODE v0 # jump to next instruction
4211
4212
4213/* ------------------------------ */
4214 .balign 128
4215.L_op_or_int: /* 0x96 */
4216/* File: mips64/op_or_int.S */
4217/* File: mips64/binop.S */
4218 /*
4219 * Generic 32-bit binary operation. Provide an "instr" line that
4220 * specifies an instruction that performs "result = a0 op a1".
4221 * This could be a MIPS instruction or a function call. (If the result
4222 * comes back in a register other than a0, you can override "result".)
4223 *
4224 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4225 * vCC (a1). Useful for integer division and modulus. Note that we
4226 * *don't* check for (INT_MIN / -1) here, because the CPU handles it
4227 * correctly.
4228 *
4229 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4230 * xor-int, shl-int, shr-int, ushr-int
4231 */
4232 /* binop vAA, vBB, vCC */
4233 srl a4, rINST, 8 # a4 <- AA
4234 lbu a2, 2(rPC) # a2 <- BB
4235 lbu a3, 3(rPC) # a3 <- CC
4236 GET_VREG a0, a2 # a0 <- vBB
4237 GET_VREG a1, a3 # a1 <- vCC
4238 .if 0
4239 beqz a1, common_errDivideByZero # is second operand zero?
4240 .endif
4241 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
4242 # optional op
4243 or a0, a0, a1 # a0 <- op, a0-a3 changed
4244 GET_INST_OPCODE v0 # extract opcode from rINST
4245 SET_VREG a0, a4 # vAA <- a0
4246 GOTO_OPCODE v0 # jump to next instruction
4247
4248
4249/* ------------------------------ */
4250 .balign 128
4251.L_op_xor_int: /* 0x97 */
4252/* File: mips64/op_xor_int.S */
4253/* File: mips64/binop.S */
4254 /*
4255 * Generic 32-bit binary operation. Provide an "instr" line that
4256 * specifies an instruction that performs "result = a0 op a1".
4257 * This could be a MIPS instruction or a function call. (If the result
4258 * comes back in a register other than a0, you can override "result".)
4259 *
4260 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4261 * vCC (a1). Useful for integer division and modulus. Note that we
4262 * *don't* check for (INT_MIN / -1) here, because the CPU handles it
4263 * correctly.
4264 *
4265 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4266 * xor-int, shl-int, shr-int, ushr-int
4267 */
4268 /* binop vAA, vBB, vCC */
4269 srl a4, rINST, 8 # a4 <- AA
4270 lbu a2, 2(rPC) # a2 <- BB
4271 lbu a3, 3(rPC) # a3 <- CC
4272 GET_VREG a0, a2 # a0 <- vBB
4273 GET_VREG a1, a3 # a1 <- vCC
4274 .if 0
4275 beqz a1, common_errDivideByZero # is second operand zero?
4276 .endif
4277 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
4278 # optional op
4279 xor a0, a0, a1 # a0 <- op, a0-a3 changed
4280 GET_INST_OPCODE v0 # extract opcode from rINST
4281 SET_VREG a0, a4 # vAA <- a0
4282 GOTO_OPCODE v0 # jump to next instruction
4283
4284
4285/* ------------------------------ */
4286 .balign 128
4287.L_op_shl_int: /* 0x98 */
4288/* File: mips64/op_shl_int.S */
4289/* File: mips64/binop.S */
4290 /*
4291 * Generic 32-bit binary operation. Provide an "instr" line that
4292 * specifies an instruction that performs "result = a0 op a1".
4293 * This could be a MIPS instruction or a function call. (If the result
4294 * comes back in a register other than a0, you can override "result".)
4295 *
4296 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4297 * vCC (a1). Useful for integer division and modulus. Note that we
4298 * *don't* check for (INT_MIN / -1) here, because the CPU handles it
4299 * correctly.
4300 *
4301 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4302 * xor-int, shl-int, shr-int, ushr-int
4303 */
4304 /* binop vAA, vBB, vCC */
4305 srl a4, rINST, 8 # a4 <- AA
4306 lbu a2, 2(rPC) # a2 <- BB
4307 lbu a3, 3(rPC) # a3 <- CC
4308 GET_VREG a0, a2 # a0 <- vBB
4309 GET_VREG a1, a3 # a1 <- vCC
4310 .if 0
4311 beqz a1, common_errDivideByZero # is second operand zero?
4312 .endif
4313 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
4314 # optional op
4315 sll a0, a0, a1 # a0 <- op, a0-a3 changed
4316 GET_INST_OPCODE v0 # extract opcode from rINST
4317 SET_VREG a0, a4 # vAA <- a0
4318 GOTO_OPCODE v0 # jump to next instruction
4319
4320
4321/* ------------------------------ */
4322 .balign 128
4323.L_op_shr_int: /* 0x99 */
4324/* File: mips64/op_shr_int.S */
4325/* File: mips64/binop.S */
4326 /*
4327 * Generic 32-bit binary operation. Provide an "instr" line that
4328 * specifies an instruction that performs "result = a0 op a1".
4329 * This could be a MIPS instruction or a function call. (If the result
4330 * comes back in a register other than a0, you can override "result".)
4331 *
4332 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4333 * vCC (a1). Useful for integer division and modulus. Note that we
4334 * *don't* check for (INT_MIN / -1) here, because the CPU handles it
4335 * correctly.
4336 *
4337 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4338 * xor-int, shl-int, shr-int, ushr-int
4339 */
4340 /* binop vAA, vBB, vCC */
4341 srl a4, rINST, 8 # a4 <- AA
4342 lbu a2, 2(rPC) # a2 <- BB
4343 lbu a3, 3(rPC) # a3 <- CC
4344 GET_VREG a0, a2 # a0 <- vBB
4345 GET_VREG a1, a3 # a1 <- vCC
4346 .if 0
4347 beqz a1, common_errDivideByZero # is second operand zero?
4348 .endif
4349 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
4350 # optional op
4351 sra a0, a0, a1 # a0 <- op, a0-a3 changed
4352 GET_INST_OPCODE v0 # extract opcode from rINST
4353 SET_VREG a0, a4 # vAA <- a0
4354 GOTO_OPCODE v0 # jump to next instruction
4355
4356
4357/* ------------------------------ */
4358 .balign 128
4359.L_op_ushr_int: /* 0x9a */
4360/* File: mips64/op_ushr_int.S */
4361/* File: mips64/binop.S */
4362 /*
4363 * Generic 32-bit binary operation. Provide an "instr" line that
4364 * specifies an instruction that performs "result = a0 op a1".
4365 * This could be a MIPS instruction or a function call. (If the result
4366 * comes back in a register other than a0, you can override "result".)
4367 *
4368 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4369 * vCC (a1). Useful for integer division and modulus. Note that we
4370 * *don't* check for (INT_MIN / -1) here, because the CPU handles it
4371 * correctly.
4372 *
4373 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4374 * xor-int, shl-int, shr-int, ushr-int
4375 */
4376 /* binop vAA, vBB, vCC */
4377 srl a4, rINST, 8 # a4 <- AA
4378 lbu a2, 2(rPC) # a2 <- BB
4379 lbu a3, 3(rPC) # a3 <- CC
4380 GET_VREG a0, a2 # a0 <- vBB
4381 GET_VREG a1, a3 # a1 <- vCC
4382 .if 0
4383 beqz a1, common_errDivideByZero # is second operand zero?
4384 .endif
4385 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
4386 # optional op
4387 srl a0, a0, a1 # a0 <- op, a0-a3 changed
4388 GET_INST_OPCODE v0 # extract opcode from rINST
4389 SET_VREG a0, a4 # vAA <- a0
4390 GOTO_OPCODE v0 # jump to next instruction
4391
4392
4393/* ------------------------------ */
4394 .balign 128
4395.L_op_add_long: /* 0x9b */
4396/* File: mips64/op_add_long.S */
4397/* File: mips64/binopWide.S */
4398 /*
4399 * Generic 64-bit binary operation. Provide an "instr" line that
4400 * specifies an instruction that performs "result = a0 op a1".
4401 * This could be a MIPS instruction or a function call. (If the result
4402 * comes back in a register other than a0, you can override "result".)
4403 *
4404 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4405 * vCC (a1). Useful for integer division and modulus. Note that we
4406 * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
4407 * correctly.
4408 *
4409 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4410 * xor-long, shl-long, shr-long, ushr-long
4411 */
4412 /* binop vAA, vBB, vCC */
4413 srl a4, rINST, 8 # a4 <- AA
4414 lbu a2, 2(rPC) # a2 <- BB
4415 lbu a3, 3(rPC) # a3 <- CC
4416 GET_VREG_WIDE a0, a2 # a0 <- vBB
4417 GET_VREG_WIDE a1, a3 # a1 <- vCC
4418 .if 0
4419 beqz a1, common_errDivideByZero # is second operand zero?
4420 .endif
4421 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
4422 # optional op
4423 daddu a0, a0, a1 # a0 <- op, a0-a3 changed
4424 GET_INST_OPCODE v0 # extract opcode from rINST
4425 SET_VREG_WIDE a0, a4 # vAA <- a0
4426 GOTO_OPCODE v0 # jump to next instruction
4427
4428
4429/* ------------------------------ */
4430 .balign 128
4431.L_op_sub_long: /* 0x9c */
4432/* File: mips64/op_sub_long.S */
4433/* File: mips64/binopWide.S */
4434 /*
4435 * Generic 64-bit binary operation. Provide an "instr" line that
4436 * specifies an instruction that performs "result = a0 op a1".
4437 * This could be a MIPS instruction or a function call. (If the result
4438 * comes back in a register other than a0, you can override "result".)
4439 *
4440 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4441 * vCC (a1). Useful for integer division and modulus. Note that we
4442 * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
4443 * correctly.
4444 *
4445 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4446 * xor-long, shl-long, shr-long, ushr-long
4447 */
4448 /* binop vAA, vBB, vCC */
4449 srl a4, rINST, 8 # a4 <- AA
4450 lbu a2, 2(rPC) # a2 <- BB
4451 lbu a3, 3(rPC) # a3 <- CC
4452 GET_VREG_WIDE a0, a2 # a0 <- vBB
4453 GET_VREG_WIDE a1, a3 # a1 <- vCC
4454 .if 0
4455 beqz a1, common_errDivideByZero # is second operand zero?
4456 .endif
4457 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
4458 # optional op
4459 dsubu a0, a0, a1 # a0 <- op, a0-a3 changed
4460 GET_INST_OPCODE v0 # extract opcode from rINST
4461 SET_VREG_WIDE a0, a4 # vAA <- a0
4462 GOTO_OPCODE v0 # jump to next instruction
4463
4464
4465/* ------------------------------ */
4466 .balign 128
4467.L_op_mul_long: /* 0x9d */
4468/* File: mips64/op_mul_long.S */
4469/* File: mips64/binopWide.S */
4470 /*
4471 * Generic 64-bit binary operation. Provide an "instr" line that
4472 * specifies an instruction that performs "result = a0 op a1".
4473 * This could be a MIPS instruction or a function call. (If the result
4474 * comes back in a register other than a0, you can override "result".)
4475 *
4476 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4477 * vCC (a1). Useful for integer division and modulus. Note that we
4478 * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
4479 * correctly.
4480 *
4481 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4482 * xor-long, shl-long, shr-long, ushr-long
4483 */
4484 /* binop vAA, vBB, vCC */
4485 srl a4, rINST, 8 # a4 <- AA
4486 lbu a2, 2(rPC) # a2 <- BB
4487 lbu a3, 3(rPC) # a3 <- CC
4488 GET_VREG_WIDE a0, a2 # a0 <- vBB
4489 GET_VREG_WIDE a1, a3 # a1 <- vCC
4490 .if 0
4491 beqz a1, common_errDivideByZero # is second operand zero?
4492 .endif
4493 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
4494 # optional op
4495 dmul a0, a0, a1 # a0 <- op, a0-a3 changed
4496 GET_INST_OPCODE v0 # extract opcode from rINST
4497 SET_VREG_WIDE a0, a4 # vAA <- a0
4498 GOTO_OPCODE v0 # jump to next instruction
4499
4500
4501/* ------------------------------ */
4502 .balign 128
4503.L_op_div_long: /* 0x9e */
4504/* File: mips64/op_div_long.S */
4505/* File: mips64/binopWide.S */
4506 /*
4507 * Generic 64-bit binary operation. Provide an "instr" line that
4508 * specifies an instruction that performs "result = a0 op a1".
4509 * This could be a MIPS instruction or a function call. (If the result
4510 * comes back in a register other than a0, you can override "result".)
4511 *
4512 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4513 * vCC (a1). Useful for integer division and modulus. Note that we
4514 * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
4515 * correctly.
4516 *
4517 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4518 * xor-long, shl-long, shr-long, ushr-long
4519 */
4520 /* binop vAA, vBB, vCC */
4521 srl a4, rINST, 8 # a4 <- AA
4522 lbu a2, 2(rPC) # a2 <- BB
4523 lbu a3, 3(rPC) # a3 <- CC
4524 GET_VREG_WIDE a0, a2 # a0 <- vBB
4525 GET_VREG_WIDE a1, a3 # a1 <- vCC
4526 .if 1
4527 beqz a1, common_errDivideByZero # is second operand zero?
4528 .endif
4529 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
4530 # optional op
4531 ddiv a0, a0, a1 # a0 <- op, a0-a3 changed
4532 GET_INST_OPCODE v0 # extract opcode from rINST
4533 SET_VREG_WIDE a0, a4 # vAA <- a0
4534 GOTO_OPCODE v0 # jump to next instruction
4535
4536
4537/* ------------------------------ */
4538 .balign 128
4539.L_op_rem_long: /* 0x9f */
4540/* File: mips64/op_rem_long.S */
4541/* File: mips64/binopWide.S */
4542 /*
4543 * Generic 64-bit binary operation. Provide an "instr" line that
4544 * specifies an instruction that performs "result = a0 op a1".
4545 * This could be a MIPS instruction or a function call. (If the result
4546 * comes back in a register other than a0, you can override "result".)
4547 *
4548 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4549 * vCC (a1). Useful for integer division and modulus. Note that we
4550 * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
4551 * correctly.
4552 *
4553 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4554 * xor-long, shl-long, shr-long, ushr-long
4555 */
4556 /* binop vAA, vBB, vCC */
4557 srl a4, rINST, 8 # a4 <- AA
4558 lbu a2, 2(rPC) # a2 <- BB
4559 lbu a3, 3(rPC) # a3 <- CC
4560 GET_VREG_WIDE a0, a2 # a0 <- vBB
4561 GET_VREG_WIDE a1, a3 # a1 <- vCC
4562 .if 1
4563 beqz a1, common_errDivideByZero # is second operand zero?
4564 .endif
4565 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
4566 # optional op
4567 dmod a0, a0, a1 # a0 <- op, a0-a3 changed
4568 GET_INST_OPCODE v0 # extract opcode from rINST
4569 SET_VREG_WIDE a0, a4 # vAA <- a0
4570 GOTO_OPCODE v0 # jump to next instruction
4571
4572
4573/* ------------------------------ */
4574 .balign 128
4575.L_op_and_long: /* 0xa0 */
4576/* File: mips64/op_and_long.S */
4577/* File: mips64/binopWide.S */
4578 /*
4579 * Generic 64-bit binary operation. Provide an "instr" line that
4580 * specifies an instruction that performs "result = a0 op a1".
4581 * This could be a MIPS instruction or a function call. (If the result
4582 * comes back in a register other than a0, you can override "result".)
4583 *
4584 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4585 * vCC (a1). Useful for integer division and modulus. Note that we
4586 * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
4587 * correctly.
4588 *
4589 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4590 * xor-long, shl-long, shr-long, ushr-long
4591 */
4592 /* binop vAA, vBB, vCC */
4593 srl a4, rINST, 8 # a4 <- AA
4594 lbu a2, 2(rPC) # a2 <- BB
4595 lbu a3, 3(rPC) # a3 <- CC
4596 GET_VREG_WIDE a0, a2 # a0 <- vBB
4597 GET_VREG_WIDE a1, a3 # a1 <- vCC
4598 .if 0
4599 beqz a1, common_errDivideByZero # is second operand zero?
4600 .endif
4601 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
4602 # optional op
4603 and a0, a0, a1 # a0 <- op, a0-a3 changed
4604 GET_INST_OPCODE v0 # extract opcode from rINST
4605 SET_VREG_WIDE a0, a4 # vAA <- a0
4606 GOTO_OPCODE v0 # jump to next instruction
4607
4608
4609/* ------------------------------ */
4610 .balign 128
4611.L_op_or_long: /* 0xa1 */
4612/* File: mips64/op_or_long.S */
4613/* File: mips64/binopWide.S */
4614 /*
4615 * Generic 64-bit binary operation. Provide an "instr" line that
4616 * specifies an instruction that performs "result = a0 op a1".
4617 * This could be a MIPS instruction or a function call. (If the result
4618 * comes back in a register other than a0, you can override "result".)
4619 *
4620 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4621 * vCC (a1). Useful for integer division and modulus. Note that we
4622 * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
4623 * correctly.
4624 *
4625 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4626 * xor-long, shl-long, shr-long, ushr-long
4627 */
4628 /* binop vAA, vBB, vCC */
4629 srl a4, rINST, 8 # a4 <- AA
4630 lbu a2, 2(rPC) # a2 <- BB
4631 lbu a3, 3(rPC) # a3 <- CC
4632 GET_VREG_WIDE a0, a2 # a0 <- vBB
4633 GET_VREG_WIDE a1, a3 # a1 <- vCC
4634 .if 0
4635 beqz a1, common_errDivideByZero # is second operand zero?
4636 .endif
4637 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
4638 # optional op
4639 or a0, a0, a1 # a0 <- op, a0-a3 changed
4640 GET_INST_OPCODE v0 # extract opcode from rINST
4641 SET_VREG_WIDE a0, a4 # vAA <- a0
4642 GOTO_OPCODE v0 # jump to next instruction
4643
4644
4645/* ------------------------------ */
4646 .balign 128
4647.L_op_xor_long: /* 0xa2 */
4648/* File: mips64/op_xor_long.S */
4649/* File: mips64/binopWide.S */
4650 /*
4651 * Generic 64-bit binary operation. Provide an "instr" line that
4652 * specifies an instruction that performs "result = a0 op a1".
4653 * This could be a MIPS instruction or a function call. (If the result
4654 * comes back in a register other than a0, you can override "result".)
4655 *
4656 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4657 * vCC (a1). Useful for integer division and modulus. Note that we
4658 * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
4659 * correctly.
4660 *
4661 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4662 * xor-long, shl-long, shr-long, ushr-long
4663 */
4664 /* binop vAA, vBB, vCC */
4665 srl a4, rINST, 8 # a4 <- AA
4666 lbu a2, 2(rPC) # a2 <- BB
4667 lbu a3, 3(rPC) # a3 <- CC
4668 GET_VREG_WIDE a0, a2 # a0 <- vBB
4669 GET_VREG_WIDE a1, a3 # a1 <- vCC
4670 .if 0
4671 beqz a1, common_errDivideByZero # is second operand zero?
4672 .endif
4673 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
4674 # optional op
4675 xor a0, a0, a1 # a0 <- op, a0-a3 changed
4676 GET_INST_OPCODE v0 # extract opcode from rINST
4677 SET_VREG_WIDE a0, a4 # vAA <- a0
4678 GOTO_OPCODE v0 # jump to next instruction
4679
4680
4681/* ------------------------------ */
4682 .balign 128
4683.L_op_shl_long: /* 0xa3 */
4684/* File: mips64/op_shl_long.S */
4685/* File: mips64/binopWide.S */
4686 /*
4687 * Generic 64-bit binary operation. Provide an "instr" line that
4688 * specifies an instruction that performs "result = a0 op a1".
4689 * This could be a MIPS instruction or a function call. (If the result
4690 * comes back in a register other than a0, you can override "result".)
4691 *
4692 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4693 * vCC (a1). Useful for integer division and modulus. Note that we
4694 * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
4695 * correctly.
4696 *
4697 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4698 * xor-long, shl-long, shr-long, ushr-long
4699 */
4700 /* binop vAA, vBB, vCC */
4701 srl a4, rINST, 8 # a4 <- AA
4702 lbu a2, 2(rPC) # a2 <- BB
4703 lbu a3, 3(rPC) # a3 <- CC
4704 GET_VREG_WIDE a0, a2 # a0 <- vBB
4705 GET_VREG_WIDE a1, a3 # a1 <- vCC
4706 .if 0
4707 beqz a1, common_errDivideByZero # is second operand zero?
4708 .endif
4709 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
4710 # optional op
4711 dsll a0, a0, a1 # a0 <- op, a0-a3 changed
4712 GET_INST_OPCODE v0 # extract opcode from rINST
4713 SET_VREG_WIDE a0, a4 # vAA <- a0
4714 GOTO_OPCODE v0 # jump to next instruction
4715
4716
4717/* ------------------------------ */
4718 .balign 128
4719.L_op_shr_long: /* 0xa4 */
4720/* File: mips64/op_shr_long.S */
4721/* File: mips64/binopWide.S */
4722 /*
4723 * Generic 64-bit binary operation. Provide an "instr" line that
4724 * specifies an instruction that performs "result = a0 op a1".
4725 * This could be a MIPS instruction or a function call. (If the result
4726 * comes back in a register other than a0, you can override "result".)
4727 *
4728 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4729 * vCC (a1). Useful for integer division and modulus. Note that we
4730 * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
4731 * correctly.
4732 *
4733 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4734 * xor-long, shl-long, shr-long, ushr-long
4735 */
4736 /* binop vAA, vBB, vCC */
4737 srl a4, rINST, 8 # a4 <- AA
4738 lbu a2, 2(rPC) # a2 <- BB
4739 lbu a3, 3(rPC) # a3 <- CC
4740 GET_VREG_WIDE a0, a2 # a0 <- vBB
4741 GET_VREG_WIDE a1, a3 # a1 <- vCC
4742 .if 0
4743 beqz a1, common_errDivideByZero # is second operand zero?
4744 .endif
4745 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
4746 # optional op
4747 dsra a0, a0, a1 # a0 <- op, a0-a3 changed
4748 GET_INST_OPCODE v0 # extract opcode from rINST
4749 SET_VREG_WIDE a0, a4 # vAA <- a0
4750 GOTO_OPCODE v0 # jump to next instruction
4751
4752
4753/* ------------------------------ */
4754 .balign 128
4755.L_op_ushr_long: /* 0xa5 */
4756/* File: mips64/op_ushr_long.S */
4757/* File: mips64/binopWide.S */
4758 /*
4759 * Generic 64-bit binary operation. Provide an "instr" line that
4760 * specifies an instruction that performs "result = a0 op a1".
4761 * This could be a MIPS instruction or a function call. (If the result
4762 * comes back in a register other than a0, you can override "result".)
4763 *
4764 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4765 * vCC (a1). Useful for integer division and modulus. Note that we
4766 * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
4767 * correctly.
4768 *
4769 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4770 * xor-long, shl-long, shr-long, ushr-long
4771 */
4772 /* binop vAA, vBB, vCC */
4773 srl a4, rINST, 8 # a4 <- AA
4774 lbu a2, 2(rPC) # a2 <- BB
4775 lbu a3, 3(rPC) # a3 <- CC
4776 GET_VREG_WIDE a0, a2 # a0 <- vBB
4777 GET_VREG_WIDE a1, a3 # a1 <- vCC
4778 .if 0
4779 beqz a1, common_errDivideByZero # is second operand zero?
4780 .endif
4781 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
4782 # optional op
4783 dsrl a0, a0, a1 # a0 <- op, a0-a3 changed
4784 GET_INST_OPCODE v0 # extract opcode from rINST
4785 SET_VREG_WIDE a0, a4 # vAA <- a0
4786 GOTO_OPCODE v0 # jump to next instruction
4787
4788
4789/* ------------------------------ */
4790 .balign 128
4791.L_op_add_float: /* 0xa6 */
4792/* File: mips64/op_add_float.S */
4793/* File: mips64/fbinop.S */
4794 /*:
4795 * Generic 32-bit floating-point operation.
4796 *
4797 * For: add-float, sub-float, mul-float, div-float.
4798 * form: <op> f0, f0, f1
4799 */
4800 /* binop vAA, vBB, vCC */
4801 srl a4, rINST, 8 # a4 <- AA
4802 lbu a2, 2(rPC) # a2 <- BB
4803 lbu a3, 3(rPC) # a3 <- CC
4804 GET_VREG_FLOAT f0, a2 # f0 <- vBB
4805 GET_VREG_FLOAT f1, a3 # f1 <- vCC
4806 add.s f0, f0, f1 # f0 <- f0 op f1
4807 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
4808 GET_INST_OPCODE v0 # extract opcode from rINST
4809 SET_VREG_FLOAT f0, a4 # vAA <- f0
4810 GOTO_OPCODE v0 # jump to next instruction
4811
4812
4813/* ------------------------------ */
4814 .balign 128
4815.L_op_sub_float: /* 0xa7 */
4816/* File: mips64/op_sub_float.S */
4817/* File: mips64/fbinop.S */
4818 /*:
4819 * Generic 32-bit floating-point operation.
4820 *
4821 * For: add-float, sub-float, mul-float, div-float.
4822 * form: <op> f0, f0, f1
4823 */
4824 /* binop vAA, vBB, vCC */
4825 srl a4, rINST, 8 # a4 <- AA
4826 lbu a2, 2(rPC) # a2 <- BB
4827 lbu a3, 3(rPC) # a3 <- CC
4828 GET_VREG_FLOAT f0, a2 # f0 <- vBB
4829 GET_VREG_FLOAT f1, a3 # f1 <- vCC
4830 sub.s f0, f0, f1 # f0 <- f0 op f1
4831 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
4832 GET_INST_OPCODE v0 # extract opcode from rINST
4833 SET_VREG_FLOAT f0, a4 # vAA <- f0
4834 GOTO_OPCODE v0 # jump to next instruction
4835
4836
4837/* ------------------------------ */
4838 .balign 128
4839.L_op_mul_float: /* 0xa8 */
4840/* File: mips64/op_mul_float.S */
4841/* File: mips64/fbinop.S */
4842 /*:
4843 * Generic 32-bit floating-point operation.
4844 *
4845 * For: add-float, sub-float, mul-float, div-float.
4846 * form: <op> f0, f0, f1
4847 */
4848 /* binop vAA, vBB, vCC */
4849 srl a4, rINST, 8 # a4 <- AA
4850 lbu a2, 2(rPC) # a2 <- BB
4851 lbu a3, 3(rPC) # a3 <- CC
4852 GET_VREG_FLOAT f0, a2 # f0 <- vBB
4853 GET_VREG_FLOAT f1, a3 # f1 <- vCC
4854 mul.s f0, f0, f1 # f0 <- f0 op f1
4855 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
4856 GET_INST_OPCODE v0 # extract opcode from rINST
4857 SET_VREG_FLOAT f0, a4 # vAA <- f0
4858 GOTO_OPCODE v0 # jump to next instruction
4859
4860
4861/* ------------------------------ */
4862 .balign 128
4863.L_op_div_float: /* 0xa9 */
4864/* File: mips64/op_div_float.S */
4865/* File: mips64/fbinop.S */
4866 /*:
4867 * Generic 32-bit floating-point operation.
4868 *
4869 * For: add-float, sub-float, mul-float, div-float.
4870 * form: <op> f0, f0, f1
4871 */
4872 /* binop vAA, vBB, vCC */
4873 srl a4, rINST, 8 # a4 <- AA
4874 lbu a2, 2(rPC) # a2 <- BB
4875 lbu a3, 3(rPC) # a3 <- CC
4876 GET_VREG_FLOAT f0, a2 # f0 <- vBB
4877 GET_VREG_FLOAT f1, a3 # f1 <- vCC
4878 div.s f0, f0, f1 # f0 <- f0 op f1
4879 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
4880 GET_INST_OPCODE v0 # extract opcode from rINST
4881 SET_VREG_FLOAT f0, a4 # vAA <- f0
4882 GOTO_OPCODE v0 # jump to next instruction
4883
4884
4885/* ------------------------------ */
4886 .balign 128
4887.L_op_rem_float: /* 0xaa */
4888/* File: mips64/op_rem_float.S */
4889 /* rem-float vAA, vBB, vCC */
4890 .extern fmodf
4891 lbu a2, 2(rPC) # a2 <- BB
4892 lbu a3, 3(rPC) # a3 <- CC
4893 GET_VREG_FLOAT f12, a2 # f12 <- vBB
4894 GET_VREG_FLOAT f13, a3 # f13 <- vCC
4895 jal fmodf # f0 <- f12 op f13
4896 srl a4, rINST, 8 # a4 <- AA
4897 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
4898 GET_INST_OPCODE v0 # extract opcode from rINST
4899 SET_VREG_FLOAT f0, a4 # vAA <- f0
4900 GOTO_OPCODE v0 # jump to next instruction
4901
4902/* ------------------------------ */
4903 .balign 128
4904.L_op_add_double: /* 0xab */
4905/* File: mips64/op_add_double.S */
4906/* File: mips64/fbinopWide.S */
4907 /*:
4908 * Generic 64-bit floating-point operation.
4909 *
4910 * For: add-double, sub-double, mul-double, div-double.
4911 * form: <op> f0, f0, f1
4912 */
4913 /* binop vAA, vBB, vCC */
4914 srl a4, rINST, 8 # a4 <- AA
4915 lbu a2, 2(rPC) # a2 <- BB
4916 lbu a3, 3(rPC) # a3 <- CC
4917 GET_VREG_DOUBLE f0, a2 # f0 <- vBB
4918 GET_VREG_DOUBLE f1, a3 # f1 <- vCC
4919 add.d f0, f0, f1 # f0 <- f0 op f1
4920 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
4921 GET_INST_OPCODE v0 # extract opcode from rINST
4922 SET_VREG_DOUBLE f0, a4 # vAA <- f0
4923 GOTO_OPCODE v0 # jump to next instruction
4924
4925
4926/* ------------------------------ */
4927 .balign 128
4928.L_op_sub_double: /* 0xac */
4929/* File: mips64/op_sub_double.S */
4930/* File: mips64/fbinopWide.S */
4931 /*:
4932 * Generic 64-bit floating-point operation.
4933 *
4934 * For: add-double, sub-double, mul-double, div-double.
4935 * form: <op> f0, f0, f1
4936 */
4937 /* binop vAA, vBB, vCC */
4938 srl a4, rINST, 8 # a4 <- AA
4939 lbu a2, 2(rPC) # a2 <- BB
4940 lbu a3, 3(rPC) # a3 <- CC
4941 GET_VREG_DOUBLE f0, a2 # f0 <- vBB
4942 GET_VREG_DOUBLE f1, a3 # f1 <- vCC
4943 sub.d f0, f0, f1 # f0 <- f0 op f1
4944 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
4945 GET_INST_OPCODE v0 # extract opcode from rINST
4946 SET_VREG_DOUBLE f0, a4 # vAA <- f0
4947 GOTO_OPCODE v0 # jump to next instruction
4948
4949
4950/* ------------------------------ */
4951 .balign 128
4952.L_op_mul_double: /* 0xad */
4953/* File: mips64/op_mul_double.S */
4954/* File: mips64/fbinopWide.S */
4955 /*:
4956 * Generic 64-bit floating-point operation.
4957 *
4958 * For: add-double, sub-double, mul-double, div-double.
4959 * form: <op> f0, f0, f1
4960 */
4961 /* binop vAA, vBB, vCC */
4962 srl a4, rINST, 8 # a4 <- AA
4963 lbu a2, 2(rPC) # a2 <- BB
4964 lbu a3, 3(rPC) # a3 <- CC
4965 GET_VREG_DOUBLE f0, a2 # f0 <- vBB
4966 GET_VREG_DOUBLE f1, a3 # f1 <- vCC
4967 mul.d f0, f0, f1 # f0 <- f0 op f1
4968 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
4969 GET_INST_OPCODE v0 # extract opcode from rINST
4970 SET_VREG_DOUBLE f0, a4 # vAA <- f0
4971 GOTO_OPCODE v0 # jump to next instruction
4972
4973
4974/* ------------------------------ */
4975 .balign 128
4976.L_op_div_double: /* 0xae */
4977/* File: mips64/op_div_double.S */
4978/* File: mips64/fbinopWide.S */
4979 /*:
4980 * Generic 64-bit floating-point operation.
4981 *
4982 * For: add-double, sub-double, mul-double, div-double.
4983 * form: <op> f0, f0, f1
4984 */
4985 /* binop vAA, vBB, vCC */
4986 srl a4, rINST, 8 # a4 <- AA
4987 lbu a2, 2(rPC) # a2 <- BB
4988 lbu a3, 3(rPC) # a3 <- CC
4989 GET_VREG_DOUBLE f0, a2 # f0 <- vBB
4990 GET_VREG_DOUBLE f1, a3 # f1 <- vCC
4991 div.d f0, f0, f1 # f0 <- f0 op f1
4992 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
4993 GET_INST_OPCODE v0 # extract opcode from rINST
4994 SET_VREG_DOUBLE f0, a4 # vAA <- f0
4995 GOTO_OPCODE v0 # jump to next instruction
4996
4997
4998/* ------------------------------ */
4999 .balign 128
5000.L_op_rem_double: /* 0xaf */
5001/* File: mips64/op_rem_double.S */
5002 /* rem-double vAA, vBB, vCC */
5003 .extern fmod
5004 lbu a2, 2(rPC) # a2 <- BB
5005 lbu a3, 3(rPC) # a3 <- CC
5006 GET_VREG_DOUBLE f12, a2 # f12 <- vBB
5007 GET_VREG_DOUBLE f13, a3 # f13 <- vCC
5008 jal fmod # f0 <- f12 op f13
5009 srl a4, rINST, 8 # a4 <- AA
5010 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
5011 GET_INST_OPCODE v0 # extract opcode from rINST
5012 SET_VREG_DOUBLE f0, a4 # vAA <- f0
5013 GOTO_OPCODE v0 # jump to next instruction
5014
5015/* ------------------------------ */
5016 .balign 128
5017.L_op_add_int_2addr: /* 0xb0 */
5018/* File: mips64/op_add_int_2addr.S */
5019/* File: mips64/binop2addr.S */
5020 /*
5021 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5022 * that specifies an instruction that performs "result = a0 op a1".
5023 * This could be a MIPS instruction or a function call. (If the result
5024 * comes back in a register other than a0, you can override "result".)
5025 *
5026 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5027 * vB (a1). Useful for integer division and modulus. Note that we
5028 * *don't* check for (INT_MIN / -1) here, because the CPU handles it
5029 * correctly.
5030 *
5031 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5032 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5033 * shl-int/2addr, shr-int/2addr, ushr-int/2addr
5034 */
5035 /* binop/2addr vA, vB */
5036 ext a2, rINST, 8, 4 # a2 <- A
5037 ext a3, rINST, 12, 4 # a3 <- B
5038 GET_VREG a0, a2 # a0 <- vA
5039 GET_VREG a1, a3 # a1 <- vB
5040 .if 0
5041 beqz a1, common_errDivideByZero # is second operand zero?
5042 .endif
5043 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
5044 # optional op
5045 addu a0, a0, a1 # a0 <- op, a0-a3 changed
5046 GET_INST_OPCODE v0 # extract opcode from rINST
5047 SET_VREG a0, a2 # vA <- a0
5048 GOTO_OPCODE v0 # jump to next instruction
5049
5050
5051/* ------------------------------ */
5052 .balign 128
5053.L_op_sub_int_2addr: /* 0xb1 */
5054/* File: mips64/op_sub_int_2addr.S */
5055/* File: mips64/binop2addr.S */
5056 /*
5057 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5058 * that specifies an instruction that performs "result = a0 op a1".
5059 * This could be a MIPS instruction or a function call. (If the result
5060 * comes back in a register other than a0, you can override "result".)
5061 *
5062 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5063 * vB (a1). Useful for integer division and modulus. Note that we
5064 * *don't* check for (INT_MIN / -1) here, because the CPU handles it
5065 * correctly.
5066 *
5067 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5068 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5069 * shl-int/2addr, shr-int/2addr, ushr-int/2addr
5070 */
5071 /* binop/2addr vA, vB */
5072 ext a2, rINST, 8, 4 # a2 <- A
5073 ext a3, rINST, 12, 4 # a3 <- B
5074 GET_VREG a0, a2 # a0 <- vA
5075 GET_VREG a1, a3 # a1 <- vB
5076 .if 0
5077 beqz a1, common_errDivideByZero # is second operand zero?
5078 .endif
5079 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
5080 # optional op
5081 subu a0, a0, a1 # a0 <- op, a0-a3 changed
5082 GET_INST_OPCODE v0 # extract opcode from rINST
5083 SET_VREG a0, a2 # vA <- a0
5084 GOTO_OPCODE v0 # jump to next instruction
5085
5086
5087/* ------------------------------ */
5088 .balign 128
5089.L_op_mul_int_2addr: /* 0xb2 */
5090/* File: mips64/op_mul_int_2addr.S */
5091/* File: mips64/binop2addr.S */
5092 /*
5093 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5094 * that specifies an instruction that performs "result = a0 op a1".
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 * vB (a1). Useful for integer division and modulus. Note that we
5100 * *don't* check for (INT_MIN / -1) here, because the CPU handles it
5101 * correctly.
5102 *
5103 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5104 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5105 * shl-int/2addr, shr-int/2addr, ushr-int/2addr
5106 */
5107 /* binop/2addr vA, vB */
5108 ext a2, rINST, 8, 4 # a2 <- A
5109 ext a3, rINST, 12, 4 # a3 <- B
5110 GET_VREG a0, a2 # a0 <- vA
5111 GET_VREG a1, a3 # a1 <- vB
5112 .if 0
5113 beqz a1, common_errDivideByZero # is second operand zero?
5114 .endif
5115 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
5116 # optional op
5117 mul a0, a0, a1 # a0 <- op, a0-a3 changed
5118 GET_INST_OPCODE v0 # extract opcode from rINST
5119 SET_VREG a0, a2 # vA <- a0
5120 GOTO_OPCODE v0 # jump to next instruction
5121
5122
5123/* ------------------------------ */
5124 .balign 128
5125.L_op_div_int_2addr: /* 0xb3 */
5126/* File: mips64/op_div_int_2addr.S */
5127/* File: mips64/binop2addr.S */
5128 /*
5129 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5130 * that specifies an instruction that performs "result = a0 op a1".
5131 * This could be a MIPS instruction or a function call. (If the result
5132 * comes back in a register other than a0, you can override "result".)
5133 *
5134 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5135 * vB (a1). Useful for integer division and modulus. Note that we
5136 * *don't* check for (INT_MIN / -1) here, because the CPU handles it
5137 * correctly.
5138 *
5139 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5140 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5141 * shl-int/2addr, shr-int/2addr, ushr-int/2addr
5142 */
5143 /* binop/2addr vA, vB */
5144 ext a2, rINST, 8, 4 # a2 <- A
5145 ext a3, rINST, 12, 4 # a3 <- B
5146 GET_VREG a0, a2 # a0 <- vA
5147 GET_VREG a1, a3 # a1 <- vB
5148 .if 1
5149 beqz a1, common_errDivideByZero # is second operand zero?
5150 .endif
5151 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
5152 # optional op
5153 div a0, a0, a1 # a0 <- op, a0-a3 changed
5154 GET_INST_OPCODE v0 # extract opcode from rINST
5155 SET_VREG a0, a2 # vA <- a0
5156 GOTO_OPCODE v0 # jump to next instruction
5157
5158
5159/* ------------------------------ */
5160 .balign 128
5161.L_op_rem_int_2addr: /* 0xb4 */
5162/* File: mips64/op_rem_int_2addr.S */
5163/* File: mips64/binop2addr.S */
5164 /*
5165 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5166 * that specifies an instruction that performs "result = a0 op a1".
5167 * This could be a MIPS instruction or a function call. (If the result
5168 * comes back in a register other than a0, you can override "result".)
5169 *
5170 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5171 * vB (a1). Useful for integer division and modulus. Note that we
5172 * *don't* check for (INT_MIN / -1) here, because the CPU handles it
5173 * correctly.
5174 *
5175 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5176 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5177 * shl-int/2addr, shr-int/2addr, ushr-int/2addr
5178 */
5179 /* binop/2addr vA, vB */
5180 ext a2, rINST, 8, 4 # a2 <- A
5181 ext a3, rINST, 12, 4 # a3 <- B
5182 GET_VREG a0, a2 # a0 <- vA
5183 GET_VREG a1, a3 # a1 <- vB
5184 .if 1
5185 beqz a1, common_errDivideByZero # is second operand zero?
5186 .endif
5187 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
5188 # optional op
5189 mod a0, a0, a1 # a0 <- op, a0-a3 changed
5190 GET_INST_OPCODE v0 # extract opcode from rINST
5191 SET_VREG a0, a2 # vA <- a0
5192 GOTO_OPCODE v0 # jump to next instruction
5193
5194
5195/* ------------------------------ */
5196 .balign 128
5197.L_op_and_int_2addr: /* 0xb5 */
5198/* File: mips64/op_and_int_2addr.S */
5199/* File: mips64/binop2addr.S */
5200 /*
5201 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5202 * that specifies an instruction that performs "result = a0 op a1".
5203 * This could be a MIPS instruction or a function call. (If the result
5204 * comes back in a register other than a0, you can override "result".)
5205 *
5206 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5207 * vB (a1). Useful for integer division and modulus. Note that we
5208 * *don't* check for (INT_MIN / -1) here, because the CPU handles it
5209 * correctly.
5210 *
5211 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5212 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5213 * shl-int/2addr, shr-int/2addr, ushr-int/2addr
5214 */
5215 /* binop/2addr vA, vB */
5216 ext a2, rINST, 8, 4 # a2 <- A
5217 ext a3, rINST, 12, 4 # a3 <- B
5218 GET_VREG a0, a2 # a0 <- vA
5219 GET_VREG a1, a3 # a1 <- vB
5220 .if 0
5221 beqz a1, common_errDivideByZero # is second operand zero?
5222 .endif
5223 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
5224 # optional op
5225 and a0, a0, a1 # a0 <- op, a0-a3 changed
5226 GET_INST_OPCODE v0 # extract opcode from rINST
5227 SET_VREG a0, a2 # vA <- a0
5228 GOTO_OPCODE v0 # jump to next instruction
5229
5230
5231/* ------------------------------ */
5232 .balign 128
5233.L_op_or_int_2addr: /* 0xb6 */
5234/* File: mips64/op_or_int_2addr.S */
5235/* File: mips64/binop2addr.S */
5236 /*
5237 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5238 * that specifies an instruction that performs "result = a0 op a1".
5239 * This could be a MIPS instruction or a function call. (If the result
5240 * comes back in a register other than a0, you can override "result".)
5241 *
5242 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5243 * vB (a1). Useful for integer division and modulus. Note that we
5244 * *don't* check for (INT_MIN / -1) here, because the CPU handles it
5245 * correctly.
5246 *
5247 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5248 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5249 * shl-int/2addr, shr-int/2addr, ushr-int/2addr
5250 */
5251 /* binop/2addr vA, vB */
5252 ext a2, rINST, 8, 4 # a2 <- A
5253 ext a3, rINST, 12, 4 # a3 <- B
5254 GET_VREG a0, a2 # a0 <- vA
5255 GET_VREG a1, a3 # a1 <- vB
5256 .if 0
5257 beqz a1, common_errDivideByZero # is second operand zero?
5258 .endif
5259 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
5260 # optional op
5261 or a0, a0, a1 # a0 <- op, a0-a3 changed
5262 GET_INST_OPCODE v0 # extract opcode from rINST
5263 SET_VREG a0, a2 # vA <- a0
5264 GOTO_OPCODE v0 # jump to next instruction
5265
5266
5267/* ------------------------------ */
5268 .balign 128
5269.L_op_xor_int_2addr: /* 0xb7 */
5270/* File: mips64/op_xor_int_2addr.S */
5271/* File: mips64/binop2addr.S */
5272 /*
5273 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5274 * that specifies an instruction that performs "result = a0 op a1".
5275 * This could be a MIPS instruction or a function call. (If the result
5276 * comes back in a register other than a0, you can override "result".)
5277 *
5278 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5279 * vB (a1). Useful for integer division and modulus. Note that we
5280 * *don't* check for (INT_MIN / -1) here, because the CPU handles it
5281 * correctly.
5282 *
5283 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5284 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5285 * shl-int/2addr, shr-int/2addr, ushr-int/2addr
5286 */
5287 /* binop/2addr vA, vB */
5288 ext a2, rINST, 8, 4 # a2 <- A
5289 ext a3, rINST, 12, 4 # a3 <- B
5290 GET_VREG a0, a2 # a0 <- vA
5291 GET_VREG a1, a3 # a1 <- vB
5292 .if 0
5293 beqz a1, common_errDivideByZero # is second operand zero?
5294 .endif
5295 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
5296 # optional op
5297 xor a0, a0, a1 # a0 <- op, a0-a3 changed
5298 GET_INST_OPCODE v0 # extract opcode from rINST
5299 SET_VREG a0, a2 # vA <- a0
5300 GOTO_OPCODE v0 # jump to next instruction
5301
5302
5303/* ------------------------------ */
5304 .balign 128
5305.L_op_shl_int_2addr: /* 0xb8 */
5306/* File: mips64/op_shl_int_2addr.S */
5307/* File: mips64/binop2addr.S */
5308 /*
5309 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5310 * that specifies an instruction that performs "result = a0 op a1".
5311 * This could be a MIPS instruction or a function call. (If the result
5312 * comes back in a register other than a0, you can override "result".)
5313 *
5314 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5315 * vB (a1). Useful for integer division and modulus. Note that we
5316 * *don't* check for (INT_MIN / -1) here, because the CPU handles it
5317 * correctly.
5318 *
5319 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5320 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5321 * shl-int/2addr, shr-int/2addr, ushr-int/2addr
5322 */
5323 /* binop/2addr vA, vB */
5324 ext a2, rINST, 8, 4 # a2 <- A
5325 ext a3, rINST, 12, 4 # a3 <- B
5326 GET_VREG a0, a2 # a0 <- vA
5327 GET_VREG a1, a3 # a1 <- vB
5328 .if 0
5329 beqz a1, common_errDivideByZero # is second operand zero?
5330 .endif
5331 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
5332 # optional op
5333 sll a0, a0, a1 # a0 <- op, a0-a3 changed
5334 GET_INST_OPCODE v0 # extract opcode from rINST
5335 SET_VREG a0, a2 # vA <- a0
5336 GOTO_OPCODE v0 # jump to next instruction
5337
5338
5339/* ------------------------------ */
5340 .balign 128
5341.L_op_shr_int_2addr: /* 0xb9 */
5342/* File: mips64/op_shr_int_2addr.S */
5343/* File: mips64/binop2addr.S */
5344 /*
5345 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5346 * that specifies an instruction that performs "result = a0 op a1".
5347 * This could be a MIPS instruction or a function call. (If the result
5348 * comes back in a register other than a0, you can override "result".)
5349 *
5350 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5351 * vB (a1). Useful for integer division and modulus. Note that we
5352 * *don't* check for (INT_MIN / -1) here, because the CPU handles it
5353 * correctly.
5354 *
5355 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5356 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5357 * shl-int/2addr, shr-int/2addr, ushr-int/2addr
5358 */
5359 /* binop/2addr vA, vB */
5360 ext a2, rINST, 8, 4 # a2 <- A
5361 ext a3, rINST, 12, 4 # a3 <- B
5362 GET_VREG a0, a2 # a0 <- vA
5363 GET_VREG a1, a3 # a1 <- vB
5364 .if 0
5365 beqz a1, common_errDivideByZero # is second operand zero?
5366 .endif
5367 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
5368 # optional op
5369 sra a0, a0, a1 # a0 <- op, a0-a3 changed
5370 GET_INST_OPCODE v0 # extract opcode from rINST
5371 SET_VREG a0, a2 # vA <- a0
5372 GOTO_OPCODE v0 # jump to next instruction
5373
5374
5375/* ------------------------------ */
5376 .balign 128
5377.L_op_ushr_int_2addr: /* 0xba */
5378/* File: mips64/op_ushr_int_2addr.S */
5379/* File: mips64/binop2addr.S */
5380 /*
5381 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5382 * that specifies an instruction that performs "result = a0 op a1".
5383 * This could be a MIPS instruction or a function call. (If the result
5384 * comes back in a register other than a0, you can override "result".)
5385 *
5386 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5387 * vB (a1). Useful for integer division and modulus. Note that we
5388 * *don't* check for (INT_MIN / -1) here, because the CPU handles it
5389 * correctly.
5390 *
5391 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5392 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5393 * shl-int/2addr, shr-int/2addr, ushr-int/2addr
5394 */
5395 /* binop/2addr vA, vB */
5396 ext a2, rINST, 8, 4 # a2 <- A
5397 ext a3, rINST, 12, 4 # a3 <- B
5398 GET_VREG a0, a2 # a0 <- vA
5399 GET_VREG a1, a3 # a1 <- vB
5400 .if 0
5401 beqz a1, common_errDivideByZero # is second operand zero?
5402 .endif
5403 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
5404 # optional op
5405 srl a0, a0, a1 # a0 <- op, a0-a3 changed
5406 GET_INST_OPCODE v0 # extract opcode from rINST
5407 SET_VREG a0, a2 # vA <- a0
5408 GOTO_OPCODE v0 # jump to next instruction
5409
5410
5411/* ------------------------------ */
5412 .balign 128
5413.L_op_add_long_2addr: /* 0xbb */
5414/* File: mips64/op_add_long_2addr.S */
5415/* File: mips64/binopWide2addr.S */
5416 /*
5417 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5418 * that specifies an instruction that performs "result = a0 op a1".
5419 * This could be a MIPS instruction or a function call. (If the result
5420 * comes back in a register other than a0, you can override "result".)
5421 *
5422 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5423 * vB (a1). Useful for integer division and modulus. Note that we
5424 * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
5425 * correctly.
5426 *
5427 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5428 * rem-long/2addr, and-long/2addr, or-long/2addr, xor-long/2addr,
5429 * shl-long/2addr, shr-long/2addr, ushr-long/2addr
5430 */
5431 /* binop/2addr vA, vB */
5432 ext a2, rINST, 8, 4 # a2 <- A
5433 ext a3, rINST, 12, 4 # a3 <- B
5434 GET_VREG_WIDE a0, a2 # a0 <- vA
5435 GET_VREG_WIDE a1, a3 # a1 <- vB
5436 .if 0
5437 beqz a1, common_errDivideByZero # is second operand zero?
5438 .endif
5439 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
5440 # optional op
5441 daddu a0, a0, a1 # a0 <- op, a0-a3 changed
5442 GET_INST_OPCODE v0 # extract opcode from rINST
5443 SET_VREG_WIDE a0, a2 # vA <- a0
5444 GOTO_OPCODE v0 # jump to next instruction
5445
5446
5447/* ------------------------------ */
5448 .balign 128
5449.L_op_sub_long_2addr: /* 0xbc */
5450/* File: mips64/op_sub_long_2addr.S */
5451/* File: mips64/binopWide2addr.S */
5452 /*
5453 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5454 * that specifies an instruction that performs "result = a0 op a1".
5455 * This could be a MIPS instruction or a function call. (If the result
5456 * comes back in a register other than a0, you can override "result".)
5457 *
5458 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5459 * vB (a1). Useful for integer division and modulus. Note that we
5460 * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
5461 * correctly.
5462 *
5463 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5464 * rem-long/2addr, and-long/2addr, or-long/2addr, xor-long/2addr,
5465 * shl-long/2addr, shr-long/2addr, ushr-long/2addr
5466 */
5467 /* binop/2addr vA, vB */
5468 ext a2, rINST, 8, 4 # a2 <- A
5469 ext a3, rINST, 12, 4 # a3 <- B
5470 GET_VREG_WIDE a0, a2 # a0 <- vA
5471 GET_VREG_WIDE a1, a3 # a1 <- vB
5472 .if 0
5473 beqz a1, common_errDivideByZero # is second operand zero?
5474 .endif
5475 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
5476 # optional op
5477 dsubu a0, a0, a1 # a0 <- op, a0-a3 changed
5478 GET_INST_OPCODE v0 # extract opcode from rINST
5479 SET_VREG_WIDE a0, a2 # vA <- a0
5480 GOTO_OPCODE v0 # jump to next instruction
5481
5482
5483/* ------------------------------ */
5484 .balign 128
5485.L_op_mul_long_2addr: /* 0xbd */
5486/* File: mips64/op_mul_long_2addr.S */
5487/* File: mips64/binopWide2addr.S */
5488 /*
5489 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5490 * that specifies an instruction that performs "result = a0 op a1".
5491 * This could be a MIPS instruction or a function call. (If the result
5492 * comes back in a register other than a0, you can override "result".)
5493 *
5494 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5495 * vB (a1). Useful for integer division and modulus. Note that we
5496 * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
5497 * correctly.
5498 *
5499 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5500 * rem-long/2addr, and-long/2addr, or-long/2addr, xor-long/2addr,
5501 * shl-long/2addr, shr-long/2addr, ushr-long/2addr
5502 */
5503 /* binop/2addr vA, vB */
5504 ext a2, rINST, 8, 4 # a2 <- A
5505 ext a3, rINST, 12, 4 # a3 <- B
5506 GET_VREG_WIDE a0, a2 # a0 <- vA
5507 GET_VREG_WIDE a1, a3 # a1 <- vB
5508 .if 0
5509 beqz a1, common_errDivideByZero # is second operand zero?
5510 .endif
5511 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
5512 # optional op
5513 dmul a0, a0, a1 # a0 <- op, a0-a3 changed
5514 GET_INST_OPCODE v0 # extract opcode from rINST
5515 SET_VREG_WIDE a0, a2 # vA <- a0
5516 GOTO_OPCODE v0 # jump to next instruction
5517
5518
5519/* ------------------------------ */
5520 .balign 128
5521.L_op_div_long_2addr: /* 0xbe */
5522/* File: mips64/op_div_long_2addr.S */
5523/* File: mips64/binopWide2addr.S */
5524 /*
5525 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5526 * that specifies an instruction that performs "result = a0 op a1".
5527 * This could be a MIPS instruction or a function call. (If the result
5528 * comes back in a register other than a0, you can override "result".)
5529 *
5530 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5531 * vB (a1). Useful for integer division and modulus. Note that we
5532 * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
5533 * correctly.
5534 *
5535 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5536 * rem-long/2addr, and-long/2addr, or-long/2addr, xor-long/2addr,
5537 * shl-long/2addr, shr-long/2addr, ushr-long/2addr
5538 */
5539 /* binop/2addr vA, vB */
5540 ext a2, rINST, 8, 4 # a2 <- A
5541 ext a3, rINST, 12, 4 # a3 <- B
5542 GET_VREG_WIDE a0, a2 # a0 <- vA
5543 GET_VREG_WIDE a1, a3 # a1 <- vB
5544 .if 1
5545 beqz a1, common_errDivideByZero # is second operand zero?
5546 .endif
5547 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
5548 # optional op
5549 ddiv a0, a0, a1 # a0 <- op, a0-a3 changed
5550 GET_INST_OPCODE v0 # extract opcode from rINST
5551 SET_VREG_WIDE a0, a2 # vA <- a0
5552 GOTO_OPCODE v0 # jump to next instruction
5553
5554
5555/* ------------------------------ */
5556 .balign 128
5557.L_op_rem_long_2addr: /* 0xbf */
5558/* File: mips64/op_rem_long_2addr.S */
5559/* File: mips64/binopWide2addr.S */
5560 /*
5561 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5562 * that specifies an instruction that performs "result = a0 op a1".
5563 * This could be a MIPS instruction or a function call. (If the result
5564 * comes back in a register other than a0, you can override "result".)
5565 *
5566 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5567 * vB (a1). Useful for integer division and modulus. Note that we
5568 * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
5569 * correctly.
5570 *
5571 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5572 * rem-long/2addr, and-long/2addr, or-long/2addr, xor-long/2addr,
5573 * shl-long/2addr, shr-long/2addr, ushr-long/2addr
5574 */
5575 /* binop/2addr vA, vB */
5576 ext a2, rINST, 8, 4 # a2 <- A
5577 ext a3, rINST, 12, 4 # a3 <- B
5578 GET_VREG_WIDE a0, a2 # a0 <- vA
5579 GET_VREG_WIDE a1, a3 # a1 <- vB
5580 .if 1
5581 beqz a1, common_errDivideByZero # is second operand zero?
5582 .endif
5583 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
5584 # optional op
5585 dmod a0, a0, a1 # a0 <- op, a0-a3 changed
5586 GET_INST_OPCODE v0 # extract opcode from rINST
5587 SET_VREG_WIDE a0, a2 # vA <- a0
5588 GOTO_OPCODE v0 # jump to next instruction
5589
5590
5591/* ------------------------------ */
5592 .balign 128
5593.L_op_and_long_2addr: /* 0xc0 */
5594/* File: mips64/op_and_long_2addr.S */
5595/* File: mips64/binopWide2addr.S */
5596 /*
5597 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5598 * that specifies an instruction that performs "result = a0 op a1".
5599 * This could be a MIPS instruction or a function call. (If the result
5600 * comes back in a register other than a0, you can override "result".)
5601 *
5602 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5603 * vB (a1). Useful for integer division and modulus. Note that we
5604 * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
5605 * correctly.
5606 *
5607 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5608 * rem-long/2addr, and-long/2addr, or-long/2addr, xor-long/2addr,
5609 * shl-long/2addr, shr-long/2addr, ushr-long/2addr
5610 */
5611 /* binop/2addr vA, vB */
5612 ext a2, rINST, 8, 4 # a2 <- A
5613 ext a3, rINST, 12, 4 # a3 <- B
5614 GET_VREG_WIDE a0, a2 # a0 <- vA
5615 GET_VREG_WIDE a1, a3 # a1 <- vB
5616 .if 0
5617 beqz a1, common_errDivideByZero # is second operand zero?
5618 .endif
5619 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
5620 # optional op
5621 and a0, a0, a1 # a0 <- op, a0-a3 changed
5622 GET_INST_OPCODE v0 # extract opcode from rINST
5623 SET_VREG_WIDE a0, a2 # vA <- a0
5624 GOTO_OPCODE v0 # jump to next instruction
5625
5626
5627/* ------------------------------ */
5628 .balign 128
5629.L_op_or_long_2addr: /* 0xc1 */
5630/* File: mips64/op_or_long_2addr.S */
5631/* File: mips64/binopWide2addr.S */
5632 /*
5633 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5634 * that specifies an instruction that performs "result = a0 op a1".
5635 * This could be a MIPS instruction or a function call. (If the result
5636 * comes back in a register other than a0, you can override "result".)
5637 *
5638 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5639 * vB (a1). Useful for integer division and modulus. Note that we
5640 * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
5641 * correctly.
5642 *
5643 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5644 * rem-long/2addr, and-long/2addr, or-long/2addr, xor-long/2addr,
5645 * shl-long/2addr, shr-long/2addr, ushr-long/2addr
5646 */
5647 /* binop/2addr vA, vB */
5648 ext a2, rINST, 8, 4 # a2 <- A
5649 ext a3, rINST, 12, 4 # a3 <- B
5650 GET_VREG_WIDE a0, a2 # a0 <- vA
5651 GET_VREG_WIDE a1, a3 # a1 <- vB
5652 .if 0
5653 beqz a1, common_errDivideByZero # is second operand zero?
5654 .endif
5655 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
5656 # optional op
5657 or a0, a0, a1 # a0 <- op, a0-a3 changed
5658 GET_INST_OPCODE v0 # extract opcode from rINST
5659 SET_VREG_WIDE a0, a2 # vA <- a0
5660 GOTO_OPCODE v0 # jump to next instruction
5661
5662
5663/* ------------------------------ */
5664 .balign 128
5665.L_op_xor_long_2addr: /* 0xc2 */
5666/* File: mips64/op_xor_long_2addr.S */
5667/* File: mips64/binopWide2addr.S */
5668 /*
5669 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5670 * that specifies an instruction that performs "result = a0 op a1".
5671 * This could be a MIPS instruction or a function call. (If the result
5672 * comes back in a register other than a0, you can override "result".)
5673 *
5674 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5675 * vB (a1). Useful for integer division and modulus. Note that we
5676 * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
5677 * correctly.
5678 *
5679 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5680 * rem-long/2addr, and-long/2addr, or-long/2addr, xor-long/2addr,
5681 * shl-long/2addr, shr-long/2addr, ushr-long/2addr
5682 */
5683 /* binop/2addr vA, vB */
5684 ext a2, rINST, 8, 4 # a2 <- A
5685 ext a3, rINST, 12, 4 # a3 <- B
5686 GET_VREG_WIDE a0, a2 # a0 <- vA
5687 GET_VREG_WIDE a1, a3 # a1 <- vB
5688 .if 0
5689 beqz a1, common_errDivideByZero # is second operand zero?
5690 .endif
5691 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
5692 # optional op
5693 xor a0, a0, a1 # a0 <- op, a0-a3 changed
5694 GET_INST_OPCODE v0 # extract opcode from rINST
5695 SET_VREG_WIDE a0, a2 # vA <- a0
5696 GOTO_OPCODE v0 # jump to next instruction
5697
5698
5699/* ------------------------------ */
5700 .balign 128
5701.L_op_shl_long_2addr: /* 0xc3 */
5702/* File: mips64/op_shl_long_2addr.S */
5703/* File: mips64/binopWide2addr.S */
5704 /*
5705 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5706 * that specifies an instruction that performs "result = a0 op a1".
5707 * This could be a MIPS instruction or a function call. (If the result
5708 * comes back in a register other than a0, you can override "result".)
5709 *
5710 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5711 * vB (a1). Useful for integer division and modulus. Note that we
5712 * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
5713 * correctly.
5714 *
5715 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5716 * rem-long/2addr, and-long/2addr, or-long/2addr, xor-long/2addr,
5717 * shl-long/2addr, shr-long/2addr, ushr-long/2addr
5718 */
5719 /* binop/2addr vA, vB */
5720 ext a2, rINST, 8, 4 # a2 <- A
5721 ext a3, rINST, 12, 4 # a3 <- B
5722 GET_VREG_WIDE a0, a2 # a0 <- vA
5723 GET_VREG_WIDE a1, a3 # a1 <- vB
5724 .if 0
5725 beqz a1, common_errDivideByZero # is second operand zero?
5726 .endif
5727 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
5728 # optional op
5729 dsll a0, a0, a1 # a0 <- op, a0-a3 changed
5730 GET_INST_OPCODE v0 # extract opcode from rINST
5731 SET_VREG_WIDE a0, a2 # vA <- a0
5732 GOTO_OPCODE v0 # jump to next instruction
5733
5734
5735/* ------------------------------ */
5736 .balign 128
5737.L_op_shr_long_2addr: /* 0xc4 */
5738/* File: mips64/op_shr_long_2addr.S */
5739/* File: mips64/binopWide2addr.S */
5740 /*
5741 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5742 * that specifies an instruction that performs "result = a0 op a1".
5743 * This could be a MIPS instruction or a function call. (If the result
5744 * comes back in a register other than a0, you can override "result".)
5745 *
5746 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5747 * vB (a1). Useful for integer division and modulus. Note that we
5748 * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
5749 * correctly.
5750 *
5751 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5752 * rem-long/2addr, and-long/2addr, or-long/2addr, xor-long/2addr,
5753 * shl-long/2addr, shr-long/2addr, ushr-long/2addr
5754 */
5755 /* binop/2addr vA, vB */
5756 ext a2, rINST, 8, 4 # a2 <- A
5757 ext a3, rINST, 12, 4 # a3 <- B
5758 GET_VREG_WIDE a0, a2 # a0 <- vA
5759 GET_VREG_WIDE a1, a3 # a1 <- vB
5760 .if 0
5761 beqz a1, common_errDivideByZero # is second operand zero?
5762 .endif
5763 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
5764 # optional op
5765 dsra a0, a0, a1 # a0 <- op, a0-a3 changed
5766 GET_INST_OPCODE v0 # extract opcode from rINST
5767 SET_VREG_WIDE a0, a2 # vA <- a0
5768 GOTO_OPCODE v0 # jump to next instruction
5769
5770
5771/* ------------------------------ */
5772 .balign 128
5773.L_op_ushr_long_2addr: /* 0xc5 */
5774/* File: mips64/op_ushr_long_2addr.S */
5775/* File: mips64/binopWide2addr.S */
5776 /*
5777 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5778 * that specifies an instruction that performs "result = a0 op a1".
5779 * This could be a MIPS instruction or a function call. (If the result
5780 * comes back in a register other than a0, you can override "result".)
5781 *
5782 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5783 * vB (a1). Useful for integer division and modulus. Note that we
5784 * *don't* check for (LONG_MIN / -1) here, because the CPU handles it
5785 * correctly.
5786 *
5787 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5788 * rem-long/2addr, and-long/2addr, or-long/2addr, xor-long/2addr,
5789 * shl-long/2addr, shr-long/2addr, ushr-long/2addr
5790 */
5791 /* binop/2addr vA, vB */
5792 ext a2, rINST, 8, 4 # a2 <- A
5793 ext a3, rINST, 12, 4 # a3 <- B
5794 GET_VREG_WIDE a0, a2 # a0 <- vA
5795 GET_VREG_WIDE a1, a3 # a1 <- vB
5796 .if 0
5797 beqz a1, common_errDivideByZero # is second operand zero?
5798 .endif
5799 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
5800 # optional op
5801 dsrl a0, a0, a1 # a0 <- op, a0-a3 changed
5802 GET_INST_OPCODE v0 # extract opcode from rINST
5803 SET_VREG_WIDE a0, a2 # vA <- a0
5804 GOTO_OPCODE v0 # jump to next instruction
5805
5806
5807/* ------------------------------ */
5808 .balign 128
5809.L_op_add_float_2addr: /* 0xc6 */
5810/* File: mips64/op_add_float_2addr.S */
5811/* File: mips64/fbinop2addr.S */
5812 /*:
5813 * Generic 32-bit "/2addr" floating-point operation.
5814 *
5815 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr.
5816 * form: <op> f0, f0, f1
5817 */
5818 /* binop/2addr vA, vB */
5819 ext a2, rINST, 8, 4 # a2 <- A
5820 ext a3, rINST, 12, 4 # a3 <- B
5821 GET_VREG_FLOAT f0, a2 # f0 <- vA
5822 GET_VREG_FLOAT f1, a3 # f1 <- vB
5823 add.s f0, f0, f1 # f0 <- f0 op f1
5824 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
5825 GET_INST_OPCODE v0 # extract opcode from rINST
5826 SET_VREG_FLOAT f0, a2 # vA <- f0
5827 GOTO_OPCODE v0 # jump to next instruction
5828
5829
5830/* ------------------------------ */
5831 .balign 128
5832.L_op_sub_float_2addr: /* 0xc7 */
5833/* File: mips64/op_sub_float_2addr.S */
5834/* File: mips64/fbinop2addr.S */
5835 /*:
5836 * Generic 32-bit "/2addr" floating-point operation.
5837 *
5838 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr.
5839 * form: <op> f0, f0, f1
5840 */
5841 /* binop/2addr vA, vB */
5842 ext a2, rINST, 8, 4 # a2 <- A
5843 ext a3, rINST, 12, 4 # a3 <- B
5844 GET_VREG_FLOAT f0, a2 # f0 <- vA
5845 GET_VREG_FLOAT f1, a3 # f1 <- vB
5846 sub.s f0, f0, f1 # f0 <- f0 op f1
5847 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
5848 GET_INST_OPCODE v0 # extract opcode from rINST
5849 SET_VREG_FLOAT f0, a2 # vA <- f0
5850 GOTO_OPCODE v0 # jump to next instruction
5851
5852
5853/* ------------------------------ */
5854 .balign 128
5855.L_op_mul_float_2addr: /* 0xc8 */
5856/* File: mips64/op_mul_float_2addr.S */
5857/* File: mips64/fbinop2addr.S */
5858 /*:
5859 * Generic 32-bit "/2addr" floating-point operation.
5860 *
5861 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr.
5862 * form: <op> f0, f0, f1
5863 */
5864 /* binop/2addr vA, vB */
5865 ext a2, rINST, 8, 4 # a2 <- A
5866 ext a3, rINST, 12, 4 # a3 <- B
5867 GET_VREG_FLOAT f0, a2 # f0 <- vA
5868 GET_VREG_FLOAT f1, a3 # f1 <- vB
5869 mul.s f0, f0, f1 # f0 <- f0 op f1
5870 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
5871 GET_INST_OPCODE v0 # extract opcode from rINST
5872 SET_VREG_FLOAT f0, a2 # vA <- f0
5873 GOTO_OPCODE v0 # jump to next instruction
5874
5875
5876/* ------------------------------ */
5877 .balign 128
5878.L_op_div_float_2addr: /* 0xc9 */
5879/* File: mips64/op_div_float_2addr.S */
5880/* File: mips64/fbinop2addr.S */
5881 /*:
5882 * Generic 32-bit "/2addr" floating-point operation.
5883 *
5884 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr.
5885 * form: <op> f0, f0, f1
5886 */
5887 /* binop/2addr vA, vB */
5888 ext a2, rINST, 8, 4 # a2 <- A
5889 ext a3, rINST, 12, 4 # a3 <- B
5890 GET_VREG_FLOAT f0, a2 # f0 <- vA
5891 GET_VREG_FLOAT f1, a3 # f1 <- vB
5892 div.s f0, f0, f1 # f0 <- f0 op f1
5893 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
5894 GET_INST_OPCODE v0 # extract opcode from rINST
5895 SET_VREG_FLOAT f0, a2 # vA <- f0
5896 GOTO_OPCODE v0 # jump to next instruction
5897
5898
5899/* ------------------------------ */
5900 .balign 128
5901.L_op_rem_float_2addr: /* 0xca */
5902/* File: mips64/op_rem_float_2addr.S */
5903 /* rem-float/2addr vA, vB */
5904 .extern fmodf
5905 ext a2, rINST, 8, 4 # a2 <- A
5906 ext a3, rINST, 12, 4 # a3 <- B
5907 GET_VREG_FLOAT f12, a2 # f12 <- vA
5908 GET_VREG_FLOAT f13, a3 # f13 <- vB
5909 jal fmodf # f0 <- f12 op f13
5910 ext a2, rINST, 8, 4 # a2 <- A
5911 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
5912 GET_INST_OPCODE v0 # extract opcode from rINST
5913 SET_VREG_FLOAT f0, a2 # vA <- f0
5914 GOTO_OPCODE v0 # jump to next instruction
5915
5916/* ------------------------------ */
5917 .balign 128
5918.L_op_add_double_2addr: /* 0xcb */
5919/* File: mips64/op_add_double_2addr.S */
5920/* File: mips64/fbinopWide2addr.S */
5921 /*:
5922 * Generic 64-bit "/2addr" floating-point operation.
5923 *
5924 * For: add-double/2addr, sub-double/2addr, mul-double/2addr, div-double/2addr.
5925 * form: <op> f0, f0, f1
5926 */
5927 /* binop/2addr vA, vB */
5928 ext a2, rINST, 8, 4 # a2 <- A
5929 ext a3, rINST, 12, 4 # a3 <- B
5930 GET_VREG_DOUBLE f0, a2 # f0 <- vA
5931 GET_VREG_DOUBLE f1, a3 # f1 <- vB
5932 add.d f0, f0, f1 # f0 <- f0 op f1
5933 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
5934 GET_INST_OPCODE v0 # extract opcode from rINST
5935 SET_VREG_DOUBLE f0, a2 # vA <- f0
5936 GOTO_OPCODE v0 # jump to next instruction
5937
5938
5939/* ------------------------------ */
5940 .balign 128
5941.L_op_sub_double_2addr: /* 0xcc */
5942/* File: mips64/op_sub_double_2addr.S */
5943/* File: mips64/fbinopWide2addr.S */
5944 /*:
5945 * Generic 64-bit "/2addr" floating-point operation.
5946 *
5947 * For: add-double/2addr, sub-double/2addr, mul-double/2addr, div-double/2addr.
5948 * form: <op> f0, f0, f1
5949 */
5950 /* binop/2addr vA, vB */
5951 ext a2, rINST, 8, 4 # a2 <- A
5952 ext a3, rINST, 12, 4 # a3 <- B
5953 GET_VREG_DOUBLE f0, a2 # f0 <- vA
5954 GET_VREG_DOUBLE f1, a3 # f1 <- vB
5955 sub.d f0, f0, f1 # f0 <- f0 op f1
5956 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
5957 GET_INST_OPCODE v0 # extract opcode from rINST
5958 SET_VREG_DOUBLE f0, a2 # vA <- f0
5959 GOTO_OPCODE v0 # jump to next instruction
5960
5961
5962/* ------------------------------ */
5963 .balign 128
5964.L_op_mul_double_2addr: /* 0xcd */
5965/* File: mips64/op_mul_double_2addr.S */
5966/* File: mips64/fbinopWide2addr.S */
5967 /*:
5968 * Generic 64-bit "/2addr" floating-point operation.
5969 *
5970 * For: add-double/2addr, sub-double/2addr, mul-double/2addr, div-double/2addr.
5971 * form: <op> f0, f0, f1
5972 */
5973 /* binop/2addr vA, vB */
5974 ext a2, rINST, 8, 4 # a2 <- A
5975 ext a3, rINST, 12, 4 # a3 <- B
5976 GET_VREG_DOUBLE f0, a2 # f0 <- vA
5977 GET_VREG_DOUBLE f1, a3 # f1 <- vB
5978 mul.d f0, f0, f1 # f0 <- f0 op f1
5979 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
5980 GET_INST_OPCODE v0 # extract opcode from rINST
5981 SET_VREG_DOUBLE f0, a2 # vA <- f0
5982 GOTO_OPCODE v0 # jump to next instruction
5983
5984
5985/* ------------------------------ */
5986 .balign 128
5987.L_op_div_double_2addr: /* 0xce */
5988/* File: mips64/op_div_double_2addr.S */
5989/* File: mips64/fbinopWide2addr.S */
5990 /*:
5991 * Generic 64-bit "/2addr" floating-point operation.
5992 *
5993 * For: add-double/2addr, sub-double/2addr, mul-double/2addr, div-double/2addr.
5994 * form: <op> f0, f0, f1
5995 */
5996 /* binop/2addr vA, vB */
5997 ext a2, rINST, 8, 4 # a2 <- A
5998 ext a3, rINST, 12, 4 # a3 <- B
5999 GET_VREG_DOUBLE f0, a2 # f0 <- vA
6000 GET_VREG_DOUBLE f1, a3 # f1 <- vB
6001 div.d f0, f0, f1 # f0 <- f0 op f1
6002 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
6003 GET_INST_OPCODE v0 # extract opcode from rINST
6004 SET_VREG_DOUBLE f0, a2 # vA <- f0
6005 GOTO_OPCODE v0 # jump to next instruction
6006
6007
6008/* ------------------------------ */
6009 .balign 128
6010.L_op_rem_double_2addr: /* 0xcf */
6011/* File: mips64/op_rem_double_2addr.S */
6012 /* rem-double/2addr vA, vB */
6013 .extern fmod
6014 ext a2, rINST, 8, 4 # a2 <- A
6015 ext a3, rINST, 12, 4 # a3 <- B
6016 GET_VREG_DOUBLE f12, a2 # f12 <- vA
6017 GET_VREG_DOUBLE f13, a3 # f13 <- vB
6018 jal fmod # f0 <- f12 op f13
6019 ext a2, rINST, 8, 4 # a2 <- A
6020 FETCH_ADVANCE_INST 1 # advance rPC, load rINST
6021 GET_INST_OPCODE v0 # extract opcode from rINST
6022 SET_VREG_DOUBLE f0, a2 # vA <- f0
6023 GOTO_OPCODE v0 # jump to next instruction
6024
6025/* ------------------------------ */
6026 .balign 128
6027.L_op_add_int_lit16: /* 0xd0 */
6028/* File: mips64/op_add_int_lit16.S */
6029/* File: mips64/binopLit16.S */
6030 /*
6031 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6032 * that specifies an instruction that performs "result = a0 op a1".
6033 * This could be an MIPS instruction or a function call. (If the result
6034 * comes back in a register other than a0, you can override "result".)
6035 *
6036 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6037 * CCCC (a1). Useful for integer division and modulus.
6038 *
6039 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6040 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6041 */
6042 /* binop/lit16 vA, vB, #+CCCC */
6043 lh a1, 2(rPC) # a1 <- sign-extended CCCC
6044 ext a2, rINST, 8, 4 # a2 <- A
6045 ext a3, rINST, 12, 4 # a3 <- B
6046 GET_VREG a0, a3 # a0 <- vB
6047 .if 0
6048 beqz a1, common_errDivideByZero # is second operand zero?
6049 .endif
6050 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
6051 # optional op
6052 addu a0, a0, a1 # a0 <- op, a0-a3 changed
6053 GET_INST_OPCODE v0 # extract opcode from rINST
6054 SET_VREG a0, a2 # vA <- a0
6055 GOTO_OPCODE v0 # jump to next instruction
6056
6057
6058
6059/* ------------------------------ */
6060 .balign 128
6061.L_op_rsub_int: /* 0xd1 */
6062/* File: mips64/op_rsub_int.S */
6063/* File: mips64/binopLit16.S */
6064 /*
6065 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6066 * that specifies an instruction that performs "result = a0 op a1".
6067 * This could be an MIPS instruction or a function call. (If the result
6068 * comes back in a register other than a0, you can override "result".)
6069 *
6070 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6071 * CCCC (a1). Useful for integer division and modulus.
6072 *
6073 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6074 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6075 */
6076 /* binop/lit16 vA, vB, #+CCCC */
6077 lh a1, 2(rPC) # a1 <- sign-extended CCCC
6078 ext a2, rINST, 8, 4 # a2 <- A
6079 ext a3, rINST, 12, 4 # a3 <- B
6080 GET_VREG a0, a3 # a0 <- vB
6081 .if 0
6082 beqz a1, common_errDivideByZero # is second operand zero?
6083 .endif
6084 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
6085 # optional op
6086 subu a0, a1, a0 # a0 <- op, a0-a3 changed
6087 GET_INST_OPCODE v0 # extract opcode from rINST
6088 SET_VREG a0, a2 # vA <- a0
6089 GOTO_OPCODE v0 # jump to next instruction
6090
6091
6092
6093/* ------------------------------ */
6094 .balign 128
6095.L_op_mul_int_lit16: /* 0xd2 */
6096/* File: mips64/op_mul_int_lit16.S */
6097/* File: mips64/binopLit16.S */
6098 /*
6099 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6100 * that specifies an instruction that performs "result = a0 op a1".
6101 * This could be an MIPS instruction or a function call. (If the result
6102 * comes back in a register other than a0, you can override "result".)
6103 *
6104 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6105 * CCCC (a1). Useful for integer division and modulus.
6106 *
6107 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6108 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6109 */
6110 /* binop/lit16 vA, vB, #+CCCC */
6111 lh a1, 2(rPC) # a1 <- sign-extended CCCC
6112 ext a2, rINST, 8, 4 # a2 <- A
6113 ext a3, rINST, 12, 4 # a3 <- B
6114 GET_VREG a0, a3 # a0 <- vB
6115 .if 0
6116 beqz a1, common_errDivideByZero # is second operand zero?
6117 .endif
6118 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
6119 # optional op
6120 mul a0, a0, a1 # a0 <- op, a0-a3 changed
6121 GET_INST_OPCODE v0 # extract opcode from rINST
6122 SET_VREG a0, a2 # vA <- a0
6123 GOTO_OPCODE v0 # jump to next instruction
6124
6125
6126
6127/* ------------------------------ */
6128 .balign 128
6129.L_op_div_int_lit16: /* 0xd3 */
6130/* File: mips64/op_div_int_lit16.S */
6131/* File: mips64/binopLit16.S */
6132 /*
6133 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6134 * that specifies an instruction that performs "result = a0 op a1".
6135 * This could be an MIPS instruction or a function call. (If the result
6136 * comes back in a register other than a0, you can override "result".)
6137 *
6138 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6139 * CCCC (a1). Useful for integer division and modulus.
6140 *
6141 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6142 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6143 */
6144 /* binop/lit16 vA, vB, #+CCCC */
6145 lh a1, 2(rPC) # a1 <- sign-extended CCCC
6146 ext a2, rINST, 8, 4 # a2 <- A
6147 ext a3, rINST, 12, 4 # a3 <- B
6148 GET_VREG a0, a3 # a0 <- vB
6149 .if 1
6150 beqz a1, common_errDivideByZero # is second operand zero?
6151 .endif
6152 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
6153 # optional op
6154 div a0, a0, a1 # a0 <- op, a0-a3 changed
6155 GET_INST_OPCODE v0 # extract opcode from rINST
6156 SET_VREG a0, a2 # vA <- a0
6157 GOTO_OPCODE v0 # jump to next instruction
6158
6159
6160
6161/* ------------------------------ */
6162 .balign 128
6163.L_op_rem_int_lit16: /* 0xd4 */
6164/* File: mips64/op_rem_int_lit16.S */
6165/* File: mips64/binopLit16.S */
6166 /*
6167 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6168 * that specifies an instruction that performs "result = a0 op a1".
6169 * This could be an MIPS instruction or a function call. (If the result
6170 * comes back in a register other than a0, you can override "result".)
6171 *
6172 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6173 * CCCC (a1). Useful for integer division and modulus.
6174 *
6175 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6176 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6177 */
6178 /* binop/lit16 vA, vB, #+CCCC */
6179 lh a1, 2(rPC) # a1 <- sign-extended CCCC
6180 ext a2, rINST, 8, 4 # a2 <- A
6181 ext a3, rINST, 12, 4 # a3 <- B
6182 GET_VREG a0, a3 # a0 <- vB
6183 .if 1
6184 beqz a1, common_errDivideByZero # is second operand zero?
6185 .endif
6186 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
6187 # optional op
6188 mod a0, a0, a1 # a0 <- op, a0-a3 changed
6189 GET_INST_OPCODE v0 # extract opcode from rINST
6190 SET_VREG a0, a2 # vA <- a0
6191 GOTO_OPCODE v0 # jump to next instruction
6192
6193
6194
6195/* ------------------------------ */
6196 .balign 128
6197.L_op_and_int_lit16: /* 0xd5 */
6198/* File: mips64/op_and_int_lit16.S */
6199/* File: mips64/binopLit16.S */
6200 /*
6201 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6202 * that specifies an instruction that performs "result = a0 op a1".
6203 * This could be an 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 * CCCC (a1). Useful for integer division and modulus.
6208 *
6209 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6210 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6211 */
6212 /* binop/lit16 vA, vB, #+CCCC */
6213 lh a1, 2(rPC) # a1 <- sign-extended CCCC
6214 ext a2, rINST, 8, 4 # a2 <- A
6215 ext a3, rINST, 12, 4 # a3 <- B
6216 GET_VREG a0, a3 # a0 <- vB
6217 .if 0
6218 beqz a1, common_errDivideByZero # is second operand zero?
6219 .endif
6220 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
6221 # optional op
6222 and a0, a0, a1 # a0 <- op, a0-a3 changed
6223 GET_INST_OPCODE v0 # extract opcode from rINST
6224 SET_VREG a0, a2 # vA <- a0
6225 GOTO_OPCODE v0 # jump to next instruction
6226
6227
6228
6229/* ------------------------------ */
6230 .balign 128
6231.L_op_or_int_lit16: /* 0xd6 */
6232/* File: mips64/op_or_int_lit16.S */
6233/* File: mips64/binopLit16.S */
6234 /*
6235 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6236 * that specifies an instruction that performs "result = a0 op a1".
6237 * This could be an MIPS instruction or a function call. (If the result
6238 * comes back in a register other than a0, you can override "result".)
6239 *
6240 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6241 * CCCC (a1). Useful for integer division and modulus.
6242 *
6243 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6244 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6245 */
6246 /* binop/lit16 vA, vB, #+CCCC */
6247 lh a1, 2(rPC) # a1 <- sign-extended CCCC
6248 ext a2, rINST, 8, 4 # a2 <- A
6249 ext a3, rINST, 12, 4 # a3 <- B
6250 GET_VREG a0, a3 # a0 <- vB
6251 .if 0
6252 beqz a1, common_errDivideByZero # is second operand zero?
6253 .endif
6254 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
6255 # optional op
6256 or a0, a0, a1 # a0 <- op, a0-a3 changed
6257 GET_INST_OPCODE v0 # extract opcode from rINST
6258 SET_VREG a0, a2 # vA <- a0
6259 GOTO_OPCODE v0 # jump to next instruction
6260
6261
6262
6263/* ------------------------------ */
6264 .balign 128
6265.L_op_xor_int_lit16: /* 0xd7 */
6266/* File: mips64/op_xor_int_lit16.S */
6267/* File: mips64/binopLit16.S */
6268 /*
6269 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6270 * that specifies an instruction that performs "result = a0 op a1".
6271 * This could be an MIPS instruction or a function call. (If the result
6272 * comes back in a register other than a0, you can override "result".)
6273 *
6274 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6275 * CCCC (a1). Useful for integer division and modulus.
6276 *
6277 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6278 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6279 */
6280 /* binop/lit16 vA, vB, #+CCCC */
6281 lh a1, 2(rPC) # a1 <- sign-extended CCCC
6282 ext a2, rINST, 8, 4 # a2 <- A
6283 ext a3, rINST, 12, 4 # a3 <- B
6284 GET_VREG a0, a3 # a0 <- vB
6285 .if 0
6286 beqz a1, common_errDivideByZero # is second operand zero?
6287 .endif
6288 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
6289 # optional op
6290 xor a0, a0, a1 # a0 <- op, a0-a3 changed
6291 GET_INST_OPCODE v0 # extract opcode from rINST
6292 SET_VREG a0, a2 # vA <- a0
6293 GOTO_OPCODE v0 # jump to next instruction
6294
6295
6296
6297/* ------------------------------ */
6298 .balign 128
6299.L_op_add_int_lit8: /* 0xd8 */
6300/* File: mips64/op_add_int_lit8.S */
6301/* File: mips64/binopLit8.S */
6302 /*
6303 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6304 * that specifies an instruction that performs "result = a0 op a1".
6305 * This could be an MIPS instruction or a function call. (If the result
6306 * comes back in a register other than a0, you can override "result".)
6307 *
6308 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6309 * CC (a1). Useful for integer division and modulus.
6310 *
6311 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6312 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6313 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6314 */
6315 /* binop/lit8 vAA, vBB, #+CC */
6316 lbu a3, 2(rPC) # a3 <- BB
6317 lb a1, 3(rPC) # a1 <- sign-extended CC
6318 srl a2, rINST, 8 # a2 <- AA
6319 GET_VREG a0, a3 # a0 <- vBB
6320 .if 0
6321 beqz a1, common_errDivideByZero # is second operand zero?
6322 .endif
6323 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
6324 # optional op
6325 addu a0, a0, a1 # a0 <- op, a0-a3 changed
6326 GET_INST_OPCODE v0 # extract opcode from rINST
6327 SET_VREG a0, a2 # vAA <- a0
6328 GOTO_OPCODE v0 # jump to next instruction
6329
6330
6331
6332/* ------------------------------ */
6333 .balign 128
6334.L_op_rsub_int_lit8: /* 0xd9 */
6335/* File: mips64/op_rsub_int_lit8.S */
6336/* File: mips64/binopLit8.S */
6337 /*
6338 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6339 * that specifies an instruction that performs "result = a0 op a1".
6340 * This could be an MIPS instruction or a function call. (If the result
6341 * comes back in a register other than a0, you can override "result".)
6342 *
6343 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6344 * CC (a1). Useful for integer division and modulus.
6345 *
6346 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6347 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6348 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6349 */
6350 /* binop/lit8 vAA, vBB, #+CC */
6351 lbu a3, 2(rPC) # a3 <- BB
6352 lb a1, 3(rPC) # a1 <- sign-extended CC
6353 srl a2, rINST, 8 # a2 <- AA
6354 GET_VREG a0, a3 # a0 <- vBB
6355 .if 0
6356 beqz a1, common_errDivideByZero # is second operand zero?
6357 .endif
6358 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
6359 # optional op
6360 subu a0, a1, a0 # a0 <- op, a0-a3 changed
6361 GET_INST_OPCODE v0 # extract opcode from rINST
6362 SET_VREG a0, a2 # vAA <- a0
6363 GOTO_OPCODE v0 # jump to next instruction
6364
6365
6366
6367/* ------------------------------ */
6368 .balign 128
6369.L_op_mul_int_lit8: /* 0xda */
6370/* File: mips64/op_mul_int_lit8.S */
6371/* File: mips64/binopLit8.S */
6372 /*
6373 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6374 * that specifies an instruction that performs "result = a0 op a1".
6375 * This could be an MIPS instruction or a function call. (If the result
6376 * comes back in a register other than a0, you can override "result".)
6377 *
6378 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6379 * CC (a1). Useful for integer division and modulus.
6380 *
6381 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6382 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6383 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6384 */
6385 /* binop/lit8 vAA, vBB, #+CC */
6386 lbu a3, 2(rPC) # a3 <- BB
6387 lb a1, 3(rPC) # a1 <- sign-extended CC
6388 srl a2, rINST, 8 # a2 <- AA
6389 GET_VREG a0, a3 # a0 <- vBB
6390 .if 0
6391 beqz a1, common_errDivideByZero # is second operand zero?
6392 .endif
6393 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
6394 # optional op
6395 mul a0, a0, a1 # a0 <- op, a0-a3 changed
6396 GET_INST_OPCODE v0 # extract opcode from rINST
6397 SET_VREG a0, a2 # vAA <- a0
6398 GOTO_OPCODE v0 # jump to next instruction
6399
6400
6401
6402/* ------------------------------ */
6403 .balign 128
6404.L_op_div_int_lit8: /* 0xdb */
6405/* File: mips64/op_div_int_lit8.S */
6406/* File: mips64/binopLit8.S */
6407 /*
6408 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6409 * that specifies an instruction that performs "result = a0 op a1".
6410 * This could be an MIPS instruction or a function call. (If the result
6411 * comes back in a register other than a0, you can override "result".)
6412 *
6413 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6414 * CC (a1). Useful for integer division and modulus.
6415 *
6416 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6417 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6418 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6419 */
6420 /* binop/lit8 vAA, vBB, #+CC */
6421 lbu a3, 2(rPC) # a3 <- BB
6422 lb a1, 3(rPC) # a1 <- sign-extended CC
6423 srl a2, rINST, 8 # a2 <- AA
6424 GET_VREG a0, a3 # a0 <- vBB
6425 .if 1
6426 beqz a1, common_errDivideByZero # is second operand zero?
6427 .endif
6428 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
6429 # optional op
6430 div a0, a0, a1 # a0 <- op, a0-a3 changed
6431 GET_INST_OPCODE v0 # extract opcode from rINST
6432 SET_VREG a0, a2 # vAA <- a0
6433 GOTO_OPCODE v0 # jump to next instruction
6434
6435
6436
6437/* ------------------------------ */
6438 .balign 128
6439.L_op_rem_int_lit8: /* 0xdc */
6440/* File: mips64/op_rem_int_lit8.S */
6441/* File: mips64/binopLit8.S */
6442 /*
6443 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6444 * that specifies an instruction that performs "result = a0 op a1".
6445 * This could be an MIPS instruction or a function call. (If the result
6446 * comes back in a register other than a0, you can override "result".)
6447 *
6448 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6449 * CC (a1). Useful for integer division and modulus.
6450 *
6451 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6452 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6453 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6454 */
6455 /* binop/lit8 vAA, vBB, #+CC */
6456 lbu a3, 2(rPC) # a3 <- BB
6457 lb a1, 3(rPC) # a1 <- sign-extended CC
6458 srl a2, rINST, 8 # a2 <- AA
6459 GET_VREG a0, a3 # a0 <- vBB
6460 .if 1
6461 beqz a1, common_errDivideByZero # is second operand zero?
6462 .endif
6463 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
6464 # optional op
6465 mod a0, a0, a1 # a0 <- op, a0-a3 changed
6466 GET_INST_OPCODE v0 # extract opcode from rINST
6467 SET_VREG a0, a2 # vAA <- a0
6468 GOTO_OPCODE v0 # jump to next instruction
6469
6470
6471
6472/* ------------------------------ */
6473 .balign 128
6474.L_op_and_int_lit8: /* 0xdd */
6475/* File: mips64/op_and_int_lit8.S */
6476/* File: mips64/binopLit8.S */
6477 /*
6478 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6479 * that specifies an instruction that performs "result = a0 op a1".
6480 * This could be an MIPS instruction or a function call. (If the result
6481 * comes back in a register other than a0, you can override "result".)
6482 *
6483 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6484 * CC (a1). Useful for integer division and modulus.
6485 *
6486 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6487 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6488 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6489 */
6490 /* binop/lit8 vAA, vBB, #+CC */
6491 lbu a3, 2(rPC) # a3 <- BB
6492 lb a1, 3(rPC) # a1 <- sign-extended CC
6493 srl a2, rINST, 8 # a2 <- AA
6494 GET_VREG a0, a3 # a0 <- vBB
6495 .if 0
6496 beqz a1, common_errDivideByZero # is second operand zero?
6497 .endif
6498 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
6499 # optional op
6500 and a0, a0, a1 # a0 <- op, a0-a3 changed
6501 GET_INST_OPCODE v0 # extract opcode from rINST
6502 SET_VREG a0, a2 # vAA <- a0
6503 GOTO_OPCODE v0 # jump to next instruction
6504
6505
6506
6507/* ------------------------------ */
6508 .balign 128
6509.L_op_or_int_lit8: /* 0xde */
6510/* File: mips64/op_or_int_lit8.S */
6511/* File: mips64/binopLit8.S */
6512 /*
6513 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6514 * that specifies an instruction that performs "result = a0 op a1".
6515 * This could be an MIPS instruction or a function call. (If the result
6516 * comes back in a register other than a0, you can override "result".)
6517 *
6518 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6519 * CC (a1). Useful for integer division and modulus.
6520 *
6521 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6522 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6523 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6524 */
6525 /* binop/lit8 vAA, vBB, #+CC */
6526 lbu a3, 2(rPC) # a3 <- BB
6527 lb a1, 3(rPC) # a1 <- sign-extended CC
6528 srl a2, rINST, 8 # a2 <- AA
6529 GET_VREG a0, a3 # a0 <- vBB
6530 .if 0
6531 beqz a1, common_errDivideByZero # is second operand zero?
6532 .endif
6533 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
6534 # optional op
6535 or a0, a0, a1 # a0 <- op, a0-a3 changed
6536 GET_INST_OPCODE v0 # extract opcode from rINST
6537 SET_VREG a0, a2 # vAA <- a0
6538 GOTO_OPCODE v0 # jump to next instruction
6539
6540
6541
6542/* ------------------------------ */
6543 .balign 128
6544.L_op_xor_int_lit8: /* 0xdf */
6545/* File: mips64/op_xor_int_lit8.S */
6546/* File: mips64/binopLit8.S */
6547 /*
6548 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6549 * that specifies an instruction that performs "result = a0 op a1".
6550 * This could be an MIPS instruction or a function call. (If the result
6551 * comes back in a register other than a0, you can override "result".)
6552 *
6553 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6554 * CC (a1). Useful for integer division and modulus.
6555 *
6556 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6557 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6558 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6559 */
6560 /* binop/lit8 vAA, vBB, #+CC */
6561 lbu a3, 2(rPC) # a3 <- BB
6562 lb a1, 3(rPC) # a1 <- sign-extended CC
6563 srl a2, rINST, 8 # a2 <- AA
6564 GET_VREG a0, a3 # a0 <- vBB
6565 .if 0
6566 beqz a1, common_errDivideByZero # is second operand zero?
6567 .endif
6568 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
6569 # optional op
6570 xor a0, a0, a1 # a0 <- op, a0-a3 changed
6571 GET_INST_OPCODE v0 # extract opcode from rINST
6572 SET_VREG a0, a2 # vAA <- a0
6573 GOTO_OPCODE v0 # jump to next instruction
6574
6575
6576
6577/* ------------------------------ */
6578 .balign 128
6579.L_op_shl_int_lit8: /* 0xe0 */
6580/* File: mips64/op_shl_int_lit8.S */
6581/* File: mips64/binopLit8.S */
6582 /*
6583 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6584 * that specifies an instruction that performs "result = a0 op a1".
6585 * This could be an MIPS instruction or a function call. (If the result
6586 * comes back in a register other than a0, you can override "result".)
6587 *
6588 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6589 * CC (a1). Useful for integer division and modulus.
6590 *
6591 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6592 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6593 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6594 */
6595 /* binop/lit8 vAA, vBB, #+CC */
6596 lbu a3, 2(rPC) # a3 <- BB
6597 lb a1, 3(rPC) # a1 <- sign-extended CC
6598 srl a2, rINST, 8 # a2 <- AA
6599 GET_VREG a0, a3 # a0 <- vBB
6600 .if 0
6601 beqz a1, common_errDivideByZero # is second operand zero?
6602 .endif
6603 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
6604 # optional op
6605 sll a0, a0, a1 # a0 <- op, a0-a3 changed
6606 GET_INST_OPCODE v0 # extract opcode from rINST
6607 SET_VREG a0, a2 # vAA <- a0
6608 GOTO_OPCODE v0 # jump to next instruction
6609
6610
6611
6612/* ------------------------------ */
6613 .balign 128
6614.L_op_shr_int_lit8: /* 0xe1 */
6615/* File: mips64/op_shr_int_lit8.S */
6616/* File: mips64/binopLit8.S */
6617 /*
6618 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6619 * that specifies an instruction that performs "result = a0 op a1".
6620 * This could be an MIPS instruction or a function call. (If the result
6621 * comes back in a register other than a0, you can override "result".)
6622 *
6623 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6624 * CC (a1). Useful for integer division and modulus.
6625 *
6626 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6627 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6628 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6629 */
6630 /* binop/lit8 vAA, vBB, #+CC */
6631 lbu a3, 2(rPC) # a3 <- BB
6632 lb a1, 3(rPC) # a1 <- sign-extended CC
6633 srl a2, rINST, 8 # a2 <- AA
6634 GET_VREG a0, a3 # a0 <- vBB
6635 .if 0
6636 beqz a1, common_errDivideByZero # is second operand zero?
6637 .endif
6638 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
6639 # optional op
6640 sra a0, a0, a1 # a0 <- op, a0-a3 changed
6641 GET_INST_OPCODE v0 # extract opcode from rINST
6642 SET_VREG a0, a2 # vAA <- a0
6643 GOTO_OPCODE v0 # jump to next instruction
6644
6645
6646
6647/* ------------------------------ */
6648 .balign 128
6649.L_op_ushr_int_lit8: /* 0xe2 */
6650/* File: mips64/op_ushr_int_lit8.S */
6651/* File: mips64/binopLit8.S */
6652 /*
6653 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6654 * that specifies an instruction that performs "result = a0 op a1".
6655 * This could be an MIPS instruction or a function call. (If the result
6656 * comes back in a register other than a0, you can override "result".)
6657 *
6658 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6659 * CC (a1). Useful for integer division and modulus.
6660 *
6661 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6662 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6663 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6664 */
6665 /* binop/lit8 vAA, vBB, #+CC */
6666 lbu a3, 2(rPC) # a3 <- BB
6667 lb a1, 3(rPC) # a1 <- sign-extended CC
6668 srl a2, rINST, 8 # a2 <- AA
6669 GET_VREG a0, a3 # a0 <- vBB
6670 .if 0
6671 beqz a1, common_errDivideByZero # is second operand zero?
6672 .endif
6673 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
6674 # optional op
6675 srl a0, a0, a1 # a0 <- op, a0-a3 changed
6676 GET_INST_OPCODE v0 # extract opcode from rINST
6677 SET_VREG a0, a2 # vAA <- a0
6678 GOTO_OPCODE v0 # jump to next instruction
6679
6680
6681
6682/* ------------------------------ */
6683 .balign 128
6684.L_op_iget_quick: /* 0xe3 */
6685/* File: mips64/op_iget_quick.S */
6686 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6687 /* op vA, vB, offset//CCCC */
6688 srl a2, rINST, 12 # a2 <- B
6689 lhu a1, 2(rPC) # a1 <- field byte offset
6690 GET_VREG_U a3, a2 # a3 <- object we're operating on
6691 ext a4, rINST, 8, 4 # a4 <- A
6692 daddu a1, a1, a3
6693 beqz a3, common_errNullObject # object was null
6694 lw a0, 0(a1) # a0 <- obj.field
6695 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
6696 SET_VREG a0, a4 # fp[A] <- a0
6697 GET_INST_OPCODE v0 # extract opcode from rINST
6698 GOTO_OPCODE v0 # jump to next instruction
6699
6700/* ------------------------------ */
6701 .balign 128
6702.L_op_iget_wide_quick: /* 0xe4 */
6703/* File: mips64/op_iget_wide_quick.S */
6704 /* iget-wide-quick vA, vB, offset//CCCC */
6705 srl a2, rINST, 12 # a2 <- B
6706 lhu a4, 2(rPC) # a4 <- field byte offset
6707 GET_VREG_U a3, a2 # a3 <- object we're operating on
6708 ext a2, rINST, 8, 4 # a2 <- A
6709 beqz a3, common_errNullObject # object was null
6710 daddu a4, a3, a4 # create direct pointer
6711 lw a0, 0(a4)
6712 lw a1, 4(a4)
6713 dinsu a0, a1, 32, 32
6714 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
6715 SET_VREG_WIDE a0, a2
6716 GET_INST_OPCODE v0 # extract opcode from rINST
6717 GOTO_OPCODE v0 # jump to next instruction
6718
6719/* ------------------------------ */
6720 .balign 128
6721.L_op_iget_object_quick: /* 0xe5 */
6722/* File: mips64/op_iget_object_quick.S */
6723 /* For: iget-object-quick */
6724 /* op vA, vB, offset//CCCC */
6725 .extern artIGetObjectFromMterp
6726 srl a2, rINST, 12 # a2 <- B
6727 lhu a1, 2(rPC) # a1 <- field byte offset
6728 EXPORT_PC
6729 GET_VREG_U a0, a2 # a0 <- object we're operating on
6730 jal artIGetObjectFromMterp # (obj, offset)
6731 ld a3, THREAD_EXCEPTION_OFFSET(rSELF)
6732 ext a2, rINST, 8, 4 # a2 <- A
6733 PREFETCH_INST 2
6734 bnez a3, MterpPossibleException # bail out
6735 SET_VREG_OBJECT v0, a2 # fp[A] <- v0
6736 ADVANCE 2 # advance rPC
6737 GET_INST_OPCODE v0 # extract opcode from rINST
6738 GOTO_OPCODE v0 # jump to next instruction
6739
6740/* ------------------------------ */
6741 .balign 128
6742.L_op_iput_quick: /* 0xe6 */
6743/* File: mips64/op_iput_quick.S */
6744 /* For: iput-quick, iput-boolean-quick, iput-byte-quick, iput-char-quick, iput-short-quick */
6745 /* op vA, vB, offset//CCCC */
6746 srl a2, rINST, 12 # a2 <- B
6747 lhu a1, 2(rPC) # a1 <- field byte offset
6748 GET_VREG_U a3, a2 # a3 <- fp[B], the object pointer
6749 ext a2, rINST, 8, 4 # a2 <- A
6750 beqz a3, common_errNullObject # object was null
6751 GET_VREG a0, a2 # a0 <- fp[A]
6752 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
6753 daddu a1, a1, a3
6754 sw a0, 0(a1) # obj.field <- a0
6755 GET_INST_OPCODE v0 # extract opcode from rINST
6756 GOTO_OPCODE v0 # jump to next instruction
6757
6758/* ------------------------------ */
6759 .balign 128
6760.L_op_iput_wide_quick: /* 0xe7 */
6761/* File: mips64/op_iput_wide_quick.S */
6762 /* iput-wide-quick vA, vB, offset//CCCC */
6763 srl a2, rINST, 12 # a2 <- B
6764 lhu a3, 2(rPC) # a3 <- field byte offset
6765 GET_VREG_U a2, a2 # a2 <- fp[B], the object pointer
6766 ext a0, rINST, 8, 4 # a0 <- A
6767 beqz a2, common_errNullObject # object was null
6768 GET_VREG_WIDE a0, a0 # a0 <- fp[A]
6769 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
6770 daddu a1, a2, a3 # create a direct pointer
6771 sw a0, 0(a1)
6772 dsrl32 a0, a0, 0
6773 sw a0, 4(a1)
6774 GET_INST_OPCODE v0 # extract opcode from rINST
6775 GOTO_OPCODE v0 # jump to next instruction
6776
6777/* ------------------------------ */
6778 .balign 128
6779.L_op_iput_object_quick: /* 0xe8 */
6780/* File: mips64/op_iput_object_quick.S */
6781 .extern MterpIputObjectQuick
6782 EXPORT_PC
6783 daddu a0, rFP, OFF_FP_SHADOWFRAME
6784 move a1, rPC
6785 move a2, rINST
6786 jal MterpIputObjectQuick
6787 beqzc v0, MterpException
6788 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
6789 GET_INST_OPCODE v0 # extract opcode from rINST
6790 GOTO_OPCODE v0 # jump to next instruction
6791
6792/* ------------------------------ */
6793 .balign 128
6794.L_op_invoke_virtual_quick: /* 0xe9 */
6795/* File: mips64/op_invoke_virtual_quick.S */
6796/* File: mips64/invoke.S */
6797 /*
6798 * Generic invoke handler wrapper.
6799 */
6800 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
6801 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
6802 .extern MterpInvokeVirtualQuick
Alexey Frunzedb045be2016-03-03 17:50:48 -08006803 .extern MterpShouldSwitchInterpreters
Alexey Frunze00b53b72016-02-02 20:25:45 -08006804 EXPORT_PC
6805 move a0, rSELF
6806 daddu a1, rFP, OFF_FP_SHADOWFRAME
6807 move a2, rPC
6808 move a3, rINST
6809 jal MterpInvokeVirtualQuick
6810 beqzc v0, MterpException
6811 FETCH_ADVANCE_INST 3
Alexey Frunzedb045be2016-03-03 17:50:48 -08006812 jal MterpShouldSwitchInterpreters
6813 bnezc v0, MterpFallback
Alexey Frunze00b53b72016-02-02 20:25:45 -08006814 GET_INST_OPCODE v0
6815 GOTO_OPCODE v0
6816
6817
6818/* ------------------------------ */
6819 .balign 128
6820.L_op_invoke_virtual_range_quick: /* 0xea */
6821/* File: mips64/op_invoke_virtual_range_quick.S */
6822/* File: mips64/invoke.S */
6823 /*
6824 * Generic invoke handler wrapper.
6825 */
6826 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
6827 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
6828 .extern MterpInvokeVirtualQuickRange
Alexey Frunzedb045be2016-03-03 17:50:48 -08006829 .extern MterpShouldSwitchInterpreters
Alexey Frunze00b53b72016-02-02 20:25:45 -08006830 EXPORT_PC
6831 move a0, rSELF
6832 daddu a1, rFP, OFF_FP_SHADOWFRAME
6833 move a2, rPC
6834 move a3, rINST
6835 jal MterpInvokeVirtualQuickRange
6836 beqzc v0, MterpException
6837 FETCH_ADVANCE_INST 3
Alexey Frunzedb045be2016-03-03 17:50:48 -08006838 jal MterpShouldSwitchInterpreters
6839 bnezc v0, MterpFallback
Alexey Frunze00b53b72016-02-02 20:25:45 -08006840 GET_INST_OPCODE v0
6841 GOTO_OPCODE v0
6842
6843
6844/* ------------------------------ */
6845 .balign 128
6846.L_op_iput_boolean_quick: /* 0xeb */
6847/* File: mips64/op_iput_boolean_quick.S */
6848/* File: mips64/op_iput_quick.S */
6849 /* For: iput-quick, iput-boolean-quick, iput-byte-quick, iput-char-quick, iput-short-quick */
6850 /* op vA, vB, offset//CCCC */
6851 srl a2, rINST, 12 # a2 <- B
6852 lhu a1, 2(rPC) # a1 <- field byte offset
6853 GET_VREG_U a3, a2 # a3 <- fp[B], the object pointer
6854 ext a2, rINST, 8, 4 # a2 <- A
6855 beqz a3, common_errNullObject # object was null
6856 GET_VREG a0, a2 # a0 <- fp[A]
6857 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
6858 daddu a1, a1, a3
6859 sb a0, 0(a1) # obj.field <- a0
6860 GET_INST_OPCODE v0 # extract opcode from rINST
6861 GOTO_OPCODE v0 # jump to next instruction
6862
6863
6864/* ------------------------------ */
6865 .balign 128
6866.L_op_iput_byte_quick: /* 0xec */
6867/* File: mips64/op_iput_byte_quick.S */
6868/* File: mips64/op_iput_quick.S */
6869 /* For: iput-quick, iput-boolean-quick, iput-byte-quick, iput-char-quick, iput-short-quick */
6870 /* op vA, vB, offset//CCCC */
6871 srl a2, rINST, 12 # a2 <- B
6872 lhu a1, 2(rPC) # a1 <- field byte offset
6873 GET_VREG_U a3, a2 # a3 <- fp[B], the object pointer
6874 ext a2, rINST, 8, 4 # a2 <- A
6875 beqz a3, common_errNullObject # object was null
6876 GET_VREG a0, a2 # a0 <- fp[A]
6877 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
6878 daddu a1, a1, a3
6879 sb a0, 0(a1) # obj.field <- a0
6880 GET_INST_OPCODE v0 # extract opcode from rINST
6881 GOTO_OPCODE v0 # jump to next instruction
6882
6883
6884/* ------------------------------ */
6885 .balign 128
6886.L_op_iput_char_quick: /* 0xed */
6887/* File: mips64/op_iput_char_quick.S */
6888/* File: mips64/op_iput_quick.S */
6889 /* For: iput-quick, iput-boolean-quick, iput-byte-quick, iput-char-quick, iput-short-quick */
6890 /* op vA, vB, offset//CCCC */
6891 srl a2, rINST, 12 # a2 <- B
6892 lhu a1, 2(rPC) # a1 <- field byte offset
6893 GET_VREG_U a3, a2 # a3 <- fp[B], the object pointer
6894 ext a2, rINST, 8, 4 # a2 <- A
6895 beqz a3, common_errNullObject # object was null
6896 GET_VREG a0, a2 # a0 <- fp[A]
6897 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
6898 daddu a1, a1, a3
6899 sh a0, 0(a1) # obj.field <- a0
6900 GET_INST_OPCODE v0 # extract opcode from rINST
6901 GOTO_OPCODE v0 # jump to next instruction
6902
6903
6904/* ------------------------------ */
6905 .balign 128
6906.L_op_iput_short_quick: /* 0xee */
6907/* File: mips64/op_iput_short_quick.S */
6908/* File: mips64/op_iput_quick.S */
6909 /* For: iput-quick, iput-boolean-quick, iput-byte-quick, iput-char-quick, iput-short-quick */
6910 /* op vA, vB, offset//CCCC */
6911 srl a2, rINST, 12 # a2 <- B
6912 lhu a1, 2(rPC) # a1 <- field byte offset
6913 GET_VREG_U a3, a2 # a3 <- fp[B], the object pointer
6914 ext a2, rINST, 8, 4 # a2 <- A
6915 beqz a3, common_errNullObject # object was null
6916 GET_VREG a0, a2 # a0 <- fp[A]
6917 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
6918 daddu a1, a1, a3
6919 sh a0, 0(a1) # obj.field <- a0
6920 GET_INST_OPCODE v0 # extract opcode from rINST
6921 GOTO_OPCODE v0 # jump to next instruction
6922
6923
6924/* ------------------------------ */
6925 .balign 128
6926.L_op_iget_boolean_quick: /* 0xef */
6927/* File: mips64/op_iget_boolean_quick.S */
6928/* File: mips64/op_iget_quick.S */
6929 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6930 /* op vA, vB, offset//CCCC */
6931 srl a2, rINST, 12 # a2 <- B
6932 lhu a1, 2(rPC) # a1 <- field byte offset
6933 GET_VREG_U a3, a2 # a3 <- object we're operating on
6934 ext a4, rINST, 8, 4 # a4 <- A
6935 daddu a1, a1, a3
6936 beqz a3, common_errNullObject # object was null
6937 lbu a0, 0(a1) # a0 <- obj.field
6938 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
6939 SET_VREG a0, a4 # fp[A] <- a0
6940 GET_INST_OPCODE v0 # extract opcode from rINST
6941 GOTO_OPCODE v0 # jump to next instruction
6942
6943
6944/* ------------------------------ */
6945 .balign 128
6946.L_op_iget_byte_quick: /* 0xf0 */
6947/* File: mips64/op_iget_byte_quick.S */
6948/* File: mips64/op_iget_quick.S */
6949 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6950 /* op vA, vB, offset//CCCC */
6951 srl a2, rINST, 12 # a2 <- B
6952 lhu a1, 2(rPC) # a1 <- field byte offset
6953 GET_VREG_U a3, a2 # a3 <- object we're operating on
6954 ext a4, rINST, 8, 4 # a4 <- A
6955 daddu a1, a1, a3
6956 beqz a3, common_errNullObject # object was null
6957 lb a0, 0(a1) # a0 <- obj.field
6958 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
6959 SET_VREG a0, a4 # fp[A] <- a0
6960 GET_INST_OPCODE v0 # extract opcode from rINST
6961 GOTO_OPCODE v0 # jump to next instruction
6962
6963
6964/* ------------------------------ */
6965 .balign 128
6966.L_op_iget_char_quick: /* 0xf1 */
6967/* File: mips64/op_iget_char_quick.S */
6968/* File: mips64/op_iget_quick.S */
6969 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6970 /* op vA, vB, offset//CCCC */
6971 srl a2, rINST, 12 # a2 <- B
6972 lhu a1, 2(rPC) # a1 <- field byte offset
6973 GET_VREG_U a3, a2 # a3 <- object we're operating on
6974 ext a4, rINST, 8, 4 # a4 <- A
6975 daddu a1, a1, a3
6976 beqz a3, common_errNullObject # object was null
6977 lhu a0, 0(a1) # a0 <- obj.field
6978 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
6979 SET_VREG a0, a4 # fp[A] <- a0
6980 GET_INST_OPCODE v0 # extract opcode from rINST
6981 GOTO_OPCODE v0 # jump to next instruction
6982
6983
6984/* ------------------------------ */
6985 .balign 128
6986.L_op_iget_short_quick: /* 0xf2 */
6987/* File: mips64/op_iget_short_quick.S */
6988/* File: mips64/op_iget_quick.S */
6989 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6990 /* op vA, vB, offset//CCCC */
6991 srl a2, rINST, 12 # a2 <- B
6992 lhu a1, 2(rPC) # a1 <- field byte offset
6993 GET_VREG_U a3, a2 # a3 <- object we're operating on
6994 ext a4, rINST, 8, 4 # a4 <- A
6995 daddu a1, a1, a3
6996 beqz a3, common_errNullObject # object was null
6997 lh a0, 0(a1) # a0 <- obj.field
6998 FETCH_ADVANCE_INST 2 # advance rPC, load rINST
6999 SET_VREG a0, a4 # fp[A] <- a0
7000 GET_INST_OPCODE v0 # extract opcode from rINST
7001 GOTO_OPCODE v0 # jump to next instruction
7002
7003
7004/* ------------------------------ */
7005 .balign 128
7006.L_op_invoke_lambda: /* 0xf3 */
7007/* Transfer stub to alternate interpreter */
7008 b MterpFallback
7009
7010/* ------------------------------ */
7011 .balign 128
7012.L_op_unused_f4: /* 0xf4 */
7013/* File: mips64/op_unused_f4.S */
7014/* File: mips64/unused.S */
7015/*
7016 * Bail to reference interpreter to throw.
7017 */
7018 b MterpFallback
7019
7020
7021/* ------------------------------ */
7022 .balign 128
7023.L_op_capture_variable: /* 0xf5 */
7024/* Transfer stub to alternate interpreter */
7025 b MterpFallback
7026
7027/* ------------------------------ */
7028 .balign 128
7029.L_op_create_lambda: /* 0xf6 */
7030/* Transfer stub to alternate interpreter */
7031 b MterpFallback
7032
7033/* ------------------------------ */
7034 .balign 128
7035.L_op_liberate_variable: /* 0xf7 */
7036/* Transfer stub to alternate interpreter */
7037 b MterpFallback
7038
7039/* ------------------------------ */
7040 .balign 128
7041.L_op_box_lambda: /* 0xf8 */
7042/* Transfer stub to alternate interpreter */
7043 b MterpFallback
7044
7045/* ------------------------------ */
7046 .balign 128
7047.L_op_unbox_lambda: /* 0xf9 */
7048/* Transfer stub to alternate interpreter */
7049 b MterpFallback
7050
7051/* ------------------------------ */
7052 .balign 128
7053.L_op_unused_fa: /* 0xfa */
7054/* File: mips64/op_unused_fa.S */
7055/* File: mips64/unused.S */
7056/*
7057 * Bail to reference interpreter to throw.
7058 */
7059 b MterpFallback
7060
7061
7062/* ------------------------------ */
7063 .balign 128
7064.L_op_unused_fb: /* 0xfb */
7065/* File: mips64/op_unused_fb.S */
7066/* File: mips64/unused.S */
7067/*
7068 * Bail to reference interpreter to throw.
7069 */
7070 b MterpFallback
7071
7072
7073/* ------------------------------ */
7074 .balign 128
7075.L_op_unused_fc: /* 0xfc */
7076/* File: mips64/op_unused_fc.S */
7077/* File: mips64/unused.S */
7078/*
7079 * Bail to reference interpreter to throw.
7080 */
7081 b MterpFallback
7082
7083
7084/* ------------------------------ */
7085 .balign 128
7086.L_op_unused_fd: /* 0xfd */
7087/* File: mips64/op_unused_fd.S */
7088/* File: mips64/unused.S */
7089/*
7090 * Bail to reference interpreter to throw.
7091 */
7092 b MterpFallback
7093
7094
7095/* ------------------------------ */
7096 .balign 128
7097.L_op_unused_fe: /* 0xfe */
7098/* File: mips64/op_unused_fe.S */
7099/* File: mips64/unused.S */
7100/*
7101 * Bail to reference interpreter to throw.
7102 */
7103 b MterpFallback
7104
7105
7106/* ------------------------------ */
7107 .balign 128
7108.L_op_unused_ff: /* 0xff */
7109/* File: mips64/op_unused_ff.S */
7110/* File: mips64/unused.S */
7111/*
7112 * Bail to reference interpreter to throw.
7113 */
7114 b MterpFallback
7115
7116
7117 .balign 128
7118 .size artMterpAsmInstructionStart, .-artMterpAsmInstructionStart
7119 .global artMterpAsmInstructionEnd
7120artMterpAsmInstructionEnd:
7121
7122/*
7123 * ===========================================================================
7124 * Sister implementations
7125 * ===========================================================================
7126 */
7127 .global artMterpAsmSisterStart
7128 .type artMterpAsmSisterStart, %function
7129 .text
7130 .balign 4
7131artMterpAsmSisterStart:
7132
7133/* continuation for op_float_to_int */
7134.Lop_float_to_int_trunc:
7135 trunc.w.s f0, f0
7136 mfc1 t0, f0
7137.Lop_float_to_int_done:
7138 /* Can't include fcvtFooter.S after break */
7139 GET_INST_OPCODE v0 # extract opcode from rINST
7140 SET_VREG t0, a1
7141 GOTO_OPCODE v0 # jump to next instruction
7142
7143/* continuation for op_float_to_long */
7144.Lop_float_to_long_trunc:
7145 trunc.l.s f0, f0
7146 dmfc1 t0, f0
7147.Lop_float_to_long_done:
7148 /* Can't include fcvtFooter.S after break */
7149 GET_INST_OPCODE v0 # extract opcode from rINST
7150 SET_VREG_WIDE t0, a1
7151 GOTO_OPCODE v0 # jump to next instruction
7152
7153/* continuation for op_double_to_int */
7154.Lop_double_to_int_trunc:
7155 trunc.w.d f0, f0
7156 mfc1 t0, f0
7157.Lop_double_to_int_done:
7158 /* Can't include fcvtFooter.S after break */
7159 GET_INST_OPCODE v0 # extract opcode from rINST
7160 SET_VREG t0, a1
7161 GOTO_OPCODE v0 # jump to next instruction
7162
7163/* continuation for op_double_to_long */
7164.Lop_double_to_long_trunc:
7165 trunc.l.d f0, f0
7166 dmfc1 t0, f0
7167.Lop_double_to_long_done:
7168 /* Can't include fcvtFooter.S after break */
7169 GET_INST_OPCODE v0 # extract opcode from rINST
7170 SET_VREG_WIDE t0, a1
7171 GOTO_OPCODE v0 # jump to next instruction
7172
7173 .size artMterpAsmSisterStart, .-artMterpAsmSisterStart
7174 .global artMterpAsmSisterEnd
7175artMterpAsmSisterEnd:
7176
7177
7178 .global artMterpAsmAltInstructionStart
7179 .type artMterpAsmAltInstructionStart, %function
7180 .text
7181
7182artMterpAsmAltInstructionStart = .L_ALT_op_nop
7183/* ------------------------------ */
7184 .balign 128
7185.L_ALT_op_nop: /* 0x00 */
7186/* File: mips64/alt_stub.S */
7187/*
7188 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7189 * any interesting requests and then jump to the real instruction
7190 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7191 */
7192 .extern MterpCheckBefore
7193 EXPORT_PC
7194 REFRESH_IBASE
7195 dla ra, artMterpAsmInstructionStart
7196 dla t9, MterpCheckBefore
7197 move a0, rSELF
7198 daddu a1, rFP, OFF_FP_SHADOWFRAME
7199 daddu ra, ra, (0 * 128) # Addr of primary handler.
7200 jalr zero, t9 # (self, shadow_frame) Note: tail call.
7201
7202/* ------------------------------ */
7203 .balign 128
7204.L_ALT_op_move: /* 0x01 */
7205/* File: mips64/alt_stub.S */
7206/*
7207 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7208 * any interesting requests and then jump to the real instruction
7209 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7210 */
7211 .extern MterpCheckBefore
7212 EXPORT_PC
7213 REFRESH_IBASE
7214 dla ra, artMterpAsmInstructionStart
7215 dla t9, MterpCheckBefore
7216 move a0, rSELF
7217 daddu a1, rFP, OFF_FP_SHADOWFRAME
7218 daddu ra, ra, (1 * 128) # Addr of primary handler.
7219 jalr zero, t9 # (self, shadow_frame) Note: tail call.
7220
7221/* ------------------------------ */
7222 .balign 128
7223.L_ALT_op_move_from16: /* 0x02 */
7224/* File: mips64/alt_stub.S */
7225/*
7226 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7227 * any interesting requests and then jump to the real instruction
7228 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7229 */
7230 .extern MterpCheckBefore
7231 EXPORT_PC
7232 REFRESH_IBASE
7233 dla ra, artMterpAsmInstructionStart
7234 dla t9, MterpCheckBefore
7235 move a0, rSELF
7236 daddu a1, rFP, OFF_FP_SHADOWFRAME
7237 daddu ra, ra, (2 * 128) # Addr of primary handler.
7238 jalr zero, t9 # (self, shadow_frame) Note: tail call.
7239
7240/* ------------------------------ */
7241 .balign 128
7242.L_ALT_op_move_16: /* 0x03 */
7243/* File: mips64/alt_stub.S */
7244/*
7245 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7246 * any interesting requests and then jump to the real instruction
7247 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7248 */
7249 .extern MterpCheckBefore
7250 EXPORT_PC
7251 REFRESH_IBASE
7252 dla ra, artMterpAsmInstructionStart
7253 dla t9, MterpCheckBefore
7254 move a0, rSELF
7255 daddu a1, rFP, OFF_FP_SHADOWFRAME
7256 daddu ra, ra, (3 * 128) # Addr of primary handler.
7257 jalr zero, t9 # (self, shadow_frame) Note: tail call.
7258
7259/* ------------------------------ */
7260 .balign 128
7261.L_ALT_op_move_wide: /* 0x04 */
7262/* File: mips64/alt_stub.S */
7263/*
7264 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7265 * any interesting requests and then jump to the real instruction
7266 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7267 */
7268 .extern MterpCheckBefore
7269 EXPORT_PC
7270 REFRESH_IBASE
7271 dla ra, artMterpAsmInstructionStart
7272 dla t9, MterpCheckBefore
7273 move a0, rSELF
7274 daddu a1, rFP, OFF_FP_SHADOWFRAME
7275 daddu ra, ra, (4 * 128) # Addr of primary handler.
7276 jalr zero, t9 # (self, shadow_frame) Note: tail call.
7277
7278/* ------------------------------ */
7279 .balign 128
7280.L_ALT_op_move_wide_from16: /* 0x05 */
7281/* File: mips64/alt_stub.S */
7282/*
7283 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7284 * any interesting requests and then jump to the real instruction
7285 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7286 */
7287 .extern MterpCheckBefore
7288 EXPORT_PC
7289 REFRESH_IBASE
7290 dla ra, artMterpAsmInstructionStart
7291 dla t9, MterpCheckBefore
7292 move a0, rSELF
7293 daddu a1, rFP, OFF_FP_SHADOWFRAME
7294 daddu ra, ra, (5 * 128) # Addr of primary handler.
7295 jalr zero, t9 # (self, shadow_frame) Note: tail call.
7296
7297/* ------------------------------ */
7298 .balign 128
7299.L_ALT_op_move_wide_16: /* 0x06 */
7300/* File: mips64/alt_stub.S */
7301/*
7302 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7303 * any interesting requests and then jump to the real instruction
7304 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7305 */
7306 .extern MterpCheckBefore
7307 EXPORT_PC
7308 REFRESH_IBASE
7309 dla ra, artMterpAsmInstructionStart
7310 dla t9, MterpCheckBefore
7311 move a0, rSELF
7312 daddu a1, rFP, OFF_FP_SHADOWFRAME
7313 daddu ra, ra, (6 * 128) # Addr of primary handler.
7314 jalr zero, t9 # (self, shadow_frame) Note: tail call.
7315
7316/* ------------------------------ */
7317 .balign 128
7318.L_ALT_op_move_object: /* 0x07 */
7319/* File: mips64/alt_stub.S */
7320/*
7321 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7322 * any interesting requests and then jump to the real instruction
7323 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7324 */
7325 .extern MterpCheckBefore
7326 EXPORT_PC
7327 REFRESH_IBASE
7328 dla ra, artMterpAsmInstructionStart
7329 dla t9, MterpCheckBefore
7330 move a0, rSELF
7331 daddu a1, rFP, OFF_FP_SHADOWFRAME
7332 daddu ra, ra, (7 * 128) # Addr of primary handler.
7333 jalr zero, t9 # (self, shadow_frame) Note: tail call.
7334
7335/* ------------------------------ */
7336 .balign 128
7337.L_ALT_op_move_object_from16: /* 0x08 */
7338/* File: mips64/alt_stub.S */
7339/*
7340 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7341 * any interesting requests and then jump to the real instruction
7342 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7343 */
7344 .extern MterpCheckBefore
7345 EXPORT_PC
7346 REFRESH_IBASE
7347 dla ra, artMterpAsmInstructionStart
7348 dla t9, MterpCheckBefore
7349 move a0, rSELF
7350 daddu a1, rFP, OFF_FP_SHADOWFRAME
7351 daddu ra, ra, (8 * 128) # Addr of primary handler.
7352 jalr zero, t9 # (self, shadow_frame) Note: tail call.
7353
7354/* ------------------------------ */
7355 .balign 128
7356.L_ALT_op_move_object_16: /* 0x09 */
7357/* File: mips64/alt_stub.S */
7358/*
7359 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7360 * any interesting requests and then jump to the real instruction
7361 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7362 */
7363 .extern MterpCheckBefore
7364 EXPORT_PC
7365 REFRESH_IBASE
7366 dla ra, artMterpAsmInstructionStart
7367 dla t9, MterpCheckBefore
7368 move a0, rSELF
7369 daddu a1, rFP, OFF_FP_SHADOWFRAME
7370 daddu ra, ra, (9 * 128) # Addr of primary handler.
7371 jalr zero, t9 # (self, shadow_frame) Note: tail call.
7372
7373/* ------------------------------ */
7374 .balign 128
7375.L_ALT_op_move_result: /* 0x0a */
7376/* File: mips64/alt_stub.S */
7377/*
7378 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7379 * any interesting requests and then jump to the real instruction
7380 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7381 */
7382 .extern MterpCheckBefore
7383 EXPORT_PC
7384 REFRESH_IBASE
7385 dla ra, artMterpAsmInstructionStart
7386 dla t9, MterpCheckBefore
7387 move a0, rSELF
7388 daddu a1, rFP, OFF_FP_SHADOWFRAME
7389 daddu ra, ra, (10 * 128) # Addr of primary handler.
7390 jalr zero, t9 # (self, shadow_frame) Note: tail call.
7391
7392/* ------------------------------ */
7393 .balign 128
7394.L_ALT_op_move_result_wide: /* 0x0b */
7395/* File: mips64/alt_stub.S */
7396/*
7397 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7398 * any interesting requests and then jump to the real instruction
7399 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7400 */
7401 .extern MterpCheckBefore
7402 EXPORT_PC
7403 REFRESH_IBASE
7404 dla ra, artMterpAsmInstructionStart
7405 dla t9, MterpCheckBefore
7406 move a0, rSELF
7407 daddu a1, rFP, OFF_FP_SHADOWFRAME
7408 daddu ra, ra, (11 * 128) # Addr of primary handler.
7409 jalr zero, t9 # (self, shadow_frame) Note: tail call.
7410
7411/* ------------------------------ */
7412 .balign 128
7413.L_ALT_op_move_result_object: /* 0x0c */
7414/* File: mips64/alt_stub.S */
7415/*
7416 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7417 * any interesting requests and then jump to the real instruction
7418 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7419 */
7420 .extern MterpCheckBefore
7421 EXPORT_PC
7422 REFRESH_IBASE
7423 dla ra, artMterpAsmInstructionStart
7424 dla t9, MterpCheckBefore
7425 move a0, rSELF
7426 daddu a1, rFP, OFF_FP_SHADOWFRAME
7427 daddu ra, ra, (12 * 128) # Addr of primary handler.
7428 jalr zero, t9 # (self, shadow_frame) Note: tail call.
7429
7430/* ------------------------------ */
7431 .balign 128
7432.L_ALT_op_move_exception: /* 0x0d */
7433/* File: mips64/alt_stub.S */
7434/*
7435 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7436 * any interesting requests and then jump to the real instruction
7437 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7438 */
7439 .extern MterpCheckBefore
7440 EXPORT_PC
7441 REFRESH_IBASE
7442 dla ra, artMterpAsmInstructionStart
7443 dla t9, MterpCheckBefore
7444 move a0, rSELF
7445 daddu a1, rFP, OFF_FP_SHADOWFRAME
7446 daddu ra, ra, (13 * 128) # Addr of primary handler.
7447 jalr zero, t9 # (self, shadow_frame) Note: tail call.
7448
7449/* ------------------------------ */
7450 .balign 128
7451.L_ALT_op_return_void: /* 0x0e */
7452/* File: mips64/alt_stub.S */
7453/*
7454 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7455 * any interesting requests and then jump to the real instruction
7456 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7457 */
7458 .extern MterpCheckBefore
7459 EXPORT_PC
7460 REFRESH_IBASE
7461 dla ra, artMterpAsmInstructionStart
7462 dla t9, MterpCheckBefore
7463 move a0, rSELF
7464 daddu a1, rFP, OFF_FP_SHADOWFRAME
7465 daddu ra, ra, (14 * 128) # Addr of primary handler.
7466 jalr zero, t9 # (self, shadow_frame) Note: tail call.
7467
7468/* ------------------------------ */
7469 .balign 128
7470.L_ALT_op_return: /* 0x0f */
7471/* File: mips64/alt_stub.S */
7472/*
7473 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7474 * any interesting requests and then jump to the real instruction
7475 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7476 */
7477 .extern MterpCheckBefore
7478 EXPORT_PC
7479 REFRESH_IBASE
7480 dla ra, artMterpAsmInstructionStart
7481 dla t9, MterpCheckBefore
7482 move a0, rSELF
7483 daddu a1, rFP, OFF_FP_SHADOWFRAME
7484 daddu ra, ra, (15 * 128) # Addr of primary handler.
7485 jalr zero, t9 # (self, shadow_frame) Note: tail call.
7486
7487/* ------------------------------ */
7488 .balign 128
7489.L_ALT_op_return_wide: /* 0x10 */
7490/* File: mips64/alt_stub.S */
7491/*
7492 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7493 * any interesting requests and then jump to the real instruction
7494 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7495 */
7496 .extern MterpCheckBefore
7497 EXPORT_PC
7498 REFRESH_IBASE
7499 dla ra, artMterpAsmInstructionStart
7500 dla t9, MterpCheckBefore
7501 move a0, rSELF
7502 daddu a1, rFP, OFF_FP_SHADOWFRAME
7503 daddu ra, ra, (16 * 128) # Addr of primary handler.
7504 jalr zero, t9 # (self, shadow_frame) Note: tail call.
7505
7506/* ------------------------------ */
7507 .balign 128
7508.L_ALT_op_return_object: /* 0x11 */
7509/* File: mips64/alt_stub.S */
7510/*
7511 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7512 * any interesting requests and then jump to the real instruction
7513 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7514 */
7515 .extern MterpCheckBefore
7516 EXPORT_PC
7517 REFRESH_IBASE
7518 dla ra, artMterpAsmInstructionStart
7519 dla t9, MterpCheckBefore
7520 move a0, rSELF
7521 daddu a1, rFP, OFF_FP_SHADOWFRAME
7522 daddu ra, ra, (17 * 128) # Addr of primary handler.
7523 jalr zero, t9 # (self, shadow_frame) Note: tail call.
7524
7525/* ------------------------------ */
7526 .balign 128
7527.L_ALT_op_const_4: /* 0x12 */
7528/* File: mips64/alt_stub.S */
7529/*
7530 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7531 * any interesting requests and then jump to the real instruction
7532 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7533 */
7534 .extern MterpCheckBefore
7535 EXPORT_PC
7536 REFRESH_IBASE
7537 dla ra, artMterpAsmInstructionStart
7538 dla t9, MterpCheckBefore
7539 move a0, rSELF
7540 daddu a1, rFP, OFF_FP_SHADOWFRAME
7541 daddu ra, ra, (18 * 128) # Addr of primary handler.
7542 jalr zero, t9 # (self, shadow_frame) Note: tail call.
7543
7544/* ------------------------------ */
7545 .balign 128
7546.L_ALT_op_const_16: /* 0x13 */
7547/* File: mips64/alt_stub.S */
7548/*
7549 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7550 * any interesting requests and then jump to the real instruction
7551 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7552 */
7553 .extern MterpCheckBefore
7554 EXPORT_PC
7555 REFRESH_IBASE
7556 dla ra, artMterpAsmInstructionStart
7557 dla t9, MterpCheckBefore
7558 move a0, rSELF
7559 daddu a1, rFP, OFF_FP_SHADOWFRAME
7560 daddu ra, ra, (19 * 128) # Addr of primary handler.
7561 jalr zero, t9 # (self, shadow_frame) Note: tail call.
7562
7563/* ------------------------------ */
7564 .balign 128
7565.L_ALT_op_const: /* 0x14 */
7566/* File: mips64/alt_stub.S */
7567/*
7568 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7569 * any interesting requests and then jump to the real instruction
7570 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7571 */
7572 .extern MterpCheckBefore
7573 EXPORT_PC
7574 REFRESH_IBASE
7575 dla ra, artMterpAsmInstructionStart
7576 dla t9, MterpCheckBefore
7577 move a0, rSELF
7578 daddu a1, rFP, OFF_FP_SHADOWFRAME
7579 daddu ra, ra, (20 * 128) # Addr of primary handler.
7580 jalr zero, t9 # (self, shadow_frame) Note: tail call.
7581
7582/* ------------------------------ */
7583 .balign 128
7584.L_ALT_op_const_high16: /* 0x15 */
7585/* File: mips64/alt_stub.S */
7586/*
7587 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7588 * any interesting requests and then jump to the real instruction
7589 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7590 */
7591 .extern MterpCheckBefore
7592 EXPORT_PC
7593 REFRESH_IBASE
7594 dla ra, artMterpAsmInstructionStart
7595 dla t9, MterpCheckBefore
7596 move a0, rSELF
7597 daddu a1, rFP, OFF_FP_SHADOWFRAME
7598 daddu ra, ra, (21 * 128) # Addr of primary handler.
7599 jalr zero, t9 # (self, shadow_frame) Note: tail call.
7600
7601/* ------------------------------ */
7602 .balign 128
7603.L_ALT_op_const_wide_16: /* 0x16 */
7604/* File: mips64/alt_stub.S */
7605/*
7606 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7607 * any interesting requests and then jump to the real instruction
7608 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7609 */
7610 .extern MterpCheckBefore
7611 EXPORT_PC
7612 REFRESH_IBASE
7613 dla ra, artMterpAsmInstructionStart
7614 dla t9, MterpCheckBefore
7615 move a0, rSELF
7616 daddu a1, rFP, OFF_FP_SHADOWFRAME
7617 daddu ra, ra, (22 * 128) # Addr of primary handler.
7618 jalr zero, t9 # (self, shadow_frame) Note: tail call.
7619
7620/* ------------------------------ */
7621 .balign 128
7622.L_ALT_op_const_wide_32: /* 0x17 */
7623/* File: mips64/alt_stub.S */
7624/*
7625 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7626 * any interesting requests and then jump to the real instruction
7627 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7628 */
7629 .extern MterpCheckBefore
7630 EXPORT_PC
7631 REFRESH_IBASE
7632 dla ra, artMterpAsmInstructionStart
7633 dla t9, MterpCheckBefore
7634 move a0, rSELF
7635 daddu a1, rFP, OFF_FP_SHADOWFRAME
7636 daddu ra, ra, (23 * 128) # Addr of primary handler.
7637 jalr zero, t9 # (self, shadow_frame) Note: tail call.
7638
7639/* ------------------------------ */
7640 .balign 128
7641.L_ALT_op_const_wide: /* 0x18 */
7642/* File: mips64/alt_stub.S */
7643/*
7644 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7645 * any interesting requests and then jump to the real instruction
7646 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7647 */
7648 .extern MterpCheckBefore
7649 EXPORT_PC
7650 REFRESH_IBASE
7651 dla ra, artMterpAsmInstructionStart
7652 dla t9, MterpCheckBefore
7653 move a0, rSELF
7654 daddu a1, rFP, OFF_FP_SHADOWFRAME
7655 daddu ra, ra, (24 * 128) # Addr of primary handler.
7656 jalr zero, t9 # (self, shadow_frame) Note: tail call.
7657
7658/* ------------------------------ */
7659 .balign 128
7660.L_ALT_op_const_wide_high16: /* 0x19 */
7661/* File: mips64/alt_stub.S */
7662/*
7663 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7664 * any interesting requests and then jump to the real instruction
7665 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7666 */
7667 .extern MterpCheckBefore
7668 EXPORT_PC
7669 REFRESH_IBASE
7670 dla ra, artMterpAsmInstructionStart
7671 dla t9, MterpCheckBefore
7672 move a0, rSELF
7673 daddu a1, rFP, OFF_FP_SHADOWFRAME
7674 daddu ra, ra, (25 * 128) # Addr of primary handler.
7675 jalr zero, t9 # (self, shadow_frame) Note: tail call.
7676
7677/* ------------------------------ */
7678 .balign 128
7679.L_ALT_op_const_string: /* 0x1a */
7680/* File: mips64/alt_stub.S */
7681/*
7682 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7683 * any interesting requests and then jump to the real instruction
7684 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7685 */
7686 .extern MterpCheckBefore
7687 EXPORT_PC
7688 REFRESH_IBASE
7689 dla ra, artMterpAsmInstructionStart
7690 dla t9, MterpCheckBefore
7691 move a0, rSELF
7692 daddu a1, rFP, OFF_FP_SHADOWFRAME
7693 daddu ra, ra, (26 * 128) # Addr of primary handler.
7694 jalr zero, t9 # (self, shadow_frame) Note: tail call.
7695
7696/* ------------------------------ */
7697 .balign 128
7698.L_ALT_op_const_string_jumbo: /* 0x1b */
7699/* File: mips64/alt_stub.S */
7700/*
7701 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7702 * any interesting requests and then jump to the real instruction
7703 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7704 */
7705 .extern MterpCheckBefore
7706 EXPORT_PC
7707 REFRESH_IBASE
7708 dla ra, artMterpAsmInstructionStart
7709 dla t9, MterpCheckBefore
7710 move a0, rSELF
7711 daddu a1, rFP, OFF_FP_SHADOWFRAME
7712 daddu ra, ra, (27 * 128) # Addr of primary handler.
7713 jalr zero, t9 # (self, shadow_frame) Note: tail call.
7714
7715/* ------------------------------ */
7716 .balign 128
7717.L_ALT_op_const_class: /* 0x1c */
7718/* File: mips64/alt_stub.S */
7719/*
7720 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7721 * any interesting requests and then jump to the real instruction
7722 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7723 */
7724 .extern MterpCheckBefore
7725 EXPORT_PC
7726 REFRESH_IBASE
7727 dla ra, artMterpAsmInstructionStart
7728 dla t9, MterpCheckBefore
7729 move a0, rSELF
7730 daddu a1, rFP, OFF_FP_SHADOWFRAME
7731 daddu ra, ra, (28 * 128) # Addr of primary handler.
7732 jalr zero, t9 # (self, shadow_frame) Note: tail call.
7733
7734/* ------------------------------ */
7735 .balign 128
7736.L_ALT_op_monitor_enter: /* 0x1d */
7737/* File: mips64/alt_stub.S */
7738/*
7739 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7740 * any interesting requests and then jump to the real instruction
7741 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7742 */
7743 .extern MterpCheckBefore
7744 EXPORT_PC
7745 REFRESH_IBASE
7746 dla ra, artMterpAsmInstructionStart
7747 dla t9, MterpCheckBefore
7748 move a0, rSELF
7749 daddu a1, rFP, OFF_FP_SHADOWFRAME
7750 daddu ra, ra, (29 * 128) # Addr of primary handler.
7751 jalr zero, t9 # (self, shadow_frame) Note: tail call.
7752
7753/* ------------------------------ */
7754 .balign 128
7755.L_ALT_op_monitor_exit: /* 0x1e */
7756/* File: mips64/alt_stub.S */
7757/*
7758 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7759 * any interesting requests and then jump to the real instruction
7760 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7761 */
7762 .extern MterpCheckBefore
7763 EXPORT_PC
7764 REFRESH_IBASE
7765 dla ra, artMterpAsmInstructionStart
7766 dla t9, MterpCheckBefore
7767 move a0, rSELF
7768 daddu a1, rFP, OFF_FP_SHADOWFRAME
7769 daddu ra, ra, (30 * 128) # Addr of primary handler.
7770 jalr zero, t9 # (self, shadow_frame) Note: tail call.
7771
7772/* ------------------------------ */
7773 .balign 128
7774.L_ALT_op_check_cast: /* 0x1f */
7775/* File: mips64/alt_stub.S */
7776/*
7777 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7778 * any interesting requests and then jump to the real instruction
7779 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7780 */
7781 .extern MterpCheckBefore
7782 EXPORT_PC
7783 REFRESH_IBASE
7784 dla ra, artMterpAsmInstructionStart
7785 dla t9, MterpCheckBefore
7786 move a0, rSELF
7787 daddu a1, rFP, OFF_FP_SHADOWFRAME
7788 daddu ra, ra, (31 * 128) # Addr of primary handler.
7789 jalr zero, t9 # (self, shadow_frame) Note: tail call.
7790
7791/* ------------------------------ */
7792 .balign 128
7793.L_ALT_op_instance_of: /* 0x20 */
7794/* File: mips64/alt_stub.S */
7795/*
7796 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7797 * any interesting requests and then jump to the real instruction
7798 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7799 */
7800 .extern MterpCheckBefore
7801 EXPORT_PC
7802 REFRESH_IBASE
7803 dla ra, artMterpAsmInstructionStart
7804 dla t9, MterpCheckBefore
7805 move a0, rSELF
7806 daddu a1, rFP, OFF_FP_SHADOWFRAME
7807 daddu ra, ra, (32 * 128) # Addr of primary handler.
7808 jalr zero, t9 # (self, shadow_frame) Note: tail call.
7809
7810/* ------------------------------ */
7811 .balign 128
7812.L_ALT_op_array_length: /* 0x21 */
7813/* File: mips64/alt_stub.S */
7814/*
7815 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7816 * any interesting requests and then jump to the real instruction
7817 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7818 */
7819 .extern MterpCheckBefore
7820 EXPORT_PC
7821 REFRESH_IBASE
7822 dla ra, artMterpAsmInstructionStart
7823 dla t9, MterpCheckBefore
7824 move a0, rSELF
7825 daddu a1, rFP, OFF_FP_SHADOWFRAME
7826 daddu ra, ra, (33 * 128) # Addr of primary handler.
7827 jalr zero, t9 # (self, shadow_frame) Note: tail call.
7828
7829/* ------------------------------ */
7830 .balign 128
7831.L_ALT_op_new_instance: /* 0x22 */
7832/* File: mips64/alt_stub.S */
7833/*
7834 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7835 * any interesting requests and then jump to the real instruction
7836 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7837 */
7838 .extern MterpCheckBefore
7839 EXPORT_PC
7840 REFRESH_IBASE
7841 dla ra, artMterpAsmInstructionStart
7842 dla t9, MterpCheckBefore
7843 move a0, rSELF
7844 daddu a1, rFP, OFF_FP_SHADOWFRAME
7845 daddu ra, ra, (34 * 128) # Addr of primary handler.
7846 jalr zero, t9 # (self, shadow_frame) Note: tail call.
7847
7848/* ------------------------------ */
7849 .balign 128
7850.L_ALT_op_new_array: /* 0x23 */
7851/* File: mips64/alt_stub.S */
7852/*
7853 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7854 * any interesting requests and then jump to the real instruction
7855 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7856 */
7857 .extern MterpCheckBefore
7858 EXPORT_PC
7859 REFRESH_IBASE
7860 dla ra, artMterpAsmInstructionStart
7861 dla t9, MterpCheckBefore
7862 move a0, rSELF
7863 daddu a1, rFP, OFF_FP_SHADOWFRAME
7864 daddu ra, ra, (35 * 128) # Addr of primary handler.
7865 jalr zero, t9 # (self, shadow_frame) Note: tail call.
7866
7867/* ------------------------------ */
7868 .balign 128
7869.L_ALT_op_filled_new_array: /* 0x24 */
7870/* File: mips64/alt_stub.S */
7871/*
7872 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7873 * any interesting requests and then jump to the real instruction
7874 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7875 */
7876 .extern MterpCheckBefore
7877 EXPORT_PC
7878 REFRESH_IBASE
7879 dla ra, artMterpAsmInstructionStart
7880 dla t9, MterpCheckBefore
7881 move a0, rSELF
7882 daddu a1, rFP, OFF_FP_SHADOWFRAME
7883 daddu ra, ra, (36 * 128) # Addr of primary handler.
7884 jalr zero, t9 # (self, shadow_frame) Note: tail call.
7885
7886/* ------------------------------ */
7887 .balign 128
7888.L_ALT_op_filled_new_array_range: /* 0x25 */
7889/* File: mips64/alt_stub.S */
7890/*
7891 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7892 * any interesting requests and then jump to the real instruction
7893 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7894 */
7895 .extern MterpCheckBefore
7896 EXPORT_PC
7897 REFRESH_IBASE
7898 dla ra, artMterpAsmInstructionStart
7899 dla t9, MterpCheckBefore
7900 move a0, rSELF
7901 daddu a1, rFP, OFF_FP_SHADOWFRAME
7902 daddu ra, ra, (37 * 128) # Addr of primary handler.
7903 jalr zero, t9 # (self, shadow_frame) Note: tail call.
7904
7905/* ------------------------------ */
7906 .balign 128
7907.L_ALT_op_fill_array_data: /* 0x26 */
7908/* File: mips64/alt_stub.S */
7909/*
7910 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7911 * any interesting requests and then jump to the real instruction
7912 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7913 */
7914 .extern MterpCheckBefore
7915 EXPORT_PC
7916 REFRESH_IBASE
7917 dla ra, artMterpAsmInstructionStart
7918 dla t9, MterpCheckBefore
7919 move a0, rSELF
7920 daddu a1, rFP, OFF_FP_SHADOWFRAME
7921 daddu ra, ra, (38 * 128) # Addr of primary handler.
7922 jalr zero, t9 # (self, shadow_frame) Note: tail call.
7923
7924/* ------------------------------ */
7925 .balign 128
7926.L_ALT_op_throw: /* 0x27 */
7927/* File: mips64/alt_stub.S */
7928/*
7929 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7930 * any interesting requests and then jump to the real instruction
7931 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7932 */
7933 .extern MterpCheckBefore
7934 EXPORT_PC
7935 REFRESH_IBASE
7936 dla ra, artMterpAsmInstructionStart
7937 dla t9, MterpCheckBefore
7938 move a0, rSELF
7939 daddu a1, rFP, OFF_FP_SHADOWFRAME
7940 daddu ra, ra, (39 * 128) # Addr of primary handler.
7941 jalr zero, t9 # (self, shadow_frame) Note: tail call.
7942
7943/* ------------------------------ */
7944 .balign 128
7945.L_ALT_op_goto: /* 0x28 */
7946/* File: mips64/alt_stub.S */
7947/*
7948 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7949 * any interesting requests and then jump to the real instruction
7950 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7951 */
7952 .extern MterpCheckBefore
7953 EXPORT_PC
7954 REFRESH_IBASE
7955 dla ra, artMterpAsmInstructionStart
7956 dla t9, MterpCheckBefore
7957 move a0, rSELF
7958 daddu a1, rFP, OFF_FP_SHADOWFRAME
7959 daddu ra, ra, (40 * 128) # Addr of primary handler.
7960 jalr zero, t9 # (self, shadow_frame) Note: tail call.
7961
7962/* ------------------------------ */
7963 .balign 128
7964.L_ALT_op_goto_16: /* 0x29 */
7965/* File: mips64/alt_stub.S */
7966/*
7967 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7968 * any interesting requests and then jump to the real instruction
7969 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7970 */
7971 .extern MterpCheckBefore
7972 EXPORT_PC
7973 REFRESH_IBASE
7974 dla ra, artMterpAsmInstructionStart
7975 dla t9, MterpCheckBefore
7976 move a0, rSELF
7977 daddu a1, rFP, OFF_FP_SHADOWFRAME
7978 daddu ra, ra, (41 * 128) # Addr of primary handler.
7979 jalr zero, t9 # (self, shadow_frame) Note: tail call.
7980
7981/* ------------------------------ */
7982 .balign 128
7983.L_ALT_op_goto_32: /* 0x2a */
7984/* File: mips64/alt_stub.S */
7985/*
7986 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7987 * any interesting requests and then jump to the real instruction
7988 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7989 */
7990 .extern MterpCheckBefore
7991 EXPORT_PC
7992 REFRESH_IBASE
7993 dla ra, artMterpAsmInstructionStart
7994 dla t9, MterpCheckBefore
7995 move a0, rSELF
7996 daddu a1, rFP, OFF_FP_SHADOWFRAME
7997 daddu ra, ra, (42 * 128) # Addr of primary handler.
7998 jalr zero, t9 # (self, shadow_frame) Note: tail call.
7999
8000/* ------------------------------ */
8001 .balign 128
8002.L_ALT_op_packed_switch: /* 0x2b */
8003/* File: mips64/alt_stub.S */
8004/*
8005 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8006 * any interesting requests and then jump to the real instruction
8007 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8008 */
8009 .extern MterpCheckBefore
8010 EXPORT_PC
8011 REFRESH_IBASE
8012 dla ra, artMterpAsmInstructionStart
8013 dla t9, MterpCheckBefore
8014 move a0, rSELF
8015 daddu a1, rFP, OFF_FP_SHADOWFRAME
8016 daddu ra, ra, (43 * 128) # Addr of primary handler.
8017 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8018
8019/* ------------------------------ */
8020 .balign 128
8021.L_ALT_op_sparse_switch: /* 0x2c */
8022/* File: mips64/alt_stub.S */
8023/*
8024 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8025 * any interesting requests and then jump to the real instruction
8026 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8027 */
8028 .extern MterpCheckBefore
8029 EXPORT_PC
8030 REFRESH_IBASE
8031 dla ra, artMterpAsmInstructionStart
8032 dla t9, MterpCheckBefore
8033 move a0, rSELF
8034 daddu a1, rFP, OFF_FP_SHADOWFRAME
8035 daddu ra, ra, (44 * 128) # Addr of primary handler.
8036 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8037
8038/* ------------------------------ */
8039 .balign 128
8040.L_ALT_op_cmpl_float: /* 0x2d */
8041/* File: mips64/alt_stub.S */
8042/*
8043 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8044 * any interesting requests and then jump to the real instruction
8045 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8046 */
8047 .extern MterpCheckBefore
8048 EXPORT_PC
8049 REFRESH_IBASE
8050 dla ra, artMterpAsmInstructionStart
8051 dla t9, MterpCheckBefore
8052 move a0, rSELF
8053 daddu a1, rFP, OFF_FP_SHADOWFRAME
8054 daddu ra, ra, (45 * 128) # Addr of primary handler.
8055 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8056
8057/* ------------------------------ */
8058 .balign 128
8059.L_ALT_op_cmpg_float: /* 0x2e */
8060/* File: mips64/alt_stub.S */
8061/*
8062 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8063 * any interesting requests and then jump to the real instruction
8064 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8065 */
8066 .extern MterpCheckBefore
8067 EXPORT_PC
8068 REFRESH_IBASE
8069 dla ra, artMterpAsmInstructionStart
8070 dla t9, MterpCheckBefore
8071 move a0, rSELF
8072 daddu a1, rFP, OFF_FP_SHADOWFRAME
8073 daddu ra, ra, (46 * 128) # Addr of primary handler.
8074 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8075
8076/* ------------------------------ */
8077 .balign 128
8078.L_ALT_op_cmpl_double: /* 0x2f */
8079/* File: mips64/alt_stub.S */
8080/*
8081 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8082 * any interesting requests and then jump to the real instruction
8083 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8084 */
8085 .extern MterpCheckBefore
8086 EXPORT_PC
8087 REFRESH_IBASE
8088 dla ra, artMterpAsmInstructionStart
8089 dla t9, MterpCheckBefore
8090 move a0, rSELF
8091 daddu a1, rFP, OFF_FP_SHADOWFRAME
8092 daddu ra, ra, (47 * 128) # Addr of primary handler.
8093 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8094
8095/* ------------------------------ */
8096 .balign 128
8097.L_ALT_op_cmpg_double: /* 0x30 */
8098/* File: mips64/alt_stub.S */
8099/*
8100 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8101 * any interesting requests and then jump to the real instruction
8102 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8103 */
8104 .extern MterpCheckBefore
8105 EXPORT_PC
8106 REFRESH_IBASE
8107 dla ra, artMterpAsmInstructionStart
8108 dla t9, MterpCheckBefore
8109 move a0, rSELF
8110 daddu a1, rFP, OFF_FP_SHADOWFRAME
8111 daddu ra, ra, (48 * 128) # Addr of primary handler.
8112 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8113
8114/* ------------------------------ */
8115 .balign 128
8116.L_ALT_op_cmp_long: /* 0x31 */
8117/* File: mips64/alt_stub.S */
8118/*
8119 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8120 * any interesting requests and then jump to the real instruction
8121 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8122 */
8123 .extern MterpCheckBefore
8124 EXPORT_PC
8125 REFRESH_IBASE
8126 dla ra, artMterpAsmInstructionStart
8127 dla t9, MterpCheckBefore
8128 move a0, rSELF
8129 daddu a1, rFP, OFF_FP_SHADOWFRAME
8130 daddu ra, ra, (49 * 128) # Addr of primary handler.
8131 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8132
8133/* ------------------------------ */
8134 .balign 128
8135.L_ALT_op_if_eq: /* 0x32 */
8136/* File: mips64/alt_stub.S */
8137/*
8138 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8139 * any interesting requests and then jump to the real instruction
8140 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8141 */
8142 .extern MterpCheckBefore
8143 EXPORT_PC
8144 REFRESH_IBASE
8145 dla ra, artMterpAsmInstructionStart
8146 dla t9, MterpCheckBefore
8147 move a0, rSELF
8148 daddu a1, rFP, OFF_FP_SHADOWFRAME
8149 daddu ra, ra, (50 * 128) # Addr of primary handler.
8150 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8151
8152/* ------------------------------ */
8153 .balign 128
8154.L_ALT_op_if_ne: /* 0x33 */
8155/* File: mips64/alt_stub.S */
8156/*
8157 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8158 * any interesting requests and then jump to the real instruction
8159 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8160 */
8161 .extern MterpCheckBefore
8162 EXPORT_PC
8163 REFRESH_IBASE
8164 dla ra, artMterpAsmInstructionStart
8165 dla t9, MterpCheckBefore
8166 move a0, rSELF
8167 daddu a1, rFP, OFF_FP_SHADOWFRAME
8168 daddu ra, ra, (51 * 128) # Addr of primary handler.
8169 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8170
8171/* ------------------------------ */
8172 .balign 128
8173.L_ALT_op_if_lt: /* 0x34 */
8174/* File: mips64/alt_stub.S */
8175/*
8176 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8177 * any interesting requests and then jump to the real instruction
8178 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8179 */
8180 .extern MterpCheckBefore
8181 EXPORT_PC
8182 REFRESH_IBASE
8183 dla ra, artMterpAsmInstructionStart
8184 dla t9, MterpCheckBefore
8185 move a0, rSELF
8186 daddu a1, rFP, OFF_FP_SHADOWFRAME
8187 daddu ra, ra, (52 * 128) # Addr of primary handler.
8188 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8189
8190/* ------------------------------ */
8191 .balign 128
8192.L_ALT_op_if_ge: /* 0x35 */
8193/* File: mips64/alt_stub.S */
8194/*
8195 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8196 * any interesting requests and then jump to the real instruction
8197 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8198 */
8199 .extern MterpCheckBefore
8200 EXPORT_PC
8201 REFRESH_IBASE
8202 dla ra, artMterpAsmInstructionStart
8203 dla t9, MterpCheckBefore
8204 move a0, rSELF
8205 daddu a1, rFP, OFF_FP_SHADOWFRAME
8206 daddu ra, ra, (53 * 128) # Addr of primary handler.
8207 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8208
8209/* ------------------------------ */
8210 .balign 128
8211.L_ALT_op_if_gt: /* 0x36 */
8212/* File: mips64/alt_stub.S */
8213/*
8214 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8215 * any interesting requests and then jump to the real instruction
8216 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8217 */
8218 .extern MterpCheckBefore
8219 EXPORT_PC
8220 REFRESH_IBASE
8221 dla ra, artMterpAsmInstructionStart
8222 dla t9, MterpCheckBefore
8223 move a0, rSELF
8224 daddu a1, rFP, OFF_FP_SHADOWFRAME
8225 daddu ra, ra, (54 * 128) # Addr of primary handler.
8226 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8227
8228/* ------------------------------ */
8229 .balign 128
8230.L_ALT_op_if_le: /* 0x37 */
8231/* File: mips64/alt_stub.S */
8232/*
8233 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8234 * any interesting requests and then jump to the real instruction
8235 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8236 */
8237 .extern MterpCheckBefore
8238 EXPORT_PC
8239 REFRESH_IBASE
8240 dla ra, artMterpAsmInstructionStart
8241 dla t9, MterpCheckBefore
8242 move a0, rSELF
8243 daddu a1, rFP, OFF_FP_SHADOWFRAME
8244 daddu ra, ra, (55 * 128) # Addr of primary handler.
8245 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8246
8247/* ------------------------------ */
8248 .balign 128
8249.L_ALT_op_if_eqz: /* 0x38 */
8250/* File: mips64/alt_stub.S */
8251/*
8252 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8253 * any interesting requests and then jump to the real instruction
8254 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8255 */
8256 .extern MterpCheckBefore
8257 EXPORT_PC
8258 REFRESH_IBASE
8259 dla ra, artMterpAsmInstructionStart
8260 dla t9, MterpCheckBefore
8261 move a0, rSELF
8262 daddu a1, rFP, OFF_FP_SHADOWFRAME
8263 daddu ra, ra, (56 * 128) # Addr of primary handler.
8264 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8265
8266/* ------------------------------ */
8267 .balign 128
8268.L_ALT_op_if_nez: /* 0x39 */
8269/* File: mips64/alt_stub.S */
8270/*
8271 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8272 * any interesting requests and then jump to the real instruction
8273 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8274 */
8275 .extern MterpCheckBefore
8276 EXPORT_PC
8277 REFRESH_IBASE
8278 dla ra, artMterpAsmInstructionStart
8279 dla t9, MterpCheckBefore
8280 move a0, rSELF
8281 daddu a1, rFP, OFF_FP_SHADOWFRAME
8282 daddu ra, ra, (57 * 128) # Addr of primary handler.
8283 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8284
8285/* ------------------------------ */
8286 .balign 128
8287.L_ALT_op_if_ltz: /* 0x3a */
8288/* File: mips64/alt_stub.S */
8289/*
8290 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8291 * any interesting requests and then jump to the real instruction
8292 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8293 */
8294 .extern MterpCheckBefore
8295 EXPORT_PC
8296 REFRESH_IBASE
8297 dla ra, artMterpAsmInstructionStart
8298 dla t9, MterpCheckBefore
8299 move a0, rSELF
8300 daddu a1, rFP, OFF_FP_SHADOWFRAME
8301 daddu ra, ra, (58 * 128) # Addr of primary handler.
8302 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8303
8304/* ------------------------------ */
8305 .balign 128
8306.L_ALT_op_if_gez: /* 0x3b */
8307/* File: mips64/alt_stub.S */
8308/*
8309 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8310 * any interesting requests and then jump to the real instruction
8311 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8312 */
8313 .extern MterpCheckBefore
8314 EXPORT_PC
8315 REFRESH_IBASE
8316 dla ra, artMterpAsmInstructionStart
8317 dla t9, MterpCheckBefore
8318 move a0, rSELF
8319 daddu a1, rFP, OFF_FP_SHADOWFRAME
8320 daddu ra, ra, (59 * 128) # Addr of primary handler.
8321 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8322
8323/* ------------------------------ */
8324 .balign 128
8325.L_ALT_op_if_gtz: /* 0x3c */
8326/* File: mips64/alt_stub.S */
8327/*
8328 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8329 * any interesting requests and then jump to the real instruction
8330 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8331 */
8332 .extern MterpCheckBefore
8333 EXPORT_PC
8334 REFRESH_IBASE
8335 dla ra, artMterpAsmInstructionStart
8336 dla t9, MterpCheckBefore
8337 move a0, rSELF
8338 daddu a1, rFP, OFF_FP_SHADOWFRAME
8339 daddu ra, ra, (60 * 128) # Addr of primary handler.
8340 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8341
8342/* ------------------------------ */
8343 .balign 128
8344.L_ALT_op_if_lez: /* 0x3d */
8345/* File: mips64/alt_stub.S */
8346/*
8347 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8348 * any interesting requests and then jump to the real instruction
8349 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8350 */
8351 .extern MterpCheckBefore
8352 EXPORT_PC
8353 REFRESH_IBASE
8354 dla ra, artMterpAsmInstructionStart
8355 dla t9, MterpCheckBefore
8356 move a0, rSELF
8357 daddu a1, rFP, OFF_FP_SHADOWFRAME
8358 daddu ra, ra, (61 * 128) # Addr of primary handler.
8359 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8360
8361/* ------------------------------ */
8362 .balign 128
8363.L_ALT_op_unused_3e: /* 0x3e */
8364/* File: mips64/alt_stub.S */
8365/*
8366 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8367 * any interesting requests and then jump to the real instruction
8368 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8369 */
8370 .extern MterpCheckBefore
8371 EXPORT_PC
8372 REFRESH_IBASE
8373 dla ra, artMterpAsmInstructionStart
8374 dla t9, MterpCheckBefore
8375 move a0, rSELF
8376 daddu a1, rFP, OFF_FP_SHADOWFRAME
8377 daddu ra, ra, (62 * 128) # Addr of primary handler.
8378 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8379
8380/* ------------------------------ */
8381 .balign 128
8382.L_ALT_op_unused_3f: /* 0x3f */
8383/* File: mips64/alt_stub.S */
8384/*
8385 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8386 * any interesting requests and then jump to the real instruction
8387 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8388 */
8389 .extern MterpCheckBefore
8390 EXPORT_PC
8391 REFRESH_IBASE
8392 dla ra, artMterpAsmInstructionStart
8393 dla t9, MterpCheckBefore
8394 move a0, rSELF
8395 daddu a1, rFP, OFF_FP_SHADOWFRAME
8396 daddu ra, ra, (63 * 128) # Addr of primary handler.
8397 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8398
8399/* ------------------------------ */
8400 .balign 128
8401.L_ALT_op_unused_40: /* 0x40 */
8402/* File: mips64/alt_stub.S */
8403/*
8404 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8405 * any interesting requests and then jump to the real instruction
8406 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8407 */
8408 .extern MterpCheckBefore
8409 EXPORT_PC
8410 REFRESH_IBASE
8411 dla ra, artMterpAsmInstructionStart
8412 dla t9, MterpCheckBefore
8413 move a0, rSELF
8414 daddu a1, rFP, OFF_FP_SHADOWFRAME
8415 daddu ra, ra, (64 * 128) # Addr of primary handler.
8416 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8417
8418/* ------------------------------ */
8419 .balign 128
8420.L_ALT_op_unused_41: /* 0x41 */
8421/* File: mips64/alt_stub.S */
8422/*
8423 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8424 * any interesting requests and then jump to the real instruction
8425 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8426 */
8427 .extern MterpCheckBefore
8428 EXPORT_PC
8429 REFRESH_IBASE
8430 dla ra, artMterpAsmInstructionStart
8431 dla t9, MterpCheckBefore
8432 move a0, rSELF
8433 daddu a1, rFP, OFF_FP_SHADOWFRAME
8434 daddu ra, ra, (65 * 128) # Addr of primary handler.
8435 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8436
8437/* ------------------------------ */
8438 .balign 128
8439.L_ALT_op_unused_42: /* 0x42 */
8440/* File: mips64/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 REFRESH_IBASE
8449 dla ra, artMterpAsmInstructionStart
8450 dla t9, MterpCheckBefore
8451 move a0, rSELF
8452 daddu a1, rFP, OFF_FP_SHADOWFRAME
8453 daddu ra, ra, (66 * 128) # Addr of primary handler.
8454 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8455
8456/* ------------------------------ */
8457 .balign 128
8458.L_ALT_op_unused_43: /* 0x43 */
8459/* File: mips64/alt_stub.S */
8460/*
8461 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8462 * any interesting requests and then jump to the real instruction
8463 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8464 */
8465 .extern MterpCheckBefore
8466 EXPORT_PC
8467 REFRESH_IBASE
8468 dla ra, artMterpAsmInstructionStart
8469 dla t9, MterpCheckBefore
8470 move a0, rSELF
8471 daddu a1, rFP, OFF_FP_SHADOWFRAME
8472 daddu ra, ra, (67 * 128) # Addr of primary handler.
8473 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8474
8475/* ------------------------------ */
8476 .balign 128
8477.L_ALT_op_aget: /* 0x44 */
8478/* File: mips64/alt_stub.S */
8479/*
8480 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8481 * any interesting requests and then jump to the real instruction
8482 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8483 */
8484 .extern MterpCheckBefore
8485 EXPORT_PC
8486 REFRESH_IBASE
8487 dla ra, artMterpAsmInstructionStart
8488 dla t9, MterpCheckBefore
8489 move a0, rSELF
8490 daddu a1, rFP, OFF_FP_SHADOWFRAME
8491 daddu ra, ra, (68 * 128) # Addr of primary handler.
8492 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8493
8494/* ------------------------------ */
8495 .balign 128
8496.L_ALT_op_aget_wide: /* 0x45 */
8497/* File: mips64/alt_stub.S */
8498/*
8499 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8500 * any interesting requests and then jump to the real instruction
8501 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8502 */
8503 .extern MterpCheckBefore
8504 EXPORT_PC
8505 REFRESH_IBASE
8506 dla ra, artMterpAsmInstructionStart
8507 dla t9, MterpCheckBefore
8508 move a0, rSELF
8509 daddu a1, rFP, OFF_FP_SHADOWFRAME
8510 daddu ra, ra, (69 * 128) # Addr of primary handler.
8511 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8512
8513/* ------------------------------ */
8514 .balign 128
8515.L_ALT_op_aget_object: /* 0x46 */
8516/* File: mips64/alt_stub.S */
8517/*
8518 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8519 * any interesting requests and then jump to the real instruction
8520 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8521 */
8522 .extern MterpCheckBefore
8523 EXPORT_PC
8524 REFRESH_IBASE
8525 dla ra, artMterpAsmInstructionStart
8526 dla t9, MterpCheckBefore
8527 move a0, rSELF
8528 daddu a1, rFP, OFF_FP_SHADOWFRAME
8529 daddu ra, ra, (70 * 128) # Addr of primary handler.
8530 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8531
8532/* ------------------------------ */
8533 .balign 128
8534.L_ALT_op_aget_boolean: /* 0x47 */
8535/* File: mips64/alt_stub.S */
8536/*
8537 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8538 * any interesting requests and then jump to the real instruction
8539 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8540 */
8541 .extern MterpCheckBefore
8542 EXPORT_PC
8543 REFRESH_IBASE
8544 dla ra, artMterpAsmInstructionStart
8545 dla t9, MterpCheckBefore
8546 move a0, rSELF
8547 daddu a1, rFP, OFF_FP_SHADOWFRAME
8548 daddu ra, ra, (71 * 128) # Addr of primary handler.
8549 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8550
8551/* ------------------------------ */
8552 .balign 128
8553.L_ALT_op_aget_byte: /* 0x48 */
8554/* File: mips64/alt_stub.S */
8555/*
8556 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8557 * any interesting requests and then jump to the real instruction
8558 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8559 */
8560 .extern MterpCheckBefore
8561 EXPORT_PC
8562 REFRESH_IBASE
8563 dla ra, artMterpAsmInstructionStart
8564 dla t9, MterpCheckBefore
8565 move a0, rSELF
8566 daddu a1, rFP, OFF_FP_SHADOWFRAME
8567 daddu ra, ra, (72 * 128) # Addr of primary handler.
8568 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8569
8570/* ------------------------------ */
8571 .balign 128
8572.L_ALT_op_aget_char: /* 0x49 */
8573/* File: mips64/alt_stub.S */
8574/*
8575 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8576 * any interesting requests and then jump to the real instruction
8577 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8578 */
8579 .extern MterpCheckBefore
8580 EXPORT_PC
8581 REFRESH_IBASE
8582 dla ra, artMterpAsmInstructionStart
8583 dla t9, MterpCheckBefore
8584 move a0, rSELF
8585 daddu a1, rFP, OFF_FP_SHADOWFRAME
8586 daddu ra, ra, (73 * 128) # Addr of primary handler.
8587 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8588
8589/* ------------------------------ */
8590 .balign 128
8591.L_ALT_op_aget_short: /* 0x4a */
8592/* File: mips64/alt_stub.S */
8593/*
8594 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8595 * any interesting requests and then jump to the real instruction
8596 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8597 */
8598 .extern MterpCheckBefore
8599 EXPORT_PC
8600 REFRESH_IBASE
8601 dla ra, artMterpAsmInstructionStart
8602 dla t9, MterpCheckBefore
8603 move a0, rSELF
8604 daddu a1, rFP, OFF_FP_SHADOWFRAME
8605 daddu ra, ra, (74 * 128) # Addr of primary handler.
8606 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8607
8608/* ------------------------------ */
8609 .balign 128
8610.L_ALT_op_aput: /* 0x4b */
8611/* File: mips64/alt_stub.S */
8612/*
8613 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8614 * any interesting requests and then jump to the real instruction
8615 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8616 */
8617 .extern MterpCheckBefore
8618 EXPORT_PC
8619 REFRESH_IBASE
8620 dla ra, artMterpAsmInstructionStart
8621 dla t9, MterpCheckBefore
8622 move a0, rSELF
8623 daddu a1, rFP, OFF_FP_SHADOWFRAME
8624 daddu ra, ra, (75 * 128) # Addr of primary handler.
8625 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8626
8627/* ------------------------------ */
8628 .balign 128
8629.L_ALT_op_aput_wide: /* 0x4c */
8630/* File: mips64/alt_stub.S */
8631/*
8632 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8633 * any interesting requests and then jump to the real instruction
8634 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8635 */
8636 .extern MterpCheckBefore
8637 EXPORT_PC
8638 REFRESH_IBASE
8639 dla ra, artMterpAsmInstructionStart
8640 dla t9, MterpCheckBefore
8641 move a0, rSELF
8642 daddu a1, rFP, OFF_FP_SHADOWFRAME
8643 daddu ra, ra, (76 * 128) # Addr of primary handler.
8644 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8645
8646/* ------------------------------ */
8647 .balign 128
8648.L_ALT_op_aput_object: /* 0x4d */
8649/* File: mips64/alt_stub.S */
8650/*
8651 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8652 * any interesting requests and then jump to the real instruction
8653 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8654 */
8655 .extern MterpCheckBefore
8656 EXPORT_PC
8657 REFRESH_IBASE
8658 dla ra, artMterpAsmInstructionStart
8659 dla t9, MterpCheckBefore
8660 move a0, rSELF
8661 daddu a1, rFP, OFF_FP_SHADOWFRAME
8662 daddu ra, ra, (77 * 128) # Addr of primary handler.
8663 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8664
8665/* ------------------------------ */
8666 .balign 128
8667.L_ALT_op_aput_boolean: /* 0x4e */
8668/* File: mips64/alt_stub.S */
8669/*
8670 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8671 * any interesting requests and then jump to the real instruction
8672 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8673 */
8674 .extern MterpCheckBefore
8675 EXPORT_PC
8676 REFRESH_IBASE
8677 dla ra, artMterpAsmInstructionStart
8678 dla t9, MterpCheckBefore
8679 move a0, rSELF
8680 daddu a1, rFP, OFF_FP_SHADOWFRAME
8681 daddu ra, ra, (78 * 128) # Addr of primary handler.
8682 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8683
8684/* ------------------------------ */
8685 .balign 128
8686.L_ALT_op_aput_byte: /* 0x4f */
8687/* File: mips64/alt_stub.S */
8688/*
8689 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8690 * any interesting requests and then jump to the real instruction
8691 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8692 */
8693 .extern MterpCheckBefore
8694 EXPORT_PC
8695 REFRESH_IBASE
8696 dla ra, artMterpAsmInstructionStart
8697 dla t9, MterpCheckBefore
8698 move a0, rSELF
8699 daddu a1, rFP, OFF_FP_SHADOWFRAME
8700 daddu ra, ra, (79 * 128) # Addr of primary handler.
8701 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8702
8703/* ------------------------------ */
8704 .balign 128
8705.L_ALT_op_aput_char: /* 0x50 */
8706/* File: mips64/alt_stub.S */
8707/*
8708 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8709 * any interesting requests and then jump to the real instruction
8710 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8711 */
8712 .extern MterpCheckBefore
8713 EXPORT_PC
8714 REFRESH_IBASE
8715 dla ra, artMterpAsmInstructionStart
8716 dla t9, MterpCheckBefore
8717 move a0, rSELF
8718 daddu a1, rFP, OFF_FP_SHADOWFRAME
8719 daddu ra, ra, (80 * 128) # Addr of primary handler.
8720 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8721
8722/* ------------------------------ */
8723 .balign 128
8724.L_ALT_op_aput_short: /* 0x51 */
8725/* File: mips64/alt_stub.S */
8726/*
8727 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8728 * any interesting requests and then jump to the real instruction
8729 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8730 */
8731 .extern MterpCheckBefore
8732 EXPORT_PC
8733 REFRESH_IBASE
8734 dla ra, artMterpAsmInstructionStart
8735 dla t9, MterpCheckBefore
8736 move a0, rSELF
8737 daddu a1, rFP, OFF_FP_SHADOWFRAME
8738 daddu ra, ra, (81 * 128) # Addr of primary handler.
8739 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8740
8741/* ------------------------------ */
8742 .balign 128
8743.L_ALT_op_iget: /* 0x52 */
8744/* File: mips64/alt_stub.S */
8745/*
8746 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8747 * any interesting requests and then jump to the real instruction
8748 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8749 */
8750 .extern MterpCheckBefore
8751 EXPORT_PC
8752 REFRESH_IBASE
8753 dla ra, artMterpAsmInstructionStart
8754 dla t9, MterpCheckBefore
8755 move a0, rSELF
8756 daddu a1, rFP, OFF_FP_SHADOWFRAME
8757 daddu ra, ra, (82 * 128) # Addr of primary handler.
8758 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8759
8760/* ------------------------------ */
8761 .balign 128
8762.L_ALT_op_iget_wide: /* 0x53 */
8763/* File: mips64/alt_stub.S */
8764/*
8765 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8766 * any interesting requests and then jump to the real instruction
8767 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8768 */
8769 .extern MterpCheckBefore
8770 EXPORT_PC
8771 REFRESH_IBASE
8772 dla ra, artMterpAsmInstructionStart
8773 dla t9, MterpCheckBefore
8774 move a0, rSELF
8775 daddu a1, rFP, OFF_FP_SHADOWFRAME
8776 daddu ra, ra, (83 * 128) # Addr of primary handler.
8777 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8778
8779/* ------------------------------ */
8780 .balign 128
8781.L_ALT_op_iget_object: /* 0x54 */
8782/* File: mips64/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 REFRESH_IBASE
8791 dla ra, artMterpAsmInstructionStart
8792 dla t9, MterpCheckBefore
8793 move a0, rSELF
8794 daddu a1, rFP, OFF_FP_SHADOWFRAME
8795 daddu ra, ra, (84 * 128) # Addr of primary handler.
8796 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8797
8798/* ------------------------------ */
8799 .balign 128
8800.L_ALT_op_iget_boolean: /* 0x55 */
8801/* File: mips64/alt_stub.S */
8802/*
8803 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8804 * any interesting requests and then jump to the real instruction
8805 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8806 */
8807 .extern MterpCheckBefore
8808 EXPORT_PC
8809 REFRESH_IBASE
8810 dla ra, artMterpAsmInstructionStart
8811 dla t9, MterpCheckBefore
8812 move a0, rSELF
8813 daddu a1, rFP, OFF_FP_SHADOWFRAME
8814 daddu ra, ra, (85 * 128) # Addr of primary handler.
8815 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8816
8817/* ------------------------------ */
8818 .balign 128
8819.L_ALT_op_iget_byte: /* 0x56 */
8820/* File: mips64/alt_stub.S */
8821/*
8822 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8823 * any interesting requests and then jump to the real instruction
8824 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8825 */
8826 .extern MterpCheckBefore
8827 EXPORT_PC
8828 REFRESH_IBASE
8829 dla ra, artMterpAsmInstructionStart
8830 dla t9, MterpCheckBefore
8831 move a0, rSELF
8832 daddu a1, rFP, OFF_FP_SHADOWFRAME
8833 daddu ra, ra, (86 * 128) # Addr of primary handler.
8834 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8835
8836/* ------------------------------ */
8837 .balign 128
8838.L_ALT_op_iget_char: /* 0x57 */
8839/* File: mips64/alt_stub.S */
8840/*
8841 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8842 * any interesting requests and then jump to the real instruction
8843 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8844 */
8845 .extern MterpCheckBefore
8846 EXPORT_PC
8847 REFRESH_IBASE
8848 dla ra, artMterpAsmInstructionStart
8849 dla t9, MterpCheckBefore
8850 move a0, rSELF
8851 daddu a1, rFP, OFF_FP_SHADOWFRAME
8852 daddu ra, ra, (87 * 128) # Addr of primary handler.
8853 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8854
8855/* ------------------------------ */
8856 .balign 128
8857.L_ALT_op_iget_short: /* 0x58 */
8858/* File: mips64/alt_stub.S */
8859/*
8860 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8861 * any interesting requests and then jump to the real instruction
8862 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8863 */
8864 .extern MterpCheckBefore
8865 EXPORT_PC
8866 REFRESH_IBASE
8867 dla ra, artMterpAsmInstructionStart
8868 dla t9, MterpCheckBefore
8869 move a0, rSELF
8870 daddu a1, rFP, OFF_FP_SHADOWFRAME
8871 daddu ra, ra, (88 * 128) # Addr of primary handler.
8872 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8873
8874/* ------------------------------ */
8875 .balign 128
8876.L_ALT_op_iput: /* 0x59 */
8877/* File: mips64/alt_stub.S */
8878/*
8879 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8880 * any interesting requests and then jump to the real instruction
8881 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8882 */
8883 .extern MterpCheckBefore
8884 EXPORT_PC
8885 REFRESH_IBASE
8886 dla ra, artMterpAsmInstructionStart
8887 dla t9, MterpCheckBefore
8888 move a0, rSELF
8889 daddu a1, rFP, OFF_FP_SHADOWFRAME
8890 daddu ra, ra, (89 * 128) # Addr of primary handler.
8891 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8892
8893/* ------------------------------ */
8894 .balign 128
8895.L_ALT_op_iput_wide: /* 0x5a */
8896/* File: mips64/alt_stub.S */
8897/*
8898 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8899 * any interesting requests and then jump to the real instruction
8900 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8901 */
8902 .extern MterpCheckBefore
8903 EXPORT_PC
8904 REFRESH_IBASE
8905 dla ra, artMterpAsmInstructionStart
8906 dla t9, MterpCheckBefore
8907 move a0, rSELF
8908 daddu a1, rFP, OFF_FP_SHADOWFRAME
8909 daddu ra, ra, (90 * 128) # Addr of primary handler.
8910 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8911
8912/* ------------------------------ */
8913 .balign 128
8914.L_ALT_op_iput_object: /* 0x5b */
8915/* File: mips64/alt_stub.S */
8916/*
8917 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8918 * any interesting requests and then jump to the real instruction
8919 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8920 */
8921 .extern MterpCheckBefore
8922 EXPORT_PC
8923 REFRESH_IBASE
8924 dla ra, artMterpAsmInstructionStart
8925 dla t9, MterpCheckBefore
8926 move a0, rSELF
8927 daddu a1, rFP, OFF_FP_SHADOWFRAME
8928 daddu ra, ra, (91 * 128) # Addr of primary handler.
8929 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8930
8931/* ------------------------------ */
8932 .balign 128
8933.L_ALT_op_iput_boolean: /* 0x5c */
8934/* File: mips64/alt_stub.S */
8935/*
8936 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8937 * any interesting requests and then jump to the real instruction
8938 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8939 */
8940 .extern MterpCheckBefore
8941 EXPORT_PC
8942 REFRESH_IBASE
8943 dla ra, artMterpAsmInstructionStart
8944 dla t9, MterpCheckBefore
8945 move a0, rSELF
8946 daddu a1, rFP, OFF_FP_SHADOWFRAME
8947 daddu ra, ra, (92 * 128) # Addr of primary handler.
8948 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8949
8950/* ------------------------------ */
8951 .balign 128
8952.L_ALT_op_iput_byte: /* 0x5d */
8953/* File: mips64/alt_stub.S */
8954/*
8955 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8956 * any interesting requests and then jump to the real instruction
8957 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8958 */
8959 .extern MterpCheckBefore
8960 EXPORT_PC
8961 REFRESH_IBASE
8962 dla ra, artMterpAsmInstructionStart
8963 dla t9, MterpCheckBefore
8964 move a0, rSELF
8965 daddu a1, rFP, OFF_FP_SHADOWFRAME
8966 daddu ra, ra, (93 * 128) # Addr of primary handler.
8967 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8968
8969/* ------------------------------ */
8970 .balign 128
8971.L_ALT_op_iput_char: /* 0x5e */
8972/* File: mips64/alt_stub.S */
8973/*
8974 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8975 * any interesting requests and then jump to the real instruction
8976 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8977 */
8978 .extern MterpCheckBefore
8979 EXPORT_PC
8980 REFRESH_IBASE
8981 dla ra, artMterpAsmInstructionStart
8982 dla t9, MterpCheckBefore
8983 move a0, rSELF
8984 daddu a1, rFP, OFF_FP_SHADOWFRAME
8985 daddu ra, ra, (94 * 128) # Addr of primary handler.
8986 jalr zero, t9 # (self, shadow_frame) Note: tail call.
8987
8988/* ------------------------------ */
8989 .balign 128
8990.L_ALT_op_iput_short: /* 0x5f */
8991/* File: mips64/alt_stub.S */
8992/*
8993 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8994 * any interesting requests and then jump to the real instruction
8995 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8996 */
8997 .extern MterpCheckBefore
8998 EXPORT_PC
8999 REFRESH_IBASE
9000 dla ra, artMterpAsmInstructionStart
9001 dla t9, MterpCheckBefore
9002 move a0, rSELF
9003 daddu a1, rFP, OFF_FP_SHADOWFRAME
9004 daddu ra, ra, (95 * 128) # Addr of primary handler.
9005 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9006
9007/* ------------------------------ */
9008 .balign 128
9009.L_ALT_op_sget: /* 0x60 */
9010/* File: mips64/alt_stub.S */
9011/*
9012 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9013 * any interesting requests and then jump to the real instruction
9014 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9015 */
9016 .extern MterpCheckBefore
9017 EXPORT_PC
9018 REFRESH_IBASE
9019 dla ra, artMterpAsmInstructionStart
9020 dla t9, MterpCheckBefore
9021 move a0, rSELF
9022 daddu a1, rFP, OFF_FP_SHADOWFRAME
9023 daddu ra, ra, (96 * 128) # Addr of primary handler.
9024 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9025
9026/* ------------------------------ */
9027 .balign 128
9028.L_ALT_op_sget_wide: /* 0x61 */
9029/* File: mips64/alt_stub.S */
9030/*
9031 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9032 * any interesting requests and then jump to the real instruction
9033 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9034 */
9035 .extern MterpCheckBefore
9036 EXPORT_PC
9037 REFRESH_IBASE
9038 dla ra, artMterpAsmInstructionStart
9039 dla t9, MterpCheckBefore
9040 move a0, rSELF
9041 daddu a1, rFP, OFF_FP_SHADOWFRAME
9042 daddu ra, ra, (97 * 128) # Addr of primary handler.
9043 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9044
9045/* ------------------------------ */
9046 .balign 128
9047.L_ALT_op_sget_object: /* 0x62 */
9048/* File: mips64/alt_stub.S */
9049/*
9050 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9051 * any interesting requests and then jump to the real instruction
9052 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9053 */
9054 .extern MterpCheckBefore
9055 EXPORT_PC
9056 REFRESH_IBASE
9057 dla ra, artMterpAsmInstructionStart
9058 dla t9, MterpCheckBefore
9059 move a0, rSELF
9060 daddu a1, rFP, OFF_FP_SHADOWFRAME
9061 daddu ra, ra, (98 * 128) # Addr of primary handler.
9062 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9063
9064/* ------------------------------ */
9065 .balign 128
9066.L_ALT_op_sget_boolean: /* 0x63 */
9067/* File: mips64/alt_stub.S */
9068/*
9069 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9070 * any interesting requests and then jump to the real instruction
9071 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9072 */
9073 .extern MterpCheckBefore
9074 EXPORT_PC
9075 REFRESH_IBASE
9076 dla ra, artMterpAsmInstructionStart
9077 dla t9, MterpCheckBefore
9078 move a0, rSELF
9079 daddu a1, rFP, OFF_FP_SHADOWFRAME
9080 daddu ra, ra, (99 * 128) # Addr of primary handler.
9081 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9082
9083/* ------------------------------ */
9084 .balign 128
9085.L_ALT_op_sget_byte: /* 0x64 */
9086/* File: mips64/alt_stub.S */
9087/*
9088 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9089 * any interesting requests and then jump to the real instruction
9090 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9091 */
9092 .extern MterpCheckBefore
9093 EXPORT_PC
9094 REFRESH_IBASE
9095 dla ra, artMterpAsmInstructionStart
9096 dla t9, MterpCheckBefore
9097 move a0, rSELF
9098 daddu a1, rFP, OFF_FP_SHADOWFRAME
9099 daddu ra, ra, (100 * 128) # Addr of primary handler.
9100 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9101
9102/* ------------------------------ */
9103 .balign 128
9104.L_ALT_op_sget_char: /* 0x65 */
9105/* File: mips64/alt_stub.S */
9106/*
9107 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9108 * any interesting requests and then jump to the real instruction
9109 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9110 */
9111 .extern MterpCheckBefore
9112 EXPORT_PC
9113 REFRESH_IBASE
9114 dla ra, artMterpAsmInstructionStart
9115 dla t9, MterpCheckBefore
9116 move a0, rSELF
9117 daddu a1, rFP, OFF_FP_SHADOWFRAME
9118 daddu ra, ra, (101 * 128) # Addr of primary handler.
9119 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9120
9121/* ------------------------------ */
9122 .balign 128
9123.L_ALT_op_sget_short: /* 0x66 */
9124/* File: mips64/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 REFRESH_IBASE
9133 dla ra, artMterpAsmInstructionStart
9134 dla t9, MterpCheckBefore
9135 move a0, rSELF
9136 daddu a1, rFP, OFF_FP_SHADOWFRAME
9137 daddu ra, ra, (102 * 128) # Addr of primary handler.
9138 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9139
9140/* ------------------------------ */
9141 .balign 128
9142.L_ALT_op_sput: /* 0x67 */
9143/* File: mips64/alt_stub.S */
9144/*
9145 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9146 * any interesting requests and then jump to the real instruction
9147 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9148 */
9149 .extern MterpCheckBefore
9150 EXPORT_PC
9151 REFRESH_IBASE
9152 dla ra, artMterpAsmInstructionStart
9153 dla t9, MterpCheckBefore
9154 move a0, rSELF
9155 daddu a1, rFP, OFF_FP_SHADOWFRAME
9156 daddu ra, ra, (103 * 128) # Addr of primary handler.
9157 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9158
9159/* ------------------------------ */
9160 .balign 128
9161.L_ALT_op_sput_wide: /* 0x68 */
9162/* File: mips64/alt_stub.S */
9163/*
9164 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9165 * any interesting requests and then jump to the real instruction
9166 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9167 */
9168 .extern MterpCheckBefore
9169 EXPORT_PC
9170 REFRESH_IBASE
9171 dla ra, artMterpAsmInstructionStart
9172 dla t9, MterpCheckBefore
9173 move a0, rSELF
9174 daddu a1, rFP, OFF_FP_SHADOWFRAME
9175 daddu ra, ra, (104 * 128) # Addr of primary handler.
9176 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9177
9178/* ------------------------------ */
9179 .balign 128
9180.L_ALT_op_sput_object: /* 0x69 */
9181/* File: mips64/alt_stub.S */
9182/*
9183 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9184 * any interesting requests and then jump to the real instruction
9185 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9186 */
9187 .extern MterpCheckBefore
9188 EXPORT_PC
9189 REFRESH_IBASE
9190 dla ra, artMterpAsmInstructionStart
9191 dla t9, MterpCheckBefore
9192 move a0, rSELF
9193 daddu a1, rFP, OFF_FP_SHADOWFRAME
9194 daddu ra, ra, (105 * 128) # Addr of primary handler.
9195 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9196
9197/* ------------------------------ */
9198 .balign 128
9199.L_ALT_op_sput_boolean: /* 0x6a */
9200/* File: mips64/alt_stub.S */
9201/*
9202 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9203 * any interesting requests and then jump to the real instruction
9204 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9205 */
9206 .extern MterpCheckBefore
9207 EXPORT_PC
9208 REFRESH_IBASE
9209 dla ra, artMterpAsmInstructionStart
9210 dla t9, MterpCheckBefore
9211 move a0, rSELF
9212 daddu a1, rFP, OFF_FP_SHADOWFRAME
9213 daddu ra, ra, (106 * 128) # Addr of primary handler.
9214 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9215
9216/* ------------------------------ */
9217 .balign 128
9218.L_ALT_op_sput_byte: /* 0x6b */
9219/* File: mips64/alt_stub.S */
9220/*
9221 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9222 * any interesting requests and then jump to the real instruction
9223 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9224 */
9225 .extern MterpCheckBefore
9226 EXPORT_PC
9227 REFRESH_IBASE
9228 dla ra, artMterpAsmInstructionStart
9229 dla t9, MterpCheckBefore
9230 move a0, rSELF
9231 daddu a1, rFP, OFF_FP_SHADOWFRAME
9232 daddu ra, ra, (107 * 128) # Addr of primary handler.
9233 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9234
9235/* ------------------------------ */
9236 .balign 128
9237.L_ALT_op_sput_char: /* 0x6c */
9238/* File: mips64/alt_stub.S */
9239/*
9240 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9241 * any interesting requests and then jump to the real instruction
9242 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9243 */
9244 .extern MterpCheckBefore
9245 EXPORT_PC
9246 REFRESH_IBASE
9247 dla ra, artMterpAsmInstructionStart
9248 dla t9, MterpCheckBefore
9249 move a0, rSELF
9250 daddu a1, rFP, OFF_FP_SHADOWFRAME
9251 daddu ra, ra, (108 * 128) # Addr of primary handler.
9252 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9253
9254/* ------------------------------ */
9255 .balign 128
9256.L_ALT_op_sput_short: /* 0x6d */
9257/* File: mips64/alt_stub.S */
9258/*
9259 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9260 * any interesting requests and then jump to the real instruction
9261 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9262 */
9263 .extern MterpCheckBefore
9264 EXPORT_PC
9265 REFRESH_IBASE
9266 dla ra, artMterpAsmInstructionStart
9267 dla t9, MterpCheckBefore
9268 move a0, rSELF
9269 daddu a1, rFP, OFF_FP_SHADOWFRAME
9270 daddu ra, ra, (109 * 128) # Addr of primary handler.
9271 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9272
9273/* ------------------------------ */
9274 .balign 128
9275.L_ALT_op_invoke_virtual: /* 0x6e */
9276/* File: mips64/alt_stub.S */
9277/*
9278 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9279 * any interesting requests and then jump to the real instruction
9280 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9281 */
9282 .extern MterpCheckBefore
9283 EXPORT_PC
9284 REFRESH_IBASE
9285 dla ra, artMterpAsmInstructionStart
9286 dla t9, MterpCheckBefore
9287 move a0, rSELF
9288 daddu a1, rFP, OFF_FP_SHADOWFRAME
9289 daddu ra, ra, (110 * 128) # Addr of primary handler.
9290 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9291
9292/* ------------------------------ */
9293 .balign 128
9294.L_ALT_op_invoke_super: /* 0x6f */
9295/* File: mips64/alt_stub.S */
9296/*
9297 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9298 * any interesting requests and then jump to the real instruction
9299 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9300 */
9301 .extern MterpCheckBefore
9302 EXPORT_PC
9303 REFRESH_IBASE
9304 dla ra, artMterpAsmInstructionStart
9305 dla t9, MterpCheckBefore
9306 move a0, rSELF
9307 daddu a1, rFP, OFF_FP_SHADOWFRAME
9308 daddu ra, ra, (111 * 128) # Addr of primary handler.
9309 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9310
9311/* ------------------------------ */
9312 .balign 128
9313.L_ALT_op_invoke_direct: /* 0x70 */
9314/* File: mips64/alt_stub.S */
9315/*
9316 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9317 * any interesting requests and then jump to the real instruction
9318 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9319 */
9320 .extern MterpCheckBefore
9321 EXPORT_PC
9322 REFRESH_IBASE
9323 dla ra, artMterpAsmInstructionStart
9324 dla t9, MterpCheckBefore
9325 move a0, rSELF
9326 daddu a1, rFP, OFF_FP_SHADOWFRAME
9327 daddu ra, ra, (112 * 128) # Addr of primary handler.
9328 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9329
9330/* ------------------------------ */
9331 .balign 128
9332.L_ALT_op_invoke_static: /* 0x71 */
9333/* File: mips64/alt_stub.S */
9334/*
9335 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9336 * any interesting requests and then jump to the real instruction
9337 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9338 */
9339 .extern MterpCheckBefore
9340 EXPORT_PC
9341 REFRESH_IBASE
9342 dla ra, artMterpAsmInstructionStart
9343 dla t9, MterpCheckBefore
9344 move a0, rSELF
9345 daddu a1, rFP, OFF_FP_SHADOWFRAME
9346 daddu ra, ra, (113 * 128) # Addr of primary handler.
9347 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9348
9349/* ------------------------------ */
9350 .balign 128
9351.L_ALT_op_invoke_interface: /* 0x72 */
9352/* File: mips64/alt_stub.S */
9353/*
9354 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9355 * any interesting requests and then jump to the real instruction
9356 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9357 */
9358 .extern MterpCheckBefore
9359 EXPORT_PC
9360 REFRESH_IBASE
9361 dla ra, artMterpAsmInstructionStart
9362 dla t9, MterpCheckBefore
9363 move a0, rSELF
9364 daddu a1, rFP, OFF_FP_SHADOWFRAME
9365 daddu ra, ra, (114 * 128) # Addr of primary handler.
9366 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9367
9368/* ------------------------------ */
9369 .balign 128
9370.L_ALT_op_return_void_no_barrier: /* 0x73 */
9371/* File: mips64/alt_stub.S */
9372/*
9373 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9374 * any interesting requests and then jump to the real instruction
9375 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9376 */
9377 .extern MterpCheckBefore
9378 EXPORT_PC
9379 REFRESH_IBASE
9380 dla ra, artMterpAsmInstructionStart
9381 dla t9, MterpCheckBefore
9382 move a0, rSELF
9383 daddu a1, rFP, OFF_FP_SHADOWFRAME
9384 daddu ra, ra, (115 * 128) # Addr of primary handler.
9385 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9386
9387/* ------------------------------ */
9388 .balign 128
9389.L_ALT_op_invoke_virtual_range: /* 0x74 */
9390/* File: mips64/alt_stub.S */
9391/*
9392 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9393 * any interesting requests and then jump to the real instruction
9394 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9395 */
9396 .extern MterpCheckBefore
9397 EXPORT_PC
9398 REFRESH_IBASE
9399 dla ra, artMterpAsmInstructionStart
9400 dla t9, MterpCheckBefore
9401 move a0, rSELF
9402 daddu a1, rFP, OFF_FP_SHADOWFRAME
9403 daddu ra, ra, (116 * 128) # Addr of primary handler.
9404 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9405
9406/* ------------------------------ */
9407 .balign 128
9408.L_ALT_op_invoke_super_range: /* 0x75 */
9409/* File: mips64/alt_stub.S */
9410/*
9411 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9412 * any interesting requests and then jump to the real instruction
9413 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9414 */
9415 .extern MterpCheckBefore
9416 EXPORT_PC
9417 REFRESH_IBASE
9418 dla ra, artMterpAsmInstructionStart
9419 dla t9, MterpCheckBefore
9420 move a0, rSELF
9421 daddu a1, rFP, OFF_FP_SHADOWFRAME
9422 daddu ra, ra, (117 * 128) # Addr of primary handler.
9423 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9424
9425/* ------------------------------ */
9426 .balign 128
9427.L_ALT_op_invoke_direct_range: /* 0x76 */
9428/* File: mips64/alt_stub.S */
9429/*
9430 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9431 * any interesting requests and then jump to the real instruction
9432 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9433 */
9434 .extern MterpCheckBefore
9435 EXPORT_PC
9436 REFRESH_IBASE
9437 dla ra, artMterpAsmInstructionStart
9438 dla t9, MterpCheckBefore
9439 move a0, rSELF
9440 daddu a1, rFP, OFF_FP_SHADOWFRAME
9441 daddu ra, ra, (118 * 128) # Addr of primary handler.
9442 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9443
9444/* ------------------------------ */
9445 .balign 128
9446.L_ALT_op_invoke_static_range: /* 0x77 */
9447/* File: mips64/alt_stub.S */
9448/*
9449 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9450 * any interesting requests and then jump to the real instruction
9451 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9452 */
9453 .extern MterpCheckBefore
9454 EXPORT_PC
9455 REFRESH_IBASE
9456 dla ra, artMterpAsmInstructionStart
9457 dla t9, MterpCheckBefore
9458 move a0, rSELF
9459 daddu a1, rFP, OFF_FP_SHADOWFRAME
9460 daddu ra, ra, (119 * 128) # Addr of primary handler.
9461 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9462
9463/* ------------------------------ */
9464 .balign 128
9465.L_ALT_op_invoke_interface_range: /* 0x78 */
9466/* File: mips64/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 REFRESH_IBASE
9475 dla ra, artMterpAsmInstructionStart
9476 dla t9, MterpCheckBefore
9477 move a0, rSELF
9478 daddu a1, rFP, OFF_FP_SHADOWFRAME
9479 daddu ra, ra, (120 * 128) # Addr of primary handler.
9480 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9481
9482/* ------------------------------ */
9483 .balign 128
9484.L_ALT_op_unused_79: /* 0x79 */
9485/* File: mips64/alt_stub.S */
9486/*
9487 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9488 * any interesting requests and then jump to the real instruction
9489 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9490 */
9491 .extern MterpCheckBefore
9492 EXPORT_PC
9493 REFRESH_IBASE
9494 dla ra, artMterpAsmInstructionStart
9495 dla t9, MterpCheckBefore
9496 move a0, rSELF
9497 daddu a1, rFP, OFF_FP_SHADOWFRAME
9498 daddu ra, ra, (121 * 128) # Addr of primary handler.
9499 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9500
9501/* ------------------------------ */
9502 .balign 128
9503.L_ALT_op_unused_7a: /* 0x7a */
9504/* File: mips64/alt_stub.S */
9505/*
9506 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9507 * any interesting requests and then jump to the real instruction
9508 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9509 */
9510 .extern MterpCheckBefore
9511 EXPORT_PC
9512 REFRESH_IBASE
9513 dla ra, artMterpAsmInstructionStart
9514 dla t9, MterpCheckBefore
9515 move a0, rSELF
9516 daddu a1, rFP, OFF_FP_SHADOWFRAME
9517 daddu ra, ra, (122 * 128) # Addr of primary handler.
9518 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9519
9520/* ------------------------------ */
9521 .balign 128
9522.L_ALT_op_neg_int: /* 0x7b */
9523/* File: mips64/alt_stub.S */
9524/*
9525 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9526 * any interesting requests and then jump to the real instruction
9527 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9528 */
9529 .extern MterpCheckBefore
9530 EXPORT_PC
9531 REFRESH_IBASE
9532 dla ra, artMterpAsmInstructionStart
9533 dla t9, MterpCheckBefore
9534 move a0, rSELF
9535 daddu a1, rFP, OFF_FP_SHADOWFRAME
9536 daddu ra, ra, (123 * 128) # Addr of primary handler.
9537 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9538
9539/* ------------------------------ */
9540 .balign 128
9541.L_ALT_op_not_int: /* 0x7c */
9542/* File: mips64/alt_stub.S */
9543/*
9544 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9545 * any interesting requests and then jump to the real instruction
9546 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9547 */
9548 .extern MterpCheckBefore
9549 EXPORT_PC
9550 REFRESH_IBASE
9551 dla ra, artMterpAsmInstructionStart
9552 dla t9, MterpCheckBefore
9553 move a0, rSELF
9554 daddu a1, rFP, OFF_FP_SHADOWFRAME
9555 daddu ra, ra, (124 * 128) # Addr of primary handler.
9556 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9557
9558/* ------------------------------ */
9559 .balign 128
9560.L_ALT_op_neg_long: /* 0x7d */
9561/* File: mips64/alt_stub.S */
9562/*
9563 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9564 * any interesting requests and then jump to the real instruction
9565 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9566 */
9567 .extern MterpCheckBefore
9568 EXPORT_PC
9569 REFRESH_IBASE
9570 dla ra, artMterpAsmInstructionStart
9571 dla t9, MterpCheckBefore
9572 move a0, rSELF
9573 daddu a1, rFP, OFF_FP_SHADOWFRAME
9574 daddu ra, ra, (125 * 128) # Addr of primary handler.
9575 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9576
9577/* ------------------------------ */
9578 .balign 128
9579.L_ALT_op_not_long: /* 0x7e */
9580/* File: mips64/alt_stub.S */
9581/*
9582 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9583 * any interesting requests and then jump to the real instruction
9584 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9585 */
9586 .extern MterpCheckBefore
9587 EXPORT_PC
9588 REFRESH_IBASE
9589 dla ra, artMterpAsmInstructionStart
9590 dla t9, MterpCheckBefore
9591 move a0, rSELF
9592 daddu a1, rFP, OFF_FP_SHADOWFRAME
9593 daddu ra, ra, (126 * 128) # Addr of primary handler.
9594 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9595
9596/* ------------------------------ */
9597 .balign 128
9598.L_ALT_op_neg_float: /* 0x7f */
9599/* File: mips64/alt_stub.S */
9600/*
9601 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9602 * any interesting requests and then jump to the real instruction
9603 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9604 */
9605 .extern MterpCheckBefore
9606 EXPORT_PC
9607 REFRESH_IBASE
9608 dla ra, artMterpAsmInstructionStart
9609 dla t9, MterpCheckBefore
9610 move a0, rSELF
9611 daddu a1, rFP, OFF_FP_SHADOWFRAME
9612 daddu ra, ra, (127 * 128) # Addr of primary handler.
9613 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9614
9615/* ------------------------------ */
9616 .balign 128
9617.L_ALT_op_neg_double: /* 0x80 */
9618/* File: mips64/alt_stub.S */
9619/*
9620 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9621 * any interesting requests and then jump to the real instruction
9622 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9623 */
9624 .extern MterpCheckBefore
9625 EXPORT_PC
9626 REFRESH_IBASE
9627 dla ra, artMterpAsmInstructionStart
9628 dla t9, MterpCheckBefore
9629 move a0, rSELF
9630 daddu a1, rFP, OFF_FP_SHADOWFRAME
9631 daddu ra, ra, (128 * 128) # Addr of primary handler.
9632 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9633
9634/* ------------------------------ */
9635 .balign 128
9636.L_ALT_op_int_to_long: /* 0x81 */
9637/* File: mips64/alt_stub.S */
9638/*
9639 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9640 * any interesting requests and then jump to the real instruction
9641 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9642 */
9643 .extern MterpCheckBefore
9644 EXPORT_PC
9645 REFRESH_IBASE
9646 dla ra, artMterpAsmInstructionStart
9647 dla t9, MterpCheckBefore
9648 move a0, rSELF
9649 daddu a1, rFP, OFF_FP_SHADOWFRAME
9650 daddu ra, ra, (129 * 128) # Addr of primary handler.
9651 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9652
9653/* ------------------------------ */
9654 .balign 128
9655.L_ALT_op_int_to_float: /* 0x82 */
9656/* File: mips64/alt_stub.S */
9657/*
9658 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9659 * any interesting requests and then jump to the real instruction
9660 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9661 */
9662 .extern MterpCheckBefore
9663 EXPORT_PC
9664 REFRESH_IBASE
9665 dla ra, artMterpAsmInstructionStart
9666 dla t9, MterpCheckBefore
9667 move a0, rSELF
9668 daddu a1, rFP, OFF_FP_SHADOWFRAME
9669 daddu ra, ra, (130 * 128) # Addr of primary handler.
9670 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9671
9672/* ------------------------------ */
9673 .balign 128
9674.L_ALT_op_int_to_double: /* 0x83 */
9675/* File: mips64/alt_stub.S */
9676/*
9677 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9678 * any interesting requests and then jump to the real instruction
9679 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9680 */
9681 .extern MterpCheckBefore
9682 EXPORT_PC
9683 REFRESH_IBASE
9684 dla ra, artMterpAsmInstructionStart
9685 dla t9, MterpCheckBefore
9686 move a0, rSELF
9687 daddu a1, rFP, OFF_FP_SHADOWFRAME
9688 daddu ra, ra, (131 * 128) # Addr of primary handler.
9689 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9690
9691/* ------------------------------ */
9692 .balign 128
9693.L_ALT_op_long_to_int: /* 0x84 */
9694/* File: mips64/alt_stub.S */
9695/*
9696 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9697 * any interesting requests and then jump to the real instruction
9698 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9699 */
9700 .extern MterpCheckBefore
9701 EXPORT_PC
9702 REFRESH_IBASE
9703 dla ra, artMterpAsmInstructionStart
9704 dla t9, MterpCheckBefore
9705 move a0, rSELF
9706 daddu a1, rFP, OFF_FP_SHADOWFRAME
9707 daddu ra, ra, (132 * 128) # Addr of primary handler.
9708 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9709
9710/* ------------------------------ */
9711 .balign 128
9712.L_ALT_op_long_to_float: /* 0x85 */
9713/* File: mips64/alt_stub.S */
9714/*
9715 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9716 * any interesting requests and then jump to the real instruction
9717 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9718 */
9719 .extern MterpCheckBefore
9720 EXPORT_PC
9721 REFRESH_IBASE
9722 dla ra, artMterpAsmInstructionStart
9723 dla t9, MterpCheckBefore
9724 move a0, rSELF
9725 daddu a1, rFP, OFF_FP_SHADOWFRAME
9726 daddu ra, ra, (133 * 128) # Addr of primary handler.
9727 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9728
9729/* ------------------------------ */
9730 .balign 128
9731.L_ALT_op_long_to_double: /* 0x86 */
9732/* File: mips64/alt_stub.S */
9733/*
9734 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9735 * any interesting requests and then jump to the real instruction
9736 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9737 */
9738 .extern MterpCheckBefore
9739 EXPORT_PC
9740 REFRESH_IBASE
9741 dla ra, artMterpAsmInstructionStart
9742 dla t9, MterpCheckBefore
9743 move a0, rSELF
9744 daddu a1, rFP, OFF_FP_SHADOWFRAME
9745 daddu ra, ra, (134 * 128) # Addr of primary handler.
9746 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9747
9748/* ------------------------------ */
9749 .balign 128
9750.L_ALT_op_float_to_int: /* 0x87 */
9751/* File: mips64/alt_stub.S */
9752/*
9753 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9754 * any interesting requests and then jump to the real instruction
9755 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9756 */
9757 .extern MterpCheckBefore
9758 EXPORT_PC
9759 REFRESH_IBASE
9760 dla ra, artMterpAsmInstructionStart
9761 dla t9, MterpCheckBefore
9762 move a0, rSELF
9763 daddu a1, rFP, OFF_FP_SHADOWFRAME
9764 daddu ra, ra, (135 * 128) # Addr of primary handler.
9765 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9766
9767/* ------------------------------ */
9768 .balign 128
9769.L_ALT_op_float_to_long: /* 0x88 */
9770/* File: mips64/alt_stub.S */
9771/*
9772 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9773 * any interesting requests and then jump to the real instruction
9774 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9775 */
9776 .extern MterpCheckBefore
9777 EXPORT_PC
9778 REFRESH_IBASE
9779 dla ra, artMterpAsmInstructionStart
9780 dla t9, MterpCheckBefore
9781 move a0, rSELF
9782 daddu a1, rFP, OFF_FP_SHADOWFRAME
9783 daddu ra, ra, (136 * 128) # Addr of primary handler.
9784 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9785
9786/* ------------------------------ */
9787 .balign 128
9788.L_ALT_op_float_to_double: /* 0x89 */
9789/* File: mips64/alt_stub.S */
9790/*
9791 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9792 * any interesting requests and then jump to the real instruction
9793 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9794 */
9795 .extern MterpCheckBefore
9796 EXPORT_PC
9797 REFRESH_IBASE
9798 dla ra, artMterpAsmInstructionStart
9799 dla t9, MterpCheckBefore
9800 move a0, rSELF
9801 daddu a1, rFP, OFF_FP_SHADOWFRAME
9802 daddu ra, ra, (137 * 128) # Addr of primary handler.
9803 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9804
9805/* ------------------------------ */
9806 .balign 128
9807.L_ALT_op_double_to_int: /* 0x8a */
9808/* File: mips64/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 REFRESH_IBASE
9817 dla ra, artMterpAsmInstructionStart
9818 dla t9, MterpCheckBefore
9819 move a0, rSELF
9820 daddu a1, rFP, OFF_FP_SHADOWFRAME
9821 daddu ra, ra, (138 * 128) # Addr of primary handler.
9822 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9823
9824/* ------------------------------ */
9825 .balign 128
9826.L_ALT_op_double_to_long: /* 0x8b */
9827/* File: mips64/alt_stub.S */
9828/*
9829 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9830 * any interesting requests and then jump to the real instruction
9831 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9832 */
9833 .extern MterpCheckBefore
9834 EXPORT_PC
9835 REFRESH_IBASE
9836 dla ra, artMterpAsmInstructionStart
9837 dla t9, MterpCheckBefore
9838 move a0, rSELF
9839 daddu a1, rFP, OFF_FP_SHADOWFRAME
9840 daddu ra, ra, (139 * 128) # Addr of primary handler.
9841 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9842
9843/* ------------------------------ */
9844 .balign 128
9845.L_ALT_op_double_to_float: /* 0x8c */
9846/* File: mips64/alt_stub.S */
9847/*
9848 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9849 * any interesting requests and then jump to the real instruction
9850 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9851 */
9852 .extern MterpCheckBefore
9853 EXPORT_PC
9854 REFRESH_IBASE
9855 dla ra, artMterpAsmInstructionStart
9856 dla t9, MterpCheckBefore
9857 move a0, rSELF
9858 daddu a1, rFP, OFF_FP_SHADOWFRAME
9859 daddu ra, ra, (140 * 128) # Addr of primary handler.
9860 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9861
9862/* ------------------------------ */
9863 .balign 128
9864.L_ALT_op_int_to_byte: /* 0x8d */
9865/* File: mips64/alt_stub.S */
9866/*
9867 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9868 * any interesting requests and then jump to the real instruction
9869 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9870 */
9871 .extern MterpCheckBefore
9872 EXPORT_PC
9873 REFRESH_IBASE
9874 dla ra, artMterpAsmInstructionStart
9875 dla t9, MterpCheckBefore
9876 move a0, rSELF
9877 daddu a1, rFP, OFF_FP_SHADOWFRAME
9878 daddu ra, ra, (141 * 128) # Addr of primary handler.
9879 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9880
9881/* ------------------------------ */
9882 .balign 128
9883.L_ALT_op_int_to_char: /* 0x8e */
9884/* File: mips64/alt_stub.S */
9885/*
9886 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9887 * any interesting requests and then jump to the real instruction
9888 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9889 */
9890 .extern MterpCheckBefore
9891 EXPORT_PC
9892 REFRESH_IBASE
9893 dla ra, artMterpAsmInstructionStart
9894 dla t9, MterpCheckBefore
9895 move a0, rSELF
9896 daddu a1, rFP, OFF_FP_SHADOWFRAME
9897 daddu ra, ra, (142 * 128) # Addr of primary handler.
9898 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9899
9900/* ------------------------------ */
9901 .balign 128
9902.L_ALT_op_int_to_short: /* 0x8f */
9903/* File: mips64/alt_stub.S */
9904/*
9905 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9906 * any interesting requests and then jump to the real instruction
9907 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9908 */
9909 .extern MterpCheckBefore
9910 EXPORT_PC
9911 REFRESH_IBASE
9912 dla ra, artMterpAsmInstructionStart
9913 dla t9, MterpCheckBefore
9914 move a0, rSELF
9915 daddu a1, rFP, OFF_FP_SHADOWFRAME
9916 daddu ra, ra, (143 * 128) # Addr of primary handler.
9917 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9918
9919/* ------------------------------ */
9920 .balign 128
9921.L_ALT_op_add_int: /* 0x90 */
9922/* File: mips64/alt_stub.S */
9923/*
9924 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9925 * any interesting requests and then jump to the real instruction
9926 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9927 */
9928 .extern MterpCheckBefore
9929 EXPORT_PC
9930 REFRESH_IBASE
9931 dla ra, artMterpAsmInstructionStart
9932 dla t9, MterpCheckBefore
9933 move a0, rSELF
9934 daddu a1, rFP, OFF_FP_SHADOWFRAME
9935 daddu ra, ra, (144 * 128) # Addr of primary handler.
9936 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9937
9938/* ------------------------------ */
9939 .balign 128
9940.L_ALT_op_sub_int: /* 0x91 */
9941/* File: mips64/alt_stub.S */
9942/*
9943 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9944 * any interesting requests and then jump to the real instruction
9945 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9946 */
9947 .extern MterpCheckBefore
9948 EXPORT_PC
9949 REFRESH_IBASE
9950 dla ra, artMterpAsmInstructionStart
9951 dla t9, MterpCheckBefore
9952 move a0, rSELF
9953 daddu a1, rFP, OFF_FP_SHADOWFRAME
9954 daddu ra, ra, (145 * 128) # Addr of primary handler.
9955 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9956
9957/* ------------------------------ */
9958 .balign 128
9959.L_ALT_op_mul_int: /* 0x92 */
9960/* File: mips64/alt_stub.S */
9961/*
9962 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9963 * any interesting requests and then jump to the real instruction
9964 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9965 */
9966 .extern MterpCheckBefore
9967 EXPORT_PC
9968 REFRESH_IBASE
9969 dla ra, artMterpAsmInstructionStart
9970 dla t9, MterpCheckBefore
9971 move a0, rSELF
9972 daddu a1, rFP, OFF_FP_SHADOWFRAME
9973 daddu ra, ra, (146 * 128) # Addr of primary handler.
9974 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9975
9976/* ------------------------------ */
9977 .balign 128
9978.L_ALT_op_div_int: /* 0x93 */
9979/* File: mips64/alt_stub.S */
9980/*
9981 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9982 * any interesting requests and then jump to the real instruction
9983 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9984 */
9985 .extern MterpCheckBefore
9986 EXPORT_PC
9987 REFRESH_IBASE
9988 dla ra, artMterpAsmInstructionStart
9989 dla t9, MterpCheckBefore
9990 move a0, rSELF
9991 daddu a1, rFP, OFF_FP_SHADOWFRAME
9992 daddu ra, ra, (147 * 128) # Addr of primary handler.
9993 jalr zero, t9 # (self, shadow_frame) Note: tail call.
9994
9995/* ------------------------------ */
9996 .balign 128
9997.L_ALT_op_rem_int: /* 0x94 */
9998/* File: mips64/alt_stub.S */
9999/*
10000 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10001 * any interesting requests and then jump to the real instruction
10002 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10003 */
10004 .extern MterpCheckBefore
10005 EXPORT_PC
10006 REFRESH_IBASE
10007 dla ra, artMterpAsmInstructionStart
10008 dla t9, MterpCheckBefore
10009 move a0, rSELF
10010 daddu a1, rFP, OFF_FP_SHADOWFRAME
10011 daddu ra, ra, (148 * 128) # Addr of primary handler.
10012 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10013
10014/* ------------------------------ */
10015 .balign 128
10016.L_ALT_op_and_int: /* 0x95 */
10017/* File: mips64/alt_stub.S */
10018/*
10019 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10020 * any interesting requests and then jump to the real instruction
10021 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10022 */
10023 .extern MterpCheckBefore
10024 EXPORT_PC
10025 REFRESH_IBASE
10026 dla ra, artMterpAsmInstructionStart
10027 dla t9, MterpCheckBefore
10028 move a0, rSELF
10029 daddu a1, rFP, OFF_FP_SHADOWFRAME
10030 daddu ra, ra, (149 * 128) # Addr of primary handler.
10031 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10032
10033/* ------------------------------ */
10034 .balign 128
10035.L_ALT_op_or_int: /* 0x96 */
10036/* File: mips64/alt_stub.S */
10037/*
10038 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10039 * any interesting requests and then jump to the real instruction
10040 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10041 */
10042 .extern MterpCheckBefore
10043 EXPORT_PC
10044 REFRESH_IBASE
10045 dla ra, artMterpAsmInstructionStart
10046 dla t9, MterpCheckBefore
10047 move a0, rSELF
10048 daddu a1, rFP, OFF_FP_SHADOWFRAME
10049 daddu ra, ra, (150 * 128) # Addr of primary handler.
10050 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10051
10052/* ------------------------------ */
10053 .balign 128
10054.L_ALT_op_xor_int: /* 0x97 */
10055/* File: mips64/alt_stub.S */
10056/*
10057 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10058 * any interesting requests and then jump to the real instruction
10059 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10060 */
10061 .extern MterpCheckBefore
10062 EXPORT_PC
10063 REFRESH_IBASE
10064 dla ra, artMterpAsmInstructionStart
10065 dla t9, MterpCheckBefore
10066 move a0, rSELF
10067 daddu a1, rFP, OFF_FP_SHADOWFRAME
10068 daddu ra, ra, (151 * 128) # Addr of primary handler.
10069 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10070
10071/* ------------------------------ */
10072 .balign 128
10073.L_ALT_op_shl_int: /* 0x98 */
10074/* File: mips64/alt_stub.S */
10075/*
10076 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10077 * any interesting requests and then jump to the real instruction
10078 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10079 */
10080 .extern MterpCheckBefore
10081 EXPORT_PC
10082 REFRESH_IBASE
10083 dla ra, artMterpAsmInstructionStart
10084 dla t9, MterpCheckBefore
10085 move a0, rSELF
10086 daddu a1, rFP, OFF_FP_SHADOWFRAME
10087 daddu ra, ra, (152 * 128) # Addr of primary handler.
10088 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10089
10090/* ------------------------------ */
10091 .balign 128
10092.L_ALT_op_shr_int: /* 0x99 */
10093/* File: mips64/alt_stub.S */
10094/*
10095 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10096 * any interesting requests and then jump to the real instruction
10097 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10098 */
10099 .extern MterpCheckBefore
10100 EXPORT_PC
10101 REFRESH_IBASE
10102 dla ra, artMterpAsmInstructionStart
10103 dla t9, MterpCheckBefore
10104 move a0, rSELF
10105 daddu a1, rFP, OFF_FP_SHADOWFRAME
10106 daddu ra, ra, (153 * 128) # Addr of primary handler.
10107 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10108
10109/* ------------------------------ */
10110 .balign 128
10111.L_ALT_op_ushr_int: /* 0x9a */
10112/* File: mips64/alt_stub.S */
10113/*
10114 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10115 * any interesting requests and then jump to the real instruction
10116 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10117 */
10118 .extern MterpCheckBefore
10119 EXPORT_PC
10120 REFRESH_IBASE
10121 dla ra, artMterpAsmInstructionStart
10122 dla t9, MterpCheckBefore
10123 move a0, rSELF
10124 daddu a1, rFP, OFF_FP_SHADOWFRAME
10125 daddu ra, ra, (154 * 128) # Addr of primary handler.
10126 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10127
10128/* ------------------------------ */
10129 .balign 128
10130.L_ALT_op_add_long: /* 0x9b */
10131/* File: mips64/alt_stub.S */
10132/*
10133 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10134 * any interesting requests and then jump to the real instruction
10135 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10136 */
10137 .extern MterpCheckBefore
10138 EXPORT_PC
10139 REFRESH_IBASE
10140 dla ra, artMterpAsmInstructionStart
10141 dla t9, MterpCheckBefore
10142 move a0, rSELF
10143 daddu a1, rFP, OFF_FP_SHADOWFRAME
10144 daddu ra, ra, (155 * 128) # Addr of primary handler.
10145 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10146
10147/* ------------------------------ */
10148 .balign 128
10149.L_ALT_op_sub_long: /* 0x9c */
10150/* File: mips64/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 REFRESH_IBASE
10159 dla ra, artMterpAsmInstructionStart
10160 dla t9, MterpCheckBefore
10161 move a0, rSELF
10162 daddu a1, rFP, OFF_FP_SHADOWFRAME
10163 daddu ra, ra, (156 * 128) # Addr of primary handler.
10164 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10165
10166/* ------------------------------ */
10167 .balign 128
10168.L_ALT_op_mul_long: /* 0x9d */
10169/* File: mips64/alt_stub.S */
10170/*
10171 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10172 * any interesting requests and then jump to the real instruction
10173 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10174 */
10175 .extern MterpCheckBefore
10176 EXPORT_PC
10177 REFRESH_IBASE
10178 dla ra, artMterpAsmInstructionStart
10179 dla t9, MterpCheckBefore
10180 move a0, rSELF
10181 daddu a1, rFP, OFF_FP_SHADOWFRAME
10182 daddu ra, ra, (157 * 128) # Addr of primary handler.
10183 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10184
10185/* ------------------------------ */
10186 .balign 128
10187.L_ALT_op_div_long: /* 0x9e */
10188/* File: mips64/alt_stub.S */
10189/*
10190 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10191 * any interesting requests and then jump to the real instruction
10192 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10193 */
10194 .extern MterpCheckBefore
10195 EXPORT_PC
10196 REFRESH_IBASE
10197 dla ra, artMterpAsmInstructionStart
10198 dla t9, MterpCheckBefore
10199 move a0, rSELF
10200 daddu a1, rFP, OFF_FP_SHADOWFRAME
10201 daddu ra, ra, (158 * 128) # Addr of primary handler.
10202 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10203
10204/* ------------------------------ */
10205 .balign 128
10206.L_ALT_op_rem_long: /* 0x9f */
10207/* File: mips64/alt_stub.S */
10208/*
10209 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10210 * any interesting requests and then jump to the real instruction
10211 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10212 */
10213 .extern MterpCheckBefore
10214 EXPORT_PC
10215 REFRESH_IBASE
10216 dla ra, artMterpAsmInstructionStart
10217 dla t9, MterpCheckBefore
10218 move a0, rSELF
10219 daddu a1, rFP, OFF_FP_SHADOWFRAME
10220 daddu ra, ra, (159 * 128) # Addr of primary handler.
10221 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10222
10223/* ------------------------------ */
10224 .balign 128
10225.L_ALT_op_and_long: /* 0xa0 */
10226/* File: mips64/alt_stub.S */
10227/*
10228 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10229 * any interesting requests and then jump to the real instruction
10230 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10231 */
10232 .extern MterpCheckBefore
10233 EXPORT_PC
10234 REFRESH_IBASE
10235 dla ra, artMterpAsmInstructionStart
10236 dla t9, MterpCheckBefore
10237 move a0, rSELF
10238 daddu a1, rFP, OFF_FP_SHADOWFRAME
10239 daddu ra, ra, (160 * 128) # Addr of primary handler.
10240 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10241
10242/* ------------------------------ */
10243 .balign 128
10244.L_ALT_op_or_long: /* 0xa1 */
10245/* File: mips64/alt_stub.S */
10246/*
10247 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10248 * any interesting requests and then jump to the real instruction
10249 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10250 */
10251 .extern MterpCheckBefore
10252 EXPORT_PC
10253 REFRESH_IBASE
10254 dla ra, artMterpAsmInstructionStart
10255 dla t9, MterpCheckBefore
10256 move a0, rSELF
10257 daddu a1, rFP, OFF_FP_SHADOWFRAME
10258 daddu ra, ra, (161 * 128) # Addr of primary handler.
10259 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10260
10261/* ------------------------------ */
10262 .balign 128
10263.L_ALT_op_xor_long: /* 0xa2 */
10264/* File: mips64/alt_stub.S */
10265/*
10266 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10267 * any interesting requests and then jump to the real instruction
10268 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10269 */
10270 .extern MterpCheckBefore
10271 EXPORT_PC
10272 REFRESH_IBASE
10273 dla ra, artMterpAsmInstructionStart
10274 dla t9, MterpCheckBefore
10275 move a0, rSELF
10276 daddu a1, rFP, OFF_FP_SHADOWFRAME
10277 daddu ra, ra, (162 * 128) # Addr of primary handler.
10278 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10279
10280/* ------------------------------ */
10281 .balign 128
10282.L_ALT_op_shl_long: /* 0xa3 */
10283/* File: mips64/alt_stub.S */
10284/*
10285 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10286 * any interesting requests and then jump to the real instruction
10287 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10288 */
10289 .extern MterpCheckBefore
10290 EXPORT_PC
10291 REFRESH_IBASE
10292 dla ra, artMterpAsmInstructionStart
10293 dla t9, MterpCheckBefore
10294 move a0, rSELF
10295 daddu a1, rFP, OFF_FP_SHADOWFRAME
10296 daddu ra, ra, (163 * 128) # Addr of primary handler.
10297 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10298
10299/* ------------------------------ */
10300 .balign 128
10301.L_ALT_op_shr_long: /* 0xa4 */
10302/* File: mips64/alt_stub.S */
10303/*
10304 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10305 * any interesting requests and then jump to the real instruction
10306 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10307 */
10308 .extern MterpCheckBefore
10309 EXPORT_PC
10310 REFRESH_IBASE
10311 dla ra, artMterpAsmInstructionStart
10312 dla t9, MterpCheckBefore
10313 move a0, rSELF
10314 daddu a1, rFP, OFF_FP_SHADOWFRAME
10315 daddu ra, ra, (164 * 128) # Addr of primary handler.
10316 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10317
10318/* ------------------------------ */
10319 .balign 128
10320.L_ALT_op_ushr_long: /* 0xa5 */
10321/* File: mips64/alt_stub.S */
10322/*
10323 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10324 * any interesting requests and then jump to the real instruction
10325 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10326 */
10327 .extern MterpCheckBefore
10328 EXPORT_PC
10329 REFRESH_IBASE
10330 dla ra, artMterpAsmInstructionStart
10331 dla t9, MterpCheckBefore
10332 move a0, rSELF
10333 daddu a1, rFP, OFF_FP_SHADOWFRAME
10334 daddu ra, ra, (165 * 128) # Addr of primary handler.
10335 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10336
10337/* ------------------------------ */
10338 .balign 128
10339.L_ALT_op_add_float: /* 0xa6 */
10340/* File: mips64/alt_stub.S */
10341/*
10342 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10343 * any interesting requests and then jump to the real instruction
10344 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10345 */
10346 .extern MterpCheckBefore
10347 EXPORT_PC
10348 REFRESH_IBASE
10349 dla ra, artMterpAsmInstructionStart
10350 dla t9, MterpCheckBefore
10351 move a0, rSELF
10352 daddu a1, rFP, OFF_FP_SHADOWFRAME
10353 daddu ra, ra, (166 * 128) # Addr of primary handler.
10354 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10355
10356/* ------------------------------ */
10357 .balign 128
10358.L_ALT_op_sub_float: /* 0xa7 */
10359/* File: mips64/alt_stub.S */
10360/*
10361 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10362 * any interesting requests and then jump to the real instruction
10363 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10364 */
10365 .extern MterpCheckBefore
10366 EXPORT_PC
10367 REFRESH_IBASE
10368 dla ra, artMterpAsmInstructionStart
10369 dla t9, MterpCheckBefore
10370 move a0, rSELF
10371 daddu a1, rFP, OFF_FP_SHADOWFRAME
10372 daddu ra, ra, (167 * 128) # Addr of primary handler.
10373 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10374
10375/* ------------------------------ */
10376 .balign 128
10377.L_ALT_op_mul_float: /* 0xa8 */
10378/* File: mips64/alt_stub.S */
10379/*
10380 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10381 * any interesting requests and then jump to the real instruction
10382 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10383 */
10384 .extern MterpCheckBefore
10385 EXPORT_PC
10386 REFRESH_IBASE
10387 dla ra, artMterpAsmInstructionStart
10388 dla t9, MterpCheckBefore
10389 move a0, rSELF
10390 daddu a1, rFP, OFF_FP_SHADOWFRAME
10391 daddu ra, ra, (168 * 128) # Addr of primary handler.
10392 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10393
10394/* ------------------------------ */
10395 .balign 128
10396.L_ALT_op_div_float: /* 0xa9 */
10397/* File: mips64/alt_stub.S */
10398/*
10399 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10400 * any interesting requests and then jump to the real instruction
10401 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10402 */
10403 .extern MterpCheckBefore
10404 EXPORT_PC
10405 REFRESH_IBASE
10406 dla ra, artMterpAsmInstructionStart
10407 dla t9, MterpCheckBefore
10408 move a0, rSELF
10409 daddu a1, rFP, OFF_FP_SHADOWFRAME
10410 daddu ra, ra, (169 * 128) # Addr of primary handler.
10411 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10412
10413/* ------------------------------ */
10414 .balign 128
10415.L_ALT_op_rem_float: /* 0xaa */
10416/* File: mips64/alt_stub.S */
10417/*
10418 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10419 * any interesting requests and then jump to the real instruction
10420 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10421 */
10422 .extern MterpCheckBefore
10423 EXPORT_PC
10424 REFRESH_IBASE
10425 dla ra, artMterpAsmInstructionStart
10426 dla t9, MterpCheckBefore
10427 move a0, rSELF
10428 daddu a1, rFP, OFF_FP_SHADOWFRAME
10429 daddu ra, ra, (170 * 128) # Addr of primary handler.
10430 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10431
10432/* ------------------------------ */
10433 .balign 128
10434.L_ALT_op_add_double: /* 0xab */
10435/* File: mips64/alt_stub.S */
10436/*
10437 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10438 * any interesting requests and then jump to the real instruction
10439 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10440 */
10441 .extern MterpCheckBefore
10442 EXPORT_PC
10443 REFRESH_IBASE
10444 dla ra, artMterpAsmInstructionStart
10445 dla t9, MterpCheckBefore
10446 move a0, rSELF
10447 daddu a1, rFP, OFF_FP_SHADOWFRAME
10448 daddu ra, ra, (171 * 128) # Addr of primary handler.
10449 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10450
10451/* ------------------------------ */
10452 .balign 128
10453.L_ALT_op_sub_double: /* 0xac */
10454/* File: mips64/alt_stub.S */
10455/*
10456 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10457 * any interesting requests and then jump to the real instruction
10458 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10459 */
10460 .extern MterpCheckBefore
10461 EXPORT_PC
10462 REFRESH_IBASE
10463 dla ra, artMterpAsmInstructionStart
10464 dla t9, MterpCheckBefore
10465 move a0, rSELF
10466 daddu a1, rFP, OFF_FP_SHADOWFRAME
10467 daddu ra, ra, (172 * 128) # Addr of primary handler.
10468 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10469
10470/* ------------------------------ */
10471 .balign 128
10472.L_ALT_op_mul_double: /* 0xad */
10473/* File: mips64/alt_stub.S */
10474/*
10475 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10476 * any interesting requests and then jump to the real instruction
10477 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10478 */
10479 .extern MterpCheckBefore
10480 EXPORT_PC
10481 REFRESH_IBASE
10482 dla ra, artMterpAsmInstructionStart
10483 dla t9, MterpCheckBefore
10484 move a0, rSELF
10485 daddu a1, rFP, OFF_FP_SHADOWFRAME
10486 daddu ra, ra, (173 * 128) # Addr of primary handler.
10487 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10488
10489/* ------------------------------ */
10490 .balign 128
10491.L_ALT_op_div_double: /* 0xae */
10492/* File: mips64/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 REFRESH_IBASE
10501 dla ra, artMterpAsmInstructionStart
10502 dla t9, MterpCheckBefore
10503 move a0, rSELF
10504 daddu a1, rFP, OFF_FP_SHADOWFRAME
10505 daddu ra, ra, (174 * 128) # Addr of primary handler.
10506 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10507
10508/* ------------------------------ */
10509 .balign 128
10510.L_ALT_op_rem_double: /* 0xaf */
10511/* File: mips64/alt_stub.S */
10512/*
10513 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10514 * any interesting requests and then jump to the real instruction
10515 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10516 */
10517 .extern MterpCheckBefore
10518 EXPORT_PC
10519 REFRESH_IBASE
10520 dla ra, artMterpAsmInstructionStart
10521 dla t9, MterpCheckBefore
10522 move a0, rSELF
10523 daddu a1, rFP, OFF_FP_SHADOWFRAME
10524 daddu ra, ra, (175 * 128) # Addr of primary handler.
10525 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10526
10527/* ------------------------------ */
10528 .balign 128
10529.L_ALT_op_add_int_2addr: /* 0xb0 */
10530/* File: mips64/alt_stub.S */
10531/*
10532 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10533 * any interesting requests and then jump to the real instruction
10534 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10535 */
10536 .extern MterpCheckBefore
10537 EXPORT_PC
10538 REFRESH_IBASE
10539 dla ra, artMterpAsmInstructionStart
10540 dla t9, MterpCheckBefore
10541 move a0, rSELF
10542 daddu a1, rFP, OFF_FP_SHADOWFRAME
10543 daddu ra, ra, (176 * 128) # Addr of primary handler.
10544 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10545
10546/* ------------------------------ */
10547 .balign 128
10548.L_ALT_op_sub_int_2addr: /* 0xb1 */
10549/* File: mips64/alt_stub.S */
10550/*
10551 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10552 * any interesting requests and then jump to the real instruction
10553 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10554 */
10555 .extern MterpCheckBefore
10556 EXPORT_PC
10557 REFRESH_IBASE
10558 dla ra, artMterpAsmInstructionStart
10559 dla t9, MterpCheckBefore
10560 move a0, rSELF
10561 daddu a1, rFP, OFF_FP_SHADOWFRAME
10562 daddu ra, ra, (177 * 128) # Addr of primary handler.
10563 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10564
10565/* ------------------------------ */
10566 .balign 128
10567.L_ALT_op_mul_int_2addr: /* 0xb2 */
10568/* File: mips64/alt_stub.S */
10569/*
10570 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10571 * any interesting requests and then jump to the real instruction
10572 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10573 */
10574 .extern MterpCheckBefore
10575 EXPORT_PC
10576 REFRESH_IBASE
10577 dla ra, artMterpAsmInstructionStart
10578 dla t9, MterpCheckBefore
10579 move a0, rSELF
10580 daddu a1, rFP, OFF_FP_SHADOWFRAME
10581 daddu ra, ra, (178 * 128) # Addr of primary handler.
10582 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10583
10584/* ------------------------------ */
10585 .balign 128
10586.L_ALT_op_div_int_2addr: /* 0xb3 */
10587/* File: mips64/alt_stub.S */
10588/*
10589 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10590 * any interesting requests and then jump to the real instruction
10591 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10592 */
10593 .extern MterpCheckBefore
10594 EXPORT_PC
10595 REFRESH_IBASE
10596 dla ra, artMterpAsmInstructionStart
10597 dla t9, MterpCheckBefore
10598 move a0, rSELF
10599 daddu a1, rFP, OFF_FP_SHADOWFRAME
10600 daddu ra, ra, (179 * 128) # Addr of primary handler.
10601 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10602
10603/* ------------------------------ */
10604 .balign 128
10605.L_ALT_op_rem_int_2addr: /* 0xb4 */
10606/* File: mips64/alt_stub.S */
10607/*
10608 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10609 * any interesting requests and then jump to the real instruction
10610 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10611 */
10612 .extern MterpCheckBefore
10613 EXPORT_PC
10614 REFRESH_IBASE
10615 dla ra, artMterpAsmInstructionStart
10616 dla t9, MterpCheckBefore
10617 move a0, rSELF
10618 daddu a1, rFP, OFF_FP_SHADOWFRAME
10619 daddu ra, ra, (180 * 128) # Addr of primary handler.
10620 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10621
10622/* ------------------------------ */
10623 .balign 128
10624.L_ALT_op_and_int_2addr: /* 0xb5 */
10625/* File: mips64/alt_stub.S */
10626/*
10627 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10628 * any interesting requests and then jump to the real instruction
10629 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10630 */
10631 .extern MterpCheckBefore
10632 EXPORT_PC
10633 REFRESH_IBASE
10634 dla ra, artMterpAsmInstructionStart
10635 dla t9, MterpCheckBefore
10636 move a0, rSELF
10637 daddu a1, rFP, OFF_FP_SHADOWFRAME
10638 daddu ra, ra, (181 * 128) # Addr of primary handler.
10639 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10640
10641/* ------------------------------ */
10642 .balign 128
10643.L_ALT_op_or_int_2addr: /* 0xb6 */
10644/* File: mips64/alt_stub.S */
10645/*
10646 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10647 * any interesting requests and then jump to the real instruction
10648 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10649 */
10650 .extern MterpCheckBefore
10651 EXPORT_PC
10652 REFRESH_IBASE
10653 dla ra, artMterpAsmInstructionStart
10654 dla t9, MterpCheckBefore
10655 move a0, rSELF
10656 daddu a1, rFP, OFF_FP_SHADOWFRAME
10657 daddu ra, ra, (182 * 128) # Addr of primary handler.
10658 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10659
10660/* ------------------------------ */
10661 .balign 128
10662.L_ALT_op_xor_int_2addr: /* 0xb7 */
10663/* File: mips64/alt_stub.S */
10664/*
10665 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10666 * any interesting requests and then jump to the real instruction
10667 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10668 */
10669 .extern MterpCheckBefore
10670 EXPORT_PC
10671 REFRESH_IBASE
10672 dla ra, artMterpAsmInstructionStart
10673 dla t9, MterpCheckBefore
10674 move a0, rSELF
10675 daddu a1, rFP, OFF_FP_SHADOWFRAME
10676 daddu ra, ra, (183 * 128) # Addr of primary handler.
10677 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10678
10679/* ------------------------------ */
10680 .balign 128
10681.L_ALT_op_shl_int_2addr: /* 0xb8 */
10682/* File: mips64/alt_stub.S */
10683/*
10684 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10685 * any interesting requests and then jump to the real instruction
10686 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10687 */
10688 .extern MterpCheckBefore
10689 EXPORT_PC
10690 REFRESH_IBASE
10691 dla ra, artMterpAsmInstructionStart
10692 dla t9, MterpCheckBefore
10693 move a0, rSELF
10694 daddu a1, rFP, OFF_FP_SHADOWFRAME
10695 daddu ra, ra, (184 * 128) # Addr of primary handler.
10696 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10697
10698/* ------------------------------ */
10699 .balign 128
10700.L_ALT_op_shr_int_2addr: /* 0xb9 */
10701/* File: mips64/alt_stub.S */
10702/*
10703 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10704 * any interesting requests and then jump to the real instruction
10705 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10706 */
10707 .extern MterpCheckBefore
10708 EXPORT_PC
10709 REFRESH_IBASE
10710 dla ra, artMterpAsmInstructionStart
10711 dla t9, MterpCheckBefore
10712 move a0, rSELF
10713 daddu a1, rFP, OFF_FP_SHADOWFRAME
10714 daddu ra, ra, (185 * 128) # Addr of primary handler.
10715 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10716
10717/* ------------------------------ */
10718 .balign 128
10719.L_ALT_op_ushr_int_2addr: /* 0xba */
10720/* File: mips64/alt_stub.S */
10721/*
10722 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10723 * any interesting requests and then jump to the real instruction
10724 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10725 */
10726 .extern MterpCheckBefore
10727 EXPORT_PC
10728 REFRESH_IBASE
10729 dla ra, artMterpAsmInstructionStart
10730 dla t9, MterpCheckBefore
10731 move a0, rSELF
10732 daddu a1, rFP, OFF_FP_SHADOWFRAME
10733 daddu ra, ra, (186 * 128) # Addr of primary handler.
10734 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10735
10736/* ------------------------------ */
10737 .balign 128
10738.L_ALT_op_add_long_2addr: /* 0xbb */
10739/* File: mips64/alt_stub.S */
10740/*
10741 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10742 * any interesting requests and then jump to the real instruction
10743 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10744 */
10745 .extern MterpCheckBefore
10746 EXPORT_PC
10747 REFRESH_IBASE
10748 dla ra, artMterpAsmInstructionStart
10749 dla t9, MterpCheckBefore
10750 move a0, rSELF
10751 daddu a1, rFP, OFF_FP_SHADOWFRAME
10752 daddu ra, ra, (187 * 128) # Addr of primary handler.
10753 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10754
10755/* ------------------------------ */
10756 .balign 128
10757.L_ALT_op_sub_long_2addr: /* 0xbc */
10758/* File: mips64/alt_stub.S */
10759/*
10760 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10761 * any interesting requests and then jump to the real instruction
10762 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10763 */
10764 .extern MterpCheckBefore
10765 EXPORT_PC
10766 REFRESH_IBASE
10767 dla ra, artMterpAsmInstructionStart
10768 dla t9, MterpCheckBefore
10769 move a0, rSELF
10770 daddu a1, rFP, OFF_FP_SHADOWFRAME
10771 daddu ra, ra, (188 * 128) # Addr of primary handler.
10772 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10773
10774/* ------------------------------ */
10775 .balign 128
10776.L_ALT_op_mul_long_2addr: /* 0xbd */
10777/* File: mips64/alt_stub.S */
10778/*
10779 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10780 * any interesting requests and then jump to the real instruction
10781 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10782 */
10783 .extern MterpCheckBefore
10784 EXPORT_PC
10785 REFRESH_IBASE
10786 dla ra, artMterpAsmInstructionStart
10787 dla t9, MterpCheckBefore
10788 move a0, rSELF
10789 daddu a1, rFP, OFF_FP_SHADOWFRAME
10790 daddu ra, ra, (189 * 128) # Addr of primary handler.
10791 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10792
10793/* ------------------------------ */
10794 .balign 128
10795.L_ALT_op_div_long_2addr: /* 0xbe */
10796/* File: mips64/alt_stub.S */
10797/*
10798 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10799 * any interesting requests and then jump to the real instruction
10800 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10801 */
10802 .extern MterpCheckBefore
10803 EXPORT_PC
10804 REFRESH_IBASE
10805 dla ra, artMterpAsmInstructionStart
10806 dla t9, MterpCheckBefore
10807 move a0, rSELF
10808 daddu a1, rFP, OFF_FP_SHADOWFRAME
10809 daddu ra, ra, (190 * 128) # Addr of primary handler.
10810 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10811
10812/* ------------------------------ */
10813 .balign 128
10814.L_ALT_op_rem_long_2addr: /* 0xbf */
10815/* File: mips64/alt_stub.S */
10816/*
10817 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10818 * any interesting requests and then jump to the real instruction
10819 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10820 */
10821 .extern MterpCheckBefore
10822 EXPORT_PC
10823 REFRESH_IBASE
10824 dla ra, artMterpAsmInstructionStart
10825 dla t9, MterpCheckBefore
10826 move a0, rSELF
10827 daddu a1, rFP, OFF_FP_SHADOWFRAME
10828 daddu ra, ra, (191 * 128) # Addr of primary handler.
10829 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10830
10831/* ------------------------------ */
10832 .balign 128
10833.L_ALT_op_and_long_2addr: /* 0xc0 */
10834/* File: mips64/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 REFRESH_IBASE
10843 dla ra, artMterpAsmInstructionStart
10844 dla t9, MterpCheckBefore
10845 move a0, rSELF
10846 daddu a1, rFP, OFF_FP_SHADOWFRAME
10847 daddu ra, ra, (192 * 128) # Addr of primary handler.
10848 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10849
10850/* ------------------------------ */
10851 .balign 128
10852.L_ALT_op_or_long_2addr: /* 0xc1 */
10853/* File: mips64/alt_stub.S */
10854/*
10855 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10856 * any interesting requests and then jump to the real instruction
10857 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10858 */
10859 .extern MterpCheckBefore
10860 EXPORT_PC
10861 REFRESH_IBASE
10862 dla ra, artMterpAsmInstructionStart
10863 dla t9, MterpCheckBefore
10864 move a0, rSELF
10865 daddu a1, rFP, OFF_FP_SHADOWFRAME
10866 daddu ra, ra, (193 * 128) # Addr of primary handler.
10867 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10868
10869/* ------------------------------ */
10870 .balign 128
10871.L_ALT_op_xor_long_2addr: /* 0xc2 */
10872/* File: mips64/alt_stub.S */
10873/*
10874 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10875 * any interesting requests and then jump to the real instruction
10876 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10877 */
10878 .extern MterpCheckBefore
10879 EXPORT_PC
10880 REFRESH_IBASE
10881 dla ra, artMterpAsmInstructionStart
10882 dla t9, MterpCheckBefore
10883 move a0, rSELF
10884 daddu a1, rFP, OFF_FP_SHADOWFRAME
10885 daddu ra, ra, (194 * 128) # Addr of primary handler.
10886 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10887
10888/* ------------------------------ */
10889 .balign 128
10890.L_ALT_op_shl_long_2addr: /* 0xc3 */
10891/* File: mips64/alt_stub.S */
10892/*
10893 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10894 * any interesting requests and then jump to the real instruction
10895 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10896 */
10897 .extern MterpCheckBefore
10898 EXPORT_PC
10899 REFRESH_IBASE
10900 dla ra, artMterpAsmInstructionStart
10901 dla t9, MterpCheckBefore
10902 move a0, rSELF
10903 daddu a1, rFP, OFF_FP_SHADOWFRAME
10904 daddu ra, ra, (195 * 128) # Addr of primary handler.
10905 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10906
10907/* ------------------------------ */
10908 .balign 128
10909.L_ALT_op_shr_long_2addr: /* 0xc4 */
10910/* File: mips64/alt_stub.S */
10911/*
10912 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10913 * any interesting requests and then jump to the real instruction
10914 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10915 */
10916 .extern MterpCheckBefore
10917 EXPORT_PC
10918 REFRESH_IBASE
10919 dla ra, artMterpAsmInstructionStart
10920 dla t9, MterpCheckBefore
10921 move a0, rSELF
10922 daddu a1, rFP, OFF_FP_SHADOWFRAME
10923 daddu ra, ra, (196 * 128) # Addr of primary handler.
10924 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10925
10926/* ------------------------------ */
10927 .balign 128
10928.L_ALT_op_ushr_long_2addr: /* 0xc5 */
10929/* File: mips64/alt_stub.S */
10930/*
10931 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10932 * any interesting requests and then jump to the real instruction
10933 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10934 */
10935 .extern MterpCheckBefore
10936 EXPORT_PC
10937 REFRESH_IBASE
10938 dla ra, artMterpAsmInstructionStart
10939 dla t9, MterpCheckBefore
10940 move a0, rSELF
10941 daddu a1, rFP, OFF_FP_SHADOWFRAME
10942 daddu ra, ra, (197 * 128) # Addr of primary handler.
10943 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10944
10945/* ------------------------------ */
10946 .balign 128
10947.L_ALT_op_add_float_2addr: /* 0xc6 */
10948/* File: mips64/alt_stub.S */
10949/*
10950 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10951 * any interesting requests and then jump to the real instruction
10952 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10953 */
10954 .extern MterpCheckBefore
10955 EXPORT_PC
10956 REFRESH_IBASE
10957 dla ra, artMterpAsmInstructionStart
10958 dla t9, MterpCheckBefore
10959 move a0, rSELF
10960 daddu a1, rFP, OFF_FP_SHADOWFRAME
10961 daddu ra, ra, (198 * 128) # Addr of primary handler.
10962 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10963
10964/* ------------------------------ */
10965 .balign 128
10966.L_ALT_op_sub_float_2addr: /* 0xc7 */
10967/* File: mips64/alt_stub.S */
10968/*
10969 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10970 * any interesting requests and then jump to the real instruction
10971 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10972 */
10973 .extern MterpCheckBefore
10974 EXPORT_PC
10975 REFRESH_IBASE
10976 dla ra, artMterpAsmInstructionStart
10977 dla t9, MterpCheckBefore
10978 move a0, rSELF
10979 daddu a1, rFP, OFF_FP_SHADOWFRAME
10980 daddu ra, ra, (199 * 128) # Addr of primary handler.
10981 jalr zero, t9 # (self, shadow_frame) Note: tail call.
10982
10983/* ------------------------------ */
10984 .balign 128
10985.L_ALT_op_mul_float_2addr: /* 0xc8 */
10986/* File: mips64/alt_stub.S */
10987/*
10988 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10989 * any interesting requests and then jump to the real instruction
10990 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10991 */
10992 .extern MterpCheckBefore
10993 EXPORT_PC
10994 REFRESH_IBASE
10995 dla ra, artMterpAsmInstructionStart
10996 dla t9, MterpCheckBefore
10997 move a0, rSELF
10998 daddu a1, rFP, OFF_FP_SHADOWFRAME
10999 daddu ra, ra, (200 * 128) # Addr of primary handler.
11000 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11001
11002/* ------------------------------ */
11003 .balign 128
11004.L_ALT_op_div_float_2addr: /* 0xc9 */
11005/* File: mips64/alt_stub.S */
11006/*
11007 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11008 * any interesting requests and then jump to the real instruction
11009 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11010 */
11011 .extern MterpCheckBefore
11012 EXPORT_PC
11013 REFRESH_IBASE
11014 dla ra, artMterpAsmInstructionStart
11015 dla t9, MterpCheckBefore
11016 move a0, rSELF
11017 daddu a1, rFP, OFF_FP_SHADOWFRAME
11018 daddu ra, ra, (201 * 128) # Addr of primary handler.
11019 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11020
11021/* ------------------------------ */
11022 .balign 128
11023.L_ALT_op_rem_float_2addr: /* 0xca */
11024/* File: mips64/alt_stub.S */
11025/*
11026 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11027 * any interesting requests and then jump to the real instruction
11028 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11029 */
11030 .extern MterpCheckBefore
11031 EXPORT_PC
11032 REFRESH_IBASE
11033 dla ra, artMterpAsmInstructionStart
11034 dla t9, MterpCheckBefore
11035 move a0, rSELF
11036 daddu a1, rFP, OFF_FP_SHADOWFRAME
11037 daddu ra, ra, (202 * 128) # Addr of primary handler.
11038 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11039
11040/* ------------------------------ */
11041 .balign 128
11042.L_ALT_op_add_double_2addr: /* 0xcb */
11043/* File: mips64/alt_stub.S */
11044/*
11045 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11046 * any interesting requests and then jump to the real instruction
11047 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11048 */
11049 .extern MterpCheckBefore
11050 EXPORT_PC
11051 REFRESH_IBASE
11052 dla ra, artMterpAsmInstructionStart
11053 dla t9, MterpCheckBefore
11054 move a0, rSELF
11055 daddu a1, rFP, OFF_FP_SHADOWFRAME
11056 daddu ra, ra, (203 * 128) # Addr of primary handler.
11057 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11058
11059/* ------------------------------ */
11060 .balign 128
11061.L_ALT_op_sub_double_2addr: /* 0xcc */
11062/* File: mips64/alt_stub.S */
11063/*
11064 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11065 * any interesting requests and then jump to the real instruction
11066 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11067 */
11068 .extern MterpCheckBefore
11069 EXPORT_PC
11070 REFRESH_IBASE
11071 dla ra, artMterpAsmInstructionStart
11072 dla t9, MterpCheckBefore
11073 move a0, rSELF
11074 daddu a1, rFP, OFF_FP_SHADOWFRAME
11075 daddu ra, ra, (204 * 128) # Addr of primary handler.
11076 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11077
11078/* ------------------------------ */
11079 .balign 128
11080.L_ALT_op_mul_double_2addr: /* 0xcd */
11081/* File: mips64/alt_stub.S */
11082/*
11083 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11084 * any interesting requests and then jump to the real instruction
11085 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11086 */
11087 .extern MterpCheckBefore
11088 EXPORT_PC
11089 REFRESH_IBASE
11090 dla ra, artMterpAsmInstructionStart
11091 dla t9, MterpCheckBefore
11092 move a0, rSELF
11093 daddu a1, rFP, OFF_FP_SHADOWFRAME
11094 daddu ra, ra, (205 * 128) # Addr of primary handler.
11095 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11096
11097/* ------------------------------ */
11098 .balign 128
11099.L_ALT_op_div_double_2addr: /* 0xce */
11100/* File: mips64/alt_stub.S */
11101/*
11102 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11103 * any interesting requests and then jump to the real instruction
11104 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11105 */
11106 .extern MterpCheckBefore
11107 EXPORT_PC
11108 REFRESH_IBASE
11109 dla ra, artMterpAsmInstructionStart
11110 dla t9, MterpCheckBefore
11111 move a0, rSELF
11112 daddu a1, rFP, OFF_FP_SHADOWFRAME
11113 daddu ra, ra, (206 * 128) # Addr of primary handler.
11114 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11115
11116/* ------------------------------ */
11117 .balign 128
11118.L_ALT_op_rem_double_2addr: /* 0xcf */
11119/* File: mips64/alt_stub.S */
11120/*
11121 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11122 * any interesting requests and then jump to the real instruction
11123 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11124 */
11125 .extern MterpCheckBefore
11126 EXPORT_PC
11127 REFRESH_IBASE
11128 dla ra, artMterpAsmInstructionStart
11129 dla t9, MterpCheckBefore
11130 move a0, rSELF
11131 daddu a1, rFP, OFF_FP_SHADOWFRAME
11132 daddu ra, ra, (207 * 128) # Addr of primary handler.
11133 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11134
11135/* ------------------------------ */
11136 .balign 128
11137.L_ALT_op_add_int_lit16: /* 0xd0 */
11138/* File: mips64/alt_stub.S */
11139/*
11140 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11141 * any interesting requests and then jump to the real instruction
11142 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11143 */
11144 .extern MterpCheckBefore
11145 EXPORT_PC
11146 REFRESH_IBASE
11147 dla ra, artMterpAsmInstructionStart
11148 dla t9, MterpCheckBefore
11149 move a0, rSELF
11150 daddu a1, rFP, OFF_FP_SHADOWFRAME
11151 daddu ra, ra, (208 * 128) # Addr of primary handler.
11152 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11153
11154/* ------------------------------ */
11155 .balign 128
11156.L_ALT_op_rsub_int: /* 0xd1 */
11157/* File: mips64/alt_stub.S */
11158/*
11159 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11160 * any interesting requests and then jump to the real instruction
11161 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11162 */
11163 .extern MterpCheckBefore
11164 EXPORT_PC
11165 REFRESH_IBASE
11166 dla ra, artMterpAsmInstructionStart
11167 dla t9, MterpCheckBefore
11168 move a0, rSELF
11169 daddu a1, rFP, OFF_FP_SHADOWFRAME
11170 daddu ra, ra, (209 * 128) # Addr of primary handler.
11171 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11172
11173/* ------------------------------ */
11174 .balign 128
11175.L_ALT_op_mul_int_lit16: /* 0xd2 */
11176/* File: mips64/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 REFRESH_IBASE
11185 dla ra, artMterpAsmInstructionStart
11186 dla t9, MterpCheckBefore
11187 move a0, rSELF
11188 daddu a1, rFP, OFF_FP_SHADOWFRAME
11189 daddu ra, ra, (210 * 128) # Addr of primary handler.
11190 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11191
11192/* ------------------------------ */
11193 .balign 128
11194.L_ALT_op_div_int_lit16: /* 0xd3 */
11195/* File: mips64/alt_stub.S */
11196/*
11197 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11198 * any interesting requests and then jump to the real instruction
11199 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11200 */
11201 .extern MterpCheckBefore
11202 EXPORT_PC
11203 REFRESH_IBASE
11204 dla ra, artMterpAsmInstructionStart
11205 dla t9, MterpCheckBefore
11206 move a0, rSELF
11207 daddu a1, rFP, OFF_FP_SHADOWFRAME
11208 daddu ra, ra, (211 * 128) # Addr of primary handler.
11209 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11210
11211/* ------------------------------ */
11212 .balign 128
11213.L_ALT_op_rem_int_lit16: /* 0xd4 */
11214/* File: mips64/alt_stub.S */
11215/*
11216 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11217 * any interesting requests and then jump to the real instruction
11218 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11219 */
11220 .extern MterpCheckBefore
11221 EXPORT_PC
11222 REFRESH_IBASE
11223 dla ra, artMterpAsmInstructionStart
11224 dla t9, MterpCheckBefore
11225 move a0, rSELF
11226 daddu a1, rFP, OFF_FP_SHADOWFRAME
11227 daddu ra, ra, (212 * 128) # Addr of primary handler.
11228 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11229
11230/* ------------------------------ */
11231 .balign 128
11232.L_ALT_op_and_int_lit16: /* 0xd5 */
11233/* File: mips64/alt_stub.S */
11234/*
11235 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11236 * any interesting requests and then jump to the real instruction
11237 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11238 */
11239 .extern MterpCheckBefore
11240 EXPORT_PC
11241 REFRESH_IBASE
11242 dla ra, artMterpAsmInstructionStart
11243 dla t9, MterpCheckBefore
11244 move a0, rSELF
11245 daddu a1, rFP, OFF_FP_SHADOWFRAME
11246 daddu ra, ra, (213 * 128) # Addr of primary handler.
11247 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11248
11249/* ------------------------------ */
11250 .balign 128
11251.L_ALT_op_or_int_lit16: /* 0xd6 */
11252/* File: mips64/alt_stub.S */
11253/*
11254 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11255 * any interesting requests and then jump to the real instruction
11256 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11257 */
11258 .extern MterpCheckBefore
11259 EXPORT_PC
11260 REFRESH_IBASE
11261 dla ra, artMterpAsmInstructionStart
11262 dla t9, MterpCheckBefore
11263 move a0, rSELF
11264 daddu a1, rFP, OFF_FP_SHADOWFRAME
11265 daddu ra, ra, (214 * 128) # Addr of primary handler.
11266 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11267
11268/* ------------------------------ */
11269 .balign 128
11270.L_ALT_op_xor_int_lit16: /* 0xd7 */
11271/* File: mips64/alt_stub.S */
11272/*
11273 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11274 * any interesting requests and then jump to the real instruction
11275 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11276 */
11277 .extern MterpCheckBefore
11278 EXPORT_PC
11279 REFRESH_IBASE
11280 dla ra, artMterpAsmInstructionStart
11281 dla t9, MterpCheckBefore
11282 move a0, rSELF
11283 daddu a1, rFP, OFF_FP_SHADOWFRAME
11284 daddu ra, ra, (215 * 128) # Addr of primary handler.
11285 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11286
11287/* ------------------------------ */
11288 .balign 128
11289.L_ALT_op_add_int_lit8: /* 0xd8 */
11290/* File: mips64/alt_stub.S */
11291/*
11292 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11293 * any interesting requests and then jump to the real instruction
11294 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11295 */
11296 .extern MterpCheckBefore
11297 EXPORT_PC
11298 REFRESH_IBASE
11299 dla ra, artMterpAsmInstructionStart
11300 dla t9, MterpCheckBefore
11301 move a0, rSELF
11302 daddu a1, rFP, OFF_FP_SHADOWFRAME
11303 daddu ra, ra, (216 * 128) # Addr of primary handler.
11304 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11305
11306/* ------------------------------ */
11307 .balign 128
11308.L_ALT_op_rsub_int_lit8: /* 0xd9 */
11309/* File: mips64/alt_stub.S */
11310/*
11311 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11312 * any interesting requests and then jump to the real instruction
11313 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11314 */
11315 .extern MterpCheckBefore
11316 EXPORT_PC
11317 REFRESH_IBASE
11318 dla ra, artMterpAsmInstructionStart
11319 dla t9, MterpCheckBefore
11320 move a0, rSELF
11321 daddu a1, rFP, OFF_FP_SHADOWFRAME
11322 daddu ra, ra, (217 * 128) # Addr of primary handler.
11323 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11324
11325/* ------------------------------ */
11326 .balign 128
11327.L_ALT_op_mul_int_lit8: /* 0xda */
11328/* File: mips64/alt_stub.S */
11329/*
11330 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11331 * any interesting requests and then jump to the real instruction
11332 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11333 */
11334 .extern MterpCheckBefore
11335 EXPORT_PC
11336 REFRESH_IBASE
11337 dla ra, artMterpAsmInstructionStart
11338 dla t9, MterpCheckBefore
11339 move a0, rSELF
11340 daddu a1, rFP, OFF_FP_SHADOWFRAME
11341 daddu ra, ra, (218 * 128) # Addr of primary handler.
11342 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11343
11344/* ------------------------------ */
11345 .balign 128
11346.L_ALT_op_div_int_lit8: /* 0xdb */
11347/* File: mips64/alt_stub.S */
11348/*
11349 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11350 * any interesting requests and then jump to the real instruction
11351 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11352 */
11353 .extern MterpCheckBefore
11354 EXPORT_PC
11355 REFRESH_IBASE
11356 dla ra, artMterpAsmInstructionStart
11357 dla t9, MterpCheckBefore
11358 move a0, rSELF
11359 daddu a1, rFP, OFF_FP_SHADOWFRAME
11360 daddu ra, ra, (219 * 128) # Addr of primary handler.
11361 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11362
11363/* ------------------------------ */
11364 .balign 128
11365.L_ALT_op_rem_int_lit8: /* 0xdc */
11366/* File: mips64/alt_stub.S */
11367/*
11368 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11369 * any interesting requests and then jump to the real instruction
11370 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11371 */
11372 .extern MterpCheckBefore
11373 EXPORT_PC
11374 REFRESH_IBASE
11375 dla ra, artMterpAsmInstructionStart
11376 dla t9, MterpCheckBefore
11377 move a0, rSELF
11378 daddu a1, rFP, OFF_FP_SHADOWFRAME
11379 daddu ra, ra, (220 * 128) # Addr of primary handler.
11380 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11381
11382/* ------------------------------ */
11383 .balign 128
11384.L_ALT_op_and_int_lit8: /* 0xdd */
11385/* File: mips64/alt_stub.S */
11386/*
11387 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11388 * any interesting requests and then jump to the real instruction
11389 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11390 */
11391 .extern MterpCheckBefore
11392 EXPORT_PC
11393 REFRESH_IBASE
11394 dla ra, artMterpAsmInstructionStart
11395 dla t9, MterpCheckBefore
11396 move a0, rSELF
11397 daddu a1, rFP, OFF_FP_SHADOWFRAME
11398 daddu ra, ra, (221 * 128) # Addr of primary handler.
11399 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11400
11401/* ------------------------------ */
11402 .balign 128
11403.L_ALT_op_or_int_lit8: /* 0xde */
11404/* File: mips64/alt_stub.S */
11405/*
11406 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11407 * any interesting requests and then jump to the real instruction
11408 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11409 */
11410 .extern MterpCheckBefore
11411 EXPORT_PC
11412 REFRESH_IBASE
11413 dla ra, artMterpAsmInstructionStart
11414 dla t9, MterpCheckBefore
11415 move a0, rSELF
11416 daddu a1, rFP, OFF_FP_SHADOWFRAME
11417 daddu ra, ra, (222 * 128) # Addr of primary handler.
11418 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11419
11420/* ------------------------------ */
11421 .balign 128
11422.L_ALT_op_xor_int_lit8: /* 0xdf */
11423/* File: mips64/alt_stub.S */
11424/*
11425 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11426 * any interesting requests and then jump to the real instruction
11427 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11428 */
11429 .extern MterpCheckBefore
11430 EXPORT_PC
11431 REFRESH_IBASE
11432 dla ra, artMterpAsmInstructionStart
11433 dla t9, MterpCheckBefore
11434 move a0, rSELF
11435 daddu a1, rFP, OFF_FP_SHADOWFRAME
11436 daddu ra, ra, (223 * 128) # Addr of primary handler.
11437 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11438
11439/* ------------------------------ */
11440 .balign 128
11441.L_ALT_op_shl_int_lit8: /* 0xe0 */
11442/* File: mips64/alt_stub.S */
11443/*
11444 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11445 * any interesting requests and then jump to the real instruction
11446 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11447 */
11448 .extern MterpCheckBefore
11449 EXPORT_PC
11450 REFRESH_IBASE
11451 dla ra, artMterpAsmInstructionStart
11452 dla t9, MterpCheckBefore
11453 move a0, rSELF
11454 daddu a1, rFP, OFF_FP_SHADOWFRAME
11455 daddu ra, ra, (224 * 128) # Addr of primary handler.
11456 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11457
11458/* ------------------------------ */
11459 .balign 128
11460.L_ALT_op_shr_int_lit8: /* 0xe1 */
11461/* File: mips64/alt_stub.S */
11462/*
11463 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11464 * any interesting requests and then jump to the real instruction
11465 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11466 */
11467 .extern MterpCheckBefore
11468 EXPORT_PC
11469 REFRESH_IBASE
11470 dla ra, artMterpAsmInstructionStart
11471 dla t9, MterpCheckBefore
11472 move a0, rSELF
11473 daddu a1, rFP, OFF_FP_SHADOWFRAME
11474 daddu ra, ra, (225 * 128) # Addr of primary handler.
11475 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11476
11477/* ------------------------------ */
11478 .balign 128
11479.L_ALT_op_ushr_int_lit8: /* 0xe2 */
11480/* File: mips64/alt_stub.S */
11481/*
11482 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11483 * any interesting requests and then jump to the real instruction
11484 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11485 */
11486 .extern MterpCheckBefore
11487 EXPORT_PC
11488 REFRESH_IBASE
11489 dla ra, artMterpAsmInstructionStart
11490 dla t9, MterpCheckBefore
11491 move a0, rSELF
11492 daddu a1, rFP, OFF_FP_SHADOWFRAME
11493 daddu ra, ra, (226 * 128) # Addr of primary handler.
11494 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11495
11496/* ------------------------------ */
11497 .balign 128
11498.L_ALT_op_iget_quick: /* 0xe3 */
11499/* File: mips64/alt_stub.S */
11500/*
11501 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11502 * any interesting requests and then jump to the real instruction
11503 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11504 */
11505 .extern MterpCheckBefore
11506 EXPORT_PC
11507 REFRESH_IBASE
11508 dla ra, artMterpAsmInstructionStart
11509 dla t9, MterpCheckBefore
11510 move a0, rSELF
11511 daddu a1, rFP, OFF_FP_SHADOWFRAME
11512 daddu ra, ra, (227 * 128) # Addr of primary handler.
11513 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11514
11515/* ------------------------------ */
11516 .balign 128
11517.L_ALT_op_iget_wide_quick: /* 0xe4 */
11518/* File: mips64/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 REFRESH_IBASE
11527 dla ra, artMterpAsmInstructionStart
11528 dla t9, MterpCheckBefore
11529 move a0, rSELF
11530 daddu a1, rFP, OFF_FP_SHADOWFRAME
11531 daddu ra, ra, (228 * 128) # Addr of primary handler.
11532 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11533
11534/* ------------------------------ */
11535 .balign 128
11536.L_ALT_op_iget_object_quick: /* 0xe5 */
11537/* File: mips64/alt_stub.S */
11538/*
11539 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11540 * any interesting requests and then jump to the real instruction
11541 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11542 */
11543 .extern MterpCheckBefore
11544 EXPORT_PC
11545 REFRESH_IBASE
11546 dla ra, artMterpAsmInstructionStart
11547 dla t9, MterpCheckBefore
11548 move a0, rSELF
11549 daddu a1, rFP, OFF_FP_SHADOWFRAME
11550 daddu ra, ra, (229 * 128) # Addr of primary handler.
11551 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11552
11553/* ------------------------------ */
11554 .balign 128
11555.L_ALT_op_iput_quick: /* 0xe6 */
11556/* File: mips64/alt_stub.S */
11557/*
11558 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11559 * any interesting requests and then jump to the real instruction
11560 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11561 */
11562 .extern MterpCheckBefore
11563 EXPORT_PC
11564 REFRESH_IBASE
11565 dla ra, artMterpAsmInstructionStart
11566 dla t9, MterpCheckBefore
11567 move a0, rSELF
11568 daddu a1, rFP, OFF_FP_SHADOWFRAME
11569 daddu ra, ra, (230 * 128) # Addr of primary handler.
11570 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11571
11572/* ------------------------------ */
11573 .balign 128
11574.L_ALT_op_iput_wide_quick: /* 0xe7 */
11575/* File: mips64/alt_stub.S */
11576/*
11577 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11578 * any interesting requests and then jump to the real instruction
11579 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11580 */
11581 .extern MterpCheckBefore
11582 EXPORT_PC
11583 REFRESH_IBASE
11584 dla ra, artMterpAsmInstructionStart
11585 dla t9, MterpCheckBefore
11586 move a0, rSELF
11587 daddu a1, rFP, OFF_FP_SHADOWFRAME
11588 daddu ra, ra, (231 * 128) # Addr of primary handler.
11589 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11590
11591/* ------------------------------ */
11592 .balign 128
11593.L_ALT_op_iput_object_quick: /* 0xe8 */
11594/* File: mips64/alt_stub.S */
11595/*
11596 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11597 * any interesting requests and then jump to the real instruction
11598 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11599 */
11600 .extern MterpCheckBefore
11601 EXPORT_PC
11602 REFRESH_IBASE
11603 dla ra, artMterpAsmInstructionStart
11604 dla t9, MterpCheckBefore
11605 move a0, rSELF
11606 daddu a1, rFP, OFF_FP_SHADOWFRAME
11607 daddu ra, ra, (232 * 128) # Addr of primary handler.
11608 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11609
11610/* ------------------------------ */
11611 .balign 128
11612.L_ALT_op_invoke_virtual_quick: /* 0xe9 */
11613/* File: mips64/alt_stub.S */
11614/*
11615 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11616 * any interesting requests and then jump to the real instruction
11617 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11618 */
11619 .extern MterpCheckBefore
11620 EXPORT_PC
11621 REFRESH_IBASE
11622 dla ra, artMterpAsmInstructionStart
11623 dla t9, MterpCheckBefore
11624 move a0, rSELF
11625 daddu a1, rFP, OFF_FP_SHADOWFRAME
11626 daddu ra, ra, (233 * 128) # Addr of primary handler.
11627 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11628
11629/* ------------------------------ */
11630 .balign 128
11631.L_ALT_op_invoke_virtual_range_quick: /* 0xea */
11632/* File: mips64/alt_stub.S */
11633/*
11634 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11635 * any interesting requests and then jump to the real instruction
11636 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11637 */
11638 .extern MterpCheckBefore
11639 EXPORT_PC
11640 REFRESH_IBASE
11641 dla ra, artMterpAsmInstructionStart
11642 dla t9, MterpCheckBefore
11643 move a0, rSELF
11644 daddu a1, rFP, OFF_FP_SHADOWFRAME
11645 daddu ra, ra, (234 * 128) # Addr of primary handler.
11646 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11647
11648/* ------------------------------ */
11649 .balign 128
11650.L_ALT_op_iput_boolean_quick: /* 0xeb */
11651/* File: mips64/alt_stub.S */
11652/*
11653 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11654 * any interesting requests and then jump to the real instruction
11655 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11656 */
11657 .extern MterpCheckBefore
11658 EXPORT_PC
11659 REFRESH_IBASE
11660 dla ra, artMterpAsmInstructionStart
11661 dla t9, MterpCheckBefore
11662 move a0, rSELF
11663 daddu a1, rFP, OFF_FP_SHADOWFRAME
11664 daddu ra, ra, (235 * 128) # Addr of primary handler.
11665 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11666
11667/* ------------------------------ */
11668 .balign 128
11669.L_ALT_op_iput_byte_quick: /* 0xec */
11670/* File: mips64/alt_stub.S */
11671/*
11672 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11673 * any interesting requests and then jump to the real instruction
11674 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11675 */
11676 .extern MterpCheckBefore
11677 EXPORT_PC
11678 REFRESH_IBASE
11679 dla ra, artMterpAsmInstructionStart
11680 dla t9, MterpCheckBefore
11681 move a0, rSELF
11682 daddu a1, rFP, OFF_FP_SHADOWFRAME
11683 daddu ra, ra, (236 * 128) # Addr of primary handler.
11684 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11685
11686/* ------------------------------ */
11687 .balign 128
11688.L_ALT_op_iput_char_quick: /* 0xed */
11689/* File: mips64/alt_stub.S */
11690/*
11691 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11692 * any interesting requests and then jump to the real instruction
11693 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11694 */
11695 .extern MterpCheckBefore
11696 EXPORT_PC
11697 REFRESH_IBASE
11698 dla ra, artMterpAsmInstructionStart
11699 dla t9, MterpCheckBefore
11700 move a0, rSELF
11701 daddu a1, rFP, OFF_FP_SHADOWFRAME
11702 daddu ra, ra, (237 * 128) # Addr of primary handler.
11703 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11704
11705/* ------------------------------ */
11706 .balign 128
11707.L_ALT_op_iput_short_quick: /* 0xee */
11708/* File: mips64/alt_stub.S */
11709/*
11710 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11711 * any interesting requests and then jump to the real instruction
11712 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11713 */
11714 .extern MterpCheckBefore
11715 EXPORT_PC
11716 REFRESH_IBASE
11717 dla ra, artMterpAsmInstructionStart
11718 dla t9, MterpCheckBefore
11719 move a0, rSELF
11720 daddu a1, rFP, OFF_FP_SHADOWFRAME
11721 daddu ra, ra, (238 * 128) # Addr of primary handler.
11722 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11723
11724/* ------------------------------ */
11725 .balign 128
11726.L_ALT_op_iget_boolean_quick: /* 0xef */
11727/* File: mips64/alt_stub.S */
11728/*
11729 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11730 * any interesting requests and then jump to the real instruction
11731 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11732 */
11733 .extern MterpCheckBefore
11734 EXPORT_PC
11735 REFRESH_IBASE
11736 dla ra, artMterpAsmInstructionStart
11737 dla t9, MterpCheckBefore
11738 move a0, rSELF
11739 daddu a1, rFP, OFF_FP_SHADOWFRAME
11740 daddu ra, ra, (239 * 128) # Addr of primary handler.
11741 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11742
11743/* ------------------------------ */
11744 .balign 128
11745.L_ALT_op_iget_byte_quick: /* 0xf0 */
11746/* File: mips64/alt_stub.S */
11747/*
11748 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11749 * any interesting requests and then jump to the real instruction
11750 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11751 */
11752 .extern MterpCheckBefore
11753 EXPORT_PC
11754 REFRESH_IBASE
11755 dla ra, artMterpAsmInstructionStart
11756 dla t9, MterpCheckBefore
11757 move a0, rSELF
11758 daddu a1, rFP, OFF_FP_SHADOWFRAME
11759 daddu ra, ra, (240 * 128) # Addr of primary handler.
11760 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11761
11762/* ------------------------------ */
11763 .balign 128
11764.L_ALT_op_iget_char_quick: /* 0xf1 */
11765/* File: mips64/alt_stub.S */
11766/*
11767 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11768 * any interesting requests and then jump to the real instruction
11769 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11770 */
11771 .extern MterpCheckBefore
11772 EXPORT_PC
11773 REFRESH_IBASE
11774 dla ra, artMterpAsmInstructionStart
11775 dla t9, MterpCheckBefore
11776 move a0, rSELF
11777 daddu a1, rFP, OFF_FP_SHADOWFRAME
11778 daddu ra, ra, (241 * 128) # Addr of primary handler.
11779 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11780
11781/* ------------------------------ */
11782 .balign 128
11783.L_ALT_op_iget_short_quick: /* 0xf2 */
11784/* File: mips64/alt_stub.S */
11785/*
11786 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11787 * any interesting requests and then jump to the real instruction
11788 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11789 */
11790 .extern MterpCheckBefore
11791 EXPORT_PC
11792 REFRESH_IBASE
11793 dla ra, artMterpAsmInstructionStart
11794 dla t9, MterpCheckBefore
11795 move a0, rSELF
11796 daddu a1, rFP, OFF_FP_SHADOWFRAME
11797 daddu ra, ra, (242 * 128) # Addr of primary handler.
11798 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11799
11800/* ------------------------------ */
11801 .balign 128
11802.L_ALT_op_invoke_lambda: /* 0xf3 */
11803/* File: mips64/alt_stub.S */
11804/*
11805 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11806 * any interesting requests and then jump to the real instruction
11807 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11808 */
11809 .extern MterpCheckBefore
11810 EXPORT_PC
11811 REFRESH_IBASE
11812 dla ra, artMterpAsmInstructionStart
11813 dla t9, MterpCheckBefore
11814 move a0, rSELF
11815 daddu a1, rFP, OFF_FP_SHADOWFRAME
11816 daddu ra, ra, (243 * 128) # Addr of primary handler.
11817 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11818
11819/* ------------------------------ */
11820 .balign 128
11821.L_ALT_op_unused_f4: /* 0xf4 */
11822/* File: mips64/alt_stub.S */
11823/*
11824 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11825 * any interesting requests and then jump to the real instruction
11826 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11827 */
11828 .extern MterpCheckBefore
11829 EXPORT_PC
11830 REFRESH_IBASE
11831 dla ra, artMterpAsmInstructionStart
11832 dla t9, MterpCheckBefore
11833 move a0, rSELF
11834 daddu a1, rFP, OFF_FP_SHADOWFRAME
11835 daddu ra, ra, (244 * 128) # Addr of primary handler.
11836 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11837
11838/* ------------------------------ */
11839 .balign 128
11840.L_ALT_op_capture_variable: /* 0xf5 */
11841/* File: mips64/alt_stub.S */
11842/*
11843 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11844 * any interesting requests and then jump to the real instruction
11845 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11846 */
11847 .extern MterpCheckBefore
11848 EXPORT_PC
11849 REFRESH_IBASE
11850 dla ra, artMterpAsmInstructionStart
11851 dla t9, MterpCheckBefore
11852 move a0, rSELF
11853 daddu a1, rFP, OFF_FP_SHADOWFRAME
11854 daddu ra, ra, (245 * 128) # Addr of primary handler.
11855 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11856
11857/* ------------------------------ */
11858 .balign 128
11859.L_ALT_op_create_lambda: /* 0xf6 */
11860/* File: mips64/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 REFRESH_IBASE
11869 dla ra, artMterpAsmInstructionStart
11870 dla t9, MterpCheckBefore
11871 move a0, rSELF
11872 daddu a1, rFP, OFF_FP_SHADOWFRAME
11873 daddu ra, ra, (246 * 128) # Addr of primary handler.
11874 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11875
11876/* ------------------------------ */
11877 .balign 128
11878.L_ALT_op_liberate_variable: /* 0xf7 */
11879/* File: mips64/alt_stub.S */
11880/*
11881 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11882 * any interesting requests and then jump to the real instruction
11883 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11884 */
11885 .extern MterpCheckBefore
11886 EXPORT_PC
11887 REFRESH_IBASE
11888 dla ra, artMterpAsmInstructionStart
11889 dla t9, MterpCheckBefore
11890 move a0, rSELF
11891 daddu a1, rFP, OFF_FP_SHADOWFRAME
11892 daddu ra, ra, (247 * 128) # Addr of primary handler.
11893 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11894
11895/* ------------------------------ */
11896 .balign 128
11897.L_ALT_op_box_lambda: /* 0xf8 */
11898/* File: mips64/alt_stub.S */
11899/*
11900 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11901 * any interesting requests and then jump to the real instruction
11902 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11903 */
11904 .extern MterpCheckBefore
11905 EXPORT_PC
11906 REFRESH_IBASE
11907 dla ra, artMterpAsmInstructionStart
11908 dla t9, MterpCheckBefore
11909 move a0, rSELF
11910 daddu a1, rFP, OFF_FP_SHADOWFRAME
11911 daddu ra, ra, (248 * 128) # Addr of primary handler.
11912 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11913
11914/* ------------------------------ */
11915 .balign 128
11916.L_ALT_op_unbox_lambda: /* 0xf9 */
11917/* File: mips64/alt_stub.S */
11918/*
11919 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11920 * any interesting requests and then jump to the real instruction
11921 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11922 */
11923 .extern MterpCheckBefore
11924 EXPORT_PC
11925 REFRESH_IBASE
11926 dla ra, artMterpAsmInstructionStart
11927 dla t9, MterpCheckBefore
11928 move a0, rSELF
11929 daddu a1, rFP, OFF_FP_SHADOWFRAME
11930 daddu ra, ra, (249 * 128) # Addr of primary handler.
11931 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11932
11933/* ------------------------------ */
11934 .balign 128
11935.L_ALT_op_unused_fa: /* 0xfa */
11936/* File: mips64/alt_stub.S */
11937/*
11938 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11939 * any interesting requests and then jump to the real instruction
11940 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11941 */
11942 .extern MterpCheckBefore
11943 EXPORT_PC
11944 REFRESH_IBASE
11945 dla ra, artMterpAsmInstructionStart
11946 dla t9, MterpCheckBefore
11947 move a0, rSELF
11948 daddu a1, rFP, OFF_FP_SHADOWFRAME
11949 daddu ra, ra, (250 * 128) # Addr of primary handler.
11950 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11951
11952/* ------------------------------ */
11953 .balign 128
11954.L_ALT_op_unused_fb: /* 0xfb */
11955/* File: mips64/alt_stub.S */
11956/*
11957 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11958 * any interesting requests and then jump to the real instruction
11959 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11960 */
11961 .extern MterpCheckBefore
11962 EXPORT_PC
11963 REFRESH_IBASE
11964 dla ra, artMterpAsmInstructionStart
11965 dla t9, MterpCheckBefore
11966 move a0, rSELF
11967 daddu a1, rFP, OFF_FP_SHADOWFRAME
11968 daddu ra, ra, (251 * 128) # Addr of primary handler.
11969 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11970
11971/* ------------------------------ */
11972 .balign 128
11973.L_ALT_op_unused_fc: /* 0xfc */
11974/* File: mips64/alt_stub.S */
11975/*
11976 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11977 * any interesting requests and then jump to the real instruction
11978 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11979 */
11980 .extern MterpCheckBefore
11981 EXPORT_PC
11982 REFRESH_IBASE
11983 dla ra, artMterpAsmInstructionStart
11984 dla t9, MterpCheckBefore
11985 move a0, rSELF
11986 daddu a1, rFP, OFF_FP_SHADOWFRAME
11987 daddu ra, ra, (252 * 128) # Addr of primary handler.
11988 jalr zero, t9 # (self, shadow_frame) Note: tail call.
11989
11990/* ------------------------------ */
11991 .balign 128
11992.L_ALT_op_unused_fd: /* 0xfd */
11993/* File: mips64/alt_stub.S */
11994/*
11995 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11996 * any interesting requests and then jump to the real instruction
11997 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11998 */
11999 .extern MterpCheckBefore
12000 EXPORT_PC
12001 REFRESH_IBASE
12002 dla ra, artMterpAsmInstructionStart
12003 dla t9, MterpCheckBefore
12004 move a0, rSELF
12005 daddu a1, rFP, OFF_FP_SHADOWFRAME
12006 daddu ra, ra, (253 * 128) # Addr of primary handler.
12007 jalr zero, t9 # (self, shadow_frame) Note: tail call.
12008
12009/* ------------------------------ */
12010 .balign 128
12011.L_ALT_op_unused_fe: /* 0xfe */
12012/* File: mips64/alt_stub.S */
12013/*
12014 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12015 * any interesting requests and then jump to the real instruction
12016 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12017 */
12018 .extern MterpCheckBefore
12019 EXPORT_PC
12020 REFRESH_IBASE
12021 dla ra, artMterpAsmInstructionStart
12022 dla t9, MterpCheckBefore
12023 move a0, rSELF
12024 daddu a1, rFP, OFF_FP_SHADOWFRAME
12025 daddu ra, ra, (254 * 128) # Addr of primary handler.
12026 jalr zero, t9 # (self, shadow_frame) Note: tail call.
12027
12028/* ------------------------------ */
12029 .balign 128
12030.L_ALT_op_unused_ff: /* 0xff */
12031/* File: mips64/alt_stub.S */
12032/*
12033 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12034 * any interesting requests and then jump to the real instruction
12035 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12036 */
12037 .extern MterpCheckBefore
12038 EXPORT_PC
12039 REFRESH_IBASE
12040 dla ra, artMterpAsmInstructionStart
12041 dla t9, MterpCheckBefore
12042 move a0, rSELF
12043 daddu a1, rFP, OFF_FP_SHADOWFRAME
12044 daddu ra, ra, (255 * 128) # Addr of primary handler.
12045 jalr zero, t9 # (self, shadow_frame) Note: tail call.
12046
12047 .balign 128
12048 .size artMterpAsmAltInstructionStart, .-artMterpAsmAltInstructionStart
12049 .global artMterpAsmAltInstructionEnd
12050artMterpAsmAltInstructionEnd:
12051/* File: mips64/footer.S */
12052/*
12053 * We've detected a condition that will result in an exception, but the exception
12054 * has not yet been thrown. Just bail out to the reference interpreter to deal with it.
12055 * TUNING: for consistency, we may want to just go ahead and handle these here.
12056 */
12057
12058 .extern MterpLogDivideByZeroException
12059common_errDivideByZero:
12060 EXPORT_PC
12061#if MTERP_LOGGING
12062 move a0, rSELF
12063 daddu a1, rFP, OFF_FP_SHADOWFRAME
12064 jal MterpLogDivideByZeroException
12065#endif
12066 b MterpCommonFallback
12067
12068 .extern MterpLogArrayIndexException
12069common_errArrayIndex:
12070 EXPORT_PC
12071#if MTERP_LOGGING
12072 move a0, rSELF
12073 daddu a1, rFP, OFF_FP_SHADOWFRAME
12074 jal MterpLogArrayIndexException
12075#endif
12076 b MterpCommonFallback
12077
12078 .extern MterpLogNullObjectException
12079common_errNullObject:
12080 EXPORT_PC
12081#if MTERP_LOGGING
12082 move a0, rSELF
12083 daddu a1, rFP, OFF_FP_SHADOWFRAME
12084 jal MterpLogNullObjectException
12085#endif
12086 b MterpCommonFallback
12087
12088/*
12089 * If we're here, something is out of the ordinary. If there is a pending
12090 * exception, handle it. Otherwise, roll back and retry with the reference
12091 * interpreter.
12092 */
12093MterpPossibleException:
12094 ld a0, THREAD_EXCEPTION_OFFSET(rSELF)
12095 beqzc a0, MterpFallback # If not, fall back to reference interpreter.
12096 /* intentional fallthrough - handle pending exception. */
12097/*
12098 * On return from a runtime helper routine, we've found a pending exception.
12099 * Can we handle it here - or need to bail out to caller?
12100 *
12101 */
12102 .extern MterpHandleException
Alexey Frunzedb045be2016-03-03 17:50:48 -080012103 .extern MterpShouldSwitchInterpreters
Alexey Frunze00b53b72016-02-02 20:25:45 -080012104MterpException:
12105 move a0, rSELF
12106 daddu a1, rFP, OFF_FP_SHADOWFRAME
12107 jal MterpHandleException # (self, shadow_frame)
12108 beqzc v0, MterpExceptionReturn # no local catch, back to caller.
12109 ld a0, OFF_FP_CODE_ITEM(rFP)
12110 lwu a1, OFF_FP_DEX_PC(rFP)
12111 REFRESH_IBASE
12112 daddu rPC, a0, CODEITEM_INSNS_OFFSET
12113 dlsa rPC, a1, rPC, 1 # generate new dex_pc_ptr
Alexey Frunzedb045be2016-03-03 17:50:48 -080012114 /* Do we need to switch interpreters? */
12115 jal MterpShouldSwitchInterpreters
12116 bnezc v0, MterpFallback
Alexey Frunze00b53b72016-02-02 20:25:45 -080012117 /* resume execution at catch block */
Alexey Frunzedb045be2016-03-03 17:50:48 -080012118 EXPORT_PC
Alexey Frunze00b53b72016-02-02 20:25:45 -080012119 FETCH_INST
12120 GET_INST_OPCODE v0
12121 GOTO_OPCODE v0
12122 /* NOTE: no fallthrough */
12123
12124/*
Douglas Leung020b18a2016-06-03 18:05:35 -070012125 * Common handling for branches with support for Jit profiling.
12126 * On entry:
12127 * rINST <= signed offset
12128 * rPROFILE <= signed hotness countdown (expanded to 64 bits)
12129 *
12130 * We have quite a few different cases for branch profiling, OSR detection and
12131 * suspend check support here.
12132 *
12133 * Taken backward branches:
12134 * If profiling active, do hotness countdown and report if we hit zero.
12135 * If in osr check mode, see if our target is a compiled loop header entry and do OSR if so.
12136 * Is there a pending suspend request? If so, suspend.
12137 *
12138 * Taken forward branches and not-taken backward branches:
12139 * If in osr check mode, see if our target is a compiled loop header entry and do OSR if so.
12140 *
12141 * Our most common case is expected to be a taken backward branch with active jit profiling,
12142 * but no full OSR check and no pending suspend request.
12143 * Next most common case is not-taken branch with no full OSR check.
12144 *
Alexey Frunze00b53b72016-02-02 20:25:45 -080012145 */
Douglas Leung020b18a2016-06-03 18:05:35 -070012146MterpCommonTakenBranchNoFlags:
12147 bgtzc rINST, .L_forward_branch # don't add forward branches to hotness
12148/*
12149 * We need to subtract 1 from positive values and we should not see 0 here,
12150 * so we may use the result of the comparison with -1.
12151 */
12152 li v0, JIT_CHECK_OSR
12153 beqc rPROFILE, v0, .L_osr_check
12154 bltc rPROFILE, v0, .L_resume_backward_branch
12155 dsubu rPROFILE, 1
12156 beqzc rPROFILE, .L_add_batch # counted down to zero - report
12157.L_resume_backward_branch:
12158 lw ra, THREAD_FLAGS_OFFSET(rSELF)
Alexey Frunze00b53b72016-02-02 20:25:45 -080012159 REFRESH_IBASE
Douglas Leung020b18a2016-06-03 18:05:35 -070012160 daddu a2, rINST, rINST # a2<- byte offset
12161 FETCH_ADVANCE_INST_RB a2 # update rPC, load rINST
12162 and ra, (THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
12163 bnezc ra, .L_suspend_request_pending
12164 GET_INST_OPCODE v0 # extract opcode from rINST
12165 GOTO_OPCODE v0 # jump to next instruction
12166
12167.L_suspend_request_pending:
Alexey Frunze00b53b72016-02-02 20:25:45 -080012168 EXPORT_PC
12169 move a0, rSELF
Douglas Leung020b18a2016-06-03 18:05:35 -070012170 jal MterpSuspendCheck # (self)
12171 bnezc v0, MterpFallback
12172 REFRESH_IBASE # might have changed during suspend
12173 GET_INST_OPCODE v0 # extract opcode from rINST
12174 GOTO_OPCODE v0 # jump to next instruction
12175
12176.L_no_count_backwards:
12177 li v0, JIT_CHECK_OSR # check for possible OSR re-entry
12178 bnec rPROFILE, v0, .L_resume_backward_branch
12179.L_osr_check:
12180 move a0, rSELF
12181 daddu a1, rFP, OFF_FP_SHADOWFRAME
12182 move a2, rINST
12183 EXPORT_PC
12184 jal MterpMaybeDoOnStackReplacement # (self, shadow_frame, offset)
12185 bnezc v0, MterpOnStackReplacement
12186 b .L_resume_backward_branch
12187
12188.L_forward_branch:
12189 li v0, JIT_CHECK_OSR # check for possible OSR re-entry
12190 beqc rPROFILE, v0, .L_check_osr_forward
12191.L_resume_forward_branch:
12192 daddu a2, rINST, rINST # a2<- byte offset
12193 FETCH_ADVANCE_INST_RB a2 # update rPC, load rINST
12194 GET_INST_OPCODE v0 # extract opcode from rINST
12195 GOTO_OPCODE v0 # jump to next instruction
12196
12197.L_check_osr_forward:
12198 move a0, rSELF
12199 daddu a1, rFP, OFF_FP_SHADOWFRAME
12200 move a2, rINST
12201 EXPORT_PC
12202 jal MterpMaybeDoOnStackReplacement # (self, shadow_frame, offset)
12203 bnezc v0, MterpOnStackReplacement
12204 b .L_resume_forward_branch
12205
12206.L_add_batch:
12207 daddu a1, rFP, OFF_FP_SHADOWFRAME
12208 sh rPROFILE, SHADOWFRAME_HOTNESS_COUNTDOWN_OFFSET(a1)
12209 ld a0, OFF_FP_METHOD(rFP)
12210 move a2, rSELF
12211 jal MterpAddHotnessBatch # (method, shadow_frame, self)
12212 move rPROFILE, v0 # restore new hotness countdown to rPROFILE
12213 b .L_no_count_backwards
12214
12215/*
12216 * Entered from the conditional branch handlers when OSR check request active on
12217 * not-taken path. All Dalvik not-taken conditional branch offsets are 2.
12218 */
12219.L_check_not_taken_osr:
12220 move a0, rSELF
12221 daddu a1, rFP, OFF_FP_SHADOWFRAME
12222 li a2, 2
12223 EXPORT_PC
12224 jal MterpMaybeDoOnStackReplacement # (self, shadow_frame, offset)
12225 bnezc v0, MterpOnStackReplacement
12226 FETCH_ADVANCE_INST 2
12227 GET_INST_OPCODE v0 # extract opcode from rINST
12228 GOTO_OPCODE v0 # jump to next instruction
Alexey Frunze00b53b72016-02-02 20:25:45 -080012229
12230/*
Alexey Frunzedb045be2016-03-03 17:50:48 -080012231 * On-stack replacement has happened, and now we've returned from the compiled method.
12232 */
12233MterpOnStackReplacement:
12234#if MTERP_LOGGING
12235 move a0, rSELF
12236 daddu a1, rFP, OFF_FP_SHADOWFRAME
12237 move a2, rINST # rINST contains offset
12238 jal MterpLogOSR
12239#endif
12240 li v0, 1 # Signal normal return
12241 b MterpDone
12242
12243/*
Alexey Frunze00b53b72016-02-02 20:25:45 -080012244 * Bail out to reference interpreter.
12245 */
12246 .extern MterpLogFallback
12247MterpFallback:
12248 EXPORT_PC
12249#if MTERP_LOGGING
12250 move a0, rSELF
12251 daddu a1, rFP, OFF_FP_SHADOWFRAME
12252 jal MterpLogFallback
12253#endif
12254MterpCommonFallback:
12255 li v0, 0 # signal retry with reference interpreter.
12256 b MterpDone
12257
12258/*
12259 * We pushed some registers on the stack in ExecuteMterpImpl, then saved
12260 * SP and RA. Here we restore SP, restore the registers, and then restore
12261 * RA to PC.
12262 *
12263 * On entry:
12264 * uint32_t* rFP (should still be live, pointer to base of vregs)
12265 */
12266MterpExceptionReturn:
12267 li v0, 1 # signal return to caller.
12268 b MterpDone
12269/*
12270 * Returned value is expected in a0 and if it's not 64-bit, the 32 most
12271 * significant bits of a0 must be 0.
12272 */
12273MterpReturn:
12274 ld a2, OFF_FP_RESULT_REGISTER(rFP)
12275 lw ra, THREAD_FLAGS_OFFSET(rSELF)
12276 sd a0, 0(a2)
12277 move a0, rSELF
12278 and ra, ra, (THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
12279 beqzc ra, check2
12280 jal MterpSuspendCheck # (self)
12281check2:
12282 li v0, 1 # signal return to caller.
12283MterpDone:
Douglas Leung020b18a2016-06-03 18:05:35 -070012284/*
12285 * At this point, we expect rPROFILE to be non-zero. If negative, hotness is disabled or we're
12286 * checking for OSR. If greater than zero, we might have unreported hotness to register
12287 * (the difference between the ending rPROFILE and the cached hotness counter). rPROFILE
12288 * should only reach zero immediately after a hotness decrement, and is then reset to either
12289 * a negative special state or the new non-zero countdown value.
12290 */
12291 blez rPROFILE, .L_pop_and_return # if > 0, we may have some counts to report.
12292
12293MterpProfileActive:
12294 move rINST, v0 # stash return value
12295 /* Report cached hotness counts */
12296 ld a0, OFF_FP_METHOD(rFP)
12297 daddu a1, rFP, OFF_FP_SHADOWFRAME
12298 move a2, rSELF
12299 sh rPROFILE, SHADOWFRAME_HOTNESS_COUNTDOWN_OFFSET(a1)
12300 jal MterpAddHotnessBatch # (method, shadow_frame, self)
12301 move v0, rINST # restore return value
12302
12303.L_pop_and_return:
12304 ld s6, STACK_OFFSET_S6(sp)
12305 .cfi_restore 22
Alexey Frunze00b53b72016-02-02 20:25:45 -080012306 ld s5, STACK_OFFSET_S5(sp)
12307 .cfi_restore 21
12308 ld s4, STACK_OFFSET_S4(sp)
12309 .cfi_restore 20
12310 ld s3, STACK_OFFSET_S3(sp)
12311 .cfi_restore 19
12312 ld s2, STACK_OFFSET_S2(sp)
12313 .cfi_restore 18
12314 ld s1, STACK_OFFSET_S1(sp)
12315 .cfi_restore 17
12316 ld s0, STACK_OFFSET_S0(sp)
12317 .cfi_restore 16
12318
12319 ld ra, STACK_OFFSET_RA(sp)
12320 .cfi_restore 31
12321
12322 ld t8, STACK_OFFSET_GP(sp)
12323 .cpreturn
12324 .cfi_restore 28
12325
12326 .set noreorder
12327 jr ra
12328 daddu sp, sp, STACK_SIZE
12329 .cfi_adjust_cfa_offset -STACK_SIZE
12330
12331 .cfi_endproc
Douglas Leung020b18a2016-06-03 18:05:35 -070012332 .set reorder
Alexey Frunze00b53b72016-02-02 20:25:45 -080012333 .size ExecuteMterpImpl, .-ExecuteMterpImpl
12334