blob: 35fbe94af89c28b6d6c09f92625903bd8cc715b3 [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
Alexey Frunze00b53b72016-02-02 20:25:45 -08007193 REFRESH_IBASE
7194 dla ra, artMterpAsmInstructionStart
7195 dla t9, MterpCheckBefore
7196 move a0, rSELF
7197 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007198 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007199 daddu ra, ra, (0 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007200 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007201
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08007212 REFRESH_IBASE
7213 dla ra, artMterpAsmInstructionStart
7214 dla t9, MterpCheckBefore
7215 move a0, rSELF
7216 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007217 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007218 daddu ra, ra, (1 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007219 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007220
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08007231 REFRESH_IBASE
7232 dla ra, artMterpAsmInstructionStart
7233 dla t9, MterpCheckBefore
7234 move a0, rSELF
7235 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007236 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007237 daddu ra, ra, (2 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007238 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007239
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08007250 REFRESH_IBASE
7251 dla ra, artMterpAsmInstructionStart
7252 dla t9, MterpCheckBefore
7253 move a0, rSELF
7254 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007255 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007256 daddu ra, ra, (3 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007257 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007258
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08007269 REFRESH_IBASE
7270 dla ra, artMterpAsmInstructionStart
7271 dla t9, MterpCheckBefore
7272 move a0, rSELF
7273 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007274 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007275 daddu ra, ra, (4 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007276 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007277
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08007288 REFRESH_IBASE
7289 dla ra, artMterpAsmInstructionStart
7290 dla t9, MterpCheckBefore
7291 move a0, rSELF
7292 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007293 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007294 daddu ra, ra, (5 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007295 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007296
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08007307 REFRESH_IBASE
7308 dla ra, artMterpAsmInstructionStart
7309 dla t9, MterpCheckBefore
7310 move a0, rSELF
7311 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007312 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007313 daddu ra, ra, (6 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007314 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007315
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08007326 REFRESH_IBASE
7327 dla ra, artMterpAsmInstructionStart
7328 dla t9, MterpCheckBefore
7329 move a0, rSELF
7330 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007331 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007332 daddu ra, ra, (7 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007333 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007334
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08007345 REFRESH_IBASE
7346 dla ra, artMterpAsmInstructionStart
7347 dla t9, MterpCheckBefore
7348 move a0, rSELF
7349 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007350 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007351 daddu ra, ra, (8 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007352 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007353
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08007364 REFRESH_IBASE
7365 dla ra, artMterpAsmInstructionStart
7366 dla t9, MterpCheckBefore
7367 move a0, rSELF
7368 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007369 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007370 daddu ra, ra, (9 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007371 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007372
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08007383 REFRESH_IBASE
7384 dla ra, artMterpAsmInstructionStart
7385 dla t9, MterpCheckBefore
7386 move a0, rSELF
7387 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007388 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007389 daddu ra, ra, (10 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007390 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007391
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08007402 REFRESH_IBASE
7403 dla ra, artMterpAsmInstructionStart
7404 dla t9, MterpCheckBefore
7405 move a0, rSELF
7406 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007407 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007408 daddu ra, ra, (11 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007409 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007410
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08007421 REFRESH_IBASE
7422 dla ra, artMterpAsmInstructionStart
7423 dla t9, MterpCheckBefore
7424 move a0, rSELF
7425 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007426 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007427 daddu ra, ra, (12 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007428 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007429
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08007440 REFRESH_IBASE
7441 dla ra, artMterpAsmInstructionStart
7442 dla t9, MterpCheckBefore
7443 move a0, rSELF
7444 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007445 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007446 daddu ra, ra, (13 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007447 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007448
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08007459 REFRESH_IBASE
7460 dla ra, artMterpAsmInstructionStart
7461 dla t9, MterpCheckBefore
7462 move a0, rSELF
7463 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007464 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007465 daddu ra, ra, (14 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007466 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007467
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08007478 REFRESH_IBASE
7479 dla ra, artMterpAsmInstructionStart
7480 dla t9, MterpCheckBefore
7481 move a0, rSELF
7482 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007483 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007484 daddu ra, ra, (15 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007485 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007486
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08007497 REFRESH_IBASE
7498 dla ra, artMterpAsmInstructionStart
7499 dla t9, MterpCheckBefore
7500 move a0, rSELF
7501 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007502 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007503 daddu ra, ra, (16 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007504 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007505
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08007516 REFRESH_IBASE
7517 dla ra, artMterpAsmInstructionStart
7518 dla t9, MterpCheckBefore
7519 move a0, rSELF
7520 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007521 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007522 daddu ra, ra, (17 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007523 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007524
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08007535 REFRESH_IBASE
7536 dla ra, artMterpAsmInstructionStart
7537 dla t9, MterpCheckBefore
7538 move a0, rSELF
7539 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007540 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007541 daddu ra, ra, (18 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007542 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007543
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08007554 REFRESH_IBASE
7555 dla ra, artMterpAsmInstructionStart
7556 dla t9, MterpCheckBefore
7557 move a0, rSELF
7558 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007559 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007560 daddu ra, ra, (19 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007561 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007562
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08007573 REFRESH_IBASE
7574 dla ra, artMterpAsmInstructionStart
7575 dla t9, MterpCheckBefore
7576 move a0, rSELF
7577 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007578 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007579 daddu ra, ra, (20 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007580 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007581
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08007592 REFRESH_IBASE
7593 dla ra, artMterpAsmInstructionStart
7594 dla t9, MterpCheckBefore
7595 move a0, rSELF
7596 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007597 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007598 daddu ra, ra, (21 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007599 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007600
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08007611 REFRESH_IBASE
7612 dla ra, artMterpAsmInstructionStart
7613 dla t9, MterpCheckBefore
7614 move a0, rSELF
7615 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007616 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007617 daddu ra, ra, (22 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007618 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007619
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08007630 REFRESH_IBASE
7631 dla ra, artMterpAsmInstructionStart
7632 dla t9, MterpCheckBefore
7633 move a0, rSELF
7634 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007635 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007636 daddu ra, ra, (23 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007637 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007638
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08007649 REFRESH_IBASE
7650 dla ra, artMterpAsmInstructionStart
7651 dla t9, MterpCheckBefore
7652 move a0, rSELF
7653 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007654 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007655 daddu ra, ra, (24 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007656 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007657
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08007668 REFRESH_IBASE
7669 dla ra, artMterpAsmInstructionStart
7670 dla t9, MterpCheckBefore
7671 move a0, rSELF
7672 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007673 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007674 daddu ra, ra, (25 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007675 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007676
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08007687 REFRESH_IBASE
7688 dla ra, artMterpAsmInstructionStart
7689 dla t9, MterpCheckBefore
7690 move a0, rSELF
7691 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007692 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007693 daddu ra, ra, (26 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007694 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007695
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08007706 REFRESH_IBASE
7707 dla ra, artMterpAsmInstructionStart
7708 dla t9, MterpCheckBefore
7709 move a0, rSELF
7710 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007711 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007712 daddu ra, ra, (27 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007713 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007714
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08007725 REFRESH_IBASE
7726 dla ra, artMterpAsmInstructionStart
7727 dla t9, MterpCheckBefore
7728 move a0, rSELF
7729 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007730 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007731 daddu ra, ra, (28 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007732 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007733
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08007744 REFRESH_IBASE
7745 dla ra, artMterpAsmInstructionStart
7746 dla t9, MterpCheckBefore
7747 move a0, rSELF
7748 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007749 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007750 daddu ra, ra, (29 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007751 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007752
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08007763 REFRESH_IBASE
7764 dla ra, artMterpAsmInstructionStart
7765 dla t9, MterpCheckBefore
7766 move a0, rSELF
7767 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007768 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007769 daddu ra, ra, (30 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007770 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007771
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08007782 REFRESH_IBASE
7783 dla ra, artMterpAsmInstructionStart
7784 dla t9, MterpCheckBefore
7785 move a0, rSELF
7786 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007787 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007788 daddu ra, ra, (31 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007789 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007790
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08007801 REFRESH_IBASE
7802 dla ra, artMterpAsmInstructionStart
7803 dla t9, MterpCheckBefore
7804 move a0, rSELF
7805 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007806 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007807 daddu ra, ra, (32 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007808 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007809
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08007820 REFRESH_IBASE
7821 dla ra, artMterpAsmInstructionStart
7822 dla t9, MterpCheckBefore
7823 move a0, rSELF
7824 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007825 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007826 daddu ra, ra, (33 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007827 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007828
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08007839 REFRESH_IBASE
7840 dla ra, artMterpAsmInstructionStart
7841 dla t9, MterpCheckBefore
7842 move a0, rSELF
7843 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007844 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007845 daddu ra, ra, (34 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007846 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007847
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08007858 REFRESH_IBASE
7859 dla ra, artMterpAsmInstructionStart
7860 dla t9, MterpCheckBefore
7861 move a0, rSELF
7862 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007863 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007864 daddu ra, ra, (35 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007865 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007866
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08007877 REFRESH_IBASE
7878 dla ra, artMterpAsmInstructionStart
7879 dla t9, MterpCheckBefore
7880 move a0, rSELF
7881 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007882 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007883 daddu ra, ra, (36 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007884 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007885
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08007896 REFRESH_IBASE
7897 dla ra, artMterpAsmInstructionStart
7898 dla t9, MterpCheckBefore
7899 move a0, rSELF
7900 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007901 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007902 daddu ra, ra, (37 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007903 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007904
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08007915 REFRESH_IBASE
7916 dla ra, artMterpAsmInstructionStart
7917 dla t9, MterpCheckBefore
7918 move a0, rSELF
7919 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007920 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007921 daddu ra, ra, (38 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007922 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007923
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08007934 REFRESH_IBASE
7935 dla ra, artMterpAsmInstructionStart
7936 dla t9, MterpCheckBefore
7937 move a0, rSELF
7938 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007939 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007940 daddu ra, ra, (39 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007941 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007942
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08007953 REFRESH_IBASE
7954 dla ra, artMterpAsmInstructionStart
7955 dla t9, MterpCheckBefore
7956 move a0, rSELF
7957 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007958 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007959 daddu ra, ra, (40 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007960 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007961
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08007972 REFRESH_IBASE
7973 dla ra, artMterpAsmInstructionStart
7974 dla t9, MterpCheckBefore
7975 move a0, rSELF
7976 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007977 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007978 daddu ra, ra, (41 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007979 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007980
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08007991 REFRESH_IBASE
7992 dla ra, artMterpAsmInstructionStart
7993 dla t9, MterpCheckBefore
7994 move a0, rSELF
7995 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007996 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007997 daddu ra, ra, (42 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007998 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007999
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008010 REFRESH_IBASE
8011 dla ra, artMterpAsmInstructionStart
8012 dla t9, MterpCheckBefore
8013 move a0, rSELF
8014 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008015 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008016 daddu ra, ra, (43 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008017 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008018
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008029 REFRESH_IBASE
8030 dla ra, artMterpAsmInstructionStart
8031 dla t9, MterpCheckBefore
8032 move a0, rSELF
8033 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008034 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008035 daddu ra, ra, (44 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008036 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008037
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008048 REFRESH_IBASE
8049 dla ra, artMterpAsmInstructionStart
8050 dla t9, MterpCheckBefore
8051 move a0, rSELF
8052 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008053 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008054 daddu ra, ra, (45 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008055 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008056
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008067 REFRESH_IBASE
8068 dla ra, artMterpAsmInstructionStart
8069 dla t9, MterpCheckBefore
8070 move a0, rSELF
8071 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008072 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008073 daddu ra, ra, (46 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008074 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008075
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008086 REFRESH_IBASE
8087 dla ra, artMterpAsmInstructionStart
8088 dla t9, MterpCheckBefore
8089 move a0, rSELF
8090 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008091 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008092 daddu ra, ra, (47 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008093 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008094
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008105 REFRESH_IBASE
8106 dla ra, artMterpAsmInstructionStart
8107 dla t9, MterpCheckBefore
8108 move a0, rSELF
8109 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008110 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008111 daddu ra, ra, (48 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008112 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008113
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008124 REFRESH_IBASE
8125 dla ra, artMterpAsmInstructionStart
8126 dla t9, MterpCheckBefore
8127 move a0, rSELF
8128 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008129 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008130 daddu ra, ra, (49 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008131 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008132
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008143 REFRESH_IBASE
8144 dla ra, artMterpAsmInstructionStart
8145 dla t9, MterpCheckBefore
8146 move a0, rSELF
8147 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008148 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008149 daddu ra, ra, (50 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008150 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008151
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008162 REFRESH_IBASE
8163 dla ra, artMterpAsmInstructionStart
8164 dla t9, MterpCheckBefore
8165 move a0, rSELF
8166 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008167 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008168 daddu ra, ra, (51 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008169 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008170
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008181 REFRESH_IBASE
8182 dla ra, artMterpAsmInstructionStart
8183 dla t9, MterpCheckBefore
8184 move a0, rSELF
8185 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008186 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008187 daddu ra, ra, (52 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008188 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008189
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008200 REFRESH_IBASE
8201 dla ra, artMterpAsmInstructionStart
8202 dla t9, MterpCheckBefore
8203 move a0, rSELF
8204 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008205 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008206 daddu ra, ra, (53 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008207 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008208
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008219 REFRESH_IBASE
8220 dla ra, artMterpAsmInstructionStart
8221 dla t9, MterpCheckBefore
8222 move a0, rSELF
8223 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008224 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008225 daddu ra, ra, (54 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008226 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008227
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008238 REFRESH_IBASE
8239 dla ra, artMterpAsmInstructionStart
8240 dla t9, MterpCheckBefore
8241 move a0, rSELF
8242 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008243 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008244 daddu ra, ra, (55 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008245 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008246
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008257 REFRESH_IBASE
8258 dla ra, artMterpAsmInstructionStart
8259 dla t9, MterpCheckBefore
8260 move a0, rSELF
8261 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008262 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008263 daddu ra, ra, (56 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008264 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008265
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008276 REFRESH_IBASE
8277 dla ra, artMterpAsmInstructionStart
8278 dla t9, MterpCheckBefore
8279 move a0, rSELF
8280 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008281 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008282 daddu ra, ra, (57 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008283 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008284
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008295 REFRESH_IBASE
8296 dla ra, artMterpAsmInstructionStart
8297 dla t9, MterpCheckBefore
8298 move a0, rSELF
8299 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008300 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008301 daddu ra, ra, (58 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008302 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008303
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008314 REFRESH_IBASE
8315 dla ra, artMterpAsmInstructionStart
8316 dla t9, MterpCheckBefore
8317 move a0, rSELF
8318 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008319 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008320 daddu ra, ra, (59 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008321 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008322
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008333 REFRESH_IBASE
8334 dla ra, artMterpAsmInstructionStart
8335 dla t9, MterpCheckBefore
8336 move a0, rSELF
8337 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008338 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008339 daddu ra, ra, (60 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008340 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008341
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008352 REFRESH_IBASE
8353 dla ra, artMterpAsmInstructionStart
8354 dla t9, MterpCheckBefore
8355 move a0, rSELF
8356 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008357 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008358 daddu ra, ra, (61 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008359 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008360
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008371 REFRESH_IBASE
8372 dla ra, artMterpAsmInstructionStart
8373 dla t9, MterpCheckBefore
8374 move a0, rSELF
8375 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008376 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008377 daddu ra, ra, (62 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008378 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008379
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008390 REFRESH_IBASE
8391 dla ra, artMterpAsmInstructionStart
8392 dla t9, MterpCheckBefore
8393 move a0, rSELF
8394 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008395 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008396 daddu ra, ra, (63 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008397 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008398
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008409 REFRESH_IBASE
8410 dla ra, artMterpAsmInstructionStart
8411 dla t9, MterpCheckBefore
8412 move a0, rSELF
8413 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008414 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008415 daddu ra, ra, (64 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008416 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008417
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008428 REFRESH_IBASE
8429 dla ra, artMterpAsmInstructionStart
8430 dla t9, MterpCheckBefore
8431 move a0, rSELF
8432 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008433 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008434 daddu ra, ra, (65 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008435 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008436
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008447 REFRESH_IBASE
8448 dla ra, artMterpAsmInstructionStart
8449 dla t9, MterpCheckBefore
8450 move a0, rSELF
8451 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008452 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008453 daddu ra, ra, (66 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008454 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008455
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008466 REFRESH_IBASE
8467 dla ra, artMterpAsmInstructionStart
8468 dla t9, MterpCheckBefore
8469 move a0, rSELF
8470 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008471 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008472 daddu ra, ra, (67 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008473 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008474
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008485 REFRESH_IBASE
8486 dla ra, artMterpAsmInstructionStart
8487 dla t9, MterpCheckBefore
8488 move a0, rSELF
8489 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008490 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008491 daddu ra, ra, (68 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008492 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008493
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008504 REFRESH_IBASE
8505 dla ra, artMterpAsmInstructionStart
8506 dla t9, MterpCheckBefore
8507 move a0, rSELF
8508 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008509 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008510 daddu ra, ra, (69 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008511 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008512
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008523 REFRESH_IBASE
8524 dla ra, artMterpAsmInstructionStart
8525 dla t9, MterpCheckBefore
8526 move a0, rSELF
8527 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008528 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008529 daddu ra, ra, (70 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008530 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008531
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008542 REFRESH_IBASE
8543 dla ra, artMterpAsmInstructionStart
8544 dla t9, MterpCheckBefore
8545 move a0, rSELF
8546 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008547 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008548 daddu ra, ra, (71 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008549 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008550
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008561 REFRESH_IBASE
8562 dla ra, artMterpAsmInstructionStart
8563 dla t9, MterpCheckBefore
8564 move a0, rSELF
8565 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008566 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008567 daddu ra, ra, (72 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008568 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008569
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008580 REFRESH_IBASE
8581 dla ra, artMterpAsmInstructionStart
8582 dla t9, MterpCheckBefore
8583 move a0, rSELF
8584 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008585 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008586 daddu ra, ra, (73 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008587 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008588
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008599 REFRESH_IBASE
8600 dla ra, artMterpAsmInstructionStart
8601 dla t9, MterpCheckBefore
8602 move a0, rSELF
8603 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008604 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008605 daddu ra, ra, (74 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008606 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008607
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008618 REFRESH_IBASE
8619 dla ra, artMterpAsmInstructionStart
8620 dla t9, MterpCheckBefore
8621 move a0, rSELF
8622 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008623 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008624 daddu ra, ra, (75 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008625 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008626
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008637 REFRESH_IBASE
8638 dla ra, artMterpAsmInstructionStart
8639 dla t9, MterpCheckBefore
8640 move a0, rSELF
8641 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008642 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008643 daddu ra, ra, (76 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008644 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008645
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008656 REFRESH_IBASE
8657 dla ra, artMterpAsmInstructionStart
8658 dla t9, MterpCheckBefore
8659 move a0, rSELF
8660 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008661 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008662 daddu ra, ra, (77 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008663 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008664
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008675 REFRESH_IBASE
8676 dla ra, artMterpAsmInstructionStart
8677 dla t9, MterpCheckBefore
8678 move a0, rSELF
8679 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008680 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008681 daddu ra, ra, (78 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008682 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008683
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008694 REFRESH_IBASE
8695 dla ra, artMterpAsmInstructionStart
8696 dla t9, MterpCheckBefore
8697 move a0, rSELF
8698 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008699 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008700 daddu ra, ra, (79 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008701 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008702
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008713 REFRESH_IBASE
8714 dla ra, artMterpAsmInstructionStart
8715 dla t9, MterpCheckBefore
8716 move a0, rSELF
8717 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008718 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008719 daddu ra, ra, (80 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008720 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008721
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008732 REFRESH_IBASE
8733 dla ra, artMterpAsmInstructionStart
8734 dla t9, MterpCheckBefore
8735 move a0, rSELF
8736 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008737 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008738 daddu ra, ra, (81 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008739 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008740
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008751 REFRESH_IBASE
8752 dla ra, artMterpAsmInstructionStart
8753 dla t9, MterpCheckBefore
8754 move a0, rSELF
8755 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008756 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008757 daddu ra, ra, (82 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008758 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008759
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008770 REFRESH_IBASE
8771 dla ra, artMterpAsmInstructionStart
8772 dla t9, MterpCheckBefore
8773 move a0, rSELF
8774 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008775 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008776 daddu ra, ra, (83 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008777 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008778
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008789 REFRESH_IBASE
8790 dla ra, artMterpAsmInstructionStart
8791 dla t9, MterpCheckBefore
8792 move a0, rSELF
8793 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008794 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008795 daddu ra, ra, (84 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008796 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008797
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008808 REFRESH_IBASE
8809 dla ra, artMterpAsmInstructionStart
8810 dla t9, MterpCheckBefore
8811 move a0, rSELF
8812 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008813 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008814 daddu ra, ra, (85 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008815 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008816
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008827 REFRESH_IBASE
8828 dla ra, artMterpAsmInstructionStart
8829 dla t9, MterpCheckBefore
8830 move a0, rSELF
8831 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008832 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008833 daddu ra, ra, (86 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008834 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008835
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008846 REFRESH_IBASE
8847 dla ra, artMterpAsmInstructionStart
8848 dla t9, MterpCheckBefore
8849 move a0, rSELF
8850 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008851 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008852 daddu ra, ra, (87 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008853 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008854
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008865 REFRESH_IBASE
8866 dla ra, artMterpAsmInstructionStart
8867 dla t9, MterpCheckBefore
8868 move a0, rSELF
8869 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008870 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008871 daddu ra, ra, (88 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008872 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008873
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008884 REFRESH_IBASE
8885 dla ra, artMterpAsmInstructionStart
8886 dla t9, MterpCheckBefore
8887 move a0, rSELF
8888 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008889 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008890 daddu ra, ra, (89 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008891 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008892
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008903 REFRESH_IBASE
8904 dla ra, artMterpAsmInstructionStart
8905 dla t9, MterpCheckBefore
8906 move a0, rSELF
8907 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008908 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008909 daddu ra, ra, (90 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008910 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008911
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008922 REFRESH_IBASE
8923 dla ra, artMterpAsmInstructionStart
8924 dla t9, MterpCheckBefore
8925 move a0, rSELF
8926 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008927 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008928 daddu ra, ra, (91 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008929 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008930
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008941 REFRESH_IBASE
8942 dla ra, artMterpAsmInstructionStart
8943 dla t9, MterpCheckBefore
8944 move a0, rSELF
8945 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008946 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008947 daddu ra, ra, (92 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008948 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008949
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008960 REFRESH_IBASE
8961 dla ra, artMterpAsmInstructionStart
8962 dla t9, MterpCheckBefore
8963 move a0, rSELF
8964 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008965 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008966 daddu ra, ra, (93 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008967 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008968
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008979 REFRESH_IBASE
8980 dla ra, artMterpAsmInstructionStart
8981 dla t9, MterpCheckBefore
8982 move a0, rSELF
8983 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008984 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008985 daddu ra, ra, (94 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008986 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008987
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08008998 REFRESH_IBASE
8999 dla ra, artMterpAsmInstructionStart
9000 dla t9, MterpCheckBefore
9001 move a0, rSELF
9002 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009003 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009004 daddu ra, ra, (95 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009005 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009006
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009017 REFRESH_IBASE
9018 dla ra, artMterpAsmInstructionStart
9019 dla t9, MterpCheckBefore
9020 move a0, rSELF
9021 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009022 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009023 daddu ra, ra, (96 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009024 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009025
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009036 REFRESH_IBASE
9037 dla ra, artMterpAsmInstructionStart
9038 dla t9, MterpCheckBefore
9039 move a0, rSELF
9040 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009041 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009042 daddu ra, ra, (97 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009043 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009044
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009055 REFRESH_IBASE
9056 dla ra, artMterpAsmInstructionStart
9057 dla t9, MterpCheckBefore
9058 move a0, rSELF
9059 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009060 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009061 daddu ra, ra, (98 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009062 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009063
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009074 REFRESH_IBASE
9075 dla ra, artMterpAsmInstructionStart
9076 dla t9, MterpCheckBefore
9077 move a0, rSELF
9078 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009079 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009080 daddu ra, ra, (99 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009081 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009082
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009093 REFRESH_IBASE
9094 dla ra, artMterpAsmInstructionStart
9095 dla t9, MterpCheckBefore
9096 move a0, rSELF
9097 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009098 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009099 daddu ra, ra, (100 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009100 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009101
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009112 REFRESH_IBASE
9113 dla ra, artMterpAsmInstructionStart
9114 dla t9, MterpCheckBefore
9115 move a0, rSELF
9116 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009117 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009118 daddu ra, ra, (101 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009119 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009120
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009131 REFRESH_IBASE
9132 dla ra, artMterpAsmInstructionStart
9133 dla t9, MterpCheckBefore
9134 move a0, rSELF
9135 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009136 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009137 daddu ra, ra, (102 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009138 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009139
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009150 REFRESH_IBASE
9151 dla ra, artMterpAsmInstructionStart
9152 dla t9, MterpCheckBefore
9153 move a0, rSELF
9154 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009155 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009156 daddu ra, ra, (103 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009157 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009158
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009169 REFRESH_IBASE
9170 dla ra, artMterpAsmInstructionStart
9171 dla t9, MterpCheckBefore
9172 move a0, rSELF
9173 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009174 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009175 daddu ra, ra, (104 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009176 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009177
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009188 REFRESH_IBASE
9189 dla ra, artMterpAsmInstructionStart
9190 dla t9, MterpCheckBefore
9191 move a0, rSELF
9192 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009193 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009194 daddu ra, ra, (105 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009195 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009196
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009207 REFRESH_IBASE
9208 dla ra, artMterpAsmInstructionStart
9209 dla t9, MterpCheckBefore
9210 move a0, rSELF
9211 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009212 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009213 daddu ra, ra, (106 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009214 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009215
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009226 REFRESH_IBASE
9227 dla ra, artMterpAsmInstructionStart
9228 dla t9, MterpCheckBefore
9229 move a0, rSELF
9230 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009231 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009232 daddu ra, ra, (107 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009233 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009234
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009245 REFRESH_IBASE
9246 dla ra, artMterpAsmInstructionStart
9247 dla t9, MterpCheckBefore
9248 move a0, rSELF
9249 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009250 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009251 daddu ra, ra, (108 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009252 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009253
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009264 REFRESH_IBASE
9265 dla ra, artMterpAsmInstructionStart
9266 dla t9, MterpCheckBefore
9267 move a0, rSELF
9268 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009269 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009270 daddu ra, ra, (109 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009271 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009272
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009283 REFRESH_IBASE
9284 dla ra, artMterpAsmInstructionStart
9285 dla t9, MterpCheckBefore
9286 move a0, rSELF
9287 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009288 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009289 daddu ra, ra, (110 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009290 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009291
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009302 REFRESH_IBASE
9303 dla ra, artMterpAsmInstructionStart
9304 dla t9, MterpCheckBefore
9305 move a0, rSELF
9306 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009307 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009308 daddu ra, ra, (111 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009309 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009310
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009321 REFRESH_IBASE
9322 dla ra, artMterpAsmInstructionStart
9323 dla t9, MterpCheckBefore
9324 move a0, rSELF
9325 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009326 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009327 daddu ra, ra, (112 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009328 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009329
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009340 REFRESH_IBASE
9341 dla ra, artMterpAsmInstructionStart
9342 dla t9, MterpCheckBefore
9343 move a0, rSELF
9344 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009345 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009346 daddu ra, ra, (113 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009347 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009348
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009359 REFRESH_IBASE
9360 dla ra, artMterpAsmInstructionStart
9361 dla t9, MterpCheckBefore
9362 move a0, rSELF
9363 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009364 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009365 daddu ra, ra, (114 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009366 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009367
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009378 REFRESH_IBASE
9379 dla ra, artMterpAsmInstructionStart
9380 dla t9, MterpCheckBefore
9381 move a0, rSELF
9382 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009383 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009384 daddu ra, ra, (115 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009385 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009386
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009397 REFRESH_IBASE
9398 dla ra, artMterpAsmInstructionStart
9399 dla t9, MterpCheckBefore
9400 move a0, rSELF
9401 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009402 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009403 daddu ra, ra, (116 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009404 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009405
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009416 REFRESH_IBASE
9417 dla ra, artMterpAsmInstructionStart
9418 dla t9, MterpCheckBefore
9419 move a0, rSELF
9420 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009421 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009422 daddu ra, ra, (117 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009423 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009424
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009435 REFRESH_IBASE
9436 dla ra, artMterpAsmInstructionStart
9437 dla t9, MterpCheckBefore
9438 move a0, rSELF
9439 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009440 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009441 daddu ra, ra, (118 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009442 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009443
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009454 REFRESH_IBASE
9455 dla ra, artMterpAsmInstructionStart
9456 dla t9, MterpCheckBefore
9457 move a0, rSELF
9458 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009459 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009460 daddu ra, ra, (119 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009461 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009462
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009473 REFRESH_IBASE
9474 dla ra, artMterpAsmInstructionStart
9475 dla t9, MterpCheckBefore
9476 move a0, rSELF
9477 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009478 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009479 daddu ra, ra, (120 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009480 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009481
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009492 REFRESH_IBASE
9493 dla ra, artMterpAsmInstructionStart
9494 dla t9, MterpCheckBefore
9495 move a0, rSELF
9496 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009497 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009498 daddu ra, ra, (121 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009499 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009500
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009511 REFRESH_IBASE
9512 dla ra, artMterpAsmInstructionStart
9513 dla t9, MterpCheckBefore
9514 move a0, rSELF
9515 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009516 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009517 daddu ra, ra, (122 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009518 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009519
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009530 REFRESH_IBASE
9531 dla ra, artMterpAsmInstructionStart
9532 dla t9, MterpCheckBefore
9533 move a0, rSELF
9534 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009535 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009536 daddu ra, ra, (123 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009537 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009538
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009549 REFRESH_IBASE
9550 dla ra, artMterpAsmInstructionStart
9551 dla t9, MterpCheckBefore
9552 move a0, rSELF
9553 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009554 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009555 daddu ra, ra, (124 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009556 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009557
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009568 REFRESH_IBASE
9569 dla ra, artMterpAsmInstructionStart
9570 dla t9, MterpCheckBefore
9571 move a0, rSELF
9572 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009573 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009574 daddu ra, ra, (125 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009575 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009576
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009587 REFRESH_IBASE
9588 dla ra, artMterpAsmInstructionStart
9589 dla t9, MterpCheckBefore
9590 move a0, rSELF
9591 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009592 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009593 daddu ra, ra, (126 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009594 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009595
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009606 REFRESH_IBASE
9607 dla ra, artMterpAsmInstructionStart
9608 dla t9, MterpCheckBefore
9609 move a0, rSELF
9610 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009611 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009612 daddu ra, ra, (127 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009613 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009614
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009625 REFRESH_IBASE
9626 dla ra, artMterpAsmInstructionStart
9627 dla t9, MterpCheckBefore
9628 move a0, rSELF
9629 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009630 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009631 daddu ra, ra, (128 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009632 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009633
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009644 REFRESH_IBASE
9645 dla ra, artMterpAsmInstructionStart
9646 dla t9, MterpCheckBefore
9647 move a0, rSELF
9648 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009649 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009650 daddu ra, ra, (129 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009651 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009652
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009663 REFRESH_IBASE
9664 dla ra, artMterpAsmInstructionStart
9665 dla t9, MterpCheckBefore
9666 move a0, rSELF
9667 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009668 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009669 daddu ra, ra, (130 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009670 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009671
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009682 REFRESH_IBASE
9683 dla ra, artMterpAsmInstructionStart
9684 dla t9, MterpCheckBefore
9685 move a0, rSELF
9686 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009687 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009688 daddu ra, ra, (131 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009689 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009690
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009701 REFRESH_IBASE
9702 dla ra, artMterpAsmInstructionStart
9703 dla t9, MterpCheckBefore
9704 move a0, rSELF
9705 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009706 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009707 daddu ra, ra, (132 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009708 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009709
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009720 REFRESH_IBASE
9721 dla ra, artMterpAsmInstructionStart
9722 dla t9, MterpCheckBefore
9723 move a0, rSELF
9724 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009725 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009726 daddu ra, ra, (133 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009727 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009728
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009739 REFRESH_IBASE
9740 dla ra, artMterpAsmInstructionStart
9741 dla t9, MterpCheckBefore
9742 move a0, rSELF
9743 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009744 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009745 daddu ra, ra, (134 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009746 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009747
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009758 REFRESH_IBASE
9759 dla ra, artMterpAsmInstructionStart
9760 dla t9, MterpCheckBefore
9761 move a0, rSELF
9762 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009763 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009764 daddu ra, ra, (135 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009765 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009766
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009777 REFRESH_IBASE
9778 dla ra, artMterpAsmInstructionStart
9779 dla t9, MterpCheckBefore
9780 move a0, rSELF
9781 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009782 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009783 daddu ra, ra, (136 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009784 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009785
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009796 REFRESH_IBASE
9797 dla ra, artMterpAsmInstructionStart
9798 dla t9, MterpCheckBefore
9799 move a0, rSELF
9800 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009801 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009802 daddu ra, ra, (137 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009803 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009804
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009815 REFRESH_IBASE
9816 dla ra, artMterpAsmInstructionStart
9817 dla t9, MterpCheckBefore
9818 move a0, rSELF
9819 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009820 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009821 daddu ra, ra, (138 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009822 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009823
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009834 REFRESH_IBASE
9835 dla ra, artMterpAsmInstructionStart
9836 dla t9, MterpCheckBefore
9837 move a0, rSELF
9838 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009839 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009840 daddu ra, ra, (139 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009841 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009842
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009853 REFRESH_IBASE
9854 dla ra, artMterpAsmInstructionStart
9855 dla t9, MterpCheckBefore
9856 move a0, rSELF
9857 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009858 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009859 daddu ra, ra, (140 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009860 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009861
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009872 REFRESH_IBASE
9873 dla ra, artMterpAsmInstructionStart
9874 dla t9, MterpCheckBefore
9875 move a0, rSELF
9876 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009877 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009878 daddu ra, ra, (141 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009879 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009880
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009891 REFRESH_IBASE
9892 dla ra, artMterpAsmInstructionStart
9893 dla t9, MterpCheckBefore
9894 move a0, rSELF
9895 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009896 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009897 daddu ra, ra, (142 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009898 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009899
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009910 REFRESH_IBASE
9911 dla ra, artMterpAsmInstructionStart
9912 dla t9, MterpCheckBefore
9913 move a0, rSELF
9914 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009915 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009916 daddu ra, ra, (143 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009917 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009918
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009929 REFRESH_IBASE
9930 dla ra, artMterpAsmInstructionStart
9931 dla t9, MterpCheckBefore
9932 move a0, rSELF
9933 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009934 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009935 daddu ra, ra, (144 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009936 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009937
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009948 REFRESH_IBASE
9949 dla ra, artMterpAsmInstructionStart
9950 dla t9, MterpCheckBefore
9951 move a0, rSELF
9952 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009953 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009954 daddu ra, ra, (145 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009955 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009956
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009967 REFRESH_IBASE
9968 dla ra, artMterpAsmInstructionStart
9969 dla t9, MterpCheckBefore
9970 move a0, rSELF
9971 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009972 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009973 daddu ra, ra, (146 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009974 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009975
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
Alexey Frunze00b53b72016-02-02 20:25:45 -08009986 REFRESH_IBASE
9987 dla ra, artMterpAsmInstructionStart
9988 dla t9, MterpCheckBefore
9989 move a0, rSELF
9990 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009991 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009992 daddu ra, ra, (147 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009993 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009994
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010005 REFRESH_IBASE
10006 dla ra, artMterpAsmInstructionStart
10007 dla t9, MterpCheckBefore
10008 move a0, rSELF
10009 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010010 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010011 daddu ra, ra, (148 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010012 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010013
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010024 REFRESH_IBASE
10025 dla ra, artMterpAsmInstructionStart
10026 dla t9, MterpCheckBefore
10027 move a0, rSELF
10028 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010029 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010030 daddu ra, ra, (149 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010031 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010032
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010043 REFRESH_IBASE
10044 dla ra, artMterpAsmInstructionStart
10045 dla t9, MterpCheckBefore
10046 move a0, rSELF
10047 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010048 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010049 daddu ra, ra, (150 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010050 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010051
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010062 REFRESH_IBASE
10063 dla ra, artMterpAsmInstructionStart
10064 dla t9, MterpCheckBefore
10065 move a0, rSELF
10066 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010067 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010068 daddu ra, ra, (151 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010069 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010070
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010081 REFRESH_IBASE
10082 dla ra, artMterpAsmInstructionStart
10083 dla t9, MterpCheckBefore
10084 move a0, rSELF
10085 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010086 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010087 daddu ra, ra, (152 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010088 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010089
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010100 REFRESH_IBASE
10101 dla ra, artMterpAsmInstructionStart
10102 dla t9, MterpCheckBefore
10103 move a0, rSELF
10104 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010105 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010106 daddu ra, ra, (153 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010107 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010108
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010119 REFRESH_IBASE
10120 dla ra, artMterpAsmInstructionStart
10121 dla t9, MterpCheckBefore
10122 move a0, rSELF
10123 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010124 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010125 daddu ra, ra, (154 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010126 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010127
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010138 REFRESH_IBASE
10139 dla ra, artMterpAsmInstructionStart
10140 dla t9, MterpCheckBefore
10141 move a0, rSELF
10142 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010143 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010144 daddu ra, ra, (155 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010145 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010146
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010157 REFRESH_IBASE
10158 dla ra, artMterpAsmInstructionStart
10159 dla t9, MterpCheckBefore
10160 move a0, rSELF
10161 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010162 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010163 daddu ra, ra, (156 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010164 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010165
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010176 REFRESH_IBASE
10177 dla ra, artMterpAsmInstructionStart
10178 dla t9, MterpCheckBefore
10179 move a0, rSELF
10180 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010181 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010182 daddu ra, ra, (157 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010183 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010184
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010195 REFRESH_IBASE
10196 dla ra, artMterpAsmInstructionStart
10197 dla t9, MterpCheckBefore
10198 move a0, rSELF
10199 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010200 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010201 daddu ra, ra, (158 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010202 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010203
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010214 REFRESH_IBASE
10215 dla ra, artMterpAsmInstructionStart
10216 dla t9, MterpCheckBefore
10217 move a0, rSELF
10218 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010219 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010220 daddu ra, ra, (159 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010221 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010222
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010233 REFRESH_IBASE
10234 dla ra, artMterpAsmInstructionStart
10235 dla t9, MterpCheckBefore
10236 move a0, rSELF
10237 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010238 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010239 daddu ra, ra, (160 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010240 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010241
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010252 REFRESH_IBASE
10253 dla ra, artMterpAsmInstructionStart
10254 dla t9, MterpCheckBefore
10255 move a0, rSELF
10256 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010257 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010258 daddu ra, ra, (161 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010259 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010260
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010271 REFRESH_IBASE
10272 dla ra, artMterpAsmInstructionStart
10273 dla t9, MterpCheckBefore
10274 move a0, rSELF
10275 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010276 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010277 daddu ra, ra, (162 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010278 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010279
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010290 REFRESH_IBASE
10291 dla ra, artMterpAsmInstructionStart
10292 dla t9, MterpCheckBefore
10293 move a0, rSELF
10294 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010295 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010296 daddu ra, ra, (163 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010297 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010298
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010309 REFRESH_IBASE
10310 dla ra, artMterpAsmInstructionStart
10311 dla t9, MterpCheckBefore
10312 move a0, rSELF
10313 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010314 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010315 daddu ra, ra, (164 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010316 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010317
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010328 REFRESH_IBASE
10329 dla ra, artMterpAsmInstructionStart
10330 dla t9, MterpCheckBefore
10331 move a0, rSELF
10332 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010333 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010334 daddu ra, ra, (165 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010335 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010336
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010347 REFRESH_IBASE
10348 dla ra, artMterpAsmInstructionStart
10349 dla t9, MterpCheckBefore
10350 move a0, rSELF
10351 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010352 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010353 daddu ra, ra, (166 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010354 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010355
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010366 REFRESH_IBASE
10367 dla ra, artMterpAsmInstructionStart
10368 dla t9, MterpCheckBefore
10369 move a0, rSELF
10370 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010371 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010372 daddu ra, ra, (167 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010373 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010374
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010385 REFRESH_IBASE
10386 dla ra, artMterpAsmInstructionStart
10387 dla t9, MterpCheckBefore
10388 move a0, rSELF
10389 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010390 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010391 daddu ra, ra, (168 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010392 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010393
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010404 REFRESH_IBASE
10405 dla ra, artMterpAsmInstructionStart
10406 dla t9, MterpCheckBefore
10407 move a0, rSELF
10408 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010409 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010410 daddu ra, ra, (169 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010411 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010412
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010423 REFRESH_IBASE
10424 dla ra, artMterpAsmInstructionStart
10425 dla t9, MterpCheckBefore
10426 move a0, rSELF
10427 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010428 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010429 daddu ra, ra, (170 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010430 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010431
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010442 REFRESH_IBASE
10443 dla ra, artMterpAsmInstructionStart
10444 dla t9, MterpCheckBefore
10445 move a0, rSELF
10446 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010447 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010448 daddu ra, ra, (171 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010449 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010450
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010461 REFRESH_IBASE
10462 dla ra, artMterpAsmInstructionStart
10463 dla t9, MterpCheckBefore
10464 move a0, rSELF
10465 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010466 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010467 daddu ra, ra, (172 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010468 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010469
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010480 REFRESH_IBASE
10481 dla ra, artMterpAsmInstructionStart
10482 dla t9, MterpCheckBefore
10483 move a0, rSELF
10484 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010485 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010486 daddu ra, ra, (173 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010487 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010488
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010499 REFRESH_IBASE
10500 dla ra, artMterpAsmInstructionStart
10501 dla t9, MterpCheckBefore
10502 move a0, rSELF
10503 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010504 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010505 daddu ra, ra, (174 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010506 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010507
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010518 REFRESH_IBASE
10519 dla ra, artMterpAsmInstructionStart
10520 dla t9, MterpCheckBefore
10521 move a0, rSELF
10522 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010523 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010524 daddu ra, ra, (175 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010525 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010526
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010537 REFRESH_IBASE
10538 dla ra, artMterpAsmInstructionStart
10539 dla t9, MterpCheckBefore
10540 move a0, rSELF
10541 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010542 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010543 daddu ra, ra, (176 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010544 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010545
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010556 REFRESH_IBASE
10557 dla ra, artMterpAsmInstructionStart
10558 dla t9, MterpCheckBefore
10559 move a0, rSELF
10560 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010561 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010562 daddu ra, ra, (177 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010563 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010564
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010575 REFRESH_IBASE
10576 dla ra, artMterpAsmInstructionStart
10577 dla t9, MterpCheckBefore
10578 move a0, rSELF
10579 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010580 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010581 daddu ra, ra, (178 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010582 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010583
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010594 REFRESH_IBASE
10595 dla ra, artMterpAsmInstructionStart
10596 dla t9, MterpCheckBefore
10597 move a0, rSELF
10598 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010599 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010600 daddu ra, ra, (179 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010601 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010602
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010613 REFRESH_IBASE
10614 dla ra, artMterpAsmInstructionStart
10615 dla t9, MterpCheckBefore
10616 move a0, rSELF
10617 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010618 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010619 daddu ra, ra, (180 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010620 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010621
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010632 REFRESH_IBASE
10633 dla ra, artMterpAsmInstructionStart
10634 dla t9, MterpCheckBefore
10635 move a0, rSELF
10636 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010637 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010638 daddu ra, ra, (181 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010639 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010640
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010651 REFRESH_IBASE
10652 dla ra, artMterpAsmInstructionStart
10653 dla t9, MterpCheckBefore
10654 move a0, rSELF
10655 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010656 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010657 daddu ra, ra, (182 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010658 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010659
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010670 REFRESH_IBASE
10671 dla ra, artMterpAsmInstructionStart
10672 dla t9, MterpCheckBefore
10673 move a0, rSELF
10674 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010675 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010676 daddu ra, ra, (183 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010677 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010678
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010689 REFRESH_IBASE
10690 dla ra, artMterpAsmInstructionStart
10691 dla t9, MterpCheckBefore
10692 move a0, rSELF
10693 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010694 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010695 daddu ra, ra, (184 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010696 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010697
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010708 REFRESH_IBASE
10709 dla ra, artMterpAsmInstructionStart
10710 dla t9, MterpCheckBefore
10711 move a0, rSELF
10712 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010713 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010714 daddu ra, ra, (185 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010715 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010716
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010727 REFRESH_IBASE
10728 dla ra, artMterpAsmInstructionStart
10729 dla t9, MterpCheckBefore
10730 move a0, rSELF
10731 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010732 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010733 daddu ra, ra, (186 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010734 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010735
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010746 REFRESH_IBASE
10747 dla ra, artMterpAsmInstructionStart
10748 dla t9, MterpCheckBefore
10749 move a0, rSELF
10750 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010751 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010752 daddu ra, ra, (187 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010753 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010754
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010765 REFRESH_IBASE
10766 dla ra, artMterpAsmInstructionStart
10767 dla t9, MterpCheckBefore
10768 move a0, rSELF
10769 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010770 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010771 daddu ra, ra, (188 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010772 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010773
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010784 REFRESH_IBASE
10785 dla ra, artMterpAsmInstructionStart
10786 dla t9, MterpCheckBefore
10787 move a0, rSELF
10788 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010789 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010790 daddu ra, ra, (189 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010791 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010792
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010803 REFRESH_IBASE
10804 dla ra, artMterpAsmInstructionStart
10805 dla t9, MterpCheckBefore
10806 move a0, rSELF
10807 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010808 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010809 daddu ra, ra, (190 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010810 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010811
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010822 REFRESH_IBASE
10823 dla ra, artMterpAsmInstructionStart
10824 dla t9, MterpCheckBefore
10825 move a0, rSELF
10826 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010827 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010828 daddu ra, ra, (191 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010829 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010830
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010841 REFRESH_IBASE
10842 dla ra, artMterpAsmInstructionStart
10843 dla t9, MterpCheckBefore
10844 move a0, rSELF
10845 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010846 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010847 daddu ra, ra, (192 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010848 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010849
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010860 REFRESH_IBASE
10861 dla ra, artMterpAsmInstructionStart
10862 dla t9, MterpCheckBefore
10863 move a0, rSELF
10864 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010865 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010866 daddu ra, ra, (193 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010867 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010868
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010879 REFRESH_IBASE
10880 dla ra, artMterpAsmInstructionStart
10881 dla t9, MterpCheckBefore
10882 move a0, rSELF
10883 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010884 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010885 daddu ra, ra, (194 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010886 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010887
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010898 REFRESH_IBASE
10899 dla ra, artMterpAsmInstructionStart
10900 dla t9, MterpCheckBefore
10901 move a0, rSELF
10902 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010903 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010904 daddu ra, ra, (195 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010905 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010906
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010917 REFRESH_IBASE
10918 dla ra, artMterpAsmInstructionStart
10919 dla t9, MterpCheckBefore
10920 move a0, rSELF
10921 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010922 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010923 daddu ra, ra, (196 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010924 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010925
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010936 REFRESH_IBASE
10937 dla ra, artMterpAsmInstructionStart
10938 dla t9, MterpCheckBefore
10939 move a0, rSELF
10940 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010941 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010942 daddu ra, ra, (197 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010943 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010944
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010955 REFRESH_IBASE
10956 dla ra, artMterpAsmInstructionStart
10957 dla t9, MterpCheckBefore
10958 move a0, rSELF
10959 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010960 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010961 daddu ra, ra, (198 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010962 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010963
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010974 REFRESH_IBASE
10975 dla ra, artMterpAsmInstructionStart
10976 dla t9, MterpCheckBefore
10977 move a0, rSELF
10978 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010979 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010980 daddu ra, ra, (199 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010981 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010982
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080010993 REFRESH_IBASE
10994 dla ra, artMterpAsmInstructionStart
10995 dla t9, MterpCheckBefore
10996 move a0, rSELF
10997 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010998 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010999 daddu ra, ra, (200 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011000 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011001
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011012 REFRESH_IBASE
11013 dla ra, artMterpAsmInstructionStart
11014 dla t9, MterpCheckBefore
11015 move a0, rSELF
11016 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011017 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011018 daddu ra, ra, (201 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011019 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011020
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011031 REFRESH_IBASE
11032 dla ra, artMterpAsmInstructionStart
11033 dla t9, MterpCheckBefore
11034 move a0, rSELF
11035 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011036 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011037 daddu ra, ra, (202 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011038 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011039
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011050 REFRESH_IBASE
11051 dla ra, artMterpAsmInstructionStart
11052 dla t9, MterpCheckBefore
11053 move a0, rSELF
11054 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011055 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011056 daddu ra, ra, (203 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011057 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011058
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011069 REFRESH_IBASE
11070 dla ra, artMterpAsmInstructionStart
11071 dla t9, MterpCheckBefore
11072 move a0, rSELF
11073 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011074 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011075 daddu ra, ra, (204 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011076 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011077
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011088 REFRESH_IBASE
11089 dla ra, artMterpAsmInstructionStart
11090 dla t9, MterpCheckBefore
11091 move a0, rSELF
11092 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011093 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011094 daddu ra, ra, (205 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011095 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011096
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011107 REFRESH_IBASE
11108 dla ra, artMterpAsmInstructionStart
11109 dla t9, MterpCheckBefore
11110 move a0, rSELF
11111 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011112 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011113 daddu ra, ra, (206 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011114 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011115
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011126 REFRESH_IBASE
11127 dla ra, artMterpAsmInstructionStart
11128 dla t9, MterpCheckBefore
11129 move a0, rSELF
11130 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011131 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011132 daddu ra, ra, (207 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011133 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011134
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011145 REFRESH_IBASE
11146 dla ra, artMterpAsmInstructionStart
11147 dla t9, MterpCheckBefore
11148 move a0, rSELF
11149 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011150 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011151 daddu ra, ra, (208 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011152 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011153
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011164 REFRESH_IBASE
11165 dla ra, artMterpAsmInstructionStart
11166 dla t9, MterpCheckBefore
11167 move a0, rSELF
11168 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011169 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011170 daddu ra, ra, (209 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011171 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011172
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011183 REFRESH_IBASE
11184 dla ra, artMterpAsmInstructionStart
11185 dla t9, MterpCheckBefore
11186 move a0, rSELF
11187 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011188 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011189 daddu ra, ra, (210 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011190 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011191
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011202 REFRESH_IBASE
11203 dla ra, artMterpAsmInstructionStart
11204 dla t9, MterpCheckBefore
11205 move a0, rSELF
11206 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011207 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011208 daddu ra, ra, (211 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011209 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011210
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011221 REFRESH_IBASE
11222 dla ra, artMterpAsmInstructionStart
11223 dla t9, MterpCheckBefore
11224 move a0, rSELF
11225 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011226 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011227 daddu ra, ra, (212 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011228 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011229
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011240 REFRESH_IBASE
11241 dla ra, artMterpAsmInstructionStart
11242 dla t9, MterpCheckBefore
11243 move a0, rSELF
11244 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011245 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011246 daddu ra, ra, (213 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011247 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011248
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011259 REFRESH_IBASE
11260 dla ra, artMterpAsmInstructionStart
11261 dla t9, MterpCheckBefore
11262 move a0, rSELF
11263 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011264 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011265 daddu ra, ra, (214 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011266 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011267
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011278 REFRESH_IBASE
11279 dla ra, artMterpAsmInstructionStart
11280 dla t9, MterpCheckBefore
11281 move a0, rSELF
11282 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011283 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011284 daddu ra, ra, (215 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011285 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011286
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011297 REFRESH_IBASE
11298 dla ra, artMterpAsmInstructionStart
11299 dla t9, MterpCheckBefore
11300 move a0, rSELF
11301 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011302 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011303 daddu ra, ra, (216 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011304 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011305
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011316 REFRESH_IBASE
11317 dla ra, artMterpAsmInstructionStart
11318 dla t9, MterpCheckBefore
11319 move a0, rSELF
11320 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011321 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011322 daddu ra, ra, (217 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011323 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011324
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011335 REFRESH_IBASE
11336 dla ra, artMterpAsmInstructionStart
11337 dla t9, MterpCheckBefore
11338 move a0, rSELF
11339 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011340 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011341 daddu ra, ra, (218 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011342 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011343
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011354 REFRESH_IBASE
11355 dla ra, artMterpAsmInstructionStart
11356 dla t9, MterpCheckBefore
11357 move a0, rSELF
11358 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011359 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011360 daddu ra, ra, (219 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011361 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011362
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011373 REFRESH_IBASE
11374 dla ra, artMterpAsmInstructionStart
11375 dla t9, MterpCheckBefore
11376 move a0, rSELF
11377 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011378 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011379 daddu ra, ra, (220 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011380 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011381
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011392 REFRESH_IBASE
11393 dla ra, artMterpAsmInstructionStart
11394 dla t9, MterpCheckBefore
11395 move a0, rSELF
11396 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011397 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011398 daddu ra, ra, (221 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011399 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011400
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011411 REFRESH_IBASE
11412 dla ra, artMterpAsmInstructionStart
11413 dla t9, MterpCheckBefore
11414 move a0, rSELF
11415 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011416 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011417 daddu ra, ra, (222 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011418 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011419
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011430 REFRESH_IBASE
11431 dla ra, artMterpAsmInstructionStart
11432 dla t9, MterpCheckBefore
11433 move a0, rSELF
11434 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011435 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011436 daddu ra, ra, (223 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011437 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011438
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011449 REFRESH_IBASE
11450 dla ra, artMterpAsmInstructionStart
11451 dla t9, MterpCheckBefore
11452 move a0, rSELF
11453 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011454 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011455 daddu ra, ra, (224 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011456 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011457
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011468 REFRESH_IBASE
11469 dla ra, artMterpAsmInstructionStart
11470 dla t9, MterpCheckBefore
11471 move a0, rSELF
11472 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011473 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011474 daddu ra, ra, (225 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011475 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011476
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011487 REFRESH_IBASE
11488 dla ra, artMterpAsmInstructionStart
11489 dla t9, MterpCheckBefore
11490 move a0, rSELF
11491 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011492 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011493 daddu ra, ra, (226 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011494 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011495
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011506 REFRESH_IBASE
11507 dla ra, artMterpAsmInstructionStart
11508 dla t9, MterpCheckBefore
11509 move a0, rSELF
11510 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011511 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011512 daddu ra, ra, (227 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011513 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011514
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011525 REFRESH_IBASE
11526 dla ra, artMterpAsmInstructionStart
11527 dla t9, MterpCheckBefore
11528 move a0, rSELF
11529 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011530 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011531 daddu ra, ra, (228 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011532 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011533
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011544 REFRESH_IBASE
11545 dla ra, artMterpAsmInstructionStart
11546 dla t9, MterpCheckBefore
11547 move a0, rSELF
11548 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011549 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011550 daddu ra, ra, (229 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011551 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011552
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011563 REFRESH_IBASE
11564 dla ra, artMterpAsmInstructionStart
11565 dla t9, MterpCheckBefore
11566 move a0, rSELF
11567 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011568 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011569 daddu ra, ra, (230 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011570 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011571
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011582 REFRESH_IBASE
11583 dla ra, artMterpAsmInstructionStart
11584 dla t9, MterpCheckBefore
11585 move a0, rSELF
11586 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011587 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011588 daddu ra, ra, (231 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011589 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011590
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011601 REFRESH_IBASE
11602 dla ra, artMterpAsmInstructionStart
11603 dla t9, MterpCheckBefore
11604 move a0, rSELF
11605 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011606 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011607 daddu ra, ra, (232 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011608 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011609
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011620 REFRESH_IBASE
11621 dla ra, artMterpAsmInstructionStart
11622 dla t9, MterpCheckBefore
11623 move a0, rSELF
11624 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011625 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011626 daddu ra, ra, (233 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011627 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011628
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011639 REFRESH_IBASE
11640 dla ra, artMterpAsmInstructionStart
11641 dla t9, MterpCheckBefore
11642 move a0, rSELF
11643 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011644 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011645 daddu ra, ra, (234 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011646 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011647
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011658 REFRESH_IBASE
11659 dla ra, artMterpAsmInstructionStart
11660 dla t9, MterpCheckBefore
11661 move a0, rSELF
11662 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011663 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011664 daddu ra, ra, (235 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011665 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011666
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011677 REFRESH_IBASE
11678 dla ra, artMterpAsmInstructionStart
11679 dla t9, MterpCheckBefore
11680 move a0, rSELF
11681 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011682 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011683 daddu ra, ra, (236 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011684 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011685
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011696 REFRESH_IBASE
11697 dla ra, artMterpAsmInstructionStart
11698 dla t9, MterpCheckBefore
11699 move a0, rSELF
11700 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011701 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011702 daddu ra, ra, (237 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011703 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011704
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011715 REFRESH_IBASE
11716 dla ra, artMterpAsmInstructionStart
11717 dla t9, MterpCheckBefore
11718 move a0, rSELF
11719 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011720 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011721 daddu ra, ra, (238 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011722 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011723
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011734 REFRESH_IBASE
11735 dla ra, artMterpAsmInstructionStart
11736 dla t9, MterpCheckBefore
11737 move a0, rSELF
11738 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011739 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011740 daddu ra, ra, (239 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011741 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011742
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011753 REFRESH_IBASE
11754 dla ra, artMterpAsmInstructionStart
11755 dla t9, MterpCheckBefore
11756 move a0, rSELF
11757 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011758 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011759 daddu ra, ra, (240 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011760 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011761
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011772 REFRESH_IBASE
11773 dla ra, artMterpAsmInstructionStart
11774 dla t9, MterpCheckBefore
11775 move a0, rSELF
11776 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011777 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011778 daddu ra, ra, (241 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011779 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011780
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011791 REFRESH_IBASE
11792 dla ra, artMterpAsmInstructionStart
11793 dla t9, MterpCheckBefore
11794 move a0, rSELF
11795 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011796 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011797 daddu ra, ra, (242 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011798 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011799
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011810 REFRESH_IBASE
11811 dla ra, artMterpAsmInstructionStart
11812 dla t9, MterpCheckBefore
11813 move a0, rSELF
11814 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011815 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011816 daddu ra, ra, (243 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011817 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011818
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011829 REFRESH_IBASE
11830 dla ra, artMterpAsmInstructionStart
11831 dla t9, MterpCheckBefore
11832 move a0, rSELF
11833 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011834 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011835 daddu ra, ra, (244 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011836 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011837
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011848 REFRESH_IBASE
11849 dla ra, artMterpAsmInstructionStart
11850 dla t9, MterpCheckBefore
11851 move a0, rSELF
11852 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011853 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011854 daddu ra, ra, (245 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011855 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011856
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011867 REFRESH_IBASE
11868 dla ra, artMterpAsmInstructionStart
11869 dla t9, MterpCheckBefore
11870 move a0, rSELF
11871 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011872 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011873 daddu ra, ra, (246 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011874 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011875
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011886 REFRESH_IBASE
11887 dla ra, artMterpAsmInstructionStart
11888 dla t9, MterpCheckBefore
11889 move a0, rSELF
11890 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011891 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011892 daddu ra, ra, (247 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011893 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011894
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011905 REFRESH_IBASE
11906 dla ra, artMterpAsmInstructionStart
11907 dla t9, MterpCheckBefore
11908 move a0, rSELF
11909 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011910 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011911 daddu ra, ra, (248 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011912 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011913
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011924 REFRESH_IBASE
11925 dla ra, artMterpAsmInstructionStart
11926 dla t9, MterpCheckBefore
11927 move a0, rSELF
11928 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011929 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011930 daddu ra, ra, (249 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011931 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011932
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011943 REFRESH_IBASE
11944 dla ra, artMterpAsmInstructionStart
11945 dla t9, MterpCheckBefore
11946 move a0, rSELF
11947 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011948 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011949 daddu ra, ra, (250 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011950 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011951
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011962 REFRESH_IBASE
11963 dla ra, artMterpAsmInstructionStart
11964 dla t9, MterpCheckBefore
11965 move a0, rSELF
11966 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011967 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011968 daddu ra, ra, (251 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011969 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011970
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080011981 REFRESH_IBASE
11982 dla ra, artMterpAsmInstructionStart
11983 dla t9, MterpCheckBefore
11984 move a0, rSELF
11985 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011986 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011987 daddu ra, ra, (252 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011988 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011989
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080012000 REFRESH_IBASE
12001 dla ra, artMterpAsmInstructionStart
12002 dla t9, MterpCheckBefore
12003 move a0, rSELF
12004 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000012005 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080012006 daddu ra, ra, (253 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000012007 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080012008
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080012019 REFRESH_IBASE
12020 dla ra, artMterpAsmInstructionStart
12021 dla t9, MterpCheckBefore
12022 move a0, rSELF
12023 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000012024 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080012025 daddu ra, ra, (254 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000012026 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080012027
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
Alexey Frunze00b53b72016-02-02 20:25:45 -080012038 REFRESH_IBASE
12039 dla ra, artMterpAsmInstructionStart
12040 dla t9, MterpCheckBefore
12041 move a0, rSELF
12042 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000012043 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080012044 daddu ra, ra, (255 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000012045 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080012046
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