blob: 037787f6b4a081f8f3b0aa91467aa2c8b2ee303a [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
Hiroshi Yamauchi30493242016-11-03 13:06:52 -0700640 and ra, ra, THREAD_SUSPEND_OR_CHECKPOINT_REQUEST
Alexey Frunze00b53b72016-02-02 20:25:45 -0800641 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 *
Douglas Leung4b787062016-08-26 15:25:31 -0700654 * for: return (sign-extend), return-object (zero-extend)
Alexey Frunze00b53b72016-02-02 20:25:45 -0800655 */
656 /* op vAA */
657 .extern MterpThreadFenceForConstructor
658 .extern MterpSuspendCheck
659 jal MterpThreadFenceForConstructor
660 lw ra, THREAD_FLAGS_OFFSET(rSELF)
661 move a0, rSELF
Hiroshi Yamauchi30493242016-11-03 13:06:52 -0700662 and ra, ra, THREAD_SUSPEND_OR_CHECKPOINT_REQUEST
Alexey Frunze00b53b72016-02-02 20:25:45 -0800663 beqzc ra, 1f
664 jal MterpSuspendCheck # (self)
6651:
666 srl a2, rINST, 8 # a2 <- AA
Douglas Leung4b787062016-08-26 15:25:31 -0700667 GET_VREG a0, a2 # a0 <- vAA
Alexey Frunze00b53b72016-02-02 20:25:45 -0800668 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
Hiroshi Yamauchi30493242016-11-03 13:06:52 -0700684 and ra, ra, THREAD_SUSPEND_OR_CHECKPOINT_REQUEST
Alexey Frunze00b53b72016-02-02 20:25:45 -0800685 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 *
Douglas Leung4b787062016-08-26 15:25:31 -0700700 * for: return (sign-extend), return-object (zero-extend)
Alexey Frunze00b53b72016-02-02 20:25:45 -0800701 */
702 /* op vAA */
703 .extern MterpThreadFenceForConstructor
704 .extern MterpSuspendCheck
705 jal MterpThreadFenceForConstructor
706 lw ra, THREAD_FLAGS_OFFSET(rSELF)
707 move a0, rSELF
Hiroshi Yamauchi30493242016-11-03 13:06:52 -0700708 and ra, ra, THREAD_SUSPEND_OR_CHECKPOINT_REQUEST
Alexey Frunze00b53b72016-02-02 20:25:45 -0800709 beqzc ra, 1f
710 jal MterpSuspendCheck # (self)
7111:
712 srl a2, rINST, 8 # a2 <- AA
Douglas Leung4b787062016-08-26 15:25:31 -0700713 GET_VREG_U a0, a2 # a0 <- vAA
Alexey Frunze00b53b72016-02-02 20:25:45 -0800714 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
Hiroshi Yamauchi30493242016-11-03 13:06:52 -07003124 and ra, ra, THREAD_SUSPEND_OR_CHECKPOINT_REQUEST
Alexey Frunze00b53b72016-02-02 20:25:45 -08003125 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
Narayan Kamath14832ef2016-08-05 11:44:32 +01007006.L_op_unused_f3: /* 0xf3 */
7007/* File: mips64/op_unused_f3.S */
7008/* File: mips64/unused.S */
7009/*
7010 * Bail to reference interpreter to throw.
7011 */
Alexey Frunze00b53b72016-02-02 20:25:45 -08007012 b MterpFallback
7013
Narayan Kamath14832ef2016-08-05 11:44:32 +01007014
Alexey Frunze00b53b72016-02-02 20:25:45 -08007015/* ------------------------------ */
7016 .balign 128
7017.L_op_unused_f4: /* 0xf4 */
7018/* File: mips64/op_unused_f4.S */
7019/* File: mips64/unused.S */
7020/*
7021 * Bail to reference interpreter to throw.
7022 */
7023 b MterpFallback
7024
7025
7026/* ------------------------------ */
7027 .balign 128
Narayan Kamath14832ef2016-08-05 11:44:32 +01007028.L_op_unused_f5: /* 0xf5 */
7029/* File: mips64/op_unused_f5.S */
7030/* File: mips64/unused.S */
7031/*
7032 * Bail to reference interpreter to throw.
7033 */
Alexey Frunze00b53b72016-02-02 20:25:45 -08007034 b MterpFallback
7035
Narayan Kamath14832ef2016-08-05 11:44:32 +01007036
Alexey Frunze00b53b72016-02-02 20:25:45 -08007037/* ------------------------------ */
7038 .balign 128
Narayan Kamath14832ef2016-08-05 11:44:32 +01007039.L_op_unused_f6: /* 0xf6 */
7040/* File: mips64/op_unused_f6.S */
7041/* File: mips64/unused.S */
7042/*
7043 * Bail to reference interpreter to throw.
7044 */
Alexey Frunze00b53b72016-02-02 20:25:45 -08007045 b MterpFallback
7046
Narayan Kamath14832ef2016-08-05 11:44:32 +01007047
Alexey Frunze00b53b72016-02-02 20:25:45 -08007048/* ------------------------------ */
7049 .balign 128
Narayan Kamath14832ef2016-08-05 11:44:32 +01007050.L_op_unused_f7: /* 0xf7 */
7051/* File: mips64/op_unused_f7.S */
7052/* File: mips64/unused.S */
7053/*
7054 * Bail to reference interpreter to throw.
7055 */
Alexey Frunze00b53b72016-02-02 20:25:45 -08007056 b MterpFallback
7057
Narayan Kamath14832ef2016-08-05 11:44:32 +01007058
Alexey Frunze00b53b72016-02-02 20:25:45 -08007059/* ------------------------------ */
7060 .balign 128
Narayan Kamath14832ef2016-08-05 11:44:32 +01007061.L_op_unused_f8: /* 0xf8 */
7062/* File: mips64/op_unused_f8.S */
7063/* File: mips64/unused.S */
7064/*
7065 * Bail to reference interpreter to throw.
7066 */
Alexey Frunze00b53b72016-02-02 20:25:45 -08007067 b MterpFallback
7068
Narayan Kamath14832ef2016-08-05 11:44:32 +01007069
Alexey Frunze00b53b72016-02-02 20:25:45 -08007070/* ------------------------------ */
7071 .balign 128
Narayan Kamath14832ef2016-08-05 11:44:32 +01007072.L_op_unused_f9: /* 0xf9 */
7073/* File: mips64/op_unused_f9.S */
7074/* File: mips64/unused.S */
7075/*
7076 * Bail to reference interpreter to throw.
7077 */
Alexey Frunze00b53b72016-02-02 20:25:45 -08007078 b MterpFallback
7079
Narayan Kamath14832ef2016-08-05 11:44:32 +01007080
Alexey Frunze00b53b72016-02-02 20:25:45 -08007081/* ------------------------------ */
7082 .balign 128
buzbee8a287142016-10-07 12:56:32 -07007083.L_op_invoke_polymorphic: /* 0xfa */
7084/* Transfer stub to alternate interpreter */
Alexey Frunze00b53b72016-02-02 20:25:45 -08007085 b MterpFallback
7086
Alexey Frunze00b53b72016-02-02 20:25:45 -08007087/* ------------------------------ */
7088 .balign 128
buzbee8a287142016-10-07 12:56:32 -07007089.L_op_invoke_polymorphic_range: /* 0xfb */
7090/* Transfer stub to alternate interpreter */
Alexey Frunze00b53b72016-02-02 20:25:45 -08007091 b MterpFallback
7092
Alexey Frunze00b53b72016-02-02 20:25:45 -08007093/* ------------------------------ */
7094 .balign 128
7095.L_op_unused_fc: /* 0xfc */
7096/* File: mips64/op_unused_fc.S */
7097/* File: mips64/unused.S */
7098/*
7099 * Bail to reference interpreter to throw.
7100 */
7101 b MterpFallback
7102
7103
7104/* ------------------------------ */
7105 .balign 128
7106.L_op_unused_fd: /* 0xfd */
7107/* File: mips64/op_unused_fd.S */
7108/* File: mips64/unused.S */
7109/*
7110 * Bail to reference interpreter to throw.
7111 */
7112 b MterpFallback
7113
7114
7115/* ------------------------------ */
7116 .balign 128
7117.L_op_unused_fe: /* 0xfe */
7118/* File: mips64/op_unused_fe.S */
7119/* File: mips64/unused.S */
7120/*
7121 * Bail to reference interpreter to throw.
7122 */
7123 b MterpFallback
7124
7125
7126/* ------------------------------ */
7127 .balign 128
7128.L_op_unused_ff: /* 0xff */
7129/* File: mips64/op_unused_ff.S */
7130/* File: mips64/unused.S */
7131/*
7132 * Bail to reference interpreter to throw.
7133 */
7134 b MterpFallback
7135
7136
7137 .balign 128
7138 .size artMterpAsmInstructionStart, .-artMterpAsmInstructionStart
7139 .global artMterpAsmInstructionEnd
7140artMterpAsmInstructionEnd:
7141
7142/*
7143 * ===========================================================================
7144 * Sister implementations
7145 * ===========================================================================
7146 */
7147 .global artMterpAsmSisterStart
7148 .type artMterpAsmSisterStart, %function
7149 .text
7150 .balign 4
7151artMterpAsmSisterStart:
7152
7153/* continuation for op_float_to_int */
7154.Lop_float_to_int_trunc:
7155 trunc.w.s f0, f0
7156 mfc1 t0, f0
7157.Lop_float_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_float_to_long */
7164.Lop_float_to_long_trunc:
7165 trunc.l.s f0, f0
7166 dmfc1 t0, f0
7167.Lop_float_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/* continuation for op_double_to_int */
7174.Lop_double_to_int_trunc:
7175 trunc.w.d f0, f0
7176 mfc1 t0, f0
7177.Lop_double_to_int_done:
7178 /* Can't include fcvtFooter.S after break */
7179 GET_INST_OPCODE v0 # extract opcode from rINST
7180 SET_VREG t0, a1
7181 GOTO_OPCODE v0 # jump to next instruction
7182
7183/* continuation for op_double_to_long */
7184.Lop_double_to_long_trunc:
7185 trunc.l.d f0, f0
7186 dmfc1 t0, f0
7187.Lop_double_to_long_done:
7188 /* Can't include fcvtFooter.S after break */
7189 GET_INST_OPCODE v0 # extract opcode from rINST
7190 SET_VREG_WIDE t0, a1
7191 GOTO_OPCODE v0 # jump to next instruction
7192
7193 .size artMterpAsmSisterStart, .-artMterpAsmSisterStart
7194 .global artMterpAsmSisterEnd
7195artMterpAsmSisterEnd:
7196
7197
7198 .global artMterpAsmAltInstructionStart
7199 .type artMterpAsmAltInstructionStart, %function
7200 .text
7201
7202artMterpAsmAltInstructionStart = .L_ALT_op_nop
7203/* ------------------------------ */
7204 .balign 128
7205.L_ALT_op_nop: /* 0x00 */
7206/* File: mips64/alt_stub.S */
7207/*
7208 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7209 * any interesting requests and then jump to the real instruction
7210 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7211 */
7212 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08007213 REFRESH_IBASE
7214 dla ra, artMterpAsmInstructionStart
7215 dla t9, MterpCheckBefore
7216 move a0, rSELF
7217 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007218 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007219 daddu ra, ra, (0 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007220 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007221
7222/* ------------------------------ */
7223 .balign 128
7224.L_ALT_op_move: /* 0x01 */
7225/* File: mips64/alt_stub.S */
7226/*
7227 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7228 * any interesting requests and then jump to the real instruction
7229 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7230 */
7231 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08007232 REFRESH_IBASE
7233 dla ra, artMterpAsmInstructionStart
7234 dla t9, MterpCheckBefore
7235 move a0, rSELF
7236 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007237 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007238 daddu ra, ra, (1 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007239 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007240
7241/* ------------------------------ */
7242 .balign 128
7243.L_ALT_op_move_from16: /* 0x02 */
7244/* File: mips64/alt_stub.S */
7245/*
7246 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7247 * any interesting requests and then jump to the real instruction
7248 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7249 */
7250 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08007251 REFRESH_IBASE
7252 dla ra, artMterpAsmInstructionStart
7253 dla t9, MterpCheckBefore
7254 move a0, rSELF
7255 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007256 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007257 daddu ra, ra, (2 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007258 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007259
7260/* ------------------------------ */
7261 .balign 128
7262.L_ALT_op_move_16: /* 0x03 */
7263/* File: mips64/alt_stub.S */
7264/*
7265 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7266 * any interesting requests and then jump to the real instruction
7267 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7268 */
7269 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08007270 REFRESH_IBASE
7271 dla ra, artMterpAsmInstructionStart
7272 dla t9, MterpCheckBefore
7273 move a0, rSELF
7274 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007275 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007276 daddu ra, ra, (3 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007277 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007278
7279/* ------------------------------ */
7280 .balign 128
7281.L_ALT_op_move_wide: /* 0x04 */
7282/* File: mips64/alt_stub.S */
7283/*
7284 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7285 * any interesting requests and then jump to the real instruction
7286 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7287 */
7288 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08007289 REFRESH_IBASE
7290 dla ra, artMterpAsmInstructionStart
7291 dla t9, MterpCheckBefore
7292 move a0, rSELF
7293 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007294 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007295 daddu ra, ra, (4 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007296 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007297
7298/* ------------------------------ */
7299 .balign 128
7300.L_ALT_op_move_wide_from16: /* 0x05 */
7301/* File: mips64/alt_stub.S */
7302/*
7303 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7304 * any interesting requests and then jump to the real instruction
7305 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7306 */
7307 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08007308 REFRESH_IBASE
7309 dla ra, artMterpAsmInstructionStart
7310 dla t9, MterpCheckBefore
7311 move a0, rSELF
7312 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007313 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007314 daddu ra, ra, (5 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007315 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007316
7317/* ------------------------------ */
7318 .balign 128
7319.L_ALT_op_move_wide_16: /* 0x06 */
7320/* File: mips64/alt_stub.S */
7321/*
7322 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7323 * any interesting requests and then jump to the real instruction
7324 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7325 */
7326 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08007327 REFRESH_IBASE
7328 dla ra, artMterpAsmInstructionStart
7329 dla t9, MterpCheckBefore
7330 move a0, rSELF
7331 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007332 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007333 daddu ra, ra, (6 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007334 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007335
7336/* ------------------------------ */
7337 .balign 128
7338.L_ALT_op_move_object: /* 0x07 */
7339/* File: mips64/alt_stub.S */
7340/*
7341 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7342 * any interesting requests and then jump to the real instruction
7343 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7344 */
7345 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08007346 REFRESH_IBASE
7347 dla ra, artMterpAsmInstructionStart
7348 dla t9, MterpCheckBefore
7349 move a0, rSELF
7350 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007351 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007352 daddu ra, ra, (7 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007353 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007354
7355/* ------------------------------ */
7356 .balign 128
7357.L_ALT_op_move_object_from16: /* 0x08 */
7358/* File: mips64/alt_stub.S */
7359/*
7360 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7361 * any interesting requests and then jump to the real instruction
7362 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7363 */
7364 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08007365 REFRESH_IBASE
7366 dla ra, artMterpAsmInstructionStart
7367 dla t9, MterpCheckBefore
7368 move a0, rSELF
7369 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007370 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007371 daddu ra, ra, (8 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007372 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007373
7374/* ------------------------------ */
7375 .balign 128
7376.L_ALT_op_move_object_16: /* 0x09 */
7377/* File: mips64/alt_stub.S */
7378/*
7379 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7380 * any interesting requests and then jump to the real instruction
7381 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7382 */
7383 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08007384 REFRESH_IBASE
7385 dla ra, artMterpAsmInstructionStart
7386 dla t9, MterpCheckBefore
7387 move a0, rSELF
7388 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007389 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007390 daddu ra, ra, (9 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007391 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007392
7393/* ------------------------------ */
7394 .balign 128
7395.L_ALT_op_move_result: /* 0x0a */
7396/* File: mips64/alt_stub.S */
7397/*
7398 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7399 * any interesting requests and then jump to the real instruction
7400 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7401 */
7402 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08007403 REFRESH_IBASE
7404 dla ra, artMterpAsmInstructionStart
7405 dla t9, MterpCheckBefore
7406 move a0, rSELF
7407 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007408 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007409 daddu ra, ra, (10 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007410 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007411
7412/* ------------------------------ */
7413 .balign 128
7414.L_ALT_op_move_result_wide: /* 0x0b */
7415/* File: mips64/alt_stub.S */
7416/*
7417 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7418 * any interesting requests and then jump to the real instruction
7419 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7420 */
7421 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08007422 REFRESH_IBASE
7423 dla ra, artMterpAsmInstructionStart
7424 dla t9, MterpCheckBefore
7425 move a0, rSELF
7426 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007427 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007428 daddu ra, ra, (11 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007429 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007430
7431/* ------------------------------ */
7432 .balign 128
7433.L_ALT_op_move_result_object: /* 0x0c */
7434/* File: mips64/alt_stub.S */
7435/*
7436 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7437 * any interesting requests and then jump to the real instruction
7438 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7439 */
7440 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08007441 REFRESH_IBASE
7442 dla ra, artMterpAsmInstructionStart
7443 dla t9, MterpCheckBefore
7444 move a0, rSELF
7445 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007446 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007447 daddu ra, ra, (12 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007448 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007449
7450/* ------------------------------ */
7451 .balign 128
7452.L_ALT_op_move_exception: /* 0x0d */
7453/* File: mips64/alt_stub.S */
7454/*
7455 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7456 * any interesting requests and then jump to the real instruction
7457 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7458 */
7459 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08007460 REFRESH_IBASE
7461 dla ra, artMterpAsmInstructionStart
7462 dla t9, MterpCheckBefore
7463 move a0, rSELF
7464 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007465 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007466 daddu ra, ra, (13 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007467 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007468
7469/* ------------------------------ */
7470 .balign 128
7471.L_ALT_op_return_void: /* 0x0e */
7472/* File: mips64/alt_stub.S */
7473/*
7474 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7475 * any interesting requests and then jump to the real instruction
7476 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7477 */
7478 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08007479 REFRESH_IBASE
7480 dla ra, artMterpAsmInstructionStart
7481 dla t9, MterpCheckBefore
7482 move a0, rSELF
7483 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007484 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007485 daddu ra, ra, (14 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007486 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007487
7488/* ------------------------------ */
7489 .balign 128
7490.L_ALT_op_return: /* 0x0f */
7491/* File: mips64/alt_stub.S */
7492/*
7493 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7494 * any interesting requests and then jump to the real instruction
7495 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7496 */
7497 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08007498 REFRESH_IBASE
7499 dla ra, artMterpAsmInstructionStart
7500 dla t9, MterpCheckBefore
7501 move a0, rSELF
7502 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007503 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007504 daddu ra, ra, (15 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007505 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007506
7507/* ------------------------------ */
7508 .balign 128
7509.L_ALT_op_return_wide: /* 0x10 */
7510/* File: mips64/alt_stub.S */
7511/*
7512 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7513 * any interesting requests and then jump to the real instruction
7514 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7515 */
7516 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08007517 REFRESH_IBASE
7518 dla ra, artMterpAsmInstructionStart
7519 dla t9, MterpCheckBefore
7520 move a0, rSELF
7521 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007522 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007523 daddu ra, ra, (16 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007524 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007525
7526/* ------------------------------ */
7527 .balign 128
7528.L_ALT_op_return_object: /* 0x11 */
7529/* File: mips64/alt_stub.S */
7530/*
7531 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7532 * any interesting requests and then jump to the real instruction
7533 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7534 */
7535 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08007536 REFRESH_IBASE
7537 dla ra, artMterpAsmInstructionStart
7538 dla t9, MterpCheckBefore
7539 move a0, rSELF
7540 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007541 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007542 daddu ra, ra, (17 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007543 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007544
7545/* ------------------------------ */
7546 .balign 128
7547.L_ALT_op_const_4: /* 0x12 */
7548/* File: mips64/alt_stub.S */
7549/*
7550 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7551 * any interesting requests and then jump to the real instruction
7552 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7553 */
7554 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08007555 REFRESH_IBASE
7556 dla ra, artMterpAsmInstructionStart
7557 dla t9, MterpCheckBefore
7558 move a0, rSELF
7559 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007560 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007561 daddu ra, ra, (18 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007562 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007563
7564/* ------------------------------ */
7565 .balign 128
7566.L_ALT_op_const_16: /* 0x13 */
7567/* File: mips64/alt_stub.S */
7568/*
7569 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7570 * any interesting requests and then jump to the real instruction
7571 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7572 */
7573 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08007574 REFRESH_IBASE
7575 dla ra, artMterpAsmInstructionStart
7576 dla t9, MterpCheckBefore
7577 move a0, rSELF
7578 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007579 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007580 daddu ra, ra, (19 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007581 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007582
7583/* ------------------------------ */
7584 .balign 128
7585.L_ALT_op_const: /* 0x14 */
7586/* File: mips64/alt_stub.S */
7587/*
7588 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7589 * any interesting requests and then jump to the real instruction
7590 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7591 */
7592 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08007593 REFRESH_IBASE
7594 dla ra, artMterpAsmInstructionStart
7595 dla t9, MterpCheckBefore
7596 move a0, rSELF
7597 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007598 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007599 daddu ra, ra, (20 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007600 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007601
7602/* ------------------------------ */
7603 .balign 128
7604.L_ALT_op_const_high16: /* 0x15 */
7605/* File: mips64/alt_stub.S */
7606/*
7607 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7608 * any interesting requests and then jump to the real instruction
7609 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7610 */
7611 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08007612 REFRESH_IBASE
7613 dla ra, artMterpAsmInstructionStart
7614 dla t9, MterpCheckBefore
7615 move a0, rSELF
7616 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007617 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007618 daddu ra, ra, (21 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007619 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007620
7621/* ------------------------------ */
7622 .balign 128
7623.L_ALT_op_const_wide_16: /* 0x16 */
7624/* File: mips64/alt_stub.S */
7625/*
7626 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7627 * any interesting requests and then jump to the real instruction
7628 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7629 */
7630 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08007631 REFRESH_IBASE
7632 dla ra, artMterpAsmInstructionStart
7633 dla t9, MterpCheckBefore
7634 move a0, rSELF
7635 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007636 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007637 daddu ra, ra, (22 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007638 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007639
7640/* ------------------------------ */
7641 .balign 128
7642.L_ALT_op_const_wide_32: /* 0x17 */
7643/* File: mips64/alt_stub.S */
7644/*
7645 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7646 * any interesting requests and then jump to the real instruction
7647 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7648 */
7649 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08007650 REFRESH_IBASE
7651 dla ra, artMterpAsmInstructionStart
7652 dla t9, MterpCheckBefore
7653 move a0, rSELF
7654 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007655 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007656 daddu ra, ra, (23 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007657 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007658
7659/* ------------------------------ */
7660 .balign 128
7661.L_ALT_op_const_wide: /* 0x18 */
7662/* File: mips64/alt_stub.S */
7663/*
7664 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7665 * any interesting requests and then jump to the real instruction
7666 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7667 */
7668 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08007669 REFRESH_IBASE
7670 dla ra, artMterpAsmInstructionStart
7671 dla t9, MterpCheckBefore
7672 move a0, rSELF
7673 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007674 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007675 daddu ra, ra, (24 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007676 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007677
7678/* ------------------------------ */
7679 .balign 128
7680.L_ALT_op_const_wide_high16: /* 0x19 */
7681/* File: mips64/alt_stub.S */
7682/*
7683 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7684 * any interesting requests and then jump to the real instruction
7685 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7686 */
7687 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08007688 REFRESH_IBASE
7689 dla ra, artMterpAsmInstructionStart
7690 dla t9, MterpCheckBefore
7691 move a0, rSELF
7692 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007693 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007694 daddu ra, ra, (25 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007695 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007696
7697/* ------------------------------ */
7698 .balign 128
7699.L_ALT_op_const_string: /* 0x1a */
7700/* File: mips64/alt_stub.S */
7701/*
7702 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7703 * any interesting requests and then jump to the real instruction
7704 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7705 */
7706 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08007707 REFRESH_IBASE
7708 dla ra, artMterpAsmInstructionStart
7709 dla t9, MterpCheckBefore
7710 move a0, rSELF
7711 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007712 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007713 daddu ra, ra, (26 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007714 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007715
7716/* ------------------------------ */
7717 .balign 128
7718.L_ALT_op_const_string_jumbo: /* 0x1b */
7719/* File: mips64/alt_stub.S */
7720/*
7721 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7722 * any interesting requests and then jump to the real instruction
7723 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7724 */
7725 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08007726 REFRESH_IBASE
7727 dla ra, artMterpAsmInstructionStart
7728 dla t9, MterpCheckBefore
7729 move a0, rSELF
7730 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007731 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007732 daddu ra, ra, (27 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007733 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007734
7735/* ------------------------------ */
7736 .balign 128
7737.L_ALT_op_const_class: /* 0x1c */
7738/* File: mips64/alt_stub.S */
7739/*
7740 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7741 * any interesting requests and then jump to the real instruction
7742 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7743 */
7744 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08007745 REFRESH_IBASE
7746 dla ra, artMterpAsmInstructionStart
7747 dla t9, MterpCheckBefore
7748 move a0, rSELF
7749 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007750 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007751 daddu ra, ra, (28 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007752 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007753
7754/* ------------------------------ */
7755 .balign 128
7756.L_ALT_op_monitor_enter: /* 0x1d */
7757/* File: mips64/alt_stub.S */
7758/*
7759 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7760 * any interesting requests and then jump to the real instruction
7761 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7762 */
7763 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08007764 REFRESH_IBASE
7765 dla ra, artMterpAsmInstructionStart
7766 dla t9, MterpCheckBefore
7767 move a0, rSELF
7768 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007769 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007770 daddu ra, ra, (29 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007771 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007772
7773/* ------------------------------ */
7774 .balign 128
7775.L_ALT_op_monitor_exit: /* 0x1e */
7776/* File: mips64/alt_stub.S */
7777/*
7778 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7779 * any interesting requests and then jump to the real instruction
7780 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7781 */
7782 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08007783 REFRESH_IBASE
7784 dla ra, artMterpAsmInstructionStart
7785 dla t9, MterpCheckBefore
7786 move a0, rSELF
7787 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007788 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007789 daddu ra, ra, (30 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007790 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007791
7792/* ------------------------------ */
7793 .balign 128
7794.L_ALT_op_check_cast: /* 0x1f */
7795/* File: mips64/alt_stub.S */
7796/*
7797 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7798 * any interesting requests and then jump to the real instruction
7799 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7800 */
7801 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08007802 REFRESH_IBASE
7803 dla ra, artMterpAsmInstructionStart
7804 dla t9, MterpCheckBefore
7805 move a0, rSELF
7806 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007807 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007808 daddu ra, ra, (31 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007809 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007810
7811/* ------------------------------ */
7812 .balign 128
7813.L_ALT_op_instance_of: /* 0x20 */
7814/* File: mips64/alt_stub.S */
7815/*
7816 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7817 * any interesting requests and then jump to the real instruction
7818 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7819 */
7820 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08007821 REFRESH_IBASE
7822 dla ra, artMterpAsmInstructionStart
7823 dla t9, MterpCheckBefore
7824 move a0, rSELF
7825 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007826 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007827 daddu ra, ra, (32 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007828 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007829
7830/* ------------------------------ */
7831 .balign 128
7832.L_ALT_op_array_length: /* 0x21 */
7833/* File: mips64/alt_stub.S */
7834/*
7835 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7836 * any interesting requests and then jump to the real instruction
7837 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7838 */
7839 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08007840 REFRESH_IBASE
7841 dla ra, artMterpAsmInstructionStart
7842 dla t9, MterpCheckBefore
7843 move a0, rSELF
7844 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007845 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007846 daddu ra, ra, (33 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007847 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007848
7849/* ------------------------------ */
7850 .balign 128
7851.L_ALT_op_new_instance: /* 0x22 */
7852/* File: mips64/alt_stub.S */
7853/*
7854 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7855 * any interesting requests and then jump to the real instruction
7856 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7857 */
7858 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08007859 REFRESH_IBASE
7860 dla ra, artMterpAsmInstructionStart
7861 dla t9, MterpCheckBefore
7862 move a0, rSELF
7863 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007864 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007865 daddu ra, ra, (34 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007866 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007867
7868/* ------------------------------ */
7869 .balign 128
7870.L_ALT_op_new_array: /* 0x23 */
7871/* File: mips64/alt_stub.S */
7872/*
7873 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7874 * any interesting requests and then jump to the real instruction
7875 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7876 */
7877 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08007878 REFRESH_IBASE
7879 dla ra, artMterpAsmInstructionStart
7880 dla t9, MterpCheckBefore
7881 move a0, rSELF
7882 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007883 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007884 daddu ra, ra, (35 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007885 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007886
7887/* ------------------------------ */
7888 .balign 128
7889.L_ALT_op_filled_new_array: /* 0x24 */
7890/* File: mips64/alt_stub.S */
7891/*
7892 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7893 * any interesting requests and then jump to the real instruction
7894 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7895 */
7896 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08007897 REFRESH_IBASE
7898 dla ra, artMterpAsmInstructionStart
7899 dla t9, MterpCheckBefore
7900 move a0, rSELF
7901 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007902 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007903 daddu ra, ra, (36 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007904 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007905
7906/* ------------------------------ */
7907 .balign 128
7908.L_ALT_op_filled_new_array_range: /* 0x25 */
7909/* File: mips64/alt_stub.S */
7910/*
7911 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7912 * any interesting requests and then jump to the real instruction
7913 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7914 */
7915 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08007916 REFRESH_IBASE
7917 dla ra, artMterpAsmInstructionStart
7918 dla t9, MterpCheckBefore
7919 move a0, rSELF
7920 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007921 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007922 daddu ra, ra, (37 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007923 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007924
7925/* ------------------------------ */
7926 .balign 128
7927.L_ALT_op_fill_array_data: /* 0x26 */
7928/* File: mips64/alt_stub.S */
7929/*
7930 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7931 * any interesting requests and then jump to the real instruction
7932 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7933 */
7934 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08007935 REFRESH_IBASE
7936 dla ra, artMterpAsmInstructionStart
7937 dla t9, MterpCheckBefore
7938 move a0, rSELF
7939 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007940 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007941 daddu ra, ra, (38 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007942 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007943
7944/* ------------------------------ */
7945 .balign 128
7946.L_ALT_op_throw: /* 0x27 */
7947/* File: mips64/alt_stub.S */
7948/*
7949 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7950 * any interesting requests and then jump to the real instruction
7951 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7952 */
7953 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08007954 REFRESH_IBASE
7955 dla ra, artMterpAsmInstructionStart
7956 dla t9, MterpCheckBefore
7957 move a0, rSELF
7958 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007959 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007960 daddu ra, ra, (39 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007961 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007962
7963/* ------------------------------ */
7964 .balign 128
7965.L_ALT_op_goto: /* 0x28 */
7966/* File: mips64/alt_stub.S */
7967/*
7968 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7969 * any interesting requests and then jump to the real instruction
7970 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7971 */
7972 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08007973 REFRESH_IBASE
7974 dla ra, artMterpAsmInstructionStart
7975 dla t9, MterpCheckBefore
7976 move a0, rSELF
7977 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007978 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007979 daddu ra, ra, (40 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007980 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08007981
7982/* ------------------------------ */
7983 .balign 128
7984.L_ALT_op_goto_16: /* 0x29 */
7985/* File: mips64/alt_stub.S */
7986/*
7987 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7988 * any interesting requests and then jump to the real instruction
7989 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7990 */
7991 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08007992 REFRESH_IBASE
7993 dla ra, artMterpAsmInstructionStart
7994 dla t9, MterpCheckBefore
7995 move a0, rSELF
7996 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007997 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08007998 daddu ra, ra, (41 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00007999 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008000
8001/* ------------------------------ */
8002 .balign 128
8003.L_ALT_op_goto_32: /* 0x2a */
8004/* File: mips64/alt_stub.S */
8005/*
8006 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8007 * any interesting requests and then jump to the real instruction
8008 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8009 */
8010 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008011 REFRESH_IBASE
8012 dla ra, artMterpAsmInstructionStart
8013 dla t9, MterpCheckBefore
8014 move a0, rSELF
8015 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008016 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008017 daddu ra, ra, (42 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008018 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008019
8020/* ------------------------------ */
8021 .balign 128
8022.L_ALT_op_packed_switch: /* 0x2b */
8023/* File: mips64/alt_stub.S */
8024/*
8025 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8026 * any interesting requests and then jump to the real instruction
8027 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8028 */
8029 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008030 REFRESH_IBASE
8031 dla ra, artMterpAsmInstructionStart
8032 dla t9, MterpCheckBefore
8033 move a0, rSELF
8034 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008035 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008036 daddu ra, ra, (43 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008037 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008038
8039/* ------------------------------ */
8040 .balign 128
8041.L_ALT_op_sparse_switch: /* 0x2c */
8042/* File: mips64/alt_stub.S */
8043/*
8044 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8045 * any interesting requests and then jump to the real instruction
8046 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8047 */
8048 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008049 REFRESH_IBASE
8050 dla ra, artMterpAsmInstructionStart
8051 dla t9, MterpCheckBefore
8052 move a0, rSELF
8053 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008054 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008055 daddu ra, ra, (44 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008056 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008057
8058/* ------------------------------ */
8059 .balign 128
8060.L_ALT_op_cmpl_float: /* 0x2d */
8061/* File: mips64/alt_stub.S */
8062/*
8063 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8064 * any interesting requests and then jump to the real instruction
8065 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8066 */
8067 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008068 REFRESH_IBASE
8069 dla ra, artMterpAsmInstructionStart
8070 dla t9, MterpCheckBefore
8071 move a0, rSELF
8072 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008073 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008074 daddu ra, ra, (45 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008075 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008076
8077/* ------------------------------ */
8078 .balign 128
8079.L_ALT_op_cmpg_float: /* 0x2e */
8080/* File: mips64/alt_stub.S */
8081/*
8082 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8083 * any interesting requests and then jump to the real instruction
8084 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8085 */
8086 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008087 REFRESH_IBASE
8088 dla ra, artMterpAsmInstructionStart
8089 dla t9, MterpCheckBefore
8090 move a0, rSELF
8091 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008092 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008093 daddu ra, ra, (46 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008094 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008095
8096/* ------------------------------ */
8097 .balign 128
8098.L_ALT_op_cmpl_double: /* 0x2f */
8099/* File: mips64/alt_stub.S */
8100/*
8101 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8102 * any interesting requests and then jump to the real instruction
8103 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8104 */
8105 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008106 REFRESH_IBASE
8107 dla ra, artMterpAsmInstructionStart
8108 dla t9, MterpCheckBefore
8109 move a0, rSELF
8110 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008111 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008112 daddu ra, ra, (47 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008113 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008114
8115/* ------------------------------ */
8116 .balign 128
8117.L_ALT_op_cmpg_double: /* 0x30 */
8118/* File: mips64/alt_stub.S */
8119/*
8120 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8121 * any interesting requests and then jump to the real instruction
8122 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8123 */
8124 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008125 REFRESH_IBASE
8126 dla ra, artMterpAsmInstructionStart
8127 dla t9, MterpCheckBefore
8128 move a0, rSELF
8129 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008130 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008131 daddu ra, ra, (48 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008132 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008133
8134/* ------------------------------ */
8135 .balign 128
8136.L_ALT_op_cmp_long: /* 0x31 */
8137/* File: mips64/alt_stub.S */
8138/*
8139 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8140 * any interesting requests and then jump to the real instruction
8141 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8142 */
8143 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008144 REFRESH_IBASE
8145 dla ra, artMterpAsmInstructionStart
8146 dla t9, MterpCheckBefore
8147 move a0, rSELF
8148 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008149 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008150 daddu ra, ra, (49 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008151 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008152
8153/* ------------------------------ */
8154 .balign 128
8155.L_ALT_op_if_eq: /* 0x32 */
8156/* File: mips64/alt_stub.S */
8157/*
8158 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8159 * any interesting requests and then jump to the real instruction
8160 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8161 */
8162 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008163 REFRESH_IBASE
8164 dla ra, artMterpAsmInstructionStart
8165 dla t9, MterpCheckBefore
8166 move a0, rSELF
8167 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008168 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008169 daddu ra, ra, (50 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008170 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008171
8172/* ------------------------------ */
8173 .balign 128
8174.L_ALT_op_if_ne: /* 0x33 */
8175/* File: mips64/alt_stub.S */
8176/*
8177 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8178 * any interesting requests and then jump to the real instruction
8179 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8180 */
8181 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008182 REFRESH_IBASE
8183 dla ra, artMterpAsmInstructionStart
8184 dla t9, MterpCheckBefore
8185 move a0, rSELF
8186 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008187 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008188 daddu ra, ra, (51 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008189 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008190
8191/* ------------------------------ */
8192 .balign 128
8193.L_ALT_op_if_lt: /* 0x34 */
8194/* File: mips64/alt_stub.S */
8195/*
8196 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8197 * any interesting requests and then jump to the real instruction
8198 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8199 */
8200 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008201 REFRESH_IBASE
8202 dla ra, artMterpAsmInstructionStart
8203 dla t9, MterpCheckBefore
8204 move a0, rSELF
8205 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008206 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008207 daddu ra, ra, (52 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008208 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008209
8210/* ------------------------------ */
8211 .balign 128
8212.L_ALT_op_if_ge: /* 0x35 */
8213/* File: mips64/alt_stub.S */
8214/*
8215 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8216 * any interesting requests and then jump to the real instruction
8217 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8218 */
8219 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008220 REFRESH_IBASE
8221 dla ra, artMterpAsmInstructionStart
8222 dla t9, MterpCheckBefore
8223 move a0, rSELF
8224 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008225 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008226 daddu ra, ra, (53 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008227 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008228
8229/* ------------------------------ */
8230 .balign 128
8231.L_ALT_op_if_gt: /* 0x36 */
8232/* File: mips64/alt_stub.S */
8233/*
8234 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8235 * any interesting requests and then jump to the real instruction
8236 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8237 */
8238 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008239 REFRESH_IBASE
8240 dla ra, artMterpAsmInstructionStart
8241 dla t9, MterpCheckBefore
8242 move a0, rSELF
8243 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008244 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008245 daddu ra, ra, (54 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008246 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008247
8248/* ------------------------------ */
8249 .balign 128
8250.L_ALT_op_if_le: /* 0x37 */
8251/* File: mips64/alt_stub.S */
8252/*
8253 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8254 * any interesting requests and then jump to the real instruction
8255 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8256 */
8257 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008258 REFRESH_IBASE
8259 dla ra, artMterpAsmInstructionStart
8260 dla t9, MterpCheckBefore
8261 move a0, rSELF
8262 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008263 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008264 daddu ra, ra, (55 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008265 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008266
8267/* ------------------------------ */
8268 .balign 128
8269.L_ALT_op_if_eqz: /* 0x38 */
8270/* File: mips64/alt_stub.S */
8271/*
8272 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8273 * any interesting requests and then jump to the real instruction
8274 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8275 */
8276 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008277 REFRESH_IBASE
8278 dla ra, artMterpAsmInstructionStart
8279 dla t9, MterpCheckBefore
8280 move a0, rSELF
8281 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008282 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008283 daddu ra, ra, (56 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008284 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008285
8286/* ------------------------------ */
8287 .balign 128
8288.L_ALT_op_if_nez: /* 0x39 */
8289/* File: mips64/alt_stub.S */
8290/*
8291 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8292 * any interesting requests and then jump to the real instruction
8293 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8294 */
8295 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008296 REFRESH_IBASE
8297 dla ra, artMterpAsmInstructionStart
8298 dla t9, MterpCheckBefore
8299 move a0, rSELF
8300 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008301 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008302 daddu ra, ra, (57 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008303 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008304
8305/* ------------------------------ */
8306 .balign 128
8307.L_ALT_op_if_ltz: /* 0x3a */
8308/* File: mips64/alt_stub.S */
8309/*
8310 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8311 * any interesting requests and then jump to the real instruction
8312 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8313 */
8314 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008315 REFRESH_IBASE
8316 dla ra, artMterpAsmInstructionStart
8317 dla t9, MterpCheckBefore
8318 move a0, rSELF
8319 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008320 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008321 daddu ra, ra, (58 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008322 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008323
8324/* ------------------------------ */
8325 .balign 128
8326.L_ALT_op_if_gez: /* 0x3b */
8327/* File: mips64/alt_stub.S */
8328/*
8329 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8330 * any interesting requests and then jump to the real instruction
8331 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8332 */
8333 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008334 REFRESH_IBASE
8335 dla ra, artMterpAsmInstructionStart
8336 dla t9, MterpCheckBefore
8337 move a0, rSELF
8338 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008339 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008340 daddu ra, ra, (59 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008341 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008342
8343/* ------------------------------ */
8344 .balign 128
8345.L_ALT_op_if_gtz: /* 0x3c */
8346/* File: mips64/alt_stub.S */
8347/*
8348 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8349 * any interesting requests and then jump to the real instruction
8350 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8351 */
8352 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008353 REFRESH_IBASE
8354 dla ra, artMterpAsmInstructionStart
8355 dla t9, MterpCheckBefore
8356 move a0, rSELF
8357 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008358 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008359 daddu ra, ra, (60 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008360 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008361
8362/* ------------------------------ */
8363 .balign 128
8364.L_ALT_op_if_lez: /* 0x3d */
8365/* File: mips64/alt_stub.S */
8366/*
8367 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8368 * any interesting requests and then jump to the real instruction
8369 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8370 */
8371 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008372 REFRESH_IBASE
8373 dla ra, artMterpAsmInstructionStart
8374 dla t9, MterpCheckBefore
8375 move a0, rSELF
8376 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008377 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008378 daddu ra, ra, (61 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008379 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008380
8381/* ------------------------------ */
8382 .balign 128
8383.L_ALT_op_unused_3e: /* 0x3e */
8384/* File: mips64/alt_stub.S */
8385/*
8386 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8387 * any interesting requests and then jump to the real instruction
8388 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8389 */
8390 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008391 REFRESH_IBASE
8392 dla ra, artMterpAsmInstructionStart
8393 dla t9, MterpCheckBefore
8394 move a0, rSELF
8395 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008396 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008397 daddu ra, ra, (62 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008398 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008399
8400/* ------------------------------ */
8401 .balign 128
8402.L_ALT_op_unused_3f: /* 0x3f */
8403/* File: mips64/alt_stub.S */
8404/*
8405 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8406 * any interesting requests and then jump to the real instruction
8407 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8408 */
8409 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008410 REFRESH_IBASE
8411 dla ra, artMterpAsmInstructionStart
8412 dla t9, MterpCheckBefore
8413 move a0, rSELF
8414 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008415 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008416 daddu ra, ra, (63 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008417 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008418
8419/* ------------------------------ */
8420 .balign 128
8421.L_ALT_op_unused_40: /* 0x40 */
8422/* File: mips64/alt_stub.S */
8423/*
8424 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8425 * any interesting requests and then jump to the real instruction
8426 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8427 */
8428 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008429 REFRESH_IBASE
8430 dla ra, artMterpAsmInstructionStart
8431 dla t9, MterpCheckBefore
8432 move a0, rSELF
8433 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008434 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008435 daddu ra, ra, (64 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008436 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008437
8438/* ------------------------------ */
8439 .balign 128
8440.L_ALT_op_unused_41: /* 0x41 */
8441/* File: mips64/alt_stub.S */
8442/*
8443 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8444 * any interesting requests and then jump to the real instruction
8445 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8446 */
8447 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008448 REFRESH_IBASE
8449 dla ra, artMterpAsmInstructionStart
8450 dla t9, MterpCheckBefore
8451 move a0, rSELF
8452 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008453 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008454 daddu ra, ra, (65 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008455 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008456
8457/* ------------------------------ */
8458 .balign 128
8459.L_ALT_op_unused_42: /* 0x42 */
8460/* File: mips64/alt_stub.S */
8461/*
8462 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8463 * any interesting requests and then jump to the real instruction
8464 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8465 */
8466 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008467 REFRESH_IBASE
8468 dla ra, artMterpAsmInstructionStart
8469 dla t9, MterpCheckBefore
8470 move a0, rSELF
8471 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008472 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008473 daddu ra, ra, (66 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008474 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008475
8476/* ------------------------------ */
8477 .balign 128
8478.L_ALT_op_unused_43: /* 0x43 */
8479/* File: mips64/alt_stub.S */
8480/*
8481 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8482 * any interesting requests and then jump to the real instruction
8483 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8484 */
8485 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008486 REFRESH_IBASE
8487 dla ra, artMterpAsmInstructionStart
8488 dla t9, MterpCheckBefore
8489 move a0, rSELF
8490 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008491 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008492 daddu ra, ra, (67 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008493 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008494
8495/* ------------------------------ */
8496 .balign 128
8497.L_ALT_op_aget: /* 0x44 */
8498/* File: mips64/alt_stub.S */
8499/*
8500 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8501 * any interesting requests and then jump to the real instruction
8502 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8503 */
8504 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008505 REFRESH_IBASE
8506 dla ra, artMterpAsmInstructionStart
8507 dla t9, MterpCheckBefore
8508 move a0, rSELF
8509 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008510 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008511 daddu ra, ra, (68 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008512 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008513
8514/* ------------------------------ */
8515 .balign 128
8516.L_ALT_op_aget_wide: /* 0x45 */
8517/* File: mips64/alt_stub.S */
8518/*
8519 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8520 * any interesting requests and then jump to the real instruction
8521 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8522 */
8523 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008524 REFRESH_IBASE
8525 dla ra, artMterpAsmInstructionStart
8526 dla t9, MterpCheckBefore
8527 move a0, rSELF
8528 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008529 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008530 daddu ra, ra, (69 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008531 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008532
8533/* ------------------------------ */
8534 .balign 128
8535.L_ALT_op_aget_object: /* 0x46 */
8536/* File: mips64/alt_stub.S */
8537/*
8538 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8539 * any interesting requests and then jump to the real instruction
8540 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8541 */
8542 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008543 REFRESH_IBASE
8544 dla ra, artMterpAsmInstructionStart
8545 dla t9, MterpCheckBefore
8546 move a0, rSELF
8547 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008548 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008549 daddu ra, ra, (70 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008550 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008551
8552/* ------------------------------ */
8553 .balign 128
8554.L_ALT_op_aget_boolean: /* 0x47 */
8555/* File: mips64/alt_stub.S */
8556/*
8557 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8558 * any interesting requests and then jump to the real instruction
8559 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8560 */
8561 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008562 REFRESH_IBASE
8563 dla ra, artMterpAsmInstructionStart
8564 dla t9, MterpCheckBefore
8565 move a0, rSELF
8566 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008567 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008568 daddu ra, ra, (71 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008569 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008570
8571/* ------------------------------ */
8572 .balign 128
8573.L_ALT_op_aget_byte: /* 0x48 */
8574/* File: mips64/alt_stub.S */
8575/*
8576 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8577 * any interesting requests and then jump to the real instruction
8578 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8579 */
8580 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008581 REFRESH_IBASE
8582 dla ra, artMterpAsmInstructionStart
8583 dla t9, MterpCheckBefore
8584 move a0, rSELF
8585 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008586 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008587 daddu ra, ra, (72 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008588 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008589
8590/* ------------------------------ */
8591 .balign 128
8592.L_ALT_op_aget_char: /* 0x49 */
8593/* File: mips64/alt_stub.S */
8594/*
8595 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8596 * any interesting requests and then jump to the real instruction
8597 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8598 */
8599 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008600 REFRESH_IBASE
8601 dla ra, artMterpAsmInstructionStart
8602 dla t9, MterpCheckBefore
8603 move a0, rSELF
8604 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008605 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008606 daddu ra, ra, (73 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008607 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008608
8609/* ------------------------------ */
8610 .balign 128
8611.L_ALT_op_aget_short: /* 0x4a */
8612/* File: mips64/alt_stub.S */
8613/*
8614 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8615 * any interesting requests and then jump to the real instruction
8616 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8617 */
8618 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008619 REFRESH_IBASE
8620 dla ra, artMterpAsmInstructionStart
8621 dla t9, MterpCheckBefore
8622 move a0, rSELF
8623 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008624 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008625 daddu ra, ra, (74 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008626 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008627
8628/* ------------------------------ */
8629 .balign 128
8630.L_ALT_op_aput: /* 0x4b */
8631/* File: mips64/alt_stub.S */
8632/*
8633 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8634 * any interesting requests and then jump to the real instruction
8635 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8636 */
8637 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008638 REFRESH_IBASE
8639 dla ra, artMterpAsmInstructionStart
8640 dla t9, MterpCheckBefore
8641 move a0, rSELF
8642 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008643 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008644 daddu ra, ra, (75 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008645 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008646
8647/* ------------------------------ */
8648 .balign 128
8649.L_ALT_op_aput_wide: /* 0x4c */
8650/* File: mips64/alt_stub.S */
8651/*
8652 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8653 * any interesting requests and then jump to the real instruction
8654 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8655 */
8656 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008657 REFRESH_IBASE
8658 dla ra, artMterpAsmInstructionStart
8659 dla t9, MterpCheckBefore
8660 move a0, rSELF
8661 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008662 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008663 daddu ra, ra, (76 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008664 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008665
8666/* ------------------------------ */
8667 .balign 128
8668.L_ALT_op_aput_object: /* 0x4d */
8669/* File: mips64/alt_stub.S */
8670/*
8671 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8672 * any interesting requests and then jump to the real instruction
8673 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8674 */
8675 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008676 REFRESH_IBASE
8677 dla ra, artMterpAsmInstructionStart
8678 dla t9, MterpCheckBefore
8679 move a0, rSELF
8680 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008681 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008682 daddu ra, ra, (77 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008683 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008684
8685/* ------------------------------ */
8686 .balign 128
8687.L_ALT_op_aput_boolean: /* 0x4e */
8688/* File: mips64/alt_stub.S */
8689/*
8690 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8691 * any interesting requests and then jump to the real instruction
8692 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8693 */
8694 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008695 REFRESH_IBASE
8696 dla ra, artMterpAsmInstructionStart
8697 dla t9, MterpCheckBefore
8698 move a0, rSELF
8699 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008700 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008701 daddu ra, ra, (78 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008702 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008703
8704/* ------------------------------ */
8705 .balign 128
8706.L_ALT_op_aput_byte: /* 0x4f */
8707/* File: mips64/alt_stub.S */
8708/*
8709 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8710 * any interesting requests and then jump to the real instruction
8711 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8712 */
8713 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008714 REFRESH_IBASE
8715 dla ra, artMterpAsmInstructionStart
8716 dla t9, MterpCheckBefore
8717 move a0, rSELF
8718 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008719 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008720 daddu ra, ra, (79 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008721 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008722
8723/* ------------------------------ */
8724 .balign 128
8725.L_ALT_op_aput_char: /* 0x50 */
8726/* File: mips64/alt_stub.S */
8727/*
8728 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8729 * any interesting requests and then jump to the real instruction
8730 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8731 */
8732 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008733 REFRESH_IBASE
8734 dla ra, artMterpAsmInstructionStart
8735 dla t9, MterpCheckBefore
8736 move a0, rSELF
8737 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008738 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008739 daddu ra, ra, (80 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008740 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008741
8742/* ------------------------------ */
8743 .balign 128
8744.L_ALT_op_aput_short: /* 0x51 */
8745/* File: mips64/alt_stub.S */
8746/*
8747 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8748 * any interesting requests and then jump to the real instruction
8749 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8750 */
8751 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008752 REFRESH_IBASE
8753 dla ra, artMterpAsmInstructionStart
8754 dla t9, MterpCheckBefore
8755 move a0, rSELF
8756 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008757 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008758 daddu ra, ra, (81 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008759 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008760
8761/* ------------------------------ */
8762 .balign 128
8763.L_ALT_op_iget: /* 0x52 */
8764/* File: mips64/alt_stub.S */
8765/*
8766 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8767 * any interesting requests and then jump to the real instruction
8768 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8769 */
8770 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008771 REFRESH_IBASE
8772 dla ra, artMterpAsmInstructionStart
8773 dla t9, MterpCheckBefore
8774 move a0, rSELF
8775 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008776 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008777 daddu ra, ra, (82 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008778 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008779
8780/* ------------------------------ */
8781 .balign 128
8782.L_ALT_op_iget_wide: /* 0x53 */
8783/* File: mips64/alt_stub.S */
8784/*
8785 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8786 * any interesting requests and then jump to the real instruction
8787 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8788 */
8789 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008790 REFRESH_IBASE
8791 dla ra, artMterpAsmInstructionStart
8792 dla t9, MterpCheckBefore
8793 move a0, rSELF
8794 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008795 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008796 daddu ra, ra, (83 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008797 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008798
8799/* ------------------------------ */
8800 .balign 128
8801.L_ALT_op_iget_object: /* 0x54 */
8802/* File: mips64/alt_stub.S */
8803/*
8804 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8805 * any interesting requests and then jump to the real instruction
8806 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8807 */
8808 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008809 REFRESH_IBASE
8810 dla ra, artMterpAsmInstructionStart
8811 dla t9, MterpCheckBefore
8812 move a0, rSELF
8813 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008814 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008815 daddu ra, ra, (84 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008816 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008817
8818/* ------------------------------ */
8819 .balign 128
8820.L_ALT_op_iget_boolean: /* 0x55 */
8821/* File: mips64/alt_stub.S */
8822/*
8823 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8824 * any interesting requests and then jump to the real instruction
8825 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8826 */
8827 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008828 REFRESH_IBASE
8829 dla ra, artMterpAsmInstructionStart
8830 dla t9, MterpCheckBefore
8831 move a0, rSELF
8832 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008833 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008834 daddu ra, ra, (85 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008835 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008836
8837/* ------------------------------ */
8838 .balign 128
8839.L_ALT_op_iget_byte: /* 0x56 */
8840/* File: mips64/alt_stub.S */
8841/*
8842 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8843 * any interesting requests and then jump to the real instruction
8844 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8845 */
8846 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008847 REFRESH_IBASE
8848 dla ra, artMterpAsmInstructionStart
8849 dla t9, MterpCheckBefore
8850 move a0, rSELF
8851 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008852 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008853 daddu ra, ra, (86 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008854 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008855
8856/* ------------------------------ */
8857 .balign 128
8858.L_ALT_op_iget_char: /* 0x57 */
8859/* File: mips64/alt_stub.S */
8860/*
8861 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8862 * any interesting requests and then jump to the real instruction
8863 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8864 */
8865 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008866 REFRESH_IBASE
8867 dla ra, artMterpAsmInstructionStart
8868 dla t9, MterpCheckBefore
8869 move a0, rSELF
8870 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008871 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008872 daddu ra, ra, (87 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008873 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008874
8875/* ------------------------------ */
8876 .balign 128
8877.L_ALT_op_iget_short: /* 0x58 */
8878/* File: mips64/alt_stub.S */
8879/*
8880 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8881 * any interesting requests and then jump to the real instruction
8882 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8883 */
8884 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008885 REFRESH_IBASE
8886 dla ra, artMterpAsmInstructionStart
8887 dla t9, MterpCheckBefore
8888 move a0, rSELF
8889 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008890 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008891 daddu ra, ra, (88 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008892 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008893
8894/* ------------------------------ */
8895 .balign 128
8896.L_ALT_op_iput: /* 0x59 */
8897/* File: mips64/alt_stub.S */
8898/*
8899 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8900 * any interesting requests and then jump to the real instruction
8901 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8902 */
8903 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008904 REFRESH_IBASE
8905 dla ra, artMterpAsmInstructionStart
8906 dla t9, MterpCheckBefore
8907 move a0, rSELF
8908 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008909 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008910 daddu ra, ra, (89 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008911 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008912
8913/* ------------------------------ */
8914 .balign 128
8915.L_ALT_op_iput_wide: /* 0x5a */
8916/* File: mips64/alt_stub.S */
8917/*
8918 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8919 * any interesting requests and then jump to the real instruction
8920 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8921 */
8922 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008923 REFRESH_IBASE
8924 dla ra, artMterpAsmInstructionStart
8925 dla t9, MterpCheckBefore
8926 move a0, rSELF
8927 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008928 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008929 daddu ra, ra, (90 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008930 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008931
8932/* ------------------------------ */
8933 .balign 128
8934.L_ALT_op_iput_object: /* 0x5b */
8935/* File: mips64/alt_stub.S */
8936/*
8937 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8938 * any interesting requests and then jump to the real instruction
8939 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8940 */
8941 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008942 REFRESH_IBASE
8943 dla ra, artMterpAsmInstructionStart
8944 dla t9, MterpCheckBefore
8945 move a0, rSELF
8946 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008947 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008948 daddu ra, ra, (91 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008949 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008950
8951/* ------------------------------ */
8952 .balign 128
8953.L_ALT_op_iput_boolean: /* 0x5c */
8954/* File: mips64/alt_stub.S */
8955/*
8956 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8957 * any interesting requests and then jump to the real instruction
8958 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8959 */
8960 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008961 REFRESH_IBASE
8962 dla ra, artMterpAsmInstructionStart
8963 dla t9, MterpCheckBefore
8964 move a0, rSELF
8965 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008966 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008967 daddu ra, ra, (92 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008968 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008969
8970/* ------------------------------ */
8971 .balign 128
8972.L_ALT_op_iput_byte: /* 0x5d */
8973/* File: mips64/alt_stub.S */
8974/*
8975 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8976 * any interesting requests and then jump to the real instruction
8977 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8978 */
8979 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008980 REFRESH_IBASE
8981 dla ra, artMterpAsmInstructionStart
8982 dla t9, MterpCheckBefore
8983 move a0, rSELF
8984 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008985 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08008986 daddu ra, ra, (93 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00008987 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08008988
8989/* ------------------------------ */
8990 .balign 128
8991.L_ALT_op_iput_char: /* 0x5e */
8992/* File: mips64/alt_stub.S */
8993/*
8994 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8995 * any interesting requests and then jump to the real instruction
8996 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8997 */
8998 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08008999 REFRESH_IBASE
9000 dla ra, artMterpAsmInstructionStart
9001 dla t9, MterpCheckBefore
9002 move a0, rSELF
9003 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009004 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009005 daddu ra, ra, (94 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009006 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009007
9008/* ------------------------------ */
9009 .balign 128
9010.L_ALT_op_iput_short: /* 0x5f */
9011/* File: mips64/alt_stub.S */
9012/*
9013 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9014 * any interesting requests and then jump to the real instruction
9015 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9016 */
9017 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009018 REFRESH_IBASE
9019 dla ra, artMterpAsmInstructionStart
9020 dla t9, MterpCheckBefore
9021 move a0, rSELF
9022 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009023 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009024 daddu ra, ra, (95 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009025 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009026
9027/* ------------------------------ */
9028 .balign 128
9029.L_ALT_op_sget: /* 0x60 */
9030/* File: mips64/alt_stub.S */
9031/*
9032 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9033 * any interesting requests and then jump to the real instruction
9034 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9035 */
9036 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009037 REFRESH_IBASE
9038 dla ra, artMterpAsmInstructionStart
9039 dla t9, MterpCheckBefore
9040 move a0, rSELF
9041 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009042 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009043 daddu ra, ra, (96 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009044 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009045
9046/* ------------------------------ */
9047 .balign 128
9048.L_ALT_op_sget_wide: /* 0x61 */
9049/* File: mips64/alt_stub.S */
9050/*
9051 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9052 * any interesting requests and then jump to the real instruction
9053 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9054 */
9055 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009056 REFRESH_IBASE
9057 dla ra, artMterpAsmInstructionStart
9058 dla t9, MterpCheckBefore
9059 move a0, rSELF
9060 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009061 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009062 daddu ra, ra, (97 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009063 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009064
9065/* ------------------------------ */
9066 .balign 128
9067.L_ALT_op_sget_object: /* 0x62 */
9068/* File: mips64/alt_stub.S */
9069/*
9070 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9071 * any interesting requests and then jump to the real instruction
9072 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9073 */
9074 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009075 REFRESH_IBASE
9076 dla ra, artMterpAsmInstructionStart
9077 dla t9, MterpCheckBefore
9078 move a0, rSELF
9079 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009080 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009081 daddu ra, ra, (98 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009082 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009083
9084/* ------------------------------ */
9085 .balign 128
9086.L_ALT_op_sget_boolean: /* 0x63 */
9087/* File: mips64/alt_stub.S */
9088/*
9089 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9090 * any interesting requests and then jump to the real instruction
9091 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9092 */
9093 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009094 REFRESH_IBASE
9095 dla ra, artMterpAsmInstructionStart
9096 dla t9, MterpCheckBefore
9097 move a0, rSELF
9098 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009099 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009100 daddu ra, ra, (99 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009101 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009102
9103/* ------------------------------ */
9104 .balign 128
9105.L_ALT_op_sget_byte: /* 0x64 */
9106/* File: mips64/alt_stub.S */
9107/*
9108 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9109 * any interesting requests and then jump to the real instruction
9110 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9111 */
9112 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009113 REFRESH_IBASE
9114 dla ra, artMterpAsmInstructionStart
9115 dla t9, MterpCheckBefore
9116 move a0, rSELF
9117 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009118 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009119 daddu ra, ra, (100 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009120 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009121
9122/* ------------------------------ */
9123 .balign 128
9124.L_ALT_op_sget_char: /* 0x65 */
9125/* File: mips64/alt_stub.S */
9126/*
9127 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9128 * any interesting requests and then jump to the real instruction
9129 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9130 */
9131 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009132 REFRESH_IBASE
9133 dla ra, artMterpAsmInstructionStart
9134 dla t9, MterpCheckBefore
9135 move a0, rSELF
9136 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009137 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009138 daddu ra, ra, (101 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009139 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009140
9141/* ------------------------------ */
9142 .balign 128
9143.L_ALT_op_sget_short: /* 0x66 */
9144/* File: mips64/alt_stub.S */
9145/*
9146 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9147 * any interesting requests and then jump to the real instruction
9148 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9149 */
9150 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009151 REFRESH_IBASE
9152 dla ra, artMterpAsmInstructionStart
9153 dla t9, MterpCheckBefore
9154 move a0, rSELF
9155 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009156 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009157 daddu ra, ra, (102 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009158 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009159
9160/* ------------------------------ */
9161 .balign 128
9162.L_ALT_op_sput: /* 0x67 */
9163/* File: mips64/alt_stub.S */
9164/*
9165 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9166 * any interesting requests and then jump to the real instruction
9167 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9168 */
9169 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009170 REFRESH_IBASE
9171 dla ra, artMterpAsmInstructionStart
9172 dla t9, MterpCheckBefore
9173 move a0, rSELF
9174 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009175 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009176 daddu ra, ra, (103 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009177 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009178
9179/* ------------------------------ */
9180 .balign 128
9181.L_ALT_op_sput_wide: /* 0x68 */
9182/* File: mips64/alt_stub.S */
9183/*
9184 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9185 * any interesting requests and then jump to the real instruction
9186 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9187 */
9188 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009189 REFRESH_IBASE
9190 dla ra, artMterpAsmInstructionStart
9191 dla t9, MterpCheckBefore
9192 move a0, rSELF
9193 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009194 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009195 daddu ra, ra, (104 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009196 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009197
9198/* ------------------------------ */
9199 .balign 128
9200.L_ALT_op_sput_object: /* 0x69 */
9201/* File: mips64/alt_stub.S */
9202/*
9203 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9204 * any interesting requests and then jump to the real instruction
9205 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9206 */
9207 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009208 REFRESH_IBASE
9209 dla ra, artMterpAsmInstructionStart
9210 dla t9, MterpCheckBefore
9211 move a0, rSELF
9212 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009213 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009214 daddu ra, ra, (105 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009215 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009216
9217/* ------------------------------ */
9218 .balign 128
9219.L_ALT_op_sput_boolean: /* 0x6a */
9220/* File: mips64/alt_stub.S */
9221/*
9222 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9223 * any interesting requests and then jump to the real instruction
9224 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9225 */
9226 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009227 REFRESH_IBASE
9228 dla ra, artMterpAsmInstructionStart
9229 dla t9, MterpCheckBefore
9230 move a0, rSELF
9231 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009232 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009233 daddu ra, ra, (106 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009234 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009235
9236/* ------------------------------ */
9237 .balign 128
9238.L_ALT_op_sput_byte: /* 0x6b */
9239/* File: mips64/alt_stub.S */
9240/*
9241 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9242 * any interesting requests and then jump to the real instruction
9243 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9244 */
9245 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009246 REFRESH_IBASE
9247 dla ra, artMterpAsmInstructionStart
9248 dla t9, MterpCheckBefore
9249 move a0, rSELF
9250 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009251 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009252 daddu ra, ra, (107 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009253 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009254
9255/* ------------------------------ */
9256 .balign 128
9257.L_ALT_op_sput_char: /* 0x6c */
9258/* File: mips64/alt_stub.S */
9259/*
9260 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9261 * any interesting requests and then jump to the real instruction
9262 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9263 */
9264 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009265 REFRESH_IBASE
9266 dla ra, artMterpAsmInstructionStart
9267 dla t9, MterpCheckBefore
9268 move a0, rSELF
9269 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009270 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009271 daddu ra, ra, (108 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009272 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009273
9274/* ------------------------------ */
9275 .balign 128
9276.L_ALT_op_sput_short: /* 0x6d */
9277/* File: mips64/alt_stub.S */
9278/*
9279 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9280 * any interesting requests and then jump to the real instruction
9281 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9282 */
9283 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009284 REFRESH_IBASE
9285 dla ra, artMterpAsmInstructionStart
9286 dla t9, MterpCheckBefore
9287 move a0, rSELF
9288 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009289 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009290 daddu ra, ra, (109 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009291 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009292
9293/* ------------------------------ */
9294 .balign 128
9295.L_ALT_op_invoke_virtual: /* 0x6e */
9296/* File: mips64/alt_stub.S */
9297/*
9298 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9299 * any interesting requests and then jump to the real instruction
9300 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9301 */
9302 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009303 REFRESH_IBASE
9304 dla ra, artMterpAsmInstructionStart
9305 dla t9, MterpCheckBefore
9306 move a0, rSELF
9307 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009308 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009309 daddu ra, ra, (110 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009310 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009311
9312/* ------------------------------ */
9313 .balign 128
9314.L_ALT_op_invoke_super: /* 0x6f */
9315/* File: mips64/alt_stub.S */
9316/*
9317 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9318 * any interesting requests and then jump to the real instruction
9319 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9320 */
9321 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009322 REFRESH_IBASE
9323 dla ra, artMterpAsmInstructionStart
9324 dla t9, MterpCheckBefore
9325 move a0, rSELF
9326 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009327 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009328 daddu ra, ra, (111 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009329 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009330
9331/* ------------------------------ */
9332 .balign 128
9333.L_ALT_op_invoke_direct: /* 0x70 */
9334/* File: mips64/alt_stub.S */
9335/*
9336 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9337 * any interesting requests and then jump to the real instruction
9338 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9339 */
9340 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009341 REFRESH_IBASE
9342 dla ra, artMterpAsmInstructionStart
9343 dla t9, MterpCheckBefore
9344 move a0, rSELF
9345 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009346 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009347 daddu ra, ra, (112 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009348 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009349
9350/* ------------------------------ */
9351 .balign 128
9352.L_ALT_op_invoke_static: /* 0x71 */
9353/* File: mips64/alt_stub.S */
9354/*
9355 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9356 * any interesting requests and then jump to the real instruction
9357 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9358 */
9359 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009360 REFRESH_IBASE
9361 dla ra, artMterpAsmInstructionStart
9362 dla t9, MterpCheckBefore
9363 move a0, rSELF
9364 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009365 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009366 daddu ra, ra, (113 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009367 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009368
9369/* ------------------------------ */
9370 .balign 128
9371.L_ALT_op_invoke_interface: /* 0x72 */
9372/* File: mips64/alt_stub.S */
9373/*
9374 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9375 * any interesting requests and then jump to the real instruction
9376 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9377 */
9378 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009379 REFRESH_IBASE
9380 dla ra, artMterpAsmInstructionStart
9381 dla t9, MterpCheckBefore
9382 move a0, rSELF
9383 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009384 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009385 daddu ra, ra, (114 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009386 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009387
9388/* ------------------------------ */
9389 .balign 128
9390.L_ALT_op_return_void_no_barrier: /* 0x73 */
9391/* File: mips64/alt_stub.S */
9392/*
9393 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9394 * any interesting requests and then jump to the real instruction
9395 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9396 */
9397 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009398 REFRESH_IBASE
9399 dla ra, artMterpAsmInstructionStart
9400 dla t9, MterpCheckBefore
9401 move a0, rSELF
9402 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009403 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009404 daddu ra, ra, (115 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009405 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009406
9407/* ------------------------------ */
9408 .balign 128
9409.L_ALT_op_invoke_virtual_range: /* 0x74 */
9410/* File: mips64/alt_stub.S */
9411/*
9412 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9413 * any interesting requests and then jump to the real instruction
9414 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9415 */
9416 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009417 REFRESH_IBASE
9418 dla ra, artMterpAsmInstructionStart
9419 dla t9, MterpCheckBefore
9420 move a0, rSELF
9421 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009422 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009423 daddu ra, ra, (116 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009424 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009425
9426/* ------------------------------ */
9427 .balign 128
9428.L_ALT_op_invoke_super_range: /* 0x75 */
9429/* File: mips64/alt_stub.S */
9430/*
9431 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9432 * any interesting requests and then jump to the real instruction
9433 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9434 */
9435 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009436 REFRESH_IBASE
9437 dla ra, artMterpAsmInstructionStart
9438 dla t9, MterpCheckBefore
9439 move a0, rSELF
9440 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009441 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009442 daddu ra, ra, (117 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009443 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009444
9445/* ------------------------------ */
9446 .balign 128
9447.L_ALT_op_invoke_direct_range: /* 0x76 */
9448/* File: mips64/alt_stub.S */
9449/*
9450 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9451 * any interesting requests and then jump to the real instruction
9452 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9453 */
9454 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009455 REFRESH_IBASE
9456 dla ra, artMterpAsmInstructionStart
9457 dla t9, MterpCheckBefore
9458 move a0, rSELF
9459 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009460 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009461 daddu ra, ra, (118 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009462 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009463
9464/* ------------------------------ */
9465 .balign 128
9466.L_ALT_op_invoke_static_range: /* 0x77 */
9467/* File: mips64/alt_stub.S */
9468/*
9469 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9470 * any interesting requests and then jump to the real instruction
9471 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9472 */
9473 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009474 REFRESH_IBASE
9475 dla ra, artMterpAsmInstructionStart
9476 dla t9, MterpCheckBefore
9477 move a0, rSELF
9478 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009479 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009480 daddu ra, ra, (119 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009481 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009482
9483/* ------------------------------ */
9484 .balign 128
9485.L_ALT_op_invoke_interface_range: /* 0x78 */
9486/* File: mips64/alt_stub.S */
9487/*
9488 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9489 * any interesting requests and then jump to the real instruction
9490 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9491 */
9492 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009493 REFRESH_IBASE
9494 dla ra, artMterpAsmInstructionStart
9495 dla t9, MterpCheckBefore
9496 move a0, rSELF
9497 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009498 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009499 daddu ra, ra, (120 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009500 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009501
9502/* ------------------------------ */
9503 .balign 128
9504.L_ALT_op_unused_79: /* 0x79 */
9505/* File: mips64/alt_stub.S */
9506/*
9507 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9508 * any interesting requests and then jump to the real instruction
9509 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9510 */
9511 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009512 REFRESH_IBASE
9513 dla ra, artMterpAsmInstructionStart
9514 dla t9, MterpCheckBefore
9515 move a0, rSELF
9516 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009517 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009518 daddu ra, ra, (121 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009519 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009520
9521/* ------------------------------ */
9522 .balign 128
9523.L_ALT_op_unused_7a: /* 0x7a */
9524/* File: mips64/alt_stub.S */
9525/*
9526 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9527 * any interesting requests and then jump to the real instruction
9528 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9529 */
9530 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009531 REFRESH_IBASE
9532 dla ra, artMterpAsmInstructionStart
9533 dla t9, MterpCheckBefore
9534 move a0, rSELF
9535 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009536 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009537 daddu ra, ra, (122 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009538 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009539
9540/* ------------------------------ */
9541 .balign 128
9542.L_ALT_op_neg_int: /* 0x7b */
9543/* File: mips64/alt_stub.S */
9544/*
9545 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9546 * any interesting requests and then jump to the real instruction
9547 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9548 */
9549 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009550 REFRESH_IBASE
9551 dla ra, artMterpAsmInstructionStart
9552 dla t9, MterpCheckBefore
9553 move a0, rSELF
9554 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009555 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009556 daddu ra, ra, (123 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009557 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009558
9559/* ------------------------------ */
9560 .balign 128
9561.L_ALT_op_not_int: /* 0x7c */
9562/* File: mips64/alt_stub.S */
9563/*
9564 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9565 * any interesting requests and then jump to the real instruction
9566 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9567 */
9568 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009569 REFRESH_IBASE
9570 dla ra, artMterpAsmInstructionStart
9571 dla t9, MterpCheckBefore
9572 move a0, rSELF
9573 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009574 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009575 daddu ra, ra, (124 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009576 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009577
9578/* ------------------------------ */
9579 .balign 128
9580.L_ALT_op_neg_long: /* 0x7d */
9581/* File: mips64/alt_stub.S */
9582/*
9583 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9584 * any interesting requests and then jump to the real instruction
9585 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9586 */
9587 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009588 REFRESH_IBASE
9589 dla ra, artMterpAsmInstructionStart
9590 dla t9, MterpCheckBefore
9591 move a0, rSELF
9592 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009593 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009594 daddu ra, ra, (125 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009595 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009596
9597/* ------------------------------ */
9598 .balign 128
9599.L_ALT_op_not_long: /* 0x7e */
9600/* File: mips64/alt_stub.S */
9601/*
9602 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9603 * any interesting requests and then jump to the real instruction
9604 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9605 */
9606 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009607 REFRESH_IBASE
9608 dla ra, artMterpAsmInstructionStart
9609 dla t9, MterpCheckBefore
9610 move a0, rSELF
9611 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009612 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009613 daddu ra, ra, (126 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009614 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009615
9616/* ------------------------------ */
9617 .balign 128
9618.L_ALT_op_neg_float: /* 0x7f */
9619/* File: mips64/alt_stub.S */
9620/*
9621 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9622 * any interesting requests and then jump to the real instruction
9623 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9624 */
9625 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009626 REFRESH_IBASE
9627 dla ra, artMterpAsmInstructionStart
9628 dla t9, MterpCheckBefore
9629 move a0, rSELF
9630 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009631 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009632 daddu ra, ra, (127 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009633 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009634
9635/* ------------------------------ */
9636 .balign 128
9637.L_ALT_op_neg_double: /* 0x80 */
9638/* File: mips64/alt_stub.S */
9639/*
9640 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9641 * any interesting requests and then jump to the real instruction
9642 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9643 */
9644 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009645 REFRESH_IBASE
9646 dla ra, artMterpAsmInstructionStart
9647 dla t9, MterpCheckBefore
9648 move a0, rSELF
9649 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009650 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009651 daddu ra, ra, (128 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009652 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009653
9654/* ------------------------------ */
9655 .balign 128
9656.L_ALT_op_int_to_long: /* 0x81 */
9657/* File: mips64/alt_stub.S */
9658/*
9659 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9660 * any interesting requests and then jump to the real instruction
9661 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9662 */
9663 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009664 REFRESH_IBASE
9665 dla ra, artMterpAsmInstructionStart
9666 dla t9, MterpCheckBefore
9667 move a0, rSELF
9668 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009669 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009670 daddu ra, ra, (129 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009671 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009672
9673/* ------------------------------ */
9674 .balign 128
9675.L_ALT_op_int_to_float: /* 0x82 */
9676/* File: mips64/alt_stub.S */
9677/*
9678 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9679 * any interesting requests and then jump to the real instruction
9680 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9681 */
9682 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009683 REFRESH_IBASE
9684 dla ra, artMterpAsmInstructionStart
9685 dla t9, MterpCheckBefore
9686 move a0, rSELF
9687 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009688 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009689 daddu ra, ra, (130 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009690 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009691
9692/* ------------------------------ */
9693 .balign 128
9694.L_ALT_op_int_to_double: /* 0x83 */
9695/* File: mips64/alt_stub.S */
9696/*
9697 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9698 * any interesting requests and then jump to the real instruction
9699 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9700 */
9701 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009702 REFRESH_IBASE
9703 dla ra, artMterpAsmInstructionStart
9704 dla t9, MterpCheckBefore
9705 move a0, rSELF
9706 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009707 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009708 daddu ra, ra, (131 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009709 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009710
9711/* ------------------------------ */
9712 .balign 128
9713.L_ALT_op_long_to_int: /* 0x84 */
9714/* File: mips64/alt_stub.S */
9715/*
9716 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9717 * any interesting requests and then jump to the real instruction
9718 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9719 */
9720 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009721 REFRESH_IBASE
9722 dla ra, artMterpAsmInstructionStart
9723 dla t9, MterpCheckBefore
9724 move a0, rSELF
9725 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009726 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009727 daddu ra, ra, (132 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009728 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009729
9730/* ------------------------------ */
9731 .balign 128
9732.L_ALT_op_long_to_float: /* 0x85 */
9733/* File: mips64/alt_stub.S */
9734/*
9735 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9736 * any interesting requests and then jump to the real instruction
9737 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9738 */
9739 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009740 REFRESH_IBASE
9741 dla ra, artMterpAsmInstructionStart
9742 dla t9, MterpCheckBefore
9743 move a0, rSELF
9744 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009745 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009746 daddu ra, ra, (133 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009747 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009748
9749/* ------------------------------ */
9750 .balign 128
9751.L_ALT_op_long_to_double: /* 0x86 */
9752/* File: mips64/alt_stub.S */
9753/*
9754 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9755 * any interesting requests and then jump to the real instruction
9756 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9757 */
9758 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009759 REFRESH_IBASE
9760 dla ra, artMterpAsmInstructionStart
9761 dla t9, MterpCheckBefore
9762 move a0, rSELF
9763 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009764 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009765 daddu ra, ra, (134 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009766 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009767
9768/* ------------------------------ */
9769 .balign 128
9770.L_ALT_op_float_to_int: /* 0x87 */
9771/* File: mips64/alt_stub.S */
9772/*
9773 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9774 * any interesting requests and then jump to the real instruction
9775 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9776 */
9777 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009778 REFRESH_IBASE
9779 dla ra, artMterpAsmInstructionStart
9780 dla t9, MterpCheckBefore
9781 move a0, rSELF
9782 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009783 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009784 daddu ra, ra, (135 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009785 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009786
9787/* ------------------------------ */
9788 .balign 128
9789.L_ALT_op_float_to_long: /* 0x88 */
9790/* File: mips64/alt_stub.S */
9791/*
9792 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9793 * any interesting requests and then jump to the real instruction
9794 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9795 */
9796 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009797 REFRESH_IBASE
9798 dla ra, artMterpAsmInstructionStart
9799 dla t9, MterpCheckBefore
9800 move a0, rSELF
9801 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009802 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009803 daddu ra, ra, (136 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009804 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009805
9806/* ------------------------------ */
9807 .balign 128
9808.L_ALT_op_float_to_double: /* 0x89 */
9809/* File: mips64/alt_stub.S */
9810/*
9811 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9812 * any interesting requests and then jump to the real instruction
9813 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9814 */
9815 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009816 REFRESH_IBASE
9817 dla ra, artMterpAsmInstructionStart
9818 dla t9, MterpCheckBefore
9819 move a0, rSELF
9820 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009821 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009822 daddu ra, ra, (137 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009823 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009824
9825/* ------------------------------ */
9826 .balign 128
9827.L_ALT_op_double_to_int: /* 0x8a */
9828/* File: mips64/alt_stub.S */
9829/*
9830 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9831 * any interesting requests and then jump to the real instruction
9832 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9833 */
9834 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009835 REFRESH_IBASE
9836 dla ra, artMterpAsmInstructionStart
9837 dla t9, MterpCheckBefore
9838 move a0, rSELF
9839 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009840 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009841 daddu ra, ra, (138 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009842 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009843
9844/* ------------------------------ */
9845 .balign 128
9846.L_ALT_op_double_to_long: /* 0x8b */
9847/* File: mips64/alt_stub.S */
9848/*
9849 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9850 * any interesting requests and then jump to the real instruction
9851 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9852 */
9853 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009854 REFRESH_IBASE
9855 dla ra, artMterpAsmInstructionStart
9856 dla t9, MterpCheckBefore
9857 move a0, rSELF
9858 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009859 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009860 daddu ra, ra, (139 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009861 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009862
9863/* ------------------------------ */
9864 .balign 128
9865.L_ALT_op_double_to_float: /* 0x8c */
9866/* File: mips64/alt_stub.S */
9867/*
9868 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9869 * any interesting requests and then jump to the real instruction
9870 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9871 */
9872 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009873 REFRESH_IBASE
9874 dla ra, artMterpAsmInstructionStart
9875 dla t9, MterpCheckBefore
9876 move a0, rSELF
9877 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009878 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009879 daddu ra, ra, (140 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009880 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009881
9882/* ------------------------------ */
9883 .balign 128
9884.L_ALT_op_int_to_byte: /* 0x8d */
9885/* File: mips64/alt_stub.S */
9886/*
9887 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9888 * any interesting requests and then jump to the real instruction
9889 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9890 */
9891 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009892 REFRESH_IBASE
9893 dla ra, artMterpAsmInstructionStart
9894 dla t9, MterpCheckBefore
9895 move a0, rSELF
9896 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009897 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009898 daddu ra, ra, (141 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009899 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009900
9901/* ------------------------------ */
9902 .balign 128
9903.L_ALT_op_int_to_char: /* 0x8e */
9904/* File: mips64/alt_stub.S */
9905/*
9906 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9907 * any interesting requests and then jump to the real instruction
9908 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9909 */
9910 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009911 REFRESH_IBASE
9912 dla ra, artMterpAsmInstructionStart
9913 dla t9, MterpCheckBefore
9914 move a0, rSELF
9915 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009916 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009917 daddu ra, ra, (142 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009918 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009919
9920/* ------------------------------ */
9921 .balign 128
9922.L_ALT_op_int_to_short: /* 0x8f */
9923/* File: mips64/alt_stub.S */
9924/*
9925 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9926 * any interesting requests and then jump to the real instruction
9927 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9928 */
9929 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009930 REFRESH_IBASE
9931 dla ra, artMterpAsmInstructionStart
9932 dla t9, MterpCheckBefore
9933 move a0, rSELF
9934 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009935 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009936 daddu ra, ra, (143 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009937 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009938
9939/* ------------------------------ */
9940 .balign 128
9941.L_ALT_op_add_int: /* 0x90 */
9942/* File: mips64/alt_stub.S */
9943/*
9944 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9945 * any interesting requests and then jump to the real instruction
9946 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9947 */
9948 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009949 REFRESH_IBASE
9950 dla ra, artMterpAsmInstructionStart
9951 dla t9, MterpCheckBefore
9952 move a0, rSELF
9953 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009954 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009955 daddu ra, ra, (144 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009956 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009957
9958/* ------------------------------ */
9959 .balign 128
9960.L_ALT_op_sub_int: /* 0x91 */
9961/* File: mips64/alt_stub.S */
9962/*
9963 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9964 * any interesting requests and then jump to the real instruction
9965 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9966 */
9967 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009968 REFRESH_IBASE
9969 dla ra, artMterpAsmInstructionStart
9970 dla t9, MterpCheckBefore
9971 move a0, rSELF
9972 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009973 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009974 daddu ra, ra, (145 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009975 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009976
9977/* ------------------------------ */
9978 .balign 128
9979.L_ALT_op_mul_int: /* 0x92 */
9980/* File: mips64/alt_stub.S */
9981/*
9982 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9983 * any interesting requests and then jump to the real instruction
9984 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9985 */
9986 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -08009987 REFRESH_IBASE
9988 dla ra, artMterpAsmInstructionStart
9989 dla t9, MterpCheckBefore
9990 move a0, rSELF
9991 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009992 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -08009993 daddu ra, ra, (146 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +00009994 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -08009995
9996/* ------------------------------ */
9997 .balign 128
9998.L_ALT_op_div_int: /* 0x93 */
9999/* File: mips64/alt_stub.S */
10000/*
10001 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10002 * any interesting requests and then jump to the real instruction
10003 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10004 */
10005 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010006 REFRESH_IBASE
10007 dla ra, artMterpAsmInstructionStart
10008 dla t9, MterpCheckBefore
10009 move a0, rSELF
10010 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010011 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010012 daddu ra, ra, (147 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010013 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010014
10015/* ------------------------------ */
10016 .balign 128
10017.L_ALT_op_rem_int: /* 0x94 */
10018/* File: mips64/alt_stub.S */
10019/*
10020 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10021 * any interesting requests and then jump to the real instruction
10022 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10023 */
10024 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010025 REFRESH_IBASE
10026 dla ra, artMterpAsmInstructionStart
10027 dla t9, MterpCheckBefore
10028 move a0, rSELF
10029 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010030 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010031 daddu ra, ra, (148 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010032 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010033
10034/* ------------------------------ */
10035 .balign 128
10036.L_ALT_op_and_int: /* 0x95 */
10037/* File: mips64/alt_stub.S */
10038/*
10039 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10040 * any interesting requests and then jump to the real instruction
10041 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10042 */
10043 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010044 REFRESH_IBASE
10045 dla ra, artMterpAsmInstructionStart
10046 dla t9, MterpCheckBefore
10047 move a0, rSELF
10048 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010049 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010050 daddu ra, ra, (149 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010051 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010052
10053/* ------------------------------ */
10054 .balign 128
10055.L_ALT_op_or_int: /* 0x96 */
10056/* File: mips64/alt_stub.S */
10057/*
10058 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10059 * any interesting requests and then jump to the real instruction
10060 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10061 */
10062 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010063 REFRESH_IBASE
10064 dla ra, artMterpAsmInstructionStart
10065 dla t9, MterpCheckBefore
10066 move a0, rSELF
10067 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010068 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010069 daddu ra, ra, (150 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010070 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010071
10072/* ------------------------------ */
10073 .balign 128
10074.L_ALT_op_xor_int: /* 0x97 */
10075/* File: mips64/alt_stub.S */
10076/*
10077 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10078 * any interesting requests and then jump to the real instruction
10079 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10080 */
10081 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010082 REFRESH_IBASE
10083 dla ra, artMterpAsmInstructionStart
10084 dla t9, MterpCheckBefore
10085 move a0, rSELF
10086 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010087 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010088 daddu ra, ra, (151 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010089 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010090
10091/* ------------------------------ */
10092 .balign 128
10093.L_ALT_op_shl_int: /* 0x98 */
10094/* File: mips64/alt_stub.S */
10095/*
10096 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10097 * any interesting requests and then jump to the real instruction
10098 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10099 */
10100 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010101 REFRESH_IBASE
10102 dla ra, artMterpAsmInstructionStart
10103 dla t9, MterpCheckBefore
10104 move a0, rSELF
10105 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010106 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010107 daddu ra, ra, (152 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010108 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010109
10110/* ------------------------------ */
10111 .balign 128
10112.L_ALT_op_shr_int: /* 0x99 */
10113/* File: mips64/alt_stub.S */
10114/*
10115 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10116 * any interesting requests and then jump to the real instruction
10117 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10118 */
10119 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010120 REFRESH_IBASE
10121 dla ra, artMterpAsmInstructionStart
10122 dla t9, MterpCheckBefore
10123 move a0, rSELF
10124 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010125 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010126 daddu ra, ra, (153 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010127 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010128
10129/* ------------------------------ */
10130 .balign 128
10131.L_ALT_op_ushr_int: /* 0x9a */
10132/* File: mips64/alt_stub.S */
10133/*
10134 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10135 * any interesting requests and then jump to the real instruction
10136 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10137 */
10138 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010139 REFRESH_IBASE
10140 dla ra, artMterpAsmInstructionStart
10141 dla t9, MterpCheckBefore
10142 move a0, rSELF
10143 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010144 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010145 daddu ra, ra, (154 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010146 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010147
10148/* ------------------------------ */
10149 .balign 128
10150.L_ALT_op_add_long: /* 0x9b */
10151/* File: mips64/alt_stub.S */
10152/*
10153 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10154 * any interesting requests and then jump to the real instruction
10155 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10156 */
10157 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010158 REFRESH_IBASE
10159 dla ra, artMterpAsmInstructionStart
10160 dla t9, MterpCheckBefore
10161 move a0, rSELF
10162 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010163 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010164 daddu ra, ra, (155 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010165 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010166
10167/* ------------------------------ */
10168 .balign 128
10169.L_ALT_op_sub_long: /* 0x9c */
10170/* File: mips64/alt_stub.S */
10171/*
10172 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10173 * any interesting requests and then jump to the real instruction
10174 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10175 */
10176 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010177 REFRESH_IBASE
10178 dla ra, artMterpAsmInstructionStart
10179 dla t9, MterpCheckBefore
10180 move a0, rSELF
10181 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010182 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010183 daddu ra, ra, (156 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010184 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010185
10186/* ------------------------------ */
10187 .balign 128
10188.L_ALT_op_mul_long: /* 0x9d */
10189/* File: mips64/alt_stub.S */
10190/*
10191 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10192 * any interesting requests and then jump to the real instruction
10193 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10194 */
10195 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010196 REFRESH_IBASE
10197 dla ra, artMterpAsmInstructionStart
10198 dla t9, MterpCheckBefore
10199 move a0, rSELF
10200 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010201 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010202 daddu ra, ra, (157 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010203 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010204
10205/* ------------------------------ */
10206 .balign 128
10207.L_ALT_op_div_long: /* 0x9e */
10208/* File: mips64/alt_stub.S */
10209/*
10210 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10211 * any interesting requests and then jump to the real instruction
10212 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10213 */
10214 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010215 REFRESH_IBASE
10216 dla ra, artMterpAsmInstructionStart
10217 dla t9, MterpCheckBefore
10218 move a0, rSELF
10219 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010220 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010221 daddu ra, ra, (158 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010222 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010223
10224/* ------------------------------ */
10225 .balign 128
10226.L_ALT_op_rem_long: /* 0x9f */
10227/* File: mips64/alt_stub.S */
10228/*
10229 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10230 * any interesting requests and then jump to the real instruction
10231 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10232 */
10233 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010234 REFRESH_IBASE
10235 dla ra, artMterpAsmInstructionStart
10236 dla t9, MterpCheckBefore
10237 move a0, rSELF
10238 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010239 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010240 daddu ra, ra, (159 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010241 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010242
10243/* ------------------------------ */
10244 .balign 128
10245.L_ALT_op_and_long: /* 0xa0 */
10246/* File: mips64/alt_stub.S */
10247/*
10248 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10249 * any interesting requests and then jump to the real instruction
10250 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10251 */
10252 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010253 REFRESH_IBASE
10254 dla ra, artMterpAsmInstructionStart
10255 dla t9, MterpCheckBefore
10256 move a0, rSELF
10257 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010258 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010259 daddu ra, ra, (160 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010260 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010261
10262/* ------------------------------ */
10263 .balign 128
10264.L_ALT_op_or_long: /* 0xa1 */
10265/* File: mips64/alt_stub.S */
10266/*
10267 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10268 * any interesting requests and then jump to the real instruction
10269 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10270 */
10271 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010272 REFRESH_IBASE
10273 dla ra, artMterpAsmInstructionStart
10274 dla t9, MterpCheckBefore
10275 move a0, rSELF
10276 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010277 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010278 daddu ra, ra, (161 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010279 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010280
10281/* ------------------------------ */
10282 .balign 128
10283.L_ALT_op_xor_long: /* 0xa2 */
10284/* File: mips64/alt_stub.S */
10285/*
10286 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10287 * any interesting requests and then jump to the real instruction
10288 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10289 */
10290 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010291 REFRESH_IBASE
10292 dla ra, artMterpAsmInstructionStart
10293 dla t9, MterpCheckBefore
10294 move a0, rSELF
10295 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010296 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010297 daddu ra, ra, (162 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010298 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010299
10300/* ------------------------------ */
10301 .balign 128
10302.L_ALT_op_shl_long: /* 0xa3 */
10303/* File: mips64/alt_stub.S */
10304/*
10305 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10306 * any interesting requests and then jump to the real instruction
10307 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10308 */
10309 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010310 REFRESH_IBASE
10311 dla ra, artMterpAsmInstructionStart
10312 dla t9, MterpCheckBefore
10313 move a0, rSELF
10314 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010315 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010316 daddu ra, ra, (163 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010317 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010318
10319/* ------------------------------ */
10320 .balign 128
10321.L_ALT_op_shr_long: /* 0xa4 */
10322/* File: mips64/alt_stub.S */
10323/*
10324 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10325 * any interesting requests and then jump to the real instruction
10326 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10327 */
10328 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010329 REFRESH_IBASE
10330 dla ra, artMterpAsmInstructionStart
10331 dla t9, MterpCheckBefore
10332 move a0, rSELF
10333 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010334 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010335 daddu ra, ra, (164 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010336 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010337
10338/* ------------------------------ */
10339 .balign 128
10340.L_ALT_op_ushr_long: /* 0xa5 */
10341/* File: mips64/alt_stub.S */
10342/*
10343 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10344 * any interesting requests and then jump to the real instruction
10345 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10346 */
10347 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010348 REFRESH_IBASE
10349 dla ra, artMterpAsmInstructionStart
10350 dla t9, MterpCheckBefore
10351 move a0, rSELF
10352 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010353 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010354 daddu ra, ra, (165 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010355 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010356
10357/* ------------------------------ */
10358 .balign 128
10359.L_ALT_op_add_float: /* 0xa6 */
10360/* File: mips64/alt_stub.S */
10361/*
10362 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10363 * any interesting requests and then jump to the real instruction
10364 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10365 */
10366 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010367 REFRESH_IBASE
10368 dla ra, artMterpAsmInstructionStart
10369 dla t9, MterpCheckBefore
10370 move a0, rSELF
10371 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010372 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010373 daddu ra, ra, (166 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010374 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010375
10376/* ------------------------------ */
10377 .balign 128
10378.L_ALT_op_sub_float: /* 0xa7 */
10379/* File: mips64/alt_stub.S */
10380/*
10381 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10382 * any interesting requests and then jump to the real instruction
10383 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10384 */
10385 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010386 REFRESH_IBASE
10387 dla ra, artMterpAsmInstructionStart
10388 dla t9, MterpCheckBefore
10389 move a0, rSELF
10390 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010391 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010392 daddu ra, ra, (167 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010393 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010394
10395/* ------------------------------ */
10396 .balign 128
10397.L_ALT_op_mul_float: /* 0xa8 */
10398/* File: mips64/alt_stub.S */
10399/*
10400 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10401 * any interesting requests and then jump to the real instruction
10402 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10403 */
10404 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010405 REFRESH_IBASE
10406 dla ra, artMterpAsmInstructionStart
10407 dla t9, MterpCheckBefore
10408 move a0, rSELF
10409 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010410 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010411 daddu ra, ra, (168 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010412 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010413
10414/* ------------------------------ */
10415 .balign 128
10416.L_ALT_op_div_float: /* 0xa9 */
10417/* File: mips64/alt_stub.S */
10418/*
10419 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10420 * any interesting requests and then jump to the real instruction
10421 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10422 */
10423 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010424 REFRESH_IBASE
10425 dla ra, artMterpAsmInstructionStart
10426 dla t9, MterpCheckBefore
10427 move a0, rSELF
10428 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010429 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010430 daddu ra, ra, (169 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010431 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010432
10433/* ------------------------------ */
10434 .balign 128
10435.L_ALT_op_rem_float: /* 0xaa */
10436/* File: mips64/alt_stub.S */
10437/*
10438 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10439 * any interesting requests and then jump to the real instruction
10440 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10441 */
10442 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010443 REFRESH_IBASE
10444 dla ra, artMterpAsmInstructionStart
10445 dla t9, MterpCheckBefore
10446 move a0, rSELF
10447 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010448 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010449 daddu ra, ra, (170 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010450 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010451
10452/* ------------------------------ */
10453 .balign 128
10454.L_ALT_op_add_double: /* 0xab */
10455/* File: mips64/alt_stub.S */
10456/*
10457 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10458 * any interesting requests and then jump to the real instruction
10459 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10460 */
10461 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010462 REFRESH_IBASE
10463 dla ra, artMterpAsmInstructionStart
10464 dla t9, MterpCheckBefore
10465 move a0, rSELF
10466 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010467 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010468 daddu ra, ra, (171 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010469 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010470
10471/* ------------------------------ */
10472 .balign 128
10473.L_ALT_op_sub_double: /* 0xac */
10474/* File: mips64/alt_stub.S */
10475/*
10476 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10477 * any interesting requests and then jump to the real instruction
10478 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10479 */
10480 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010481 REFRESH_IBASE
10482 dla ra, artMterpAsmInstructionStart
10483 dla t9, MterpCheckBefore
10484 move a0, rSELF
10485 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010486 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010487 daddu ra, ra, (172 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010488 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010489
10490/* ------------------------------ */
10491 .balign 128
10492.L_ALT_op_mul_double: /* 0xad */
10493/* File: mips64/alt_stub.S */
10494/*
10495 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10496 * any interesting requests and then jump to the real instruction
10497 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10498 */
10499 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010500 REFRESH_IBASE
10501 dla ra, artMterpAsmInstructionStart
10502 dla t9, MterpCheckBefore
10503 move a0, rSELF
10504 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010505 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010506 daddu ra, ra, (173 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010507 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010508
10509/* ------------------------------ */
10510 .balign 128
10511.L_ALT_op_div_double: /* 0xae */
10512/* File: mips64/alt_stub.S */
10513/*
10514 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10515 * any interesting requests and then jump to the real instruction
10516 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10517 */
10518 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010519 REFRESH_IBASE
10520 dla ra, artMterpAsmInstructionStart
10521 dla t9, MterpCheckBefore
10522 move a0, rSELF
10523 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010524 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010525 daddu ra, ra, (174 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010526 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010527
10528/* ------------------------------ */
10529 .balign 128
10530.L_ALT_op_rem_double: /* 0xaf */
10531/* File: mips64/alt_stub.S */
10532/*
10533 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10534 * any interesting requests and then jump to the real instruction
10535 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10536 */
10537 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010538 REFRESH_IBASE
10539 dla ra, artMterpAsmInstructionStart
10540 dla t9, MterpCheckBefore
10541 move a0, rSELF
10542 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010543 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010544 daddu ra, ra, (175 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010545 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010546
10547/* ------------------------------ */
10548 .balign 128
10549.L_ALT_op_add_int_2addr: /* 0xb0 */
10550/* File: mips64/alt_stub.S */
10551/*
10552 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10553 * any interesting requests and then jump to the real instruction
10554 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10555 */
10556 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010557 REFRESH_IBASE
10558 dla ra, artMterpAsmInstructionStart
10559 dla t9, MterpCheckBefore
10560 move a0, rSELF
10561 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010562 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010563 daddu ra, ra, (176 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010564 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010565
10566/* ------------------------------ */
10567 .balign 128
10568.L_ALT_op_sub_int_2addr: /* 0xb1 */
10569/* File: mips64/alt_stub.S */
10570/*
10571 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10572 * any interesting requests and then jump to the real instruction
10573 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10574 */
10575 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010576 REFRESH_IBASE
10577 dla ra, artMterpAsmInstructionStart
10578 dla t9, MterpCheckBefore
10579 move a0, rSELF
10580 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010581 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010582 daddu ra, ra, (177 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010583 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010584
10585/* ------------------------------ */
10586 .balign 128
10587.L_ALT_op_mul_int_2addr: /* 0xb2 */
10588/* File: mips64/alt_stub.S */
10589/*
10590 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10591 * any interesting requests and then jump to the real instruction
10592 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10593 */
10594 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010595 REFRESH_IBASE
10596 dla ra, artMterpAsmInstructionStart
10597 dla t9, MterpCheckBefore
10598 move a0, rSELF
10599 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010600 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010601 daddu ra, ra, (178 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010602 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010603
10604/* ------------------------------ */
10605 .balign 128
10606.L_ALT_op_div_int_2addr: /* 0xb3 */
10607/* File: mips64/alt_stub.S */
10608/*
10609 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10610 * any interesting requests and then jump to the real instruction
10611 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10612 */
10613 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010614 REFRESH_IBASE
10615 dla ra, artMterpAsmInstructionStart
10616 dla t9, MterpCheckBefore
10617 move a0, rSELF
10618 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010619 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010620 daddu ra, ra, (179 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010621 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010622
10623/* ------------------------------ */
10624 .balign 128
10625.L_ALT_op_rem_int_2addr: /* 0xb4 */
10626/* File: mips64/alt_stub.S */
10627/*
10628 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10629 * any interesting requests and then jump to the real instruction
10630 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10631 */
10632 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010633 REFRESH_IBASE
10634 dla ra, artMterpAsmInstructionStart
10635 dla t9, MterpCheckBefore
10636 move a0, rSELF
10637 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010638 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010639 daddu ra, ra, (180 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010640 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010641
10642/* ------------------------------ */
10643 .balign 128
10644.L_ALT_op_and_int_2addr: /* 0xb5 */
10645/* File: mips64/alt_stub.S */
10646/*
10647 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10648 * any interesting requests and then jump to the real instruction
10649 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10650 */
10651 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010652 REFRESH_IBASE
10653 dla ra, artMterpAsmInstructionStart
10654 dla t9, MterpCheckBefore
10655 move a0, rSELF
10656 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010657 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010658 daddu ra, ra, (181 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010659 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010660
10661/* ------------------------------ */
10662 .balign 128
10663.L_ALT_op_or_int_2addr: /* 0xb6 */
10664/* File: mips64/alt_stub.S */
10665/*
10666 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10667 * any interesting requests and then jump to the real instruction
10668 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10669 */
10670 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010671 REFRESH_IBASE
10672 dla ra, artMterpAsmInstructionStart
10673 dla t9, MterpCheckBefore
10674 move a0, rSELF
10675 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010676 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010677 daddu ra, ra, (182 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010678 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010679
10680/* ------------------------------ */
10681 .balign 128
10682.L_ALT_op_xor_int_2addr: /* 0xb7 */
10683/* File: mips64/alt_stub.S */
10684/*
10685 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10686 * any interesting requests and then jump to the real instruction
10687 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10688 */
10689 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010690 REFRESH_IBASE
10691 dla ra, artMterpAsmInstructionStart
10692 dla t9, MterpCheckBefore
10693 move a0, rSELF
10694 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010695 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010696 daddu ra, ra, (183 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010697 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010698
10699/* ------------------------------ */
10700 .balign 128
10701.L_ALT_op_shl_int_2addr: /* 0xb8 */
10702/* File: mips64/alt_stub.S */
10703/*
10704 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10705 * any interesting requests and then jump to the real instruction
10706 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10707 */
10708 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010709 REFRESH_IBASE
10710 dla ra, artMterpAsmInstructionStart
10711 dla t9, MterpCheckBefore
10712 move a0, rSELF
10713 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010714 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010715 daddu ra, ra, (184 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010716 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010717
10718/* ------------------------------ */
10719 .balign 128
10720.L_ALT_op_shr_int_2addr: /* 0xb9 */
10721/* File: mips64/alt_stub.S */
10722/*
10723 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10724 * any interesting requests and then jump to the real instruction
10725 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10726 */
10727 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010728 REFRESH_IBASE
10729 dla ra, artMterpAsmInstructionStart
10730 dla t9, MterpCheckBefore
10731 move a0, rSELF
10732 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010733 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010734 daddu ra, ra, (185 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010735 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010736
10737/* ------------------------------ */
10738 .balign 128
10739.L_ALT_op_ushr_int_2addr: /* 0xba */
10740/* File: mips64/alt_stub.S */
10741/*
10742 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10743 * any interesting requests and then jump to the real instruction
10744 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10745 */
10746 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010747 REFRESH_IBASE
10748 dla ra, artMterpAsmInstructionStart
10749 dla t9, MterpCheckBefore
10750 move a0, rSELF
10751 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010752 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010753 daddu ra, ra, (186 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010754 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010755
10756/* ------------------------------ */
10757 .balign 128
10758.L_ALT_op_add_long_2addr: /* 0xbb */
10759/* File: mips64/alt_stub.S */
10760/*
10761 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10762 * any interesting requests and then jump to the real instruction
10763 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10764 */
10765 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010766 REFRESH_IBASE
10767 dla ra, artMterpAsmInstructionStart
10768 dla t9, MterpCheckBefore
10769 move a0, rSELF
10770 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010771 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010772 daddu ra, ra, (187 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010773 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010774
10775/* ------------------------------ */
10776 .balign 128
10777.L_ALT_op_sub_long_2addr: /* 0xbc */
10778/* File: mips64/alt_stub.S */
10779/*
10780 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10781 * any interesting requests and then jump to the real instruction
10782 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10783 */
10784 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010785 REFRESH_IBASE
10786 dla ra, artMterpAsmInstructionStart
10787 dla t9, MterpCheckBefore
10788 move a0, rSELF
10789 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010790 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010791 daddu ra, ra, (188 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010792 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010793
10794/* ------------------------------ */
10795 .balign 128
10796.L_ALT_op_mul_long_2addr: /* 0xbd */
10797/* File: mips64/alt_stub.S */
10798/*
10799 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10800 * any interesting requests and then jump to the real instruction
10801 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10802 */
10803 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010804 REFRESH_IBASE
10805 dla ra, artMterpAsmInstructionStart
10806 dla t9, MterpCheckBefore
10807 move a0, rSELF
10808 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010809 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010810 daddu ra, ra, (189 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010811 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010812
10813/* ------------------------------ */
10814 .balign 128
10815.L_ALT_op_div_long_2addr: /* 0xbe */
10816/* File: mips64/alt_stub.S */
10817/*
10818 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10819 * any interesting requests and then jump to the real instruction
10820 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10821 */
10822 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010823 REFRESH_IBASE
10824 dla ra, artMterpAsmInstructionStart
10825 dla t9, MterpCheckBefore
10826 move a0, rSELF
10827 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010828 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010829 daddu ra, ra, (190 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010830 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010831
10832/* ------------------------------ */
10833 .balign 128
10834.L_ALT_op_rem_long_2addr: /* 0xbf */
10835/* File: mips64/alt_stub.S */
10836/*
10837 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10838 * any interesting requests and then jump to the real instruction
10839 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10840 */
10841 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010842 REFRESH_IBASE
10843 dla ra, artMterpAsmInstructionStart
10844 dla t9, MterpCheckBefore
10845 move a0, rSELF
10846 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010847 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010848 daddu ra, ra, (191 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010849 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010850
10851/* ------------------------------ */
10852 .balign 128
10853.L_ALT_op_and_long_2addr: /* 0xc0 */
10854/* File: mips64/alt_stub.S */
10855/*
10856 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10857 * any interesting requests and then jump to the real instruction
10858 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10859 */
10860 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010861 REFRESH_IBASE
10862 dla ra, artMterpAsmInstructionStart
10863 dla t9, MterpCheckBefore
10864 move a0, rSELF
10865 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010866 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010867 daddu ra, ra, (192 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010868 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010869
10870/* ------------------------------ */
10871 .balign 128
10872.L_ALT_op_or_long_2addr: /* 0xc1 */
10873/* File: mips64/alt_stub.S */
10874/*
10875 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10876 * any interesting requests and then jump to the real instruction
10877 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10878 */
10879 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010880 REFRESH_IBASE
10881 dla ra, artMterpAsmInstructionStart
10882 dla t9, MterpCheckBefore
10883 move a0, rSELF
10884 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010885 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010886 daddu ra, ra, (193 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010887 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010888
10889/* ------------------------------ */
10890 .balign 128
10891.L_ALT_op_xor_long_2addr: /* 0xc2 */
10892/* File: mips64/alt_stub.S */
10893/*
10894 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10895 * any interesting requests and then jump to the real instruction
10896 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10897 */
10898 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010899 REFRESH_IBASE
10900 dla ra, artMterpAsmInstructionStart
10901 dla t9, MterpCheckBefore
10902 move a0, rSELF
10903 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010904 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010905 daddu ra, ra, (194 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010906 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010907
10908/* ------------------------------ */
10909 .balign 128
10910.L_ALT_op_shl_long_2addr: /* 0xc3 */
10911/* File: mips64/alt_stub.S */
10912/*
10913 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10914 * any interesting requests and then jump to the real instruction
10915 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10916 */
10917 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010918 REFRESH_IBASE
10919 dla ra, artMterpAsmInstructionStart
10920 dla t9, MterpCheckBefore
10921 move a0, rSELF
10922 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010923 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010924 daddu ra, ra, (195 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010925 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010926
10927/* ------------------------------ */
10928 .balign 128
10929.L_ALT_op_shr_long_2addr: /* 0xc4 */
10930/* File: mips64/alt_stub.S */
10931/*
10932 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10933 * any interesting requests and then jump to the real instruction
10934 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10935 */
10936 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010937 REFRESH_IBASE
10938 dla ra, artMterpAsmInstructionStart
10939 dla t9, MterpCheckBefore
10940 move a0, rSELF
10941 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010942 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010943 daddu ra, ra, (196 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010944 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010945
10946/* ------------------------------ */
10947 .balign 128
10948.L_ALT_op_ushr_long_2addr: /* 0xc5 */
10949/* File: mips64/alt_stub.S */
10950/*
10951 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10952 * any interesting requests and then jump to the real instruction
10953 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10954 */
10955 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010956 REFRESH_IBASE
10957 dla ra, artMterpAsmInstructionStart
10958 dla t9, MterpCheckBefore
10959 move a0, rSELF
10960 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010961 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010962 daddu ra, ra, (197 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010963 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010964
10965/* ------------------------------ */
10966 .balign 128
10967.L_ALT_op_add_float_2addr: /* 0xc6 */
10968/* File: mips64/alt_stub.S */
10969/*
10970 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10971 * any interesting requests and then jump to the real instruction
10972 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10973 */
10974 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010975 REFRESH_IBASE
10976 dla ra, artMterpAsmInstructionStart
10977 dla t9, MterpCheckBefore
10978 move a0, rSELF
10979 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010980 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080010981 daddu ra, ra, (198 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000010982 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080010983
10984/* ------------------------------ */
10985 .balign 128
10986.L_ALT_op_sub_float_2addr: /* 0xc7 */
10987/* File: mips64/alt_stub.S */
10988/*
10989 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10990 * any interesting requests and then jump to the real instruction
10991 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10992 */
10993 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080010994 REFRESH_IBASE
10995 dla ra, artMterpAsmInstructionStart
10996 dla t9, MterpCheckBefore
10997 move a0, rSELF
10998 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010999 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011000 daddu ra, ra, (199 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011001 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011002
11003/* ------------------------------ */
11004 .balign 128
11005.L_ALT_op_mul_float_2addr: /* 0xc8 */
11006/* File: mips64/alt_stub.S */
11007/*
11008 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11009 * any interesting requests and then jump to the real instruction
11010 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11011 */
11012 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011013 REFRESH_IBASE
11014 dla ra, artMterpAsmInstructionStart
11015 dla t9, MterpCheckBefore
11016 move a0, rSELF
11017 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011018 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011019 daddu ra, ra, (200 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011020 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011021
11022/* ------------------------------ */
11023 .balign 128
11024.L_ALT_op_div_float_2addr: /* 0xc9 */
11025/* File: mips64/alt_stub.S */
11026/*
11027 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11028 * any interesting requests and then jump to the real instruction
11029 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11030 */
11031 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011032 REFRESH_IBASE
11033 dla ra, artMterpAsmInstructionStart
11034 dla t9, MterpCheckBefore
11035 move a0, rSELF
11036 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011037 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011038 daddu ra, ra, (201 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011039 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011040
11041/* ------------------------------ */
11042 .balign 128
11043.L_ALT_op_rem_float_2addr: /* 0xca */
11044/* File: mips64/alt_stub.S */
11045/*
11046 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11047 * any interesting requests and then jump to the real instruction
11048 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11049 */
11050 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011051 REFRESH_IBASE
11052 dla ra, artMterpAsmInstructionStart
11053 dla t9, MterpCheckBefore
11054 move a0, rSELF
11055 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011056 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011057 daddu ra, ra, (202 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011058 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011059
11060/* ------------------------------ */
11061 .balign 128
11062.L_ALT_op_add_double_2addr: /* 0xcb */
11063/* File: mips64/alt_stub.S */
11064/*
11065 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11066 * any interesting requests and then jump to the real instruction
11067 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11068 */
11069 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011070 REFRESH_IBASE
11071 dla ra, artMterpAsmInstructionStart
11072 dla t9, MterpCheckBefore
11073 move a0, rSELF
11074 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011075 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011076 daddu ra, ra, (203 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011077 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011078
11079/* ------------------------------ */
11080 .balign 128
11081.L_ALT_op_sub_double_2addr: /* 0xcc */
11082/* File: mips64/alt_stub.S */
11083/*
11084 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11085 * any interesting requests and then jump to the real instruction
11086 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11087 */
11088 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011089 REFRESH_IBASE
11090 dla ra, artMterpAsmInstructionStart
11091 dla t9, MterpCheckBefore
11092 move a0, rSELF
11093 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011094 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011095 daddu ra, ra, (204 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011096 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011097
11098/* ------------------------------ */
11099 .balign 128
11100.L_ALT_op_mul_double_2addr: /* 0xcd */
11101/* File: mips64/alt_stub.S */
11102/*
11103 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11104 * any interesting requests and then jump to the real instruction
11105 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11106 */
11107 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011108 REFRESH_IBASE
11109 dla ra, artMterpAsmInstructionStart
11110 dla t9, MterpCheckBefore
11111 move a0, rSELF
11112 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011113 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011114 daddu ra, ra, (205 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011115 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011116
11117/* ------------------------------ */
11118 .balign 128
11119.L_ALT_op_div_double_2addr: /* 0xce */
11120/* File: mips64/alt_stub.S */
11121/*
11122 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11123 * any interesting requests and then jump to the real instruction
11124 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11125 */
11126 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011127 REFRESH_IBASE
11128 dla ra, artMterpAsmInstructionStart
11129 dla t9, MterpCheckBefore
11130 move a0, rSELF
11131 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011132 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011133 daddu ra, ra, (206 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011134 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011135
11136/* ------------------------------ */
11137 .balign 128
11138.L_ALT_op_rem_double_2addr: /* 0xcf */
11139/* File: mips64/alt_stub.S */
11140/*
11141 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11142 * any interesting requests and then jump to the real instruction
11143 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11144 */
11145 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011146 REFRESH_IBASE
11147 dla ra, artMterpAsmInstructionStart
11148 dla t9, MterpCheckBefore
11149 move a0, rSELF
11150 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011151 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011152 daddu ra, ra, (207 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011153 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011154
11155/* ------------------------------ */
11156 .balign 128
11157.L_ALT_op_add_int_lit16: /* 0xd0 */
11158/* File: mips64/alt_stub.S */
11159/*
11160 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11161 * any interesting requests and then jump to the real instruction
11162 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11163 */
11164 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011165 REFRESH_IBASE
11166 dla ra, artMterpAsmInstructionStart
11167 dla t9, MterpCheckBefore
11168 move a0, rSELF
11169 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011170 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011171 daddu ra, ra, (208 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011172 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011173
11174/* ------------------------------ */
11175 .balign 128
11176.L_ALT_op_rsub_int: /* 0xd1 */
11177/* File: mips64/alt_stub.S */
11178/*
11179 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11180 * any interesting requests and then jump to the real instruction
11181 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11182 */
11183 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011184 REFRESH_IBASE
11185 dla ra, artMterpAsmInstructionStart
11186 dla t9, MterpCheckBefore
11187 move a0, rSELF
11188 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011189 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011190 daddu ra, ra, (209 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011191 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011192
11193/* ------------------------------ */
11194 .balign 128
11195.L_ALT_op_mul_int_lit16: /* 0xd2 */
11196/* File: mips64/alt_stub.S */
11197/*
11198 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11199 * any interesting requests and then jump to the real instruction
11200 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11201 */
11202 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011203 REFRESH_IBASE
11204 dla ra, artMterpAsmInstructionStart
11205 dla t9, MterpCheckBefore
11206 move a0, rSELF
11207 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011208 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011209 daddu ra, ra, (210 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011210 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011211
11212/* ------------------------------ */
11213 .balign 128
11214.L_ALT_op_div_int_lit16: /* 0xd3 */
11215/* File: mips64/alt_stub.S */
11216/*
11217 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11218 * any interesting requests and then jump to the real instruction
11219 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11220 */
11221 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011222 REFRESH_IBASE
11223 dla ra, artMterpAsmInstructionStart
11224 dla t9, MterpCheckBefore
11225 move a0, rSELF
11226 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011227 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011228 daddu ra, ra, (211 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011229 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011230
11231/* ------------------------------ */
11232 .balign 128
11233.L_ALT_op_rem_int_lit16: /* 0xd4 */
11234/* File: mips64/alt_stub.S */
11235/*
11236 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11237 * any interesting requests and then jump to the real instruction
11238 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11239 */
11240 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011241 REFRESH_IBASE
11242 dla ra, artMterpAsmInstructionStart
11243 dla t9, MterpCheckBefore
11244 move a0, rSELF
11245 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011246 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011247 daddu ra, ra, (212 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011248 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011249
11250/* ------------------------------ */
11251 .balign 128
11252.L_ALT_op_and_int_lit16: /* 0xd5 */
11253/* File: mips64/alt_stub.S */
11254/*
11255 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11256 * any interesting requests and then jump to the real instruction
11257 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11258 */
11259 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011260 REFRESH_IBASE
11261 dla ra, artMterpAsmInstructionStart
11262 dla t9, MterpCheckBefore
11263 move a0, rSELF
11264 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011265 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011266 daddu ra, ra, (213 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011267 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011268
11269/* ------------------------------ */
11270 .balign 128
11271.L_ALT_op_or_int_lit16: /* 0xd6 */
11272/* File: mips64/alt_stub.S */
11273/*
11274 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11275 * any interesting requests and then jump to the real instruction
11276 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11277 */
11278 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011279 REFRESH_IBASE
11280 dla ra, artMterpAsmInstructionStart
11281 dla t9, MterpCheckBefore
11282 move a0, rSELF
11283 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011284 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011285 daddu ra, ra, (214 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011286 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011287
11288/* ------------------------------ */
11289 .balign 128
11290.L_ALT_op_xor_int_lit16: /* 0xd7 */
11291/* File: mips64/alt_stub.S */
11292/*
11293 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11294 * any interesting requests and then jump to the real instruction
11295 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11296 */
11297 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011298 REFRESH_IBASE
11299 dla ra, artMterpAsmInstructionStart
11300 dla t9, MterpCheckBefore
11301 move a0, rSELF
11302 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011303 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011304 daddu ra, ra, (215 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011305 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011306
11307/* ------------------------------ */
11308 .balign 128
11309.L_ALT_op_add_int_lit8: /* 0xd8 */
11310/* File: mips64/alt_stub.S */
11311/*
11312 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11313 * any interesting requests and then jump to the real instruction
11314 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11315 */
11316 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011317 REFRESH_IBASE
11318 dla ra, artMterpAsmInstructionStart
11319 dla t9, MterpCheckBefore
11320 move a0, rSELF
11321 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011322 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011323 daddu ra, ra, (216 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011324 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011325
11326/* ------------------------------ */
11327 .balign 128
11328.L_ALT_op_rsub_int_lit8: /* 0xd9 */
11329/* File: mips64/alt_stub.S */
11330/*
11331 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11332 * any interesting requests and then jump to the real instruction
11333 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11334 */
11335 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011336 REFRESH_IBASE
11337 dla ra, artMterpAsmInstructionStart
11338 dla t9, MterpCheckBefore
11339 move a0, rSELF
11340 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011341 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011342 daddu ra, ra, (217 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011343 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011344
11345/* ------------------------------ */
11346 .balign 128
11347.L_ALT_op_mul_int_lit8: /* 0xda */
11348/* File: mips64/alt_stub.S */
11349/*
11350 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11351 * any interesting requests and then jump to the real instruction
11352 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11353 */
11354 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011355 REFRESH_IBASE
11356 dla ra, artMterpAsmInstructionStart
11357 dla t9, MterpCheckBefore
11358 move a0, rSELF
11359 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011360 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011361 daddu ra, ra, (218 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011362 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011363
11364/* ------------------------------ */
11365 .balign 128
11366.L_ALT_op_div_int_lit8: /* 0xdb */
11367/* File: mips64/alt_stub.S */
11368/*
11369 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11370 * any interesting requests and then jump to the real instruction
11371 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11372 */
11373 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011374 REFRESH_IBASE
11375 dla ra, artMterpAsmInstructionStart
11376 dla t9, MterpCheckBefore
11377 move a0, rSELF
11378 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011379 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011380 daddu ra, ra, (219 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011381 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011382
11383/* ------------------------------ */
11384 .balign 128
11385.L_ALT_op_rem_int_lit8: /* 0xdc */
11386/* File: mips64/alt_stub.S */
11387/*
11388 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11389 * any interesting requests and then jump to the real instruction
11390 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11391 */
11392 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011393 REFRESH_IBASE
11394 dla ra, artMterpAsmInstructionStart
11395 dla t9, MterpCheckBefore
11396 move a0, rSELF
11397 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011398 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011399 daddu ra, ra, (220 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011400 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011401
11402/* ------------------------------ */
11403 .balign 128
11404.L_ALT_op_and_int_lit8: /* 0xdd */
11405/* File: mips64/alt_stub.S */
11406/*
11407 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11408 * any interesting requests and then jump to the real instruction
11409 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11410 */
11411 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011412 REFRESH_IBASE
11413 dla ra, artMterpAsmInstructionStart
11414 dla t9, MterpCheckBefore
11415 move a0, rSELF
11416 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011417 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011418 daddu ra, ra, (221 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011419 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011420
11421/* ------------------------------ */
11422 .balign 128
11423.L_ALT_op_or_int_lit8: /* 0xde */
11424/* File: mips64/alt_stub.S */
11425/*
11426 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11427 * any interesting requests and then jump to the real instruction
11428 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11429 */
11430 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011431 REFRESH_IBASE
11432 dla ra, artMterpAsmInstructionStart
11433 dla t9, MterpCheckBefore
11434 move a0, rSELF
11435 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011436 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011437 daddu ra, ra, (222 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011438 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011439
11440/* ------------------------------ */
11441 .balign 128
11442.L_ALT_op_xor_int_lit8: /* 0xdf */
11443/* File: mips64/alt_stub.S */
11444/*
11445 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11446 * any interesting requests and then jump to the real instruction
11447 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11448 */
11449 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011450 REFRESH_IBASE
11451 dla ra, artMterpAsmInstructionStart
11452 dla t9, MterpCheckBefore
11453 move a0, rSELF
11454 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011455 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011456 daddu ra, ra, (223 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011457 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011458
11459/* ------------------------------ */
11460 .balign 128
11461.L_ALT_op_shl_int_lit8: /* 0xe0 */
11462/* File: mips64/alt_stub.S */
11463/*
11464 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11465 * any interesting requests and then jump to the real instruction
11466 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11467 */
11468 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011469 REFRESH_IBASE
11470 dla ra, artMterpAsmInstructionStart
11471 dla t9, MterpCheckBefore
11472 move a0, rSELF
11473 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011474 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011475 daddu ra, ra, (224 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011476 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011477
11478/* ------------------------------ */
11479 .balign 128
11480.L_ALT_op_shr_int_lit8: /* 0xe1 */
11481/* File: mips64/alt_stub.S */
11482/*
11483 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11484 * any interesting requests and then jump to the real instruction
11485 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11486 */
11487 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011488 REFRESH_IBASE
11489 dla ra, artMterpAsmInstructionStart
11490 dla t9, MterpCheckBefore
11491 move a0, rSELF
11492 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011493 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011494 daddu ra, ra, (225 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011495 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011496
11497/* ------------------------------ */
11498 .balign 128
11499.L_ALT_op_ushr_int_lit8: /* 0xe2 */
11500/* File: mips64/alt_stub.S */
11501/*
11502 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11503 * any interesting requests and then jump to the real instruction
11504 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11505 */
11506 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011507 REFRESH_IBASE
11508 dla ra, artMterpAsmInstructionStart
11509 dla t9, MterpCheckBefore
11510 move a0, rSELF
11511 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011512 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011513 daddu ra, ra, (226 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011514 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011515
11516/* ------------------------------ */
11517 .balign 128
11518.L_ALT_op_iget_quick: /* 0xe3 */
11519/* File: mips64/alt_stub.S */
11520/*
11521 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11522 * any interesting requests and then jump to the real instruction
11523 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11524 */
11525 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011526 REFRESH_IBASE
11527 dla ra, artMterpAsmInstructionStart
11528 dla t9, MterpCheckBefore
11529 move a0, rSELF
11530 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011531 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011532 daddu ra, ra, (227 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011533 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011534
11535/* ------------------------------ */
11536 .balign 128
11537.L_ALT_op_iget_wide_quick: /* 0xe4 */
11538/* File: mips64/alt_stub.S */
11539/*
11540 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11541 * any interesting requests and then jump to the real instruction
11542 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11543 */
11544 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011545 REFRESH_IBASE
11546 dla ra, artMterpAsmInstructionStart
11547 dla t9, MterpCheckBefore
11548 move a0, rSELF
11549 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011550 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011551 daddu ra, ra, (228 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011552 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011553
11554/* ------------------------------ */
11555 .balign 128
11556.L_ALT_op_iget_object_quick: /* 0xe5 */
11557/* File: mips64/alt_stub.S */
11558/*
11559 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11560 * any interesting requests and then jump to the real instruction
11561 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11562 */
11563 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011564 REFRESH_IBASE
11565 dla ra, artMterpAsmInstructionStart
11566 dla t9, MterpCheckBefore
11567 move a0, rSELF
11568 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011569 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011570 daddu ra, ra, (229 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011571 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011572
11573/* ------------------------------ */
11574 .balign 128
11575.L_ALT_op_iput_quick: /* 0xe6 */
11576/* File: mips64/alt_stub.S */
11577/*
11578 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11579 * any interesting requests and then jump to the real instruction
11580 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11581 */
11582 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011583 REFRESH_IBASE
11584 dla ra, artMterpAsmInstructionStart
11585 dla t9, MterpCheckBefore
11586 move a0, rSELF
11587 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011588 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011589 daddu ra, ra, (230 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011590 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011591
11592/* ------------------------------ */
11593 .balign 128
11594.L_ALT_op_iput_wide_quick: /* 0xe7 */
11595/* File: mips64/alt_stub.S */
11596/*
11597 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11598 * any interesting requests and then jump to the real instruction
11599 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11600 */
11601 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011602 REFRESH_IBASE
11603 dla ra, artMterpAsmInstructionStart
11604 dla t9, MterpCheckBefore
11605 move a0, rSELF
11606 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011607 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011608 daddu ra, ra, (231 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011609 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011610
11611/* ------------------------------ */
11612 .balign 128
11613.L_ALT_op_iput_object_quick: /* 0xe8 */
11614/* File: mips64/alt_stub.S */
11615/*
11616 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11617 * any interesting requests and then jump to the real instruction
11618 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11619 */
11620 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011621 REFRESH_IBASE
11622 dla ra, artMterpAsmInstructionStart
11623 dla t9, MterpCheckBefore
11624 move a0, rSELF
11625 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011626 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011627 daddu ra, ra, (232 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011628 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011629
11630/* ------------------------------ */
11631 .balign 128
11632.L_ALT_op_invoke_virtual_quick: /* 0xe9 */
11633/* File: mips64/alt_stub.S */
11634/*
11635 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11636 * any interesting requests and then jump to the real instruction
11637 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11638 */
11639 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011640 REFRESH_IBASE
11641 dla ra, artMterpAsmInstructionStart
11642 dla t9, MterpCheckBefore
11643 move a0, rSELF
11644 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011645 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011646 daddu ra, ra, (233 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011647 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011648
11649/* ------------------------------ */
11650 .balign 128
11651.L_ALT_op_invoke_virtual_range_quick: /* 0xea */
11652/* File: mips64/alt_stub.S */
11653/*
11654 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11655 * any interesting requests and then jump to the real instruction
11656 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11657 */
11658 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011659 REFRESH_IBASE
11660 dla ra, artMterpAsmInstructionStart
11661 dla t9, MterpCheckBefore
11662 move a0, rSELF
11663 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011664 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011665 daddu ra, ra, (234 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011666 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011667
11668/* ------------------------------ */
11669 .balign 128
11670.L_ALT_op_iput_boolean_quick: /* 0xeb */
11671/* File: mips64/alt_stub.S */
11672/*
11673 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11674 * any interesting requests and then jump to the real instruction
11675 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11676 */
11677 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011678 REFRESH_IBASE
11679 dla ra, artMterpAsmInstructionStart
11680 dla t9, MterpCheckBefore
11681 move a0, rSELF
11682 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011683 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011684 daddu ra, ra, (235 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011685 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011686
11687/* ------------------------------ */
11688 .balign 128
11689.L_ALT_op_iput_byte_quick: /* 0xec */
11690/* File: mips64/alt_stub.S */
11691/*
11692 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11693 * any interesting requests and then jump to the real instruction
11694 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11695 */
11696 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011697 REFRESH_IBASE
11698 dla ra, artMterpAsmInstructionStart
11699 dla t9, MterpCheckBefore
11700 move a0, rSELF
11701 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011702 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011703 daddu ra, ra, (236 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011704 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011705
11706/* ------------------------------ */
11707 .balign 128
11708.L_ALT_op_iput_char_quick: /* 0xed */
11709/* File: mips64/alt_stub.S */
11710/*
11711 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11712 * any interesting requests and then jump to the real instruction
11713 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11714 */
11715 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011716 REFRESH_IBASE
11717 dla ra, artMterpAsmInstructionStart
11718 dla t9, MterpCheckBefore
11719 move a0, rSELF
11720 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011721 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011722 daddu ra, ra, (237 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011723 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011724
11725/* ------------------------------ */
11726 .balign 128
11727.L_ALT_op_iput_short_quick: /* 0xee */
11728/* File: mips64/alt_stub.S */
11729/*
11730 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11731 * any interesting requests and then jump to the real instruction
11732 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11733 */
11734 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011735 REFRESH_IBASE
11736 dla ra, artMterpAsmInstructionStart
11737 dla t9, MterpCheckBefore
11738 move a0, rSELF
11739 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011740 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011741 daddu ra, ra, (238 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011742 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011743
11744/* ------------------------------ */
11745 .balign 128
11746.L_ALT_op_iget_boolean_quick: /* 0xef */
11747/* File: mips64/alt_stub.S */
11748/*
11749 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11750 * any interesting requests and then jump to the real instruction
11751 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11752 */
11753 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011754 REFRESH_IBASE
11755 dla ra, artMterpAsmInstructionStart
11756 dla t9, MterpCheckBefore
11757 move a0, rSELF
11758 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011759 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011760 daddu ra, ra, (239 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011761 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011762
11763/* ------------------------------ */
11764 .balign 128
11765.L_ALT_op_iget_byte_quick: /* 0xf0 */
11766/* File: mips64/alt_stub.S */
11767/*
11768 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11769 * any interesting requests and then jump to the real instruction
11770 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11771 */
11772 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011773 REFRESH_IBASE
11774 dla ra, artMterpAsmInstructionStart
11775 dla t9, MterpCheckBefore
11776 move a0, rSELF
11777 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011778 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011779 daddu ra, ra, (240 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011780 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011781
11782/* ------------------------------ */
11783 .balign 128
11784.L_ALT_op_iget_char_quick: /* 0xf1 */
11785/* File: mips64/alt_stub.S */
11786/*
11787 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11788 * any interesting requests and then jump to the real instruction
11789 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11790 */
11791 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011792 REFRESH_IBASE
11793 dla ra, artMterpAsmInstructionStart
11794 dla t9, MterpCheckBefore
11795 move a0, rSELF
11796 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011797 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011798 daddu ra, ra, (241 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011799 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011800
11801/* ------------------------------ */
11802 .balign 128
11803.L_ALT_op_iget_short_quick: /* 0xf2 */
11804/* File: mips64/alt_stub.S */
11805/*
11806 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11807 * any interesting requests and then jump to the real instruction
11808 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11809 */
11810 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011811 REFRESH_IBASE
11812 dla ra, artMterpAsmInstructionStart
11813 dla t9, MterpCheckBefore
11814 move a0, rSELF
11815 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011816 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011817 daddu ra, ra, (242 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011818 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011819
11820/* ------------------------------ */
11821 .balign 128
Narayan Kamath14832ef2016-08-05 11:44:32 +010011822.L_ALT_op_unused_f3: /* 0xf3 */
Alexey Frunze00b53b72016-02-02 20:25:45 -080011823/* File: mips64/alt_stub.S */
11824/*
11825 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11826 * any interesting requests and then jump to the real instruction
11827 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11828 */
11829 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011830 REFRESH_IBASE
11831 dla ra, artMterpAsmInstructionStart
11832 dla t9, MterpCheckBefore
11833 move a0, rSELF
11834 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011835 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011836 daddu ra, ra, (243 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011837 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011838
11839/* ------------------------------ */
11840 .balign 128
11841.L_ALT_op_unused_f4: /* 0xf4 */
11842/* File: mips64/alt_stub.S */
11843/*
11844 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11845 * any interesting requests and then jump to the real instruction
11846 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11847 */
11848 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011849 REFRESH_IBASE
11850 dla ra, artMterpAsmInstructionStart
11851 dla t9, MterpCheckBefore
11852 move a0, rSELF
11853 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011854 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011855 daddu ra, ra, (244 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011856 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011857
11858/* ------------------------------ */
11859 .balign 128
Narayan Kamath14832ef2016-08-05 11:44:32 +010011860.L_ALT_op_unused_f5: /* 0xf5 */
Alexey Frunze00b53b72016-02-02 20:25:45 -080011861/* File: mips64/alt_stub.S */
11862/*
11863 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11864 * any interesting requests and then jump to the real instruction
11865 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11866 */
11867 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011868 REFRESH_IBASE
11869 dla ra, artMterpAsmInstructionStart
11870 dla t9, MterpCheckBefore
11871 move a0, rSELF
11872 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011873 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011874 daddu ra, ra, (245 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011875 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011876
11877/* ------------------------------ */
11878 .balign 128
Narayan Kamath14832ef2016-08-05 11:44:32 +010011879.L_ALT_op_unused_f6: /* 0xf6 */
Alexey Frunze00b53b72016-02-02 20:25:45 -080011880/* File: mips64/alt_stub.S */
11881/*
11882 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11883 * any interesting requests and then jump to the real instruction
11884 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11885 */
11886 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011887 REFRESH_IBASE
11888 dla ra, artMterpAsmInstructionStart
11889 dla t9, MterpCheckBefore
11890 move a0, rSELF
11891 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011892 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011893 daddu ra, ra, (246 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011894 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011895
11896/* ------------------------------ */
11897 .balign 128
Narayan Kamath14832ef2016-08-05 11:44:32 +010011898.L_ALT_op_unused_f7: /* 0xf7 */
Alexey Frunze00b53b72016-02-02 20:25:45 -080011899/* File: mips64/alt_stub.S */
11900/*
11901 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11902 * any interesting requests and then jump to the real instruction
11903 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11904 */
11905 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011906 REFRESH_IBASE
11907 dla ra, artMterpAsmInstructionStart
11908 dla t9, MterpCheckBefore
11909 move a0, rSELF
11910 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011911 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011912 daddu ra, ra, (247 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011913 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011914
11915/* ------------------------------ */
11916 .balign 128
Narayan Kamath14832ef2016-08-05 11:44:32 +010011917.L_ALT_op_unused_f8: /* 0xf8 */
Alexey Frunze00b53b72016-02-02 20:25:45 -080011918/* File: mips64/alt_stub.S */
11919/*
11920 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11921 * any interesting requests and then jump to the real instruction
11922 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11923 */
11924 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011925 REFRESH_IBASE
11926 dla ra, artMterpAsmInstructionStart
11927 dla t9, MterpCheckBefore
11928 move a0, rSELF
11929 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011930 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011931 daddu ra, ra, (248 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011932 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011933
11934/* ------------------------------ */
11935 .balign 128
Narayan Kamath14832ef2016-08-05 11:44:32 +010011936.L_ALT_op_unused_f9: /* 0xf9 */
Alexey Frunze00b53b72016-02-02 20:25:45 -080011937/* File: mips64/alt_stub.S */
11938/*
11939 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11940 * any interesting requests and then jump to the real instruction
11941 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11942 */
11943 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011944 REFRESH_IBASE
11945 dla ra, artMterpAsmInstructionStart
11946 dla t9, MterpCheckBefore
11947 move a0, rSELF
11948 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011949 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011950 daddu ra, ra, (249 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011951 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011952
11953/* ------------------------------ */
11954 .balign 128
buzbee8a287142016-10-07 12:56:32 -070011955.L_ALT_op_invoke_polymorphic: /* 0xfa */
Alexey Frunze00b53b72016-02-02 20:25:45 -080011956/* File: mips64/alt_stub.S */
11957/*
11958 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11959 * any interesting requests and then jump to the real instruction
11960 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11961 */
11962 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011963 REFRESH_IBASE
11964 dla ra, artMterpAsmInstructionStart
11965 dla t9, MterpCheckBefore
11966 move a0, rSELF
11967 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011968 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011969 daddu ra, ra, (250 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011970 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011971
11972/* ------------------------------ */
11973 .balign 128
buzbee8a287142016-10-07 12:56:32 -070011974.L_ALT_op_invoke_polymorphic_range: /* 0xfb */
Alexey Frunze00b53b72016-02-02 20:25:45 -080011975/* File: mips64/alt_stub.S */
11976/*
11977 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11978 * any interesting requests and then jump to the real instruction
11979 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11980 */
11981 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080011982 REFRESH_IBASE
11983 dla ra, artMterpAsmInstructionStart
11984 dla t9, MterpCheckBefore
11985 move a0, rSELF
11986 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011987 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080011988 daddu ra, ra, (251 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000011989 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080011990
11991/* ------------------------------ */
11992 .balign 128
11993.L_ALT_op_unused_fc: /* 0xfc */
11994/* File: mips64/alt_stub.S */
11995/*
11996 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11997 * any interesting requests and then jump to the real instruction
11998 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11999 */
12000 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080012001 REFRESH_IBASE
12002 dla ra, artMterpAsmInstructionStart
12003 dla t9, MterpCheckBefore
12004 move a0, rSELF
12005 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000012006 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080012007 daddu ra, ra, (252 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000012008 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080012009
12010/* ------------------------------ */
12011 .balign 128
12012.L_ALT_op_unused_fd: /* 0xfd */
12013/* File: mips64/alt_stub.S */
12014/*
12015 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12016 * any interesting requests and then jump to the real instruction
12017 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12018 */
12019 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080012020 REFRESH_IBASE
12021 dla ra, artMterpAsmInstructionStart
12022 dla t9, MterpCheckBefore
12023 move a0, rSELF
12024 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000012025 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080012026 daddu ra, ra, (253 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000012027 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080012028
12029/* ------------------------------ */
12030 .balign 128
12031.L_ALT_op_unused_fe: /* 0xfe */
12032/* File: mips64/alt_stub.S */
12033/*
12034 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12035 * any interesting requests and then jump to the real instruction
12036 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12037 */
12038 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080012039 REFRESH_IBASE
12040 dla ra, artMterpAsmInstructionStart
12041 dla t9, MterpCheckBefore
12042 move a0, rSELF
12043 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000012044 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080012045 daddu ra, ra, (254 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000012046 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080012047
12048/* ------------------------------ */
12049 .balign 128
12050.L_ALT_op_unused_ff: /* 0xff */
12051/* File: mips64/alt_stub.S */
12052/*
12053 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12054 * any interesting requests and then jump to the real instruction
12055 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12056 */
12057 .extern MterpCheckBefore
Alexey Frunze00b53b72016-02-02 20:25:45 -080012058 REFRESH_IBASE
12059 dla ra, artMterpAsmInstructionStart
12060 dla t9, MterpCheckBefore
12061 move a0, rSELF
12062 daddu a1, rFP, OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000012063 move a2, rPC
Alexey Frunze00b53b72016-02-02 20:25:45 -080012064 daddu ra, ra, (255 * 128) # Addr of primary handler.
Bill Buzbeed47fd902016-07-07 14:42:43 +000012065 jalr zero, t9 # (self, shadow_frame, dex_pc_ptr) Note: tail call.
Alexey Frunze00b53b72016-02-02 20:25:45 -080012066
12067 .balign 128
12068 .size artMterpAsmAltInstructionStart, .-artMterpAsmAltInstructionStart
12069 .global artMterpAsmAltInstructionEnd
12070artMterpAsmAltInstructionEnd:
12071/* File: mips64/footer.S */
12072/*
12073 * We've detected a condition that will result in an exception, but the exception
12074 * has not yet been thrown. Just bail out to the reference interpreter to deal with it.
12075 * TUNING: for consistency, we may want to just go ahead and handle these here.
12076 */
12077
12078 .extern MterpLogDivideByZeroException
12079common_errDivideByZero:
12080 EXPORT_PC
12081#if MTERP_LOGGING
12082 move a0, rSELF
12083 daddu a1, rFP, OFF_FP_SHADOWFRAME
12084 jal MterpLogDivideByZeroException
12085#endif
12086 b MterpCommonFallback
12087
12088 .extern MterpLogArrayIndexException
12089common_errArrayIndex:
12090 EXPORT_PC
12091#if MTERP_LOGGING
12092 move a0, rSELF
12093 daddu a1, rFP, OFF_FP_SHADOWFRAME
12094 jal MterpLogArrayIndexException
12095#endif
12096 b MterpCommonFallback
12097
12098 .extern MterpLogNullObjectException
12099common_errNullObject:
12100 EXPORT_PC
12101#if MTERP_LOGGING
12102 move a0, rSELF
12103 daddu a1, rFP, OFF_FP_SHADOWFRAME
12104 jal MterpLogNullObjectException
12105#endif
12106 b MterpCommonFallback
12107
12108/*
12109 * If we're here, something is out of the ordinary. If there is a pending
12110 * exception, handle it. Otherwise, roll back and retry with the reference
12111 * interpreter.
12112 */
12113MterpPossibleException:
12114 ld a0, THREAD_EXCEPTION_OFFSET(rSELF)
12115 beqzc a0, MterpFallback # If not, fall back to reference interpreter.
12116 /* intentional fallthrough - handle pending exception. */
12117/*
12118 * On return from a runtime helper routine, we've found a pending exception.
12119 * Can we handle it here - or need to bail out to caller?
12120 *
12121 */
12122 .extern MterpHandleException
Alexey Frunzedb045be2016-03-03 17:50:48 -080012123 .extern MterpShouldSwitchInterpreters
Alexey Frunze00b53b72016-02-02 20:25:45 -080012124MterpException:
12125 move a0, rSELF
12126 daddu a1, rFP, OFF_FP_SHADOWFRAME
12127 jal MterpHandleException # (self, shadow_frame)
12128 beqzc v0, MterpExceptionReturn # no local catch, back to caller.
12129 ld a0, OFF_FP_CODE_ITEM(rFP)
12130 lwu a1, OFF_FP_DEX_PC(rFP)
12131 REFRESH_IBASE
12132 daddu rPC, a0, CODEITEM_INSNS_OFFSET
12133 dlsa rPC, a1, rPC, 1 # generate new dex_pc_ptr
Alexey Frunzedb045be2016-03-03 17:50:48 -080012134 /* Do we need to switch interpreters? */
12135 jal MterpShouldSwitchInterpreters
12136 bnezc v0, MterpFallback
Alexey Frunze00b53b72016-02-02 20:25:45 -080012137 /* resume execution at catch block */
Alexey Frunzedb045be2016-03-03 17:50:48 -080012138 EXPORT_PC
Alexey Frunze00b53b72016-02-02 20:25:45 -080012139 FETCH_INST
12140 GET_INST_OPCODE v0
12141 GOTO_OPCODE v0
12142 /* NOTE: no fallthrough */
12143
12144/*
Douglas Leung020b18a2016-06-03 18:05:35 -070012145 * Common handling for branches with support for Jit profiling.
12146 * On entry:
12147 * rINST <= signed offset
12148 * rPROFILE <= signed hotness countdown (expanded to 64 bits)
12149 *
12150 * We have quite a few different cases for branch profiling, OSR detection and
12151 * suspend check support here.
12152 *
12153 * Taken backward branches:
12154 * If profiling active, do hotness countdown and report if we hit zero.
12155 * If in osr check mode, see if our target is a compiled loop header entry and do OSR if so.
12156 * Is there a pending suspend request? If so, suspend.
12157 *
12158 * Taken forward branches and not-taken backward branches:
12159 * If in osr check mode, see if our target is a compiled loop header entry and do OSR if so.
12160 *
12161 * Our most common case is expected to be a taken backward branch with active jit profiling,
12162 * but no full OSR check and no pending suspend request.
12163 * Next most common case is not-taken branch with no full OSR check.
12164 *
Alexey Frunze00b53b72016-02-02 20:25:45 -080012165 */
Douglas Leung020b18a2016-06-03 18:05:35 -070012166MterpCommonTakenBranchNoFlags:
12167 bgtzc rINST, .L_forward_branch # don't add forward branches to hotness
12168/*
12169 * We need to subtract 1 from positive values and we should not see 0 here,
12170 * so we may use the result of the comparison with -1.
12171 */
12172 li v0, JIT_CHECK_OSR
12173 beqc rPROFILE, v0, .L_osr_check
12174 bltc rPROFILE, v0, .L_resume_backward_branch
12175 dsubu rPROFILE, 1
12176 beqzc rPROFILE, .L_add_batch # counted down to zero - report
12177.L_resume_backward_branch:
12178 lw ra, THREAD_FLAGS_OFFSET(rSELF)
Alexey Frunze00b53b72016-02-02 20:25:45 -080012179 REFRESH_IBASE
Douglas Leung020b18a2016-06-03 18:05:35 -070012180 daddu a2, rINST, rINST # a2<- byte offset
12181 FETCH_ADVANCE_INST_RB a2 # update rPC, load rINST
Hiroshi Yamauchi30493242016-11-03 13:06:52 -070012182 and ra, THREAD_SUSPEND_OR_CHECKPOINT_REQUEST
Douglas Leung020b18a2016-06-03 18:05:35 -070012183 bnezc ra, .L_suspend_request_pending
12184 GET_INST_OPCODE v0 # extract opcode from rINST
12185 GOTO_OPCODE v0 # jump to next instruction
12186
12187.L_suspend_request_pending:
Alexey Frunze00b53b72016-02-02 20:25:45 -080012188 EXPORT_PC
12189 move a0, rSELF
Douglas Leung020b18a2016-06-03 18:05:35 -070012190 jal MterpSuspendCheck # (self)
12191 bnezc v0, MterpFallback
12192 REFRESH_IBASE # might have changed during suspend
12193 GET_INST_OPCODE v0 # extract opcode from rINST
12194 GOTO_OPCODE v0 # jump to next instruction
12195
12196.L_no_count_backwards:
12197 li v0, JIT_CHECK_OSR # check for possible OSR re-entry
12198 bnec rPROFILE, v0, .L_resume_backward_branch
12199.L_osr_check:
12200 move a0, rSELF
12201 daddu a1, rFP, OFF_FP_SHADOWFRAME
12202 move a2, rINST
12203 EXPORT_PC
12204 jal MterpMaybeDoOnStackReplacement # (self, shadow_frame, offset)
12205 bnezc v0, MterpOnStackReplacement
12206 b .L_resume_backward_branch
12207
12208.L_forward_branch:
12209 li v0, JIT_CHECK_OSR # check for possible OSR re-entry
12210 beqc rPROFILE, v0, .L_check_osr_forward
12211.L_resume_forward_branch:
12212 daddu a2, rINST, rINST # a2<- byte offset
12213 FETCH_ADVANCE_INST_RB a2 # update rPC, load rINST
12214 GET_INST_OPCODE v0 # extract opcode from rINST
12215 GOTO_OPCODE v0 # jump to next instruction
12216
12217.L_check_osr_forward:
12218 move a0, rSELF
12219 daddu a1, rFP, OFF_FP_SHADOWFRAME
12220 move a2, rINST
12221 EXPORT_PC
12222 jal MterpMaybeDoOnStackReplacement # (self, shadow_frame, offset)
12223 bnezc v0, MterpOnStackReplacement
12224 b .L_resume_forward_branch
12225
12226.L_add_batch:
12227 daddu a1, rFP, OFF_FP_SHADOWFRAME
12228 sh rPROFILE, SHADOWFRAME_HOTNESS_COUNTDOWN_OFFSET(a1)
12229 ld a0, OFF_FP_METHOD(rFP)
12230 move a2, rSELF
12231 jal MterpAddHotnessBatch # (method, shadow_frame, self)
12232 move rPROFILE, v0 # restore new hotness countdown to rPROFILE
12233 b .L_no_count_backwards
12234
12235/*
12236 * Entered from the conditional branch handlers when OSR check request active on
12237 * not-taken path. All Dalvik not-taken conditional branch offsets are 2.
12238 */
12239.L_check_not_taken_osr:
12240 move a0, rSELF
12241 daddu a1, rFP, OFF_FP_SHADOWFRAME
12242 li a2, 2
12243 EXPORT_PC
12244 jal MterpMaybeDoOnStackReplacement # (self, shadow_frame, offset)
12245 bnezc v0, MterpOnStackReplacement
12246 FETCH_ADVANCE_INST 2
12247 GET_INST_OPCODE v0 # extract opcode from rINST
12248 GOTO_OPCODE v0 # jump to next instruction
Alexey Frunze00b53b72016-02-02 20:25:45 -080012249
12250/*
Alexey Frunzedb045be2016-03-03 17:50:48 -080012251 * On-stack replacement has happened, and now we've returned from the compiled method.
12252 */
12253MterpOnStackReplacement:
12254#if MTERP_LOGGING
12255 move a0, rSELF
12256 daddu a1, rFP, OFF_FP_SHADOWFRAME
12257 move a2, rINST # rINST contains offset
12258 jal MterpLogOSR
12259#endif
12260 li v0, 1 # Signal normal return
12261 b MterpDone
12262
12263/*
Alexey Frunze00b53b72016-02-02 20:25:45 -080012264 * Bail out to reference interpreter.
12265 */
12266 .extern MterpLogFallback
12267MterpFallback:
12268 EXPORT_PC
12269#if MTERP_LOGGING
12270 move a0, rSELF
12271 daddu a1, rFP, OFF_FP_SHADOWFRAME
12272 jal MterpLogFallback
12273#endif
12274MterpCommonFallback:
12275 li v0, 0 # signal retry with reference interpreter.
12276 b MterpDone
12277
12278/*
12279 * We pushed some registers on the stack in ExecuteMterpImpl, then saved
12280 * SP and RA. Here we restore SP, restore the registers, and then restore
12281 * RA to PC.
12282 *
12283 * On entry:
12284 * uint32_t* rFP (should still be live, pointer to base of vregs)
12285 */
12286MterpExceptionReturn:
12287 li v0, 1 # signal return to caller.
12288 b MterpDone
12289/*
12290 * Returned value is expected in a0 and if it's not 64-bit, the 32 most
Douglas Leung4b787062016-08-26 15:25:31 -070012291 * significant bits of a0 must be zero-extended or sign-extended
12292 * depending on the return type.
Alexey Frunze00b53b72016-02-02 20:25:45 -080012293 */
12294MterpReturn:
12295 ld a2, OFF_FP_RESULT_REGISTER(rFP)
12296 lw ra, THREAD_FLAGS_OFFSET(rSELF)
12297 sd a0, 0(a2)
12298 move a0, rSELF
Hiroshi Yamauchi30493242016-11-03 13:06:52 -070012299 and ra, ra, THREAD_SUSPEND_OR_CHECKPOINT_REQUEST
Alexey Frunze00b53b72016-02-02 20:25:45 -080012300 beqzc ra, check2
12301 jal MterpSuspendCheck # (self)
12302check2:
12303 li v0, 1 # signal return to caller.
12304MterpDone:
Douglas Leung020b18a2016-06-03 18:05:35 -070012305/*
12306 * At this point, we expect rPROFILE to be non-zero. If negative, hotness is disabled or we're
12307 * checking for OSR. If greater than zero, we might have unreported hotness to register
12308 * (the difference between the ending rPROFILE and the cached hotness counter). rPROFILE
12309 * should only reach zero immediately after a hotness decrement, and is then reset to either
12310 * a negative special state or the new non-zero countdown value.
12311 */
12312 blez rPROFILE, .L_pop_and_return # if > 0, we may have some counts to report.
12313
12314MterpProfileActive:
12315 move rINST, v0 # stash return value
12316 /* Report cached hotness counts */
12317 ld a0, OFF_FP_METHOD(rFP)
12318 daddu a1, rFP, OFF_FP_SHADOWFRAME
12319 move a2, rSELF
12320 sh rPROFILE, SHADOWFRAME_HOTNESS_COUNTDOWN_OFFSET(a1)
12321 jal MterpAddHotnessBatch # (method, shadow_frame, self)
12322 move v0, rINST # restore return value
12323
12324.L_pop_and_return:
12325 ld s6, STACK_OFFSET_S6(sp)
12326 .cfi_restore 22
Alexey Frunze00b53b72016-02-02 20:25:45 -080012327 ld s5, STACK_OFFSET_S5(sp)
12328 .cfi_restore 21
12329 ld s4, STACK_OFFSET_S4(sp)
12330 .cfi_restore 20
12331 ld s3, STACK_OFFSET_S3(sp)
12332 .cfi_restore 19
12333 ld s2, STACK_OFFSET_S2(sp)
12334 .cfi_restore 18
12335 ld s1, STACK_OFFSET_S1(sp)
12336 .cfi_restore 17
12337 ld s0, STACK_OFFSET_S0(sp)
12338 .cfi_restore 16
12339
12340 ld ra, STACK_OFFSET_RA(sp)
12341 .cfi_restore 31
12342
12343 ld t8, STACK_OFFSET_GP(sp)
12344 .cpreturn
12345 .cfi_restore 28
12346
12347 .set noreorder
12348 jr ra
12349 daddu sp, sp, STACK_SIZE
12350 .cfi_adjust_cfa_offset -STACK_SIZE
12351
12352 .cfi_endproc
Douglas Leung020b18a2016-06-03 18:05:35 -070012353 .set reorder
Alexey Frunze00b53b72016-02-02 20:25:45 -080012354 .size ExecuteMterpImpl, .-ExecuteMterpImpl
12355