blob: 96229ceba0b60007b43905eb20b7027a56f8e366 [file] [log] [blame]
Bill Buzbee7c58bd42016-01-20 20:46:01 +00001/*
2 * This file was generated automatically by gen-mterp.py for 'x86'.
3 *
4 * --> DO NOT EDIT <--
5 */
6
7/* File: x86/header.S */
8/*
9 * Copyright (C) 2016 The Android Open Source Project
10 *
11 * Licensed under the Apache License, Version 2.0 (the "License");
12 * you may not use this file except in compliance with the License.
13 * You may obtain a copy of the License at
14 *
15 * http://www.apache.org/licenses/LICENSE-2.0
16 *
17 * Unless required by applicable law or agreed to in writing, software
18 * distributed under the License is distributed on an "AS IS" BASIS,
19 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20 * See the License for the specific language governing permissions and
21 * limitations under the License.
22 */
23
24/*
25 Art assembly interpreter notes:
26
27 First validate assembly code by implementing ExecuteXXXImpl() style body (doesn't
28 handle invoke, allows higher-level code to create frame & shadow frame.
29
30 Once that's working, support direct entry code & eliminate shadow frame (and
31 excess locals allocation.
32
33 Some (hopefully) temporary ugliness. We'll treat rFP as pointing to the
34 base of the vreg array within the shadow frame. Access the other fields,
35 dex_pc_, method_ and number_of_vregs_ via negative offsets. For now, we'll continue
36 the shadow frame mechanism of double-storing object references - via rFP &
37 number_of_vregs_.
38
39 */
40
41/*
42x86 ABI general notes:
43
44Caller save set:
45 eax, edx, ecx, st(0)-st(7)
46Callee save set:
47 ebx, esi, edi, ebp
48Return regs:
49 32-bit in eax
50 64-bit in edx:eax (low-order 32 in eax)
51 fp on top of fp stack st(0)
52
53Parameters passed on stack, pushed right-to-left. On entry to target, first
54parm is at 4(%esp). Traditional entry code is:
55
56functEntry:
57 push %ebp # save old frame pointer
58 mov %ebp,%esp # establish new frame pointer
59 sub FrameSize,%esp # Allocate storage for spill, locals & outs
60
61Once past the prologue, arguments are referenced at ((argno + 2)*4)(%ebp)
62
63Stack must be 16-byte aligned to support SSE in native code.
64
65If we're not doing variable stack allocation (alloca), the frame pointer can be
66eliminated and all arg references adjusted to be esp relative.
67*/
68
69/*
70Mterp and x86 notes:
71
72Some key interpreter variables will be assigned to registers.
73
74 nick reg purpose
75 rPC esi interpreted program counter, used for fetching instructions
76 rFP edi interpreted frame pointer, used for accessing locals and args
77 rINSTw bx first 16-bit code of current instruction
78 rINSTbl bl opcode portion of instruction word
79 rINSTbh bh high byte of inst word, usually contains src/tgt reg names
80 rIBASE edx base of instruction handler table
81 rREFS ebp base of object references in shadow frame.
82
83Notes:
84 o High order 16 bits of ebx must be zero on entry to handler
85 o rPC, rFP, rINSTw/rINSTbl valid on handler entry and exit
86 o eax and ecx are scratch, rINSTw/ebx sometimes scratch
87
88Macros are provided for common operations. Each macro MUST emit only
89one instruction to make instruction-counting easier. They MUST NOT alter
90unspecified registers or condition codes.
91*/
92
93/*
94 * This is a #include, not a %include, because we want the C pre-processor
95 * to expand the macros into assembler assignment statements.
96 */
97#include "asm_support.h"
98
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060099/*
100 * Handle mac compiler specific
101 */
102#if defined(__APPLE__)
103 #define MACRO_LITERAL(value) $(value)
104 #define FUNCTION_TYPE(name)
105 #define SIZE(start,end)
106 // Mac OS' symbols have an _ prefix.
107 #define SYMBOL(name) _ ## name
108#else
109 #define MACRO_LITERAL(value) $value
110 #define FUNCTION_TYPE(name) .type name, @function
111 #define SIZE(start,end) .size start, .-end
112 #define SYMBOL(name) name
113#endif
114
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000115/* Frame size must be 16-byte aligned.
116 * Remember about 4 bytes for return address
117 */
118#define FRAME_SIZE 44
119
120/* Frame diagram while executing ExecuteMterpImpl, high to low addresses */
121#define IN_ARG3 (FRAME_SIZE + 16)
122#define IN_ARG2 (FRAME_SIZE + 12)
123#define IN_ARG1 (FRAME_SIZE + 8)
124#define IN_ARG0 (FRAME_SIZE + 4)
125#define CALLER_RP (FRAME_SIZE + 0)
126/* Spill offsets relative to %esp */
127#define EBP_SPILL (FRAME_SIZE - 4)
128#define EDI_SPILL (FRAME_SIZE - 8)
129#define ESI_SPILL (FRAME_SIZE - 12)
130#define EBX_SPILL (FRAME_SIZE - 16)
131#define LOCAL0 (FRAME_SIZE - 20)
132#define LOCAL1 (FRAME_SIZE - 24)
133#define LOCAL2 (FRAME_SIZE - 28)
134/* Out Arg offsets, relative to %esp */
135#define OUT_ARG3 ( 12)
136#define OUT_ARG2 ( 8)
137#define OUT_ARG1 ( 4)
138#define OUT_ARG0 ( 0) /* <- ExecuteMterpImpl esp + 0 */
139
140/* During bringup, we'll use the shadow frame model instead of rFP */
141/* single-purpose registers, given names for clarity */
142#define rSELF IN_ARG0(%esp)
143#define rPC %esi
144#define rFP %edi
145#define rINST %ebx
146#define rINSTw %bx
147#define rINSTbh %bh
148#define rINSTbl %bl
149#define rIBASE %edx
150#define rREFS %ebp
151
152/*
153 * Instead of holding a pointer to the shadow frame, we keep rFP at the base of the vregs. So,
154 * to access other shadow frame fields, we need to use a backwards offset. Define those here.
155 */
156#define OFF_FP(a) (a - SHADOWFRAME_VREGS_OFFSET)
157#define OFF_FP_NUMBER_OF_VREGS OFF_FP(SHADOWFRAME_NUMBER_OF_VREGS_OFFSET)
158#define OFF_FP_DEX_PC OFF_FP(SHADOWFRAME_DEX_PC_OFFSET)
159#define OFF_FP_LINK OFF_FP(SHADOWFRAME_LINK_OFFSET)
160#define OFF_FP_METHOD OFF_FP(SHADOWFRAME_METHOD_OFFSET)
161#define OFF_FP_RESULT_REGISTER OFF_FP(SHADOWFRAME_RESULT_REGISTER_OFFSET)
162#define OFF_FP_DEX_PC_PTR OFF_FP(SHADOWFRAME_DEX_PC_PTR_OFFSET)
163#define OFF_FP_CODE_ITEM OFF_FP(SHADOWFRAME_CODE_ITEM_OFFSET)
164#define OFF_FP_SHADOWFRAME (-SHADOWFRAME_VREGS_OFFSET)
165
166/*
167 *
168 * The reference interpreter performs explicit suspect checks, which is somewhat wasteful.
169 * Dalvik's interpreter folded suspend checks into the jump table mechanism, and eventually
170 * mterp should do so as well.
171 */
172#define MTERP_SUSPEND 0
173
174/*
175 * "export" the PC to dex_pc field in the shadow frame, f/b/o future exception objects. Must
176 * be done *before* something throws.
177 *
178 * It's okay to do this more than once.
179 *
180 * NOTE: the fast interpreter keeps track of dex pc as a direct pointer to the mapped
181 * dex byte codes. However, the rest of the runtime expects dex pc to be an instruction
182 * offset into the code_items_[] array. For effiency, we will "export" the
183 * current dex pc as a direct pointer using the EXPORT_PC macro, and rely on GetDexPC
184 * to convert to a dex pc when needed.
185 */
186.macro EXPORT_PC
187 movl rPC, OFF_FP_DEX_PC_PTR(rFP)
188.endm
189
190/*
191 * Refresh handler table.
192 * IBase handles uses the caller save register so we must restore it after each call.
193 * Also it is used as a result of some 64-bit operations (like imul) and we should
194 * restore it in such cases also.
195 *
196 * TODO: Consider spilling the IBase instead of restoring it from Thread structure.
197 */
198.macro REFRESH_IBASE
199 movl rSELF, rIBASE
200 movl THREAD_CURRENT_IBASE_OFFSET(rIBASE), rIBASE
201.endm
202
203/*
204 * If rSELF is already loaded then we can use it from known reg.
205 */
206.macro REFRESH_IBASE_FROM_SELF _reg
207 movl THREAD_CURRENT_IBASE_OFFSET(\_reg), rIBASE
208.endm
209
210/*
211 * Refresh rINST.
212 * At enter to handler rINST does not contain the opcode number.
213 * However some utilities require the full value, so this macro
214 * restores the opcode number.
215 */
216.macro REFRESH_INST _opnum
217 movb rINSTbl, rINSTbh
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600218 movb MACRO_LITERAL(\_opnum), rINSTbl
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000219.endm
220
221/*
222 * Fetch the next instruction from rPC into rINSTw. Does not advance rPC.
223 */
224.macro FETCH_INST
225 movzwl (rPC), rINST
226.endm
227
228/*
229 * Remove opcode from rINST, compute the address of handler and jump to it.
230 */
231.macro GOTO_NEXT
232 movzx rINSTbl,%eax
233 movzbl rINSTbh,rINST
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600234 shll MACRO_LITERAL(7), %eax
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000235 addl rIBASE, %eax
236 jmp *%eax
237.endm
238
239/*
240 * Advance rPC by instruction count.
241 */
242.macro ADVANCE_PC _count
243 leal 2*\_count(rPC), rPC
244.endm
245
246/*
247 * Advance rPC by instruction count, fetch instruction and jump to handler.
248 */
249.macro ADVANCE_PC_FETCH_AND_GOTO_NEXT _count
250 ADVANCE_PC \_count
251 FETCH_INST
252 GOTO_NEXT
253.endm
254
255/*
256 * Get/set the 32-bit value from a Dalvik register.
257 */
258#define VREG_ADDRESS(_vreg) (rFP,_vreg,4)
259#define VREG_HIGH_ADDRESS(_vreg) 4(rFP,_vreg,4)
260#define VREG_REF_ADDRESS(_vreg) (rREFS,_vreg,4)
261#define VREG_REF_HIGH_ADDRESS(_vreg) 4(rREFS,_vreg,4)
262
263.macro GET_VREG _reg _vreg
264 movl (rFP,\_vreg,4), \_reg
265.endm
266
267/* Read wide value to xmm. */
268.macro GET_WIDE_FP_VREG _reg _vreg
269 movq (rFP,\_vreg,4), \_reg
270.endm
271
272.macro SET_VREG _reg _vreg
273 movl \_reg, (rFP,\_vreg,4)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600274 movl MACRO_LITERAL(0), (rREFS,\_vreg,4)
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000275.endm
276
277/* Write wide value from xmm. xmm is clobbered. */
278.macro SET_WIDE_FP_VREG _reg _vreg
279 movq \_reg, (rFP,\_vreg,4)
280 pxor \_reg, \_reg
281 movq \_reg, (rREFS,\_vreg,4)
282.endm
283
284.macro SET_VREG_OBJECT _reg _vreg
285 movl \_reg, (rFP,\_vreg,4)
286 movl \_reg, (rREFS,\_vreg,4)
287.endm
288
289.macro GET_VREG_HIGH _reg _vreg
290 movl 4(rFP,\_vreg,4), \_reg
291.endm
292
293.macro SET_VREG_HIGH _reg _vreg
294 movl \_reg, 4(rFP,\_vreg,4)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600295 movl MACRO_LITERAL(0), 4(rREFS,\_vreg,4)
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000296.endm
297
298.macro CLEAR_REF _vreg
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600299 movl MACRO_LITERAL(0), (rREFS,\_vreg,4)
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000300.endm
301
302.macro CLEAR_WIDE_REF _vreg
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600303 movl MACRO_LITERAL(0), (rREFS,\_vreg,4)
304 movl MACRO_LITERAL(0), 4(rREFS,\_vreg,4)
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000305.endm
306
307/* File: x86/entry.S */
308/*
309 * Copyright (C) 2016 The Android Open Source Project
310 *
311 * Licensed under the Apache License, Version 2.0 (the "License");
312 * you may not use this file except in compliance with the License.
313 * You may obtain a copy of the License at
314 *
315 * http://www.apache.org/licenses/LICENSE-2.0
316 *
317 * Unless required by applicable law or agreed to in writing, software
318 * distributed under the License is distributed on an "AS IS" BASIS,
319 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
320 * See the License for the specific language governing permissions and
321 * limitations under the License.
322 */
323/*
324 * Interpreter entry point.
325 */
326
327 .text
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600328 .global SYMBOL(ExecuteMterpImpl)
329 FUNCTION_TYPE(ExecuteMterpImpl)
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000330
331/*
332 * On entry:
333 * 0 Thread* self
334 * 1 code_item
335 * 2 ShadowFrame
336 * 3 JValue* result_register
337 *
338 */
339
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600340SYMBOL(ExecuteMterpImpl):
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000341 .cfi_startproc
342 /* Allocate frame */
343 subl $FRAME_SIZE, %esp
344 .cfi_adjust_cfa_offset FRAME_SIZE
345
346 /* Spill callee save regs */
347 movl %ebp, EBP_SPILL(%esp)
348 movl %edi, EDI_SPILL(%esp)
349 movl %esi, ESI_SPILL(%esp)
350 movl %ebx, EBX_SPILL(%esp)
351
352 /* Load ShadowFrame pointer */
353 movl IN_ARG2(%esp), %edx
354
355 /* Remember the return register */
356 movl IN_ARG3(%esp), %eax
357 movl %eax, SHADOWFRAME_RESULT_REGISTER_OFFSET(%edx)
358
359 /* Remember the code_item */
360 movl IN_ARG1(%esp), %ecx
361 movl %ecx, SHADOWFRAME_CODE_ITEM_OFFSET(%edx)
362
363 /* set up "named" registers */
364 movl SHADOWFRAME_NUMBER_OF_VREGS_OFFSET(%edx), %eax
365 leal SHADOWFRAME_VREGS_OFFSET(%edx), rFP
366 leal (rFP, %eax, 4), rREFS
367 movl SHADOWFRAME_DEX_PC_OFFSET(%edx), %eax
368 lea CODEITEM_INSNS_OFFSET(%ecx), rPC
369 lea (rPC, %eax, 2), rPC
370 EXPORT_PC
371
372 /* Starting ibase */
373 REFRESH_IBASE
374
375 /* start executing the instruction at rPC */
376 FETCH_INST
377 GOTO_NEXT
378 /* NOTE: no fallthrough */
379
380
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600381 .global SYMBOL(artMterpAsmInstructionStart)
382 FUNCTION_TYPE(SYMBOL(artMterpAsmInstructionStart))
383SYMBOL(artMterpAsmInstructionStart) = .L_op_nop
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000384 .text
385
386/* ------------------------------ */
387 .balign 128
388.L_op_nop: /* 0x00 */
389/* File: x86/op_nop.S */
390 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
391
392/* ------------------------------ */
393 .balign 128
394.L_op_move: /* 0x01 */
395/* File: x86/op_move.S */
396 /* for move, move-object, long-to-int */
397 /* op vA, vB */
398 movzbl rINSTbl, %eax # eax <- BA
399 andb $0xf, %al # eax <- A
400 shrl $4, rINST # rINST <- B
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600401 GET_VREG rINST, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000402 .if 0
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600403 SET_VREG_OBJECT rINST, %eax # fp[A] <- fp[B]
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000404 .else
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600405 SET_VREG rINST, %eax # fp[A] <- fp[B]
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000406 .endif
407 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
408
409/* ------------------------------ */
410 .balign 128
411.L_op_move_from16: /* 0x02 */
412/* File: x86/op_move_from16.S */
413 /* for: move/from16, move-object/from16 */
414 /* op vAA, vBBBB */
415 movzx rINSTbl, %eax # eax <- AA
416 movw 2(rPC), rINSTw # rINSTw <- BBBB
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600417 GET_VREG rINST, rINST # rINST <- fp[BBBB]
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000418 .if 0
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600419 SET_VREG_OBJECT rINST, %eax # fp[A] <- fp[B]
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000420 .else
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600421 SET_VREG rINST, %eax # fp[A] <- fp[B]
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000422 .endif
423 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
424
425/* ------------------------------ */
426 .balign 128
427.L_op_move_16: /* 0x03 */
428/* File: x86/op_move_16.S */
429 /* for: move/16, move-object/16 */
430 /* op vAAAA, vBBBB */
431 movzwl 4(rPC), %ecx # ecx <- BBBB
432 movzwl 2(rPC), %eax # eax <- AAAA
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600433 GET_VREG rINST, %ecx
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000434 .if 0
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600435 SET_VREG_OBJECT rINST, %eax # fp[A] <- fp[B]
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000436 .else
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600437 SET_VREG rINST, %eax # fp[A] <- fp[B]
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000438 .endif
439 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
440
441/* ------------------------------ */
442 .balign 128
443.L_op_move_wide: /* 0x04 */
444/* File: x86/op_move_wide.S */
445 /* move-wide vA, vB */
446 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
447 movzbl rINSTbl, %ecx # ecx <- BA
448 sarl $4, rINST # rINST <- B
449 andb $0xf, %cl # ecx <- A
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600450 GET_WIDE_FP_VREG %xmm0, rINST # xmm0 <- v[B]
451 SET_WIDE_FP_VREG %xmm0, %ecx # v[A] <- xmm0
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000452 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
453
454/* ------------------------------ */
455 .balign 128
456.L_op_move_wide_from16: /* 0x05 */
457/* File: x86/op_move_wide_from16.S */
458 /* move-wide/from16 vAA, vBBBB */
459 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
460 movzwl 2(rPC), %ecx # ecx <- BBBB
461 movzbl rINSTbl, %eax # eax <- AAAA
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600462 GET_WIDE_FP_VREG %xmm0, %ecx # xmm0 <- v[B]
463 SET_WIDE_FP_VREG %xmm0, %eax # v[A] <- xmm0
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000464 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
465
466/* ------------------------------ */
467 .balign 128
468.L_op_move_wide_16: /* 0x06 */
469/* File: x86/op_move_wide_16.S */
470 /* move-wide/16 vAAAA, vBBBB */
471 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
472 movzwl 4(rPC), %ecx # ecx<- BBBB
473 movzwl 2(rPC), %eax # eax<- AAAA
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600474 GET_WIDE_FP_VREG %xmm0, %ecx # xmm0 <- v[B]
475 SET_WIDE_FP_VREG %xmm0, %eax # v[A] <- xmm0
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000476 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
477
478/* ------------------------------ */
479 .balign 128
480.L_op_move_object: /* 0x07 */
481/* File: x86/op_move_object.S */
482/* File: x86/op_move.S */
483 /* for move, move-object, long-to-int */
484 /* op vA, vB */
485 movzbl rINSTbl, %eax # eax <- BA
486 andb $0xf, %al # eax <- A
487 shrl $4, rINST # rINST <- B
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600488 GET_VREG rINST, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000489 .if 1
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600490 SET_VREG_OBJECT rINST, %eax # fp[A] <- fp[B]
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000491 .else
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600492 SET_VREG rINST, %eax # fp[A] <- fp[B]
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000493 .endif
494 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
495
496
497/* ------------------------------ */
498 .balign 128
499.L_op_move_object_from16: /* 0x08 */
500/* File: x86/op_move_object_from16.S */
501/* File: x86/op_move_from16.S */
502 /* for: move/from16, move-object/from16 */
503 /* op vAA, vBBBB */
504 movzx rINSTbl, %eax # eax <- AA
505 movw 2(rPC), rINSTw # rINSTw <- BBBB
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600506 GET_VREG rINST, rINST # rINST <- fp[BBBB]
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000507 .if 1
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600508 SET_VREG_OBJECT rINST, %eax # fp[A] <- fp[B]
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000509 .else
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600510 SET_VREG rINST, %eax # fp[A] <- fp[B]
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000511 .endif
512 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
513
514
515/* ------------------------------ */
516 .balign 128
517.L_op_move_object_16: /* 0x09 */
518/* File: x86/op_move_object_16.S */
519/* File: x86/op_move_16.S */
520 /* for: move/16, move-object/16 */
521 /* op vAAAA, vBBBB */
522 movzwl 4(rPC), %ecx # ecx <- BBBB
523 movzwl 2(rPC), %eax # eax <- AAAA
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600524 GET_VREG rINST, %ecx
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000525 .if 1
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600526 SET_VREG_OBJECT rINST, %eax # fp[A] <- fp[B]
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000527 .else
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600528 SET_VREG rINST, %eax # fp[A] <- fp[B]
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000529 .endif
530 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
531
532
533/* ------------------------------ */
534 .balign 128
535.L_op_move_result: /* 0x0a */
536/* File: x86/op_move_result.S */
537 /* for: move-result, move-result-object */
538 /* op vAA */
539 movl OFF_FP_RESULT_REGISTER(rFP), %eax # get pointer to result JType.
540 movl (%eax), %eax # r0 <- result.i.
541 .if 0
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600542 SET_VREG_OBJECT %eax, rINST # fp[A] <- fp[B]
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000543 .else
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600544 SET_VREG %eax, rINST # fp[A] <- fp[B]
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000545 .endif
546 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
547
548/* ------------------------------ */
549 .balign 128
550.L_op_move_result_wide: /* 0x0b */
551/* File: x86/op_move_result_wide.S */
552 /* move-result-wide vAA */
553 movl OFF_FP_RESULT_REGISTER(rFP), %eax # get pointer to result JType.
554 movl 4(%eax), %ecx # Get high
555 movl (%eax), %eax # Get low
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600556 SET_VREG %eax, rINST # v[AA+0] <- eax
557 SET_VREG_HIGH %ecx, rINST # v[AA+1] <- ecx
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000558 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
559
560/* ------------------------------ */
561 .balign 128
562.L_op_move_result_object: /* 0x0c */
563/* File: x86/op_move_result_object.S */
564/* File: x86/op_move_result.S */
565 /* for: move-result, move-result-object */
566 /* op vAA */
567 movl OFF_FP_RESULT_REGISTER(rFP), %eax # get pointer to result JType.
568 movl (%eax), %eax # r0 <- result.i.
569 .if 1
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600570 SET_VREG_OBJECT %eax, rINST # fp[A] <- fp[B]
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000571 .else
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600572 SET_VREG %eax, rINST # fp[A] <- fp[B]
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000573 .endif
574 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
575
576
577/* ------------------------------ */
578 .balign 128
579.L_op_move_exception: /* 0x0d */
580/* File: x86/op_move_exception.S */
581 /* move-exception vAA */
582 movl rSELF, %ecx
583 movl THREAD_EXCEPTION_OFFSET(%ecx), %eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600584 SET_VREG_OBJECT %eax, rINST # fp[AA] <- exception object
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000585 movl $0, THREAD_EXCEPTION_OFFSET(%ecx)
586 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
587
588/* ------------------------------ */
589 .balign 128
590.L_op_return_void: /* 0x0e */
591/* File: x86/op_return_void.S */
592 .extern MterpThreadFenceForConstructor
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600593 call SYMBOL(MterpThreadFenceForConstructor)
buzbeea2c97a92016-01-25 15:41:24 -0800594 movl rSELF, %eax
595 testl $(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST), THREAD_FLAGS_OFFSET(%eax)
596 jz 1f
597 movl %eax, OUT_ARG0(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600598 call SYMBOL(MterpSuspendCheck)
buzbeea2c97a92016-01-25 15:41:24 -08005991:
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000600 xorl %eax, %eax
601 xorl %ecx, %ecx
602 jmp MterpReturn
603
604/* ------------------------------ */
605 .balign 128
606.L_op_return: /* 0x0f */
607/* File: x86/op_return.S */
608/*
609 * Return a 32-bit value.
610 *
611 * for: return, return-object
612 */
613 /* op vAA */
614 .extern MterpThreadFenceForConstructor
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600615 call SYMBOL(MterpThreadFenceForConstructor)
buzbeea2c97a92016-01-25 15:41:24 -0800616 movl rSELF, %eax
617 testl $(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST), THREAD_FLAGS_OFFSET(%eax)
618 jz 1f
619 movl %eax, OUT_ARG0(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600620 call SYMBOL(MterpSuspendCheck)
buzbeea2c97a92016-01-25 15:41:24 -08006211:
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600622 GET_VREG %eax, rINST # eax <- vAA
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000623 xorl %ecx, %ecx
624 jmp MterpReturn
625
626/* ------------------------------ */
627 .balign 128
628.L_op_return_wide: /* 0x10 */
629/* File: x86/op_return_wide.S */
630/*
631 * Return a 64-bit value.
632 */
633 /* return-wide vAA */
634 .extern MterpThreadFenceForConstructor
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600635 call SYMBOL(MterpThreadFenceForConstructor)
buzbeea2c97a92016-01-25 15:41:24 -0800636 movl rSELF, %eax
637 testl $(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST), THREAD_FLAGS_OFFSET(%eax)
638 jz 1f
639 movl %eax, OUT_ARG0(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600640 call SYMBOL(MterpSuspendCheck)
buzbeea2c97a92016-01-25 15:41:24 -08006411:
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600642 GET_VREG %eax, rINST # eax <- v[AA+0]
643 GET_VREG_HIGH %ecx, rINST # ecx <- v[AA+1]
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000644 jmp MterpReturn
645
646/* ------------------------------ */
647 .balign 128
648.L_op_return_object: /* 0x11 */
649/* File: x86/op_return_object.S */
650/* File: x86/op_return.S */
651/*
652 * Return a 32-bit value.
653 *
654 * for: return, return-object
655 */
656 /* op vAA */
657 .extern MterpThreadFenceForConstructor
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600658 call SYMBOL(MterpThreadFenceForConstructor)
buzbeea2c97a92016-01-25 15:41:24 -0800659 movl rSELF, %eax
660 testl $(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST), THREAD_FLAGS_OFFSET(%eax)
661 jz 1f
662 movl %eax, OUT_ARG0(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600663 call SYMBOL(MterpSuspendCheck)
buzbeea2c97a92016-01-25 15:41:24 -08006641:
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600665 GET_VREG %eax, rINST # eax <- vAA
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000666 xorl %ecx, %ecx
667 jmp MterpReturn
668
669
670/* ------------------------------ */
671 .balign 128
672.L_op_const_4: /* 0x12 */
673/* File: x86/op_const_4.S */
674 /* const/4 vA, #+B */
675 movsx rINSTbl, %eax # eax <-ssssssBx
676 movl $0xf, rINST
677 andl %eax, rINST # rINST <- A
678 sarl $4, %eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600679 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000680 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
681
682/* ------------------------------ */
683 .balign 128
684.L_op_const_16: /* 0x13 */
685/* File: x86/op_const_16.S */
686 /* const/16 vAA, #+BBBB */
687 movswl 2(rPC), %ecx # ecx <- ssssBBBB
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600688 SET_VREG %ecx, rINST # vAA <- ssssBBBB
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000689 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
690
691/* ------------------------------ */
692 .balign 128
693.L_op_const: /* 0x14 */
694/* File: x86/op_const.S */
695 /* const vAA, #+BBBBbbbb */
696 movl 2(rPC), %eax # grab all 32 bits at once
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600697 SET_VREG %eax, rINST # vAA<- eax
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000698 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
699
700/* ------------------------------ */
701 .balign 128
702.L_op_const_high16: /* 0x15 */
703/* File: x86/op_const_high16.S */
704 /* const/high16 vAA, #+BBBB0000 */
705 movzwl 2(rPC), %eax # eax <- 0000BBBB
706 sall $16, %eax # eax <- BBBB0000
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600707 SET_VREG %eax, rINST # vAA <- eax
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000708 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
709
710/* ------------------------------ */
711 .balign 128
712.L_op_const_wide_16: /* 0x16 */
713/* File: x86/op_const_wide_16.S */
714 /* const-wide/16 vAA, #+BBBB */
715 movswl 2(rPC), %eax # eax <- ssssBBBB
716 movl rIBASE, %ecx # preserve rIBASE (cltd trashes it)
717 cltd # rIBASE:eax <- ssssssssssssBBBB
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600718 SET_VREG_HIGH rIBASE, rINST # store msw
719 SET_VREG %eax, rINST # store lsw
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000720 movl %ecx, rIBASE # restore rIBASE
721 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
722
723/* ------------------------------ */
724 .balign 128
725.L_op_const_wide_32: /* 0x17 */
726/* File: x86/op_const_wide_32.S */
727 /* const-wide/32 vAA, #+BBBBbbbb */
728 movl 2(rPC), %eax # eax <- BBBBbbbb
729 movl rIBASE, %ecx # preserve rIBASE (cltd trashes it)
730 cltd # rIBASE:eax <- ssssssssssssBBBB
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600731 SET_VREG_HIGH rIBASE, rINST # store msw
732 SET_VREG %eax, rINST # store lsw
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000733 movl %ecx, rIBASE # restore rIBASE
734 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
735
736/* ------------------------------ */
737 .balign 128
738.L_op_const_wide: /* 0x18 */
739/* File: x86/op_const_wide.S */
740 /* const-wide vAA, #+HHHHhhhhBBBBbbbb */
741 movl 2(rPC), %eax # eax <- lsw
742 movzbl rINSTbl, %ecx # ecx <- AA
743 movl 6(rPC), rINST # rINST <- msw
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600744 SET_VREG %eax, %ecx
745 SET_VREG_HIGH rINST, %ecx
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000746 ADVANCE_PC_FETCH_AND_GOTO_NEXT 5
747
748/* ------------------------------ */
749 .balign 128
750.L_op_const_wide_high16: /* 0x19 */
751/* File: x86/op_const_wide_high16.S */
752 /* const-wide/high16 vAA, #+BBBB000000000000 */
753 movzwl 2(rPC), %eax # eax <- 0000BBBB
754 sall $16, %eax # eax <- BBBB0000
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600755 SET_VREG_HIGH %eax, rINST # v[AA+1] <- eax
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000756 xorl %eax, %eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600757 SET_VREG %eax, rINST # v[AA+0] <- eax
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000758 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
759
760/* ------------------------------ */
761 .balign 128
762.L_op_const_string: /* 0x1a */
763/* File: x86/op_const_string.S */
764 /* const/string vAA, String@BBBB */
765 EXPORT_PC
766 movzwl 2(rPC), %eax # eax <- BBBB
767 movl %eax, OUT_ARG0(%esp)
768 movl rINST, OUT_ARG1(%esp)
769 leal OFF_FP_SHADOWFRAME(rFP), %eax
770 movl %eax, OUT_ARG2(%esp)
771 movl rSELF, %eax
772 movl %eax, OUT_ARG3(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600773 call SYMBOL(MterpConstString) # (index, tgt_reg, shadow_frame, self)
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000774 REFRESH_IBASE
775 testl %eax, %eax
776 jnz MterpPossibleException
777 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
778
779/* ------------------------------ */
780 .balign 128
781.L_op_const_string_jumbo: /* 0x1b */
782/* File: x86/op_const_string_jumbo.S */
783 /* const/string vAA, String@BBBBBBBB */
784 EXPORT_PC
785 movl 2(rPC), %eax # eax <- BBBB
786 movl %eax, OUT_ARG0(%esp)
787 movl rINST, OUT_ARG1(%esp)
788 leal OFF_FP_SHADOWFRAME(rFP), %eax
789 movl %eax, OUT_ARG2(%esp)
790 movl rSELF, %eax
791 movl %eax, OUT_ARG3(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600792 call SYMBOL(MterpConstString) # (index, tgt_reg, shadow_frame, self)
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000793 REFRESH_IBASE
794 testl %eax, %eax
795 jnz MterpPossibleException
796 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
797
798/* ------------------------------ */
799 .balign 128
800.L_op_const_class: /* 0x1c */
801/* File: x86/op_const_class.S */
802 /* const/class vAA, Class@BBBB */
803 EXPORT_PC
804 movzwl 2(rPC), %eax # eax<- BBBB
805 movl %eax, OUT_ARG0(%esp)
806 movl rINST, OUT_ARG1(%esp)
807 leal OFF_FP_SHADOWFRAME(rFP), %eax
808 movl %eax, OUT_ARG2(%esp)
809 movl rSELF, %eax
810 movl %eax, OUT_ARG3(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600811 call SYMBOL(MterpConstClass) # (index, tgt_reg, shadow_frame, self)
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000812 REFRESH_IBASE
813 testl %eax, %eax
814 jnz MterpPossibleException
815 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
816
817/* ------------------------------ */
818 .balign 128
819.L_op_monitor_enter: /* 0x1d */
820/* File: x86/op_monitor_enter.S */
821/*
822 * Synchronize on an object.
823 */
824 /* monitor-enter vAA */
825 EXPORT_PC
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600826 GET_VREG %ecx, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000827 movl %ecx, OUT_ARG0(%esp)
828 movl rSELF, %eax
829 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600830 call SYMBOL(artLockObjectFromCode) # (object, self)
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000831 REFRESH_IBASE
832 testl %eax, %eax
833 jnz MterpException
834 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
835
836/* ------------------------------ */
837 .balign 128
838.L_op_monitor_exit: /* 0x1e */
839/* File: x86/op_monitor_exit.S */
840/*
841 * Unlock an object.
842 *
843 * Exceptions that occur when unlocking a monitor need to appear as
844 * if they happened at the following instruction. See the Dalvik
845 * instruction spec.
846 */
847 /* monitor-exit vAA */
848 EXPORT_PC
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600849 GET_VREG %ecx, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000850 movl %ecx, OUT_ARG0(%esp)
851 movl rSELF, %eax
852 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600853 call SYMBOL(artUnlockObjectFromCode) # (object, self)
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000854 REFRESH_IBASE
855 testl %eax, %eax
856 jnz MterpException
857 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
858
859/* ------------------------------ */
860 .balign 128
861.L_op_check_cast: /* 0x1f */
862/* File: x86/op_check_cast.S */
863/*
864 * Check to see if a cast from one class to another is allowed.
865 */
866 /* check-cast vAA, class@BBBB */
867 EXPORT_PC
868 movzwl 2(rPC), %eax # eax <- BBBB
869 movl %eax, OUT_ARG0(%esp)
buzbeea2c97a92016-01-25 15:41:24 -0800870 leal VREG_ADDRESS(rINST), %ecx
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000871 movl %ecx, OUT_ARG1(%esp)
872 movl OFF_FP_METHOD(rFP),%eax
873 movl %eax, OUT_ARG2(%esp)
874 movl rSELF, %ecx
875 movl %ecx, OUT_ARG3(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600876 call SYMBOL(MterpCheckCast) # (index, &obj, method, self)
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000877 REFRESH_IBASE
878 testl %eax, %eax
879 jnz MterpPossibleException
880 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
881
882/* ------------------------------ */
883 .balign 128
884.L_op_instance_of: /* 0x20 */
885/* File: x86/op_instance_of.S */
886/*
887 * Check to see if an object reference is an instance of a class.
888 *
889 * Most common situation is a non-null object, being compared against
890 * an already-resolved class.
891 */
892 /* instance-of vA, vB, class@CCCC */
893 EXPORT_PC
894 movzwl 2(rPC), %eax # eax <- BBBB
895 movl %eax, OUT_ARG0(%esp)
896 movl rINST, %eax # eax <- BA
897 sarl $4, %eax # eax <- B
buzbeea2c97a92016-01-25 15:41:24 -0800898 leal VREG_ADDRESS(%eax), %ecx # Get object address
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000899 movl %ecx, OUT_ARG1(%esp)
900 movl OFF_FP_METHOD(rFP),%eax
901 movl %eax, OUT_ARG2(%esp)
902 movl rSELF, %ecx
903 movl %ecx, OUT_ARG3(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600904 call SYMBOL(MterpInstanceOf) # (index, &obj, method, self)
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000905 movl rSELF, %ecx
906 REFRESH_IBASE_FROM_SELF %ecx
907 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx)
908 jnz MterpException
909 andb $0xf, rINSTbl # rINSTbl <- A
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600910 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000911 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
912
913/* ------------------------------ */
914 .balign 128
915.L_op_array_length: /* 0x21 */
916/* File: x86/op_array_length.S */
917/*
918 * Return the length of an array.
919 */
920 mov rINST, %eax # eax <- BA
921 sarl $4, rINST # rINST <- B
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600922 GET_VREG %ecx, rINST # ecx <- vB (object ref)
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000923 testl %ecx, %ecx # is null?
924 je common_errNullObject
925 andb $0xf, %al # eax <- A
926 movl MIRROR_ARRAY_LENGTH_OFFSET(%ecx), rINST
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600927 SET_VREG rINST, %eax
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000928 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
929
930/* ------------------------------ */
931 .balign 128
932.L_op_new_instance: /* 0x22 */
933/* File: x86/op_new_instance.S */
934/*
935 * Create a new instance of a class.
936 */
937 /* new-instance vAA, class@BBBB */
938 EXPORT_PC
939 leal OFF_FP_SHADOWFRAME(rFP), %eax
940 movl %eax, OUT_ARG0(%esp)
941 movl rSELF, %ecx
942 movl %ecx, OUT_ARG1(%esp)
943 REFRESH_INST 34
944 movl rINST, OUT_ARG2(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600945 call SYMBOL(MterpNewInstance)
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000946 REFRESH_IBASE
947 testl %eax, %eax # 0 means an exception is thrown
948 jz MterpPossibleException
949 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
950
951/* ------------------------------ */
952 .balign 128
953.L_op_new_array: /* 0x23 */
954/* File: x86/op_new_array.S */
955/*
956 * Allocate an array of objects, specified with the array class
957 * and a count.
958 *
959 * The verifier guarantees that this is an array class, so we don't
960 * check for it here.
961 */
962 /* new-array vA, vB, class@CCCC */
963 EXPORT_PC
964 leal OFF_FP_SHADOWFRAME(rFP), %eax
965 movl %eax, OUT_ARG0(%esp)
966 movl rPC, OUT_ARG1(%esp)
967 REFRESH_INST 35
968 movl rINST, OUT_ARG2(%esp)
969 movl rSELF, %ecx
970 movl %ecx, OUT_ARG3(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600971 call SYMBOL(MterpNewArray)
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000972 REFRESH_IBASE
973 testl %eax, %eax # 0 means an exception is thrown
974 jz MterpPossibleException
975 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
976
977/* ------------------------------ */
978 .balign 128
979.L_op_filled_new_array: /* 0x24 */
980/* File: x86/op_filled_new_array.S */
981/*
982 * Create a new array with elements filled from registers.
983 *
984 * for: filled-new-array, filled-new-array/range
985 */
986 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
987 /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
988 .extern MterpFilledNewArray
989 EXPORT_PC
990 leal OFF_FP_SHADOWFRAME(rFP), %eax
991 movl %eax, OUT_ARG0(%esp)
992 movl rPC, OUT_ARG1(%esp)
993 movl rSELF, %ecx
994 movl %ecx, OUT_ARG2(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +0600995 call SYMBOL(MterpFilledNewArray)
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000996 REFRESH_IBASE
997 testl %eax, %eax # 0 means an exception is thrown
998 jz MterpPossibleException
999 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
1000
1001/* ------------------------------ */
1002 .balign 128
1003.L_op_filled_new_array_range: /* 0x25 */
1004/* File: x86/op_filled_new_array_range.S */
1005/* File: x86/op_filled_new_array.S */
1006/*
1007 * Create a new array with elements filled from registers.
1008 *
1009 * for: filled-new-array, filled-new-array/range
1010 */
1011 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
1012 /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
1013 .extern MterpFilledNewArrayRange
1014 EXPORT_PC
1015 leal OFF_FP_SHADOWFRAME(rFP), %eax
1016 movl %eax, OUT_ARG0(%esp)
1017 movl rPC, OUT_ARG1(%esp)
1018 movl rSELF, %ecx
1019 movl %ecx, OUT_ARG2(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06001020 call SYMBOL(MterpFilledNewArrayRange)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00001021 REFRESH_IBASE
1022 testl %eax, %eax # 0 means an exception is thrown
1023 jz MterpPossibleException
1024 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
1025
1026
1027/* ------------------------------ */
1028 .balign 128
1029.L_op_fill_array_data: /* 0x26 */
1030/* File: x86/op_fill_array_data.S */
1031 /* fill-array-data vAA, +BBBBBBBB */
1032 EXPORT_PC
1033 movl 2(rPC), %ecx # ecx <- BBBBbbbb
1034 leal (rPC,%ecx,2), %ecx # ecx <- PC + BBBBbbbb*2
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06001035 GET_VREG %eax, rINST # eax <- vAA (array object)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00001036 movl %eax, OUT_ARG0(%esp)
1037 movl %ecx, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06001038 call SYMBOL(MterpFillArrayData) # (obj, payload)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00001039 REFRESH_IBASE
1040 testl %eax, %eax # 0 means an exception is thrown
1041 jz MterpPossibleException
1042 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
1043
1044/* ------------------------------ */
1045 .balign 128
1046.L_op_throw: /* 0x27 */
1047/* File: x86/op_throw.S */
1048/*
1049 * Throw an exception object in the current thread.
1050 */
1051 /* throw vAA */
1052 EXPORT_PC
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06001053 GET_VREG %eax, rINST # eax<- vAA (exception object)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00001054 testl %eax, %eax
1055 jz common_errNullObject
1056 movl rSELF,%ecx
1057 movl %eax, THREAD_EXCEPTION_OFFSET(%ecx)
1058 jmp MterpException
1059
1060/* ------------------------------ */
1061 .balign 128
1062.L_op_goto: /* 0x28 */
1063/* File: x86/op_goto.S */
1064/*
1065 * Unconditional branch, 8-bit offset.
1066 *
1067 * The branch distance is a signed code-unit offset, which we need to
1068 * double to get a byte offset.
1069 */
1070 /* goto +AA */
1071 movsbl rINSTbl, %eax # eax <- ssssssAA
1072 addl %eax, %eax # eax <- AA * 2
1073 leal (rPC, %eax), rPC
1074 FETCH_INST
1075 jg 1f # AA * 2 > 0 => no suspend check
1076#if MTERP_SUSPEND
1077 REFRESH_IBASE
1078#else
1079 jmp MterpCheckSuspendAndContinue
1080#endif
10811:
1082 GOTO_NEXT
1083
1084/* ------------------------------ */
1085 .balign 128
1086.L_op_goto_16: /* 0x29 */
1087/* File: x86/op_goto_16.S */
1088/*
1089 * Unconditional branch, 16-bit offset.
1090 *
1091 * The branch distance is a signed code-unit offset, which we need to
1092 * double to get a byte offset.
1093 */
1094 /* goto/16 +AAAA */
1095 movswl 2(rPC), %eax # eax <- ssssAAAA
1096 addl %eax, %eax # eax <- AA * 2
1097 leal (rPC, %eax), rPC
1098 FETCH_INST
1099 jg 1f # AA * 2 > 0 => no suspend check
1100#if MTERP_SUSPEND
1101 REFRESH_IBASE
1102#else
1103 jmp MterpCheckSuspendAndContinue
1104#endif
11051:
1106 GOTO_NEXT
1107
1108/* ------------------------------ */
1109 .balign 128
1110.L_op_goto_32: /* 0x2a */
1111/* File: x86/op_goto_32.S */
1112/*
1113 * Unconditional branch, 32-bit offset.
1114 *
1115 * The branch distance is a signed code-unit offset, which we need to
1116 * double to get a byte offset.
1117 *
1118 * Unlike most opcodes, this one is allowed to branch to itself, so
1119 * our "backward branch" test must be "<=0" instead of "<0". Because
1120 * we need the V bit set, we'll use an adds to convert from Dalvik
1121 * offset to byte offset.
1122 */
1123 /* goto/32 +AAAAAAAA */
1124 movl 2(rPC), %eax # eax <- AAAAAAAA
1125 addl %eax, %eax # eax <- AA * 2
1126 leal (rPC, %eax), rPC
1127 FETCH_INST
1128 jg 1f # AA * 2 > 0 => no suspend check
1129#if MTERP_SUSPEND
1130 REFRESH_IBASE
1131#else
1132 jmp MterpCheckSuspendAndContinue
1133#endif
11341:
1135 GOTO_NEXT
1136
1137/* ------------------------------ */
1138 .balign 128
1139.L_op_packed_switch: /* 0x2b */
1140/* File: x86/op_packed_switch.S */
1141/*
1142 * Handle a packed-switch or sparse-switch instruction. In both cases
1143 * we decode it and hand it off to a helper function.
1144 *
1145 * We don't really expect backward branches in a switch statement, but
1146 * they're perfectly legal, so we check for them here.
1147 *
1148 * for: packed-switch, sparse-switch
1149 */
1150 /* op vAA, +BBBB */
1151 movl 2(rPC), %ecx # ecx <- BBBBbbbb
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06001152 GET_VREG %eax, rINST # eax <- vAA
Bill Buzbee7c58bd42016-01-20 20:46:01 +00001153 leal (rPC,%ecx,2), %ecx # ecx <- PC + BBBBbbbb*2
1154 movl %eax, OUT_ARG1(%esp) # ARG1 <- vAA
1155 movl %ecx, OUT_ARG0(%esp) # ARG0 <- switchData
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06001156 call SYMBOL(MterpDoPackedSwitch)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00001157 addl %eax, %eax
1158 leal (rPC, %eax), rPC
1159 FETCH_INST
1160 REFRESH_IBASE
1161 jg 1f
1162#if MTERP_SUSPEND
1163 # REFRESH_IBASE - we did it above.
1164#else
1165 jmp MterpCheckSuspendAndContinue
1166#endif
11671:
1168 GOTO_NEXT
1169
1170/* ------------------------------ */
1171 .balign 128
1172.L_op_sparse_switch: /* 0x2c */
1173/* File: x86/op_sparse_switch.S */
1174/* File: x86/op_packed_switch.S */
1175/*
1176 * Handle a packed-switch or sparse-switch instruction. In both cases
1177 * we decode it and hand it off to a helper function.
1178 *
1179 * We don't really expect backward branches in a switch statement, but
1180 * they're perfectly legal, so we check for them here.
1181 *
1182 * for: packed-switch, sparse-switch
1183 */
1184 /* op vAA, +BBBB */
1185 movl 2(rPC), %ecx # ecx <- BBBBbbbb
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06001186 GET_VREG %eax, rINST # eax <- vAA
Bill Buzbee7c58bd42016-01-20 20:46:01 +00001187 leal (rPC,%ecx,2), %ecx # ecx <- PC + BBBBbbbb*2
1188 movl %eax, OUT_ARG1(%esp) # ARG1 <- vAA
1189 movl %ecx, OUT_ARG0(%esp) # ARG0 <- switchData
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06001190 call SYMBOL(MterpDoSparseSwitch)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00001191 addl %eax, %eax
1192 leal (rPC, %eax), rPC
1193 FETCH_INST
1194 REFRESH_IBASE
1195 jg 1f
1196#if MTERP_SUSPEND
1197 # REFRESH_IBASE - we did it above.
1198#else
1199 jmp MterpCheckSuspendAndContinue
1200#endif
12011:
1202 GOTO_NEXT
1203
1204
1205/* ------------------------------ */
1206 .balign 128
1207.L_op_cmpl_float: /* 0x2d */
1208/* File: x86/op_cmpl_float.S */
1209/* File: x86/fpcmp.S */
1210/*
1211 * Compare two floating-point values. Puts 0, 1, or -1 into the
1212 * destination register based on the results of the comparison.
1213 *
1214 * int compare(x, y) {
1215 * if (x == y) {
1216 * return 0;
1217 * } else if (x < y) {
1218 * return -1;
1219 * } else if (x > y) {
1220 * return 1;
1221 * } else {
1222 * return nanval ? 1 : -1;
1223 * }
1224 * }
1225 */
1226 /* op vAA, vBB, vCC */
1227 movzbl 3(rPC), %ecx # ecx<- CC
1228 movzbl 2(rPC), %eax # eax<- BB
1229 movss VREG_ADDRESS(%eax), %xmm0
1230 xor %eax, %eax
1231 ucomiss VREG_ADDRESS(%ecx), %xmm0
1232 jp .Lop_cmpl_float_nan_is_neg
1233 je .Lop_cmpl_float_finish
1234 jb .Lop_cmpl_float_less
1235.Lop_cmpl_float_nan_is_pos:
1236 incl %eax
1237 jmp .Lop_cmpl_float_finish
1238.Lop_cmpl_float_nan_is_neg:
1239.Lop_cmpl_float_less:
1240 decl %eax
1241.Lop_cmpl_float_finish:
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06001242 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00001243 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1244
1245
1246/* ------------------------------ */
1247 .balign 128
1248.L_op_cmpg_float: /* 0x2e */
1249/* File: x86/op_cmpg_float.S */
1250/* File: x86/fpcmp.S */
1251/*
1252 * Compare two floating-point values. Puts 0, 1, or -1 into the
1253 * destination register based on the results of the comparison.
1254 *
1255 * int compare(x, y) {
1256 * if (x == y) {
1257 * return 0;
1258 * } else if (x < y) {
1259 * return -1;
1260 * } else if (x > y) {
1261 * return 1;
1262 * } else {
1263 * return nanval ? 1 : -1;
1264 * }
1265 * }
1266 */
1267 /* op vAA, vBB, vCC */
1268 movzbl 3(rPC), %ecx # ecx<- CC
1269 movzbl 2(rPC), %eax # eax<- BB
1270 movss VREG_ADDRESS(%eax), %xmm0
1271 xor %eax, %eax
1272 ucomiss VREG_ADDRESS(%ecx), %xmm0
1273 jp .Lop_cmpg_float_nan_is_pos
1274 je .Lop_cmpg_float_finish
1275 jb .Lop_cmpg_float_less
1276.Lop_cmpg_float_nan_is_pos:
1277 incl %eax
1278 jmp .Lop_cmpg_float_finish
1279.Lop_cmpg_float_nan_is_neg:
1280.Lop_cmpg_float_less:
1281 decl %eax
1282.Lop_cmpg_float_finish:
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06001283 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00001284 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1285
1286
1287/* ------------------------------ */
1288 .balign 128
1289.L_op_cmpl_double: /* 0x2f */
1290/* File: x86/op_cmpl_double.S */
1291/* File: x86/fpcmp.S */
1292/*
1293 * Compare two floating-point values. Puts 0, 1, or -1 into the
1294 * destination register based on the results of the comparison.
1295 *
1296 * int compare(x, y) {
1297 * if (x == y) {
1298 * return 0;
1299 * } else if (x < y) {
1300 * return -1;
1301 * } else if (x > y) {
1302 * return 1;
1303 * } else {
1304 * return nanval ? 1 : -1;
1305 * }
1306 * }
1307 */
1308 /* op vAA, vBB, vCC */
1309 movzbl 3(rPC), %ecx # ecx<- CC
1310 movzbl 2(rPC), %eax # eax<- BB
1311 movsd VREG_ADDRESS(%eax), %xmm0
1312 xor %eax, %eax
1313 ucomisd VREG_ADDRESS(%ecx), %xmm0
1314 jp .Lop_cmpl_double_nan_is_neg
1315 je .Lop_cmpl_double_finish
1316 jb .Lop_cmpl_double_less
1317.Lop_cmpl_double_nan_is_pos:
1318 incl %eax
1319 jmp .Lop_cmpl_double_finish
1320.Lop_cmpl_double_nan_is_neg:
1321.Lop_cmpl_double_less:
1322 decl %eax
1323.Lop_cmpl_double_finish:
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06001324 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00001325 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1326
1327
1328/* ------------------------------ */
1329 .balign 128
1330.L_op_cmpg_double: /* 0x30 */
1331/* File: x86/op_cmpg_double.S */
1332/* File: x86/fpcmp.S */
1333/*
1334 * Compare two floating-point values. Puts 0, 1, or -1 into the
1335 * destination register based on the results of the comparison.
1336 *
1337 * int compare(x, y) {
1338 * if (x == y) {
1339 * return 0;
1340 * } else if (x < y) {
1341 * return -1;
1342 * } else if (x > y) {
1343 * return 1;
1344 * } else {
1345 * return nanval ? 1 : -1;
1346 * }
1347 * }
1348 */
1349 /* op vAA, vBB, vCC */
1350 movzbl 3(rPC), %ecx # ecx<- CC
1351 movzbl 2(rPC), %eax # eax<- BB
1352 movsd VREG_ADDRESS(%eax), %xmm0
1353 xor %eax, %eax
1354 ucomisd VREG_ADDRESS(%ecx), %xmm0
1355 jp .Lop_cmpg_double_nan_is_pos
1356 je .Lop_cmpg_double_finish
1357 jb .Lop_cmpg_double_less
1358.Lop_cmpg_double_nan_is_pos:
1359 incl %eax
1360 jmp .Lop_cmpg_double_finish
1361.Lop_cmpg_double_nan_is_neg:
1362.Lop_cmpg_double_less:
1363 decl %eax
1364.Lop_cmpg_double_finish:
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06001365 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00001366 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1367
1368
1369/* ------------------------------ */
1370 .balign 128
1371.L_op_cmp_long: /* 0x31 */
1372/* File: x86/op_cmp_long.S */
1373/*
1374 * Compare two 64-bit values. Puts 0, 1, or -1 into the destination
1375 * register based on the results of the comparison.
1376 */
1377 /* cmp-long vAA, vBB, vCC */
1378 movzbl 2(rPC), %eax # eax <- BB
1379 movzbl 3(rPC), %ecx # ecx <- CC
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06001380 GET_VREG_HIGH %eax, %eax # eax <- v[BB+1], BB is clobbered
Bill Buzbee7c58bd42016-01-20 20:46:01 +00001381 cmpl VREG_HIGH_ADDRESS(%ecx), %eax
1382 jl .Lop_cmp_long_smaller
1383 jg .Lop_cmp_long_bigger
1384 movzbl 2(rPC), %eax # eax <- BB, restore BB
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06001385 GET_VREG %eax, %eax # eax <- v[BB]
Bill Buzbee7c58bd42016-01-20 20:46:01 +00001386 sub VREG_ADDRESS(%ecx), %eax
1387 ja .Lop_cmp_long_bigger
1388 jb .Lop_cmp_long_smaller
1389.Lop_cmp_long_finish:
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06001390 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00001391 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1392
1393.Lop_cmp_long_bigger:
1394 movl $1, %eax
1395 jmp .Lop_cmp_long_finish
1396
1397.Lop_cmp_long_smaller:
1398 movl $-1, %eax
1399 jmp .Lop_cmp_long_finish
1400
1401/* ------------------------------ */
1402 .balign 128
1403.L_op_if_eq: /* 0x32 */
1404/* File: x86/op_if_eq.S */
1405/* File: x86/bincmp.S */
1406/*
1407 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1408 * fragment that specifies the *reverse* comparison to perform, e.g.
1409 * for "if-le" you would use "gt".
1410 *
1411 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1412 */
1413 /* if-cmp vA, vB, +CCCC */
1414 movzx rINSTbl, %ecx # ecx <- A+
1415 andb $0xf, %cl # ecx <- A
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06001416 GET_VREG %eax, %ecx # eax <- vA
Bill Buzbee7c58bd42016-01-20 20:46:01 +00001417 sarl $4, rINST # rINST <- B
1418 cmpl VREG_ADDRESS(rINST), %eax # compare (vA, vB)
1419 movl $2, %eax # assume not taken
1420 jne 1f
1421 movswl 2(rPC),%eax # Get signed branch offset
14221:
1423 addl %eax, %eax # eax <- AA * 2
1424 leal (rPC, %eax), rPC
1425 FETCH_INST
1426 jg 2f # AA * 2 > 0 => no suspend check
1427#if MTERP_SUSPEND
1428 REFRESH_IBASE
1429#else
1430 jmp MterpCheckSuspendAndContinue
1431#endif
14322:
1433 GOTO_NEXT
1434
1435
1436/* ------------------------------ */
1437 .balign 128
1438.L_op_if_ne: /* 0x33 */
1439/* File: x86/op_if_ne.S */
1440/* File: x86/bincmp.S */
1441/*
1442 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1443 * fragment that specifies the *reverse* comparison to perform, e.g.
1444 * for "if-le" you would use "gt".
1445 *
1446 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1447 */
1448 /* if-cmp vA, vB, +CCCC */
1449 movzx rINSTbl, %ecx # ecx <- A+
1450 andb $0xf, %cl # ecx <- A
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06001451 GET_VREG %eax, %ecx # eax <- vA
Bill Buzbee7c58bd42016-01-20 20:46:01 +00001452 sarl $4, rINST # rINST <- B
1453 cmpl VREG_ADDRESS(rINST), %eax # compare (vA, vB)
1454 movl $2, %eax # assume not taken
1455 je 1f
1456 movswl 2(rPC),%eax # Get signed branch offset
14571:
1458 addl %eax, %eax # eax <- AA * 2
1459 leal (rPC, %eax), rPC
1460 FETCH_INST
1461 jg 2f # AA * 2 > 0 => no suspend check
1462#if MTERP_SUSPEND
1463 REFRESH_IBASE
1464#else
1465 jmp MterpCheckSuspendAndContinue
1466#endif
14672:
1468 GOTO_NEXT
1469
1470
1471/* ------------------------------ */
1472 .balign 128
1473.L_op_if_lt: /* 0x34 */
1474/* File: x86/op_if_lt.S */
1475/* File: x86/bincmp.S */
1476/*
1477 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1478 * fragment that specifies the *reverse* comparison to perform, e.g.
1479 * for "if-le" you would use "gt".
1480 *
1481 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1482 */
1483 /* if-cmp vA, vB, +CCCC */
1484 movzx rINSTbl, %ecx # ecx <- A+
1485 andb $0xf, %cl # ecx <- A
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06001486 GET_VREG %eax, %ecx # eax <- vA
Bill Buzbee7c58bd42016-01-20 20:46:01 +00001487 sarl $4, rINST # rINST <- B
1488 cmpl VREG_ADDRESS(rINST), %eax # compare (vA, vB)
1489 movl $2, %eax # assume not taken
1490 jge 1f
1491 movswl 2(rPC),%eax # Get signed branch offset
14921:
1493 addl %eax, %eax # eax <- AA * 2
1494 leal (rPC, %eax), rPC
1495 FETCH_INST
1496 jg 2f # AA * 2 > 0 => no suspend check
1497#if MTERP_SUSPEND
1498 REFRESH_IBASE
1499#else
1500 jmp MterpCheckSuspendAndContinue
1501#endif
15022:
1503 GOTO_NEXT
1504
1505
1506/* ------------------------------ */
1507 .balign 128
1508.L_op_if_ge: /* 0x35 */
1509/* File: x86/op_if_ge.S */
1510/* File: x86/bincmp.S */
1511/*
1512 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1513 * fragment that specifies the *reverse* comparison to perform, e.g.
1514 * for "if-le" you would use "gt".
1515 *
1516 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1517 */
1518 /* if-cmp vA, vB, +CCCC */
1519 movzx rINSTbl, %ecx # ecx <- A+
1520 andb $0xf, %cl # ecx <- A
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06001521 GET_VREG %eax, %ecx # eax <- vA
Bill Buzbee7c58bd42016-01-20 20:46:01 +00001522 sarl $4, rINST # rINST <- B
1523 cmpl VREG_ADDRESS(rINST), %eax # compare (vA, vB)
1524 movl $2, %eax # assume not taken
1525 jl 1f
1526 movswl 2(rPC),%eax # Get signed branch offset
15271:
1528 addl %eax, %eax # eax <- AA * 2
1529 leal (rPC, %eax), rPC
1530 FETCH_INST
1531 jg 2f # AA * 2 > 0 => no suspend check
1532#if MTERP_SUSPEND
1533 REFRESH_IBASE
1534#else
1535 jmp MterpCheckSuspendAndContinue
1536#endif
15372:
1538 GOTO_NEXT
1539
1540
1541/* ------------------------------ */
1542 .balign 128
1543.L_op_if_gt: /* 0x36 */
1544/* File: x86/op_if_gt.S */
1545/* File: x86/bincmp.S */
1546/*
1547 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1548 * fragment that specifies the *reverse* comparison to perform, e.g.
1549 * for "if-le" you would use "gt".
1550 *
1551 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1552 */
1553 /* if-cmp vA, vB, +CCCC */
1554 movzx rINSTbl, %ecx # ecx <- A+
1555 andb $0xf, %cl # ecx <- A
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06001556 GET_VREG %eax, %ecx # eax <- vA
Bill Buzbee7c58bd42016-01-20 20:46:01 +00001557 sarl $4, rINST # rINST <- B
1558 cmpl VREG_ADDRESS(rINST), %eax # compare (vA, vB)
1559 movl $2, %eax # assume not taken
1560 jle 1f
1561 movswl 2(rPC),%eax # Get signed branch offset
15621:
1563 addl %eax, %eax # eax <- AA * 2
1564 leal (rPC, %eax), rPC
1565 FETCH_INST
1566 jg 2f # AA * 2 > 0 => no suspend check
1567#if MTERP_SUSPEND
1568 REFRESH_IBASE
1569#else
1570 jmp MterpCheckSuspendAndContinue
1571#endif
15722:
1573 GOTO_NEXT
1574
1575
1576/* ------------------------------ */
1577 .balign 128
1578.L_op_if_le: /* 0x37 */
1579/* File: x86/op_if_le.S */
1580/* File: x86/bincmp.S */
1581/*
1582 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1583 * fragment that specifies the *reverse* comparison to perform, e.g.
1584 * for "if-le" you would use "gt".
1585 *
1586 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1587 */
1588 /* if-cmp vA, vB, +CCCC */
1589 movzx rINSTbl, %ecx # ecx <- A+
1590 andb $0xf, %cl # ecx <- A
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06001591 GET_VREG %eax, %ecx # eax <- vA
Bill Buzbee7c58bd42016-01-20 20:46:01 +00001592 sarl $4, rINST # rINST <- B
1593 cmpl VREG_ADDRESS(rINST), %eax # compare (vA, vB)
1594 movl $2, %eax # assume not taken
1595 jg 1f
1596 movswl 2(rPC),%eax # Get signed branch offset
15971:
1598 addl %eax, %eax # eax <- AA * 2
1599 leal (rPC, %eax), rPC
1600 FETCH_INST
1601 jg 2f # AA * 2 > 0 => no suspend check
1602#if MTERP_SUSPEND
1603 REFRESH_IBASE
1604#else
1605 jmp MterpCheckSuspendAndContinue
1606#endif
16072:
1608 GOTO_NEXT
1609
1610
1611/* ------------------------------ */
1612 .balign 128
1613.L_op_if_eqz: /* 0x38 */
1614/* File: x86/op_if_eqz.S */
1615/* File: x86/zcmp.S */
1616/*
1617 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1618 * fragment that specifies the *reverse* comparison to perform, e.g.
1619 * for "if-le" you would use "gt".
1620 *
1621 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1622 */
1623 /* if-cmp vAA, +BBBB */
1624 cmpl $0, VREG_ADDRESS(rINST) # compare (vA, 0)
1625 movl $2, %eax # assume branch not taken
1626 jne 1f
1627 movswl 2(rPC),%eax # fetch signed displacement
16281:
1629 addl %eax, %eax # eax <- AA * 2
1630 leal (rPC, %eax), rPC
1631 FETCH_INST
1632 jg 2f # AA * 2 > 0 => no suspend check
1633#if MTERP_SUSPEND
1634 REFRESH_IBASE
1635#else
1636 jmp MterpCheckSuspendAndContinue
1637#endif
16382:
1639 GOTO_NEXT
1640
1641
1642/* ------------------------------ */
1643 .balign 128
1644.L_op_if_nez: /* 0x39 */
1645/* File: x86/op_if_nez.S */
1646/* File: x86/zcmp.S */
1647/*
1648 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1649 * fragment that specifies the *reverse* comparison to perform, e.g.
1650 * for "if-le" you would use "gt".
1651 *
1652 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1653 */
1654 /* if-cmp vAA, +BBBB */
1655 cmpl $0, VREG_ADDRESS(rINST) # compare (vA, 0)
1656 movl $2, %eax # assume branch not taken
1657 je 1f
1658 movswl 2(rPC),%eax # fetch signed displacement
16591:
1660 addl %eax, %eax # eax <- AA * 2
1661 leal (rPC, %eax), rPC
1662 FETCH_INST
1663 jg 2f # AA * 2 > 0 => no suspend check
1664#if MTERP_SUSPEND
1665 REFRESH_IBASE
1666#else
1667 jmp MterpCheckSuspendAndContinue
1668#endif
16692:
1670 GOTO_NEXT
1671
1672
1673/* ------------------------------ */
1674 .balign 128
1675.L_op_if_ltz: /* 0x3a */
1676/* File: x86/op_if_ltz.S */
1677/* File: x86/zcmp.S */
1678/*
1679 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1680 * fragment that specifies the *reverse* comparison to perform, e.g.
1681 * for "if-le" you would use "gt".
1682 *
1683 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1684 */
1685 /* if-cmp vAA, +BBBB */
1686 cmpl $0, VREG_ADDRESS(rINST) # compare (vA, 0)
1687 movl $2, %eax # assume branch not taken
1688 jge 1f
1689 movswl 2(rPC),%eax # fetch signed displacement
16901:
1691 addl %eax, %eax # eax <- AA * 2
1692 leal (rPC, %eax), rPC
1693 FETCH_INST
1694 jg 2f # AA * 2 > 0 => no suspend check
1695#if MTERP_SUSPEND
1696 REFRESH_IBASE
1697#else
1698 jmp MterpCheckSuspendAndContinue
1699#endif
17002:
1701 GOTO_NEXT
1702
1703
1704/* ------------------------------ */
1705 .balign 128
1706.L_op_if_gez: /* 0x3b */
1707/* File: x86/op_if_gez.S */
1708/* File: x86/zcmp.S */
1709/*
1710 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1711 * fragment that specifies the *reverse* comparison to perform, e.g.
1712 * for "if-le" you would use "gt".
1713 *
1714 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1715 */
1716 /* if-cmp vAA, +BBBB */
1717 cmpl $0, VREG_ADDRESS(rINST) # compare (vA, 0)
1718 movl $2, %eax # assume branch not taken
1719 jl 1f
1720 movswl 2(rPC),%eax # fetch signed displacement
17211:
1722 addl %eax, %eax # eax <- AA * 2
1723 leal (rPC, %eax), rPC
1724 FETCH_INST
1725 jg 2f # AA * 2 > 0 => no suspend check
1726#if MTERP_SUSPEND
1727 REFRESH_IBASE
1728#else
1729 jmp MterpCheckSuspendAndContinue
1730#endif
17312:
1732 GOTO_NEXT
1733
1734
1735/* ------------------------------ */
1736 .balign 128
1737.L_op_if_gtz: /* 0x3c */
1738/* File: x86/op_if_gtz.S */
1739/* File: x86/zcmp.S */
1740/*
1741 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1742 * fragment that specifies the *reverse* comparison to perform, e.g.
1743 * for "if-le" you would use "gt".
1744 *
1745 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1746 */
1747 /* if-cmp vAA, +BBBB */
1748 cmpl $0, VREG_ADDRESS(rINST) # compare (vA, 0)
1749 movl $2, %eax # assume branch not taken
1750 jle 1f
1751 movswl 2(rPC),%eax # fetch signed displacement
17521:
1753 addl %eax, %eax # eax <- AA * 2
1754 leal (rPC, %eax), rPC
1755 FETCH_INST
1756 jg 2f # AA * 2 > 0 => no suspend check
1757#if MTERP_SUSPEND
1758 REFRESH_IBASE
1759#else
1760 jmp MterpCheckSuspendAndContinue
1761#endif
17622:
1763 GOTO_NEXT
1764
1765
1766/* ------------------------------ */
1767 .balign 128
1768.L_op_if_lez: /* 0x3d */
1769/* File: x86/op_if_lez.S */
1770/* File: x86/zcmp.S */
1771/*
1772 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1773 * fragment that specifies the *reverse* comparison to perform, e.g.
1774 * for "if-le" you would use "gt".
1775 *
1776 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1777 */
1778 /* if-cmp vAA, +BBBB */
1779 cmpl $0, VREG_ADDRESS(rINST) # compare (vA, 0)
1780 movl $2, %eax # assume branch not taken
1781 jg 1f
1782 movswl 2(rPC),%eax # fetch signed displacement
17831:
1784 addl %eax, %eax # eax <- AA * 2
1785 leal (rPC, %eax), rPC
1786 FETCH_INST
1787 jg 2f # AA * 2 > 0 => no suspend check
1788#if MTERP_SUSPEND
1789 REFRESH_IBASE
1790#else
1791 jmp MterpCheckSuspendAndContinue
1792#endif
17932:
1794 GOTO_NEXT
1795
1796
1797/* ------------------------------ */
1798 .balign 128
1799.L_op_unused_3e: /* 0x3e */
1800/* File: x86/op_unused_3e.S */
1801/* File: x86/unused.S */
1802/*
1803 * Bail to reference interpreter to throw.
1804 */
1805 jmp MterpFallback
1806
1807
1808/* ------------------------------ */
1809 .balign 128
1810.L_op_unused_3f: /* 0x3f */
1811/* File: x86/op_unused_3f.S */
1812/* File: x86/unused.S */
1813/*
1814 * Bail to reference interpreter to throw.
1815 */
1816 jmp MterpFallback
1817
1818
1819/* ------------------------------ */
1820 .balign 128
1821.L_op_unused_40: /* 0x40 */
1822/* File: x86/op_unused_40.S */
1823/* File: x86/unused.S */
1824/*
1825 * Bail to reference interpreter to throw.
1826 */
1827 jmp MterpFallback
1828
1829
1830/* ------------------------------ */
1831 .balign 128
1832.L_op_unused_41: /* 0x41 */
1833/* File: x86/op_unused_41.S */
1834/* File: x86/unused.S */
1835/*
1836 * Bail to reference interpreter to throw.
1837 */
1838 jmp MterpFallback
1839
1840
1841/* ------------------------------ */
1842 .balign 128
1843.L_op_unused_42: /* 0x42 */
1844/* File: x86/op_unused_42.S */
1845/* File: x86/unused.S */
1846/*
1847 * Bail to reference interpreter to throw.
1848 */
1849 jmp MterpFallback
1850
1851
1852/* ------------------------------ */
1853 .balign 128
1854.L_op_unused_43: /* 0x43 */
1855/* File: x86/op_unused_43.S */
1856/* File: x86/unused.S */
1857/*
1858 * Bail to reference interpreter to throw.
1859 */
1860 jmp MterpFallback
1861
1862
1863/* ------------------------------ */
1864 .balign 128
1865.L_op_aget: /* 0x44 */
1866/* File: x86/op_aget.S */
1867/*
1868 * Array get, 32 bits or less. vAA <- vBB[vCC].
1869 *
1870 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1871 *
1872 */
1873 /* op vAA, vBB, vCC */
1874 movzbl 2(rPC), %eax # eax <- BB
1875 movzbl 3(rPC), %ecx # ecx <- CC
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06001876 GET_VREG %eax, %eax # eax <- vBB (array object)
1877 GET_VREG %ecx, %ecx # ecx <- vCC (requested index)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00001878 testl %eax, %eax # null array object?
1879 je common_errNullObject # bail if so
1880 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx
1881 jae common_errArrayIndex # index >= length, bail.
1882 movl MIRROR_INT_ARRAY_DATA_OFFSET(%eax,%ecx,4), %eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06001883 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00001884 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1885
1886/* ------------------------------ */
1887 .balign 128
1888.L_op_aget_wide: /* 0x45 */
1889/* File: x86/op_aget_wide.S */
1890/*
1891 * Array get, 64 bits. vAA <- vBB[vCC].
1892 */
1893 /* aget-wide vAA, vBB, vCC */
1894 movzbl 2(rPC), %eax # eax <- BB
1895 movzbl 3(rPC), %ecx # ecx <- CC
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06001896 GET_VREG %eax, %eax # eax <- vBB (array object)
1897 GET_VREG %ecx, %ecx # ecx <- vCC (requested index)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00001898 testl %eax, %eax # null array object?
1899 je common_errNullObject # bail if so
1900 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx
1901 jae common_errArrayIndex # index >= length, bail.
1902 leal MIRROR_WIDE_ARRAY_DATA_OFFSET(%eax,%ecx,8), %eax
1903 movq (%eax), %xmm0 # xmm0 <- vBB[vCC]
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06001904 SET_WIDE_FP_VREG %xmm0, rINST # vAA <- xmm0
Bill Buzbee7c58bd42016-01-20 20:46:01 +00001905 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1906
1907/* ------------------------------ */
1908 .balign 128
1909.L_op_aget_object: /* 0x46 */
1910/* File: x86/op_aget_object.S */
1911/*
1912 * Array object get. vAA <- vBB[vCC].
1913 *
1914 * for: aget-object
1915 */
1916 /* op vAA, vBB, vCC */
1917 movzbl 2(rPC), %eax # eax <- BB
1918 movzbl 3(rPC), %ecx # ecx <- CC
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06001919 GET_VREG %eax, %eax # eax <- vBB (array object)
1920 GET_VREG %ecx, %ecx # ecs <- vCC (requested index)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00001921 EXPORT_PC
1922 movl %eax, OUT_ARG0(%esp)
1923 movl %ecx, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06001924 call SYMBOL(artAGetObjectFromMterp) # (array, index)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00001925 movl rSELF, %ecx
1926 REFRESH_IBASE_FROM_SELF %ecx
1927 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx)
1928 jnz MterpException
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06001929 SET_VREG_OBJECT %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00001930 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1931
1932/* ------------------------------ */
1933 .balign 128
1934.L_op_aget_boolean: /* 0x47 */
1935/* File: x86/op_aget_boolean.S */
1936/* File: x86/op_aget.S */
1937/*
1938 * Array get, 32 bits or less. vAA <- vBB[vCC].
1939 *
1940 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1941 *
1942 */
1943 /* op vAA, vBB, vCC */
1944 movzbl 2(rPC), %eax # eax <- BB
1945 movzbl 3(rPC), %ecx # ecx <- CC
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06001946 GET_VREG %eax, %eax # eax <- vBB (array object)
1947 GET_VREG %ecx, %ecx # ecx <- vCC (requested index)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00001948 testl %eax, %eax # null array object?
1949 je common_errNullObject # bail if so
1950 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx
1951 jae common_errArrayIndex # index >= length, bail.
1952 movzbl MIRROR_BOOLEAN_ARRAY_DATA_OFFSET(%eax,%ecx,1), %eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06001953 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00001954 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1955
1956
1957/* ------------------------------ */
1958 .balign 128
1959.L_op_aget_byte: /* 0x48 */
1960/* File: x86/op_aget_byte.S */
1961/* File: x86/op_aget.S */
1962/*
1963 * Array get, 32 bits or less. vAA <- vBB[vCC].
1964 *
1965 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1966 *
1967 */
1968 /* op vAA, vBB, vCC */
1969 movzbl 2(rPC), %eax # eax <- BB
1970 movzbl 3(rPC), %ecx # ecx <- CC
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06001971 GET_VREG %eax, %eax # eax <- vBB (array object)
1972 GET_VREG %ecx, %ecx # ecx <- vCC (requested index)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00001973 testl %eax, %eax # null array object?
1974 je common_errNullObject # bail if so
1975 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx
1976 jae common_errArrayIndex # index >= length, bail.
1977 movsbl MIRROR_BYTE_ARRAY_DATA_OFFSET(%eax,%ecx,1), %eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06001978 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00001979 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1980
1981
1982/* ------------------------------ */
1983 .balign 128
1984.L_op_aget_char: /* 0x49 */
1985/* File: x86/op_aget_char.S */
1986/* File: x86/op_aget.S */
1987/*
1988 * Array get, 32 bits or less. vAA <- vBB[vCC].
1989 *
1990 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1991 *
1992 */
1993 /* op vAA, vBB, vCC */
1994 movzbl 2(rPC), %eax # eax <- BB
1995 movzbl 3(rPC), %ecx # ecx <- CC
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06001996 GET_VREG %eax, %eax # eax <- vBB (array object)
1997 GET_VREG %ecx, %ecx # ecx <- vCC (requested index)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00001998 testl %eax, %eax # null array object?
1999 je common_errNullObject # bail if so
2000 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx
2001 jae common_errArrayIndex # index >= length, bail.
2002 movzwl MIRROR_CHAR_ARRAY_DATA_OFFSET(%eax,%ecx,2), %eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002003 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002004 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2005
2006
2007/* ------------------------------ */
2008 .balign 128
2009.L_op_aget_short: /* 0x4a */
2010/* File: x86/op_aget_short.S */
2011/* File: x86/op_aget.S */
2012/*
2013 * Array get, 32 bits or less. vAA <- vBB[vCC].
2014 *
2015 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
2016 *
2017 */
2018 /* op vAA, vBB, vCC */
2019 movzbl 2(rPC), %eax # eax <- BB
2020 movzbl 3(rPC), %ecx # ecx <- CC
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002021 GET_VREG %eax, %eax # eax <- vBB (array object)
2022 GET_VREG %ecx, %ecx # ecx <- vCC (requested index)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002023 testl %eax, %eax # null array object?
2024 je common_errNullObject # bail if so
2025 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx
2026 jae common_errArrayIndex # index >= length, bail.
2027 movswl MIRROR_SHORT_ARRAY_DATA_OFFSET(%eax,%ecx,2), %eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002028 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002029 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2030
2031
2032/* ------------------------------ */
2033 .balign 128
2034.L_op_aput: /* 0x4b */
2035/* File: x86/op_aput.S */
2036/*
2037 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2038 *
2039 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2040 *
2041 */
2042 /* op vAA, vBB, vCC */
2043 movzbl 2(rPC), %eax # eax <- BB
2044 movzbl 3(rPC), %ecx # ecx <- CC
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002045 GET_VREG %eax, %eax # eax <- vBB (array object)
2046 GET_VREG %ecx, %ecx # ecx <- vCC (requested index)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002047 testl %eax, %eax # null array object?
2048 je common_errNullObject # bail if so
2049 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx
2050 jae common_errArrayIndex # index >= length, bail.
2051 leal MIRROR_INT_ARRAY_DATA_OFFSET(%eax,%ecx,4), %eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002052 GET_VREG rINST, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002053 movl rINST, (%eax)
2054 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2055
2056/* ------------------------------ */
2057 .balign 128
2058.L_op_aput_wide: /* 0x4c */
2059/* File: x86/op_aput_wide.S */
2060/*
2061 * Array put, 64 bits. vBB[vCC] <- vAA.
2062 *
2063 */
2064 /* aput-wide vAA, vBB, vCC */
2065 movzbl 2(rPC), %eax # eax <- BB
2066 movzbl 3(rPC), %ecx # ecx <- CC
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002067 GET_VREG %eax, %eax # eax <- vBB (array object)
2068 GET_VREG %ecx, %ecx # ecx <- vCC (requested index)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002069 testl %eax, %eax # null array object?
2070 je common_errNullObject # bail if so
2071 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx
2072 jae common_errArrayIndex # index >= length, bail.
2073 leal MIRROR_WIDE_ARRAY_DATA_OFFSET(%eax,%ecx,8), %eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002074 GET_WIDE_FP_VREG %xmm0, rINST # xmm0 <- vAA
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002075 movq %xmm0, (%eax) # vBB[vCC] <- xmm0
2076 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2077
2078/* ------------------------------ */
2079 .balign 128
2080.L_op_aput_object: /* 0x4d */
2081/* File: x86/op_aput_object.S */
2082/*
2083 * Store an object into an array. vBB[vCC] <- vAA.
2084 */
2085 /* op vAA, vBB, vCC */
2086 EXPORT_PC
2087 leal OFF_FP_SHADOWFRAME(rFP), %eax
2088 movl %eax, OUT_ARG0(%esp)
2089 movl rPC, OUT_ARG1(%esp)
2090 REFRESH_INST 77
2091 movl rINST, OUT_ARG2(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002092 call SYMBOL(MterpAputObject) # (array, index)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002093 REFRESH_IBASE
2094 testl %eax, %eax
2095 jz MterpPossibleException
2096 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2097
2098/* ------------------------------ */
2099 .balign 128
2100.L_op_aput_boolean: /* 0x4e */
2101/* File: x86/op_aput_boolean.S */
2102/* File: x86/op_aput.S */
2103/*
2104 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2105 *
2106 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2107 *
2108 */
2109 /* op vAA, vBB, vCC */
2110 movzbl 2(rPC), %eax # eax <- BB
2111 movzbl 3(rPC), %ecx # ecx <- CC
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002112 GET_VREG %eax, %eax # eax <- vBB (array object)
2113 GET_VREG %ecx, %ecx # ecx <- vCC (requested index)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002114 testl %eax, %eax # null array object?
2115 je common_errNullObject # bail if so
2116 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx
2117 jae common_errArrayIndex # index >= length, bail.
2118 leal MIRROR_BOOLEAN_ARRAY_DATA_OFFSET(%eax,%ecx,1), %eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002119 GET_VREG rINST, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002120 movb rINSTbl, (%eax)
2121 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2122
2123
2124/* ------------------------------ */
2125 .balign 128
2126.L_op_aput_byte: /* 0x4f */
2127/* File: x86/op_aput_byte.S */
2128/* File: x86/op_aput.S */
2129/*
2130 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2131 *
2132 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2133 *
2134 */
2135 /* op vAA, vBB, vCC */
2136 movzbl 2(rPC), %eax # eax <- BB
2137 movzbl 3(rPC), %ecx # ecx <- CC
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002138 GET_VREG %eax, %eax # eax <- vBB (array object)
2139 GET_VREG %ecx, %ecx # ecx <- vCC (requested index)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002140 testl %eax, %eax # null array object?
2141 je common_errNullObject # bail if so
2142 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx
2143 jae common_errArrayIndex # index >= length, bail.
2144 leal MIRROR_BYTE_ARRAY_DATA_OFFSET(%eax,%ecx,1), %eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002145 GET_VREG rINST, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002146 movb rINSTbl, (%eax)
2147 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2148
2149
2150/* ------------------------------ */
2151 .balign 128
2152.L_op_aput_char: /* 0x50 */
2153/* File: x86/op_aput_char.S */
2154/* File: x86/op_aput.S */
2155/*
2156 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2157 *
2158 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2159 *
2160 */
2161 /* op vAA, vBB, vCC */
2162 movzbl 2(rPC), %eax # eax <- BB
2163 movzbl 3(rPC), %ecx # ecx <- CC
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002164 GET_VREG %eax, %eax # eax <- vBB (array object)
2165 GET_VREG %ecx, %ecx # ecx <- vCC (requested index)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002166 testl %eax, %eax # null array object?
2167 je common_errNullObject # bail if so
2168 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx
2169 jae common_errArrayIndex # index >= length, bail.
2170 leal MIRROR_CHAR_ARRAY_DATA_OFFSET(%eax,%ecx,2), %eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002171 GET_VREG rINST, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002172 movw rINSTw, (%eax)
2173 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2174
2175
2176/* ------------------------------ */
2177 .balign 128
2178.L_op_aput_short: /* 0x51 */
2179/* File: x86/op_aput_short.S */
2180/* File: x86/op_aput.S */
2181/*
2182 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2183 *
2184 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2185 *
2186 */
2187 /* op vAA, vBB, vCC */
2188 movzbl 2(rPC), %eax # eax <- BB
2189 movzbl 3(rPC), %ecx # ecx <- CC
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002190 GET_VREG %eax, %eax # eax <- vBB (array object)
2191 GET_VREG %ecx, %ecx # ecx <- vCC (requested index)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002192 testl %eax, %eax # null array object?
2193 je common_errNullObject # bail if so
2194 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx
2195 jae common_errArrayIndex # index >= length, bail.
2196 leal MIRROR_SHORT_ARRAY_DATA_OFFSET(%eax,%ecx,2), %eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002197 GET_VREG rINST, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002198 movw rINSTw, (%eax)
2199 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2200
2201
2202/* ------------------------------ */
2203 .balign 128
2204.L_op_iget: /* 0x52 */
2205/* File: x86/op_iget.S */
2206/*
2207 * General instance field get.
2208 *
2209 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2210 */
2211 EXPORT_PC
2212 movzwl 2(rPC), %eax # eax <- 0000CCCC
2213 movl %eax, OUT_ARG0(%esp) # field ref CCCC
2214 movzbl rINSTbl, %ecx # ecx <- BA
2215 sarl $4, %ecx # ecx <- B
2216 GET_VREG %ecx, %ecx
2217 movl %ecx, OUT_ARG1(%esp) # the object pointer
2218 movl OFF_FP_METHOD(rFP), %eax
2219 movl %eax, OUT_ARG2(%esp) # referrer
2220 mov rSELF, %ecx
2221 movl %ecx, OUT_ARG3(%esp) # self
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002222 call SYMBOL(artGet32InstanceFromCode)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002223 movl rSELF, %ecx
2224 REFRESH_IBASE_FROM_SELF %ecx
2225 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx)
2226 jnz MterpException # bail out
2227 andb $0xf, rINSTbl # rINST <- A
2228 .if 0
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002229 SET_VREG_OBJECT %eax, rINST # fp[A] <-value
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002230 .else
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002231 SET_VREG %eax, rINST # fp[A] <-value
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002232 .endif
2233 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2234
2235/* ------------------------------ */
2236 .balign 128
2237.L_op_iget_wide: /* 0x53 */
2238/* File: x86/op_iget_wide.S */
2239/*
2240 * 64-bit instance field get.
2241 *
2242 * for: iget-wide
2243 */
2244 EXPORT_PC
2245 movzwl 2(rPC), %eax # eax <- 0000CCCC
2246 movl %eax, OUT_ARG0(%esp) # field ref CCCC
2247 movzbl rINSTbl, %ecx # ecx <- BA
2248 sarl $4, %ecx # ecx <- B
2249 GET_VREG %ecx, %ecx
2250 movl %ecx, OUT_ARG1(%esp) # the object pointer
2251 movl OFF_FP_METHOD(rFP), %eax
2252 movl %eax, OUT_ARG2(%esp) # referrer
2253 mov rSELF, %ecx
2254 movl %ecx, OUT_ARG3(%esp) # self
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002255 call SYMBOL(artGet64InstanceFromCode)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002256 mov rSELF, %ecx
2257 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx)
2258 jnz MterpException # bail out
2259 andb $0xf, rINSTbl # rINST <- A
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002260 SET_VREG %eax, rINST
2261 SET_VREG_HIGH %edx, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002262 REFRESH_IBASE_FROM_SELF %ecx
2263 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2264
2265/* ------------------------------ */
2266 .balign 128
2267.L_op_iget_object: /* 0x54 */
2268/* File: x86/op_iget_object.S */
2269/* File: x86/op_iget.S */
2270/*
2271 * General instance field get.
2272 *
2273 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2274 */
2275 EXPORT_PC
2276 movzwl 2(rPC), %eax # eax <- 0000CCCC
2277 movl %eax, OUT_ARG0(%esp) # field ref CCCC
2278 movzbl rINSTbl, %ecx # ecx <- BA
2279 sarl $4, %ecx # ecx <- B
2280 GET_VREG %ecx, %ecx
2281 movl %ecx, OUT_ARG1(%esp) # the object pointer
2282 movl OFF_FP_METHOD(rFP), %eax
2283 movl %eax, OUT_ARG2(%esp) # referrer
2284 mov rSELF, %ecx
2285 movl %ecx, OUT_ARG3(%esp) # self
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002286 call SYMBOL(artGetObjInstanceFromCode)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002287 movl rSELF, %ecx
2288 REFRESH_IBASE_FROM_SELF %ecx
2289 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx)
2290 jnz MterpException # bail out
2291 andb $0xf, rINSTbl # rINST <- A
2292 .if 1
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002293 SET_VREG_OBJECT %eax, rINST # fp[A] <-value
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002294 .else
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002295 SET_VREG %eax, rINST # fp[A] <-value
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002296 .endif
2297 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2298
2299
2300/* ------------------------------ */
2301 .balign 128
2302.L_op_iget_boolean: /* 0x55 */
2303/* File: x86/op_iget_boolean.S */
2304/* File: x86/op_iget.S */
2305/*
2306 * General instance field get.
2307 *
2308 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2309 */
2310 EXPORT_PC
2311 movzwl 2(rPC), %eax # eax <- 0000CCCC
2312 movl %eax, OUT_ARG0(%esp) # field ref CCCC
2313 movzbl rINSTbl, %ecx # ecx <- BA
2314 sarl $4, %ecx # ecx <- B
2315 GET_VREG %ecx, %ecx
2316 movl %ecx, OUT_ARG1(%esp) # the object pointer
2317 movl OFF_FP_METHOD(rFP), %eax
2318 movl %eax, OUT_ARG2(%esp) # referrer
2319 mov rSELF, %ecx
2320 movl %ecx, OUT_ARG3(%esp) # self
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002321 call SYMBOL(artGetBooleanInstanceFromCode)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002322 movl rSELF, %ecx
2323 REFRESH_IBASE_FROM_SELF %ecx
2324 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx)
2325 jnz MterpException # bail out
2326 andb $0xf, rINSTbl # rINST <- A
2327 .if 0
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002328 SET_VREG_OBJECT %eax, rINST # fp[A] <-value
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002329 .else
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002330 SET_VREG %eax, rINST # fp[A] <-value
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002331 .endif
2332 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2333
2334
2335/* ------------------------------ */
2336 .balign 128
2337.L_op_iget_byte: /* 0x56 */
2338/* File: x86/op_iget_byte.S */
2339/* File: x86/op_iget.S */
2340/*
2341 * General instance field get.
2342 *
2343 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2344 */
2345 EXPORT_PC
2346 movzwl 2(rPC), %eax # eax <- 0000CCCC
2347 movl %eax, OUT_ARG0(%esp) # field ref CCCC
2348 movzbl rINSTbl, %ecx # ecx <- BA
2349 sarl $4, %ecx # ecx <- B
2350 GET_VREG %ecx, %ecx
2351 movl %ecx, OUT_ARG1(%esp) # the object pointer
2352 movl OFF_FP_METHOD(rFP), %eax
2353 movl %eax, OUT_ARG2(%esp) # referrer
2354 mov rSELF, %ecx
2355 movl %ecx, OUT_ARG3(%esp) # self
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002356 call SYMBOL(artGetByteInstanceFromCode)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002357 movl rSELF, %ecx
2358 REFRESH_IBASE_FROM_SELF %ecx
2359 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx)
2360 jnz MterpException # bail out
2361 andb $0xf, rINSTbl # rINST <- A
2362 .if 0
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002363 SET_VREG_OBJECT %eax, rINST # fp[A] <-value
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002364 .else
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002365 SET_VREG %eax, rINST # fp[A] <-value
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002366 .endif
2367 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2368
2369
2370/* ------------------------------ */
2371 .balign 128
2372.L_op_iget_char: /* 0x57 */
2373/* File: x86/op_iget_char.S */
2374/* File: x86/op_iget.S */
2375/*
2376 * General instance field get.
2377 *
2378 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2379 */
2380 EXPORT_PC
2381 movzwl 2(rPC), %eax # eax <- 0000CCCC
2382 movl %eax, OUT_ARG0(%esp) # field ref CCCC
2383 movzbl rINSTbl, %ecx # ecx <- BA
2384 sarl $4, %ecx # ecx <- B
2385 GET_VREG %ecx, %ecx
2386 movl %ecx, OUT_ARG1(%esp) # the object pointer
2387 movl OFF_FP_METHOD(rFP), %eax
2388 movl %eax, OUT_ARG2(%esp) # referrer
2389 mov rSELF, %ecx
2390 movl %ecx, OUT_ARG3(%esp) # self
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002391 call SYMBOL(artGetCharInstanceFromCode)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002392 movl rSELF, %ecx
2393 REFRESH_IBASE_FROM_SELF %ecx
2394 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx)
2395 jnz MterpException # bail out
2396 andb $0xf, rINSTbl # rINST <- A
2397 .if 0
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002398 SET_VREG_OBJECT %eax, rINST # fp[A] <-value
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002399 .else
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002400 SET_VREG %eax, rINST # fp[A] <-value
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002401 .endif
2402 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2403
2404
2405/* ------------------------------ */
2406 .balign 128
2407.L_op_iget_short: /* 0x58 */
2408/* File: x86/op_iget_short.S */
2409/* File: x86/op_iget.S */
2410/*
2411 * General instance field get.
2412 *
2413 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2414 */
2415 EXPORT_PC
2416 movzwl 2(rPC), %eax # eax <- 0000CCCC
2417 movl %eax, OUT_ARG0(%esp) # field ref CCCC
2418 movzbl rINSTbl, %ecx # ecx <- BA
2419 sarl $4, %ecx # ecx <- B
2420 GET_VREG %ecx, %ecx
2421 movl %ecx, OUT_ARG1(%esp) # the object pointer
2422 movl OFF_FP_METHOD(rFP), %eax
2423 movl %eax, OUT_ARG2(%esp) # referrer
2424 mov rSELF, %ecx
2425 movl %ecx, OUT_ARG3(%esp) # self
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002426 call SYMBOL(artGetShortInstanceFromCode)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002427 movl rSELF, %ecx
2428 REFRESH_IBASE_FROM_SELF %ecx
2429 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx)
2430 jnz MterpException # bail out
2431 andb $0xf, rINSTbl # rINST <- A
2432 .if 0
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002433 SET_VREG_OBJECT %eax, rINST # fp[A] <-value
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002434 .else
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002435 SET_VREG %eax, rINST # fp[A] <-value
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002436 .endif
2437 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2438
2439
2440/* ------------------------------ */
2441 .balign 128
2442.L_op_iput: /* 0x59 */
2443/* File: x86/op_iput.S */
2444/*
2445 * General 32-bit instance field put.
2446 *
2447 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2448 */
2449 /* op vA, vB, field@CCCC */
2450 .extern artSet32InstanceFromMterp
2451 EXPORT_PC
2452 movzwl 2(rPC), %eax # eax<- 0000CCCC
2453 movl %eax, OUT_ARG0(%esp) # field ref CCCC
2454 movzbl rINSTbl, %ecx # ecx<- BA
2455 sarl $4, %ecx # ecx<- B
2456 GET_VREG %ecx, %ecx
2457 movl %ecx, OUT_ARG1(%esp) # the object pointer
2458 andb $0xf, rINSTbl # rINST<- A
2459 GET_VREG %eax, rINST
2460 movl %eax, OUT_ARG2(%esp) # fp[A]
2461 movl OFF_FP_METHOD(rFP), %eax
2462 movl %eax, OUT_ARG3(%esp) # referrer
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002463 call SYMBOL(artSet32InstanceFromMterp)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002464 testl %eax, %eax
2465 jnz MterpPossibleException
2466 REFRESH_IBASE
2467 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2468
2469/* ------------------------------ */
2470 .balign 128
2471.L_op_iput_wide: /* 0x5a */
2472/* File: x86/op_iput_wide.S */
2473 /* iput-wide vA, vB, field@CCCC */
2474 .extern artSet64InstanceFromMterp
2475 EXPORT_PC
2476 movzwl 2(rPC), %eax # eax <- 0000CCCC
2477 movl %eax, OUT_ARG0(%esp) # field ref CCCC
2478 movzbl rINSTbl,%ecx # ecx <- BA
2479 sarl $4,%ecx # ecx <- B
2480 GET_VREG %ecx, %ecx
2481 movl %ecx, OUT_ARG1(%esp) # the object pointer
2482 andb $0xf,rINSTbl # rINST <- A
2483 leal VREG_ADDRESS(rINST), %eax
2484 movl %eax, OUT_ARG2(%esp) # &fp[A]
2485 movl OFF_FP_METHOD(rFP), %eax
2486 movl %eax, OUT_ARG3(%esp) # referrer
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002487 call SYMBOL(artSet64InstanceFromMterp)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002488 testl %eax, %eax
2489 jnz MterpPossibleException
2490 REFRESH_IBASE
2491 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2492
2493/* ------------------------------ */
2494 .balign 128
2495.L_op_iput_object: /* 0x5b */
2496/* File: x86/op_iput_object.S */
2497 EXPORT_PC
2498 leal OFF_FP_SHADOWFRAME(rFP), %eax
2499 movl %eax, OUT_ARG0(%esp)
2500 movl rPC, OUT_ARG1(%esp)
2501 REFRESH_INST 91
2502 movl rINST, OUT_ARG2(%esp)
2503 movl rSELF, %eax
2504 movl %eax, OUT_ARG3(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002505 call SYMBOL(MterpIputObject)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002506 testl %eax, %eax
2507 jz MterpException
2508 REFRESH_IBASE
2509 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2510
2511/* ------------------------------ */
2512 .balign 128
2513.L_op_iput_boolean: /* 0x5c */
2514/* File: x86/op_iput_boolean.S */
2515/* File: x86/op_iput.S */
2516/*
2517 * General 32-bit instance field put.
2518 *
2519 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2520 */
2521 /* op vA, vB, field@CCCC */
2522 .extern artSet8InstanceFromMterp
2523 EXPORT_PC
2524 movzwl 2(rPC), %eax # eax<- 0000CCCC
2525 movl %eax, OUT_ARG0(%esp) # field ref CCCC
2526 movzbl rINSTbl, %ecx # ecx<- BA
2527 sarl $4, %ecx # ecx<- B
2528 GET_VREG %ecx, %ecx
2529 movl %ecx, OUT_ARG1(%esp) # the object pointer
2530 andb $0xf, rINSTbl # rINST<- A
2531 GET_VREG %eax, rINST
2532 movl %eax, OUT_ARG2(%esp) # fp[A]
2533 movl OFF_FP_METHOD(rFP), %eax
2534 movl %eax, OUT_ARG3(%esp) # referrer
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002535 call SYMBOL(artSet8InstanceFromMterp)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002536 testl %eax, %eax
2537 jnz MterpPossibleException
2538 REFRESH_IBASE
2539 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2540
2541
2542/* ------------------------------ */
2543 .balign 128
2544.L_op_iput_byte: /* 0x5d */
2545/* File: x86/op_iput_byte.S */
2546/* File: x86/op_iput.S */
2547/*
2548 * General 32-bit instance field put.
2549 *
2550 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2551 */
2552 /* op vA, vB, field@CCCC */
2553 .extern artSet8InstanceFromMterp
2554 EXPORT_PC
2555 movzwl 2(rPC), %eax # eax<- 0000CCCC
2556 movl %eax, OUT_ARG0(%esp) # field ref CCCC
2557 movzbl rINSTbl, %ecx # ecx<- BA
2558 sarl $4, %ecx # ecx<- B
2559 GET_VREG %ecx, %ecx
2560 movl %ecx, OUT_ARG1(%esp) # the object pointer
2561 andb $0xf, rINSTbl # rINST<- A
2562 GET_VREG %eax, rINST
2563 movl %eax, OUT_ARG2(%esp) # fp[A]
2564 movl OFF_FP_METHOD(rFP), %eax
2565 movl %eax, OUT_ARG3(%esp) # referrer
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002566 call SYMBOL(artSet8InstanceFromMterp)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002567 testl %eax, %eax
2568 jnz MterpPossibleException
2569 REFRESH_IBASE
2570 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2571
2572
2573/* ------------------------------ */
2574 .balign 128
2575.L_op_iput_char: /* 0x5e */
2576/* File: x86/op_iput_char.S */
2577/* File: x86/op_iput.S */
2578/*
2579 * General 32-bit instance field put.
2580 *
2581 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2582 */
2583 /* op vA, vB, field@CCCC */
2584 .extern artSet16InstanceFromMterp
2585 EXPORT_PC
2586 movzwl 2(rPC), %eax # eax<- 0000CCCC
2587 movl %eax, OUT_ARG0(%esp) # field ref CCCC
2588 movzbl rINSTbl, %ecx # ecx<- BA
2589 sarl $4, %ecx # ecx<- B
2590 GET_VREG %ecx, %ecx
2591 movl %ecx, OUT_ARG1(%esp) # the object pointer
2592 andb $0xf, rINSTbl # rINST<- A
2593 GET_VREG %eax, rINST
2594 movl %eax, OUT_ARG2(%esp) # fp[A]
2595 movl OFF_FP_METHOD(rFP), %eax
2596 movl %eax, OUT_ARG3(%esp) # referrer
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002597 call SYMBOL(artSet16InstanceFromMterp)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002598 testl %eax, %eax
2599 jnz MterpPossibleException
2600 REFRESH_IBASE
2601 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2602
2603
2604/* ------------------------------ */
2605 .balign 128
2606.L_op_iput_short: /* 0x5f */
2607/* File: x86/op_iput_short.S */
2608/* File: x86/op_iput.S */
2609/*
2610 * General 32-bit instance field put.
2611 *
2612 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2613 */
2614 /* op vA, vB, field@CCCC */
2615 .extern artSet16InstanceFromMterp
2616 EXPORT_PC
2617 movzwl 2(rPC), %eax # eax<- 0000CCCC
2618 movl %eax, OUT_ARG0(%esp) # field ref CCCC
2619 movzbl rINSTbl, %ecx # ecx<- BA
2620 sarl $4, %ecx # ecx<- B
2621 GET_VREG %ecx, %ecx
2622 movl %ecx, OUT_ARG1(%esp) # the object pointer
2623 andb $0xf, rINSTbl # rINST<- A
2624 GET_VREG %eax, rINST
2625 movl %eax, OUT_ARG2(%esp) # fp[A]
2626 movl OFF_FP_METHOD(rFP), %eax
2627 movl %eax, OUT_ARG3(%esp) # referrer
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002628 call SYMBOL(artSet16InstanceFromMterp)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002629 testl %eax, %eax
2630 jnz MterpPossibleException
2631 REFRESH_IBASE
2632 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2633
2634
2635/* ------------------------------ */
2636 .balign 128
2637.L_op_sget: /* 0x60 */
2638/* File: x86/op_sget.S */
2639/*
2640 * General SGET handler wrapper.
2641 *
2642 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2643 */
2644 /* op vAA, field@BBBB */
2645 .extern artGet32StaticFromCode
2646 EXPORT_PC
2647 movzwl 2(rPC), %eax
2648 movl %eax, OUT_ARG0(%esp) # field ref CCCC
2649 movl OFF_FP_METHOD(rFP), %eax
2650 movl %eax, OUT_ARG1(%esp) # referrer
2651 movl rSELF, %ecx
2652 movl %ecx, OUT_ARG2(%esp) # self
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002653 call SYMBOL(artGet32StaticFromCode)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002654 movl rSELF, %ecx
2655 REFRESH_IBASE_FROM_SELF %ecx
2656 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx)
2657 jnz MterpException
2658 .if 0
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002659 SET_VREG_OBJECT %eax, rINST # fp[A] <- value
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002660 .else
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002661 SET_VREG %eax, rINST # fp[A] <- value
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002662 .endif
2663 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2664
2665/* ------------------------------ */
2666 .balign 128
2667.L_op_sget_wide: /* 0x61 */
2668/* File: x86/op_sget_wide.S */
2669/*
2670 * SGET_WIDE handler wrapper.
2671 *
2672 */
2673 /* sget-wide vAA, field@BBBB */
2674 .extern artGet64StaticFromCode
2675 EXPORT_PC
2676 movzwl 2(rPC), %eax
2677 movl %eax, OUT_ARG0(%esp) # field ref CCCC
2678 movl OFF_FP_METHOD(rFP), %eax
2679 movl %eax, OUT_ARG1(%esp) # referrer
2680 movl rSELF, %ecx
2681 movl %ecx, OUT_ARG2(%esp) # self
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002682 call SYMBOL(artGet64StaticFromCode)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002683 movl rSELF, %ecx
2684 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx)
2685 jnz MterpException
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002686 SET_VREG %eax, rINST # fp[A]<- low part
2687 SET_VREG_HIGH %edx, rINST # fp[A+1]<- high part
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002688 REFRESH_IBASE_FROM_SELF %ecx
2689 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2690
2691/* ------------------------------ */
2692 .balign 128
2693.L_op_sget_object: /* 0x62 */
2694/* File: x86/op_sget_object.S */
2695/* File: x86/op_sget.S */
2696/*
2697 * General SGET handler wrapper.
2698 *
2699 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2700 */
2701 /* op vAA, field@BBBB */
2702 .extern artGetObjStaticFromCode
2703 EXPORT_PC
2704 movzwl 2(rPC), %eax
2705 movl %eax, OUT_ARG0(%esp) # field ref CCCC
2706 movl OFF_FP_METHOD(rFP), %eax
2707 movl %eax, OUT_ARG1(%esp) # referrer
2708 movl rSELF, %ecx
2709 movl %ecx, OUT_ARG2(%esp) # self
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002710 call SYMBOL(artGetObjStaticFromCode)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002711 movl rSELF, %ecx
2712 REFRESH_IBASE_FROM_SELF %ecx
2713 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx)
2714 jnz MterpException
2715 .if 1
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002716 SET_VREG_OBJECT %eax, rINST # fp[A] <- value
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002717 .else
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002718 SET_VREG %eax, rINST # fp[A] <- value
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002719 .endif
2720 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2721
2722
2723/* ------------------------------ */
2724 .balign 128
2725.L_op_sget_boolean: /* 0x63 */
2726/* File: x86/op_sget_boolean.S */
2727/* File: x86/op_sget.S */
2728/*
2729 * General SGET handler wrapper.
2730 *
2731 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2732 */
2733 /* op vAA, field@BBBB */
2734 .extern artGetBooleanStaticFromCode
2735 EXPORT_PC
2736 movzwl 2(rPC), %eax
2737 movl %eax, OUT_ARG0(%esp) # field ref CCCC
2738 movl OFF_FP_METHOD(rFP), %eax
2739 movl %eax, OUT_ARG1(%esp) # referrer
2740 movl rSELF, %ecx
2741 movl %ecx, OUT_ARG2(%esp) # self
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002742 call SYMBOL(artGetBooleanStaticFromCode)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002743 movl rSELF, %ecx
2744 REFRESH_IBASE_FROM_SELF %ecx
2745 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx)
2746 jnz MterpException
2747 .if 0
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002748 SET_VREG_OBJECT %eax, rINST # fp[A] <- value
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002749 .else
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002750 SET_VREG %eax, rINST # fp[A] <- value
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002751 .endif
2752 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2753
2754
2755/* ------------------------------ */
2756 .balign 128
2757.L_op_sget_byte: /* 0x64 */
2758/* File: x86/op_sget_byte.S */
2759/* File: x86/op_sget.S */
2760/*
2761 * General SGET handler wrapper.
2762 *
2763 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2764 */
2765 /* op vAA, field@BBBB */
2766 .extern artGetByteStaticFromCode
2767 EXPORT_PC
2768 movzwl 2(rPC), %eax
2769 movl %eax, OUT_ARG0(%esp) # field ref CCCC
2770 movl OFF_FP_METHOD(rFP), %eax
2771 movl %eax, OUT_ARG1(%esp) # referrer
2772 movl rSELF, %ecx
2773 movl %ecx, OUT_ARG2(%esp) # self
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002774 call SYMBOL(artGetByteStaticFromCode)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002775 movl rSELF, %ecx
2776 REFRESH_IBASE_FROM_SELF %ecx
2777 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx)
2778 jnz MterpException
2779 .if 0
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002780 SET_VREG_OBJECT %eax, rINST # fp[A] <- value
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002781 .else
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002782 SET_VREG %eax, rINST # fp[A] <- value
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002783 .endif
2784 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2785
2786
2787/* ------------------------------ */
2788 .balign 128
2789.L_op_sget_char: /* 0x65 */
2790/* File: x86/op_sget_char.S */
2791/* File: x86/op_sget.S */
2792/*
2793 * General SGET handler wrapper.
2794 *
2795 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2796 */
2797 /* op vAA, field@BBBB */
2798 .extern artGetCharStaticFromCode
2799 EXPORT_PC
2800 movzwl 2(rPC), %eax
2801 movl %eax, OUT_ARG0(%esp) # field ref CCCC
2802 movl OFF_FP_METHOD(rFP), %eax
2803 movl %eax, OUT_ARG1(%esp) # referrer
2804 movl rSELF, %ecx
2805 movl %ecx, OUT_ARG2(%esp) # self
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002806 call SYMBOL(artGetCharStaticFromCode)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002807 movl rSELF, %ecx
2808 REFRESH_IBASE_FROM_SELF %ecx
2809 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx)
2810 jnz MterpException
2811 .if 0
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002812 SET_VREG_OBJECT %eax, rINST # fp[A] <- value
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002813 .else
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002814 SET_VREG %eax, rINST # fp[A] <- value
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002815 .endif
2816 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2817
2818
2819/* ------------------------------ */
2820 .balign 128
2821.L_op_sget_short: /* 0x66 */
2822/* File: x86/op_sget_short.S */
2823/* File: x86/op_sget.S */
2824/*
2825 * General SGET handler wrapper.
2826 *
2827 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2828 */
2829 /* op vAA, field@BBBB */
2830 .extern artGetShortStaticFromCode
2831 EXPORT_PC
2832 movzwl 2(rPC), %eax
2833 movl %eax, OUT_ARG0(%esp) # field ref CCCC
2834 movl OFF_FP_METHOD(rFP), %eax
2835 movl %eax, OUT_ARG1(%esp) # referrer
2836 movl rSELF, %ecx
2837 movl %ecx, OUT_ARG2(%esp) # self
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002838 call SYMBOL(artGetShortStaticFromCode)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002839 movl rSELF, %ecx
2840 REFRESH_IBASE_FROM_SELF %ecx
2841 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx)
2842 jnz MterpException
2843 .if 0
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002844 SET_VREG_OBJECT %eax, rINST # fp[A] <- value
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002845 .else
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002846 SET_VREG %eax, rINST # fp[A] <- value
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002847 .endif
2848 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2849
2850
2851/* ------------------------------ */
2852 .balign 128
2853.L_op_sput: /* 0x67 */
2854/* File: x86/op_sput.S */
2855/*
2856 * General SPUT handler wrapper.
2857 *
2858 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2859 */
2860 /* op vAA, field@BBBB */
2861 .extern artSet32StaticFromCode
2862 EXPORT_PC
2863 movzwl 2(rPC), %eax
2864 movl %eax, OUT_ARG0(%esp) # field ref BBBB
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002865 GET_VREG rINST, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002866 movl rINST, OUT_ARG1(%esp) # fp[AA]
2867 movl OFF_FP_METHOD(rFP), %eax
2868 movl %eax, OUT_ARG2(%esp) # referrer
2869 movl rSELF, %ecx
2870 movl %ecx, OUT_ARG3(%esp) # self
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002871 call SYMBOL(artSet32StaticFromCode)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002872 testl %eax, %eax
2873 jnz MterpException
2874 REFRESH_IBASE
2875 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2876
2877/* ------------------------------ */
2878 .balign 128
2879.L_op_sput_wide: /* 0x68 */
2880/* File: x86/op_sput_wide.S */
2881/*
2882 * SPUT_WIDE handler wrapper.
2883 *
2884 */
2885 /* sput-wide vAA, field@BBBB */
2886 .extern artSet64IndirectStaticFromMterp
2887 EXPORT_PC
2888 movzwl 2(rPC), %eax
2889 movl %eax, OUT_ARG0(%esp) # field ref BBBB
2890 movl OFF_FP_METHOD(rFP), %eax
2891 movl %eax, OUT_ARG1(%esp) # referrer
2892 leal VREG_ADDRESS(rINST), %eax
2893 movl %eax, OUT_ARG2(%esp) # &fp[AA]
2894 movl rSELF, %ecx
2895 movl %ecx, OUT_ARG3(%esp) # self
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002896 call SYMBOL(artSet64IndirectStaticFromMterp)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002897 testl %eax, %eax
2898 jnz MterpException
2899 REFRESH_IBASE
2900 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2901
2902/* ------------------------------ */
2903 .balign 128
2904.L_op_sput_object: /* 0x69 */
2905/* File: x86/op_sput_object.S */
2906 EXPORT_PC
2907 leal OFF_FP_SHADOWFRAME(rFP), %eax
2908 movl %eax, OUT_ARG0(%esp)
2909 movl rPC, OUT_ARG1(%esp)
2910 REFRESH_INST 105
2911 movl rINST, OUT_ARG2(%esp)
2912 movl rSELF, %ecx
2913 movl %ecx, OUT_ARG3(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002914 call SYMBOL(MterpSputObject)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002915 testl %eax, %eax
2916 jz MterpException
2917 REFRESH_IBASE
2918 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2919
2920/* ------------------------------ */
2921 .balign 128
2922.L_op_sput_boolean: /* 0x6a */
2923/* File: x86/op_sput_boolean.S */
2924/* File: x86/op_sput.S */
2925/*
2926 * General SPUT handler wrapper.
2927 *
2928 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2929 */
2930 /* op vAA, field@BBBB */
2931 .extern artSet8StaticFromCode
2932 EXPORT_PC
2933 movzwl 2(rPC), %eax
2934 movl %eax, OUT_ARG0(%esp) # field ref BBBB
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002935 GET_VREG rINST, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002936 movl rINST, OUT_ARG1(%esp) # fp[AA]
2937 movl OFF_FP_METHOD(rFP), %eax
2938 movl %eax, OUT_ARG2(%esp) # referrer
2939 movl rSELF, %ecx
2940 movl %ecx, OUT_ARG3(%esp) # self
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002941 call SYMBOL(artSet8StaticFromCode)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002942 testl %eax, %eax
2943 jnz MterpException
2944 REFRESH_IBASE
2945 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2946
2947
2948/* ------------------------------ */
2949 .balign 128
2950.L_op_sput_byte: /* 0x6b */
2951/* File: x86/op_sput_byte.S */
2952/* File: x86/op_sput.S */
2953/*
2954 * General SPUT handler wrapper.
2955 *
2956 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2957 */
2958 /* op vAA, field@BBBB */
2959 .extern artSet8StaticFromCode
2960 EXPORT_PC
2961 movzwl 2(rPC), %eax
2962 movl %eax, OUT_ARG0(%esp) # field ref BBBB
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002963 GET_VREG rINST, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002964 movl rINST, OUT_ARG1(%esp) # fp[AA]
2965 movl OFF_FP_METHOD(rFP), %eax
2966 movl %eax, OUT_ARG2(%esp) # referrer
2967 movl rSELF, %ecx
2968 movl %ecx, OUT_ARG3(%esp) # self
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002969 call SYMBOL(artSet8StaticFromCode)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002970 testl %eax, %eax
2971 jnz MterpException
2972 REFRESH_IBASE
2973 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2974
2975
2976/* ------------------------------ */
2977 .balign 128
2978.L_op_sput_char: /* 0x6c */
2979/* File: x86/op_sput_char.S */
2980/* File: x86/op_sput.S */
2981/*
2982 * General SPUT handler wrapper.
2983 *
2984 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2985 */
2986 /* op vAA, field@BBBB */
2987 .extern artSet16StaticFromCode
2988 EXPORT_PC
2989 movzwl 2(rPC), %eax
2990 movl %eax, OUT_ARG0(%esp) # field ref BBBB
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002991 GET_VREG rINST, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002992 movl rINST, OUT_ARG1(%esp) # fp[AA]
2993 movl OFF_FP_METHOD(rFP), %eax
2994 movl %eax, OUT_ARG2(%esp) # referrer
2995 movl rSELF, %ecx
2996 movl %ecx, OUT_ARG3(%esp) # self
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06002997 call SYMBOL(artSet16StaticFromCode)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00002998 testl %eax, %eax
2999 jnz MterpException
3000 REFRESH_IBASE
3001 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
3002
3003
3004/* ------------------------------ */
3005 .balign 128
3006.L_op_sput_short: /* 0x6d */
3007/* File: x86/op_sput_short.S */
3008/* File: x86/op_sput.S */
3009/*
3010 * General SPUT handler wrapper.
3011 *
3012 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3013 */
3014 /* op vAA, field@BBBB */
3015 .extern artSet16StaticFromCode
3016 EXPORT_PC
3017 movzwl 2(rPC), %eax
3018 movl %eax, OUT_ARG0(%esp) # field ref BBBB
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06003019 GET_VREG rINST, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00003020 movl rINST, OUT_ARG1(%esp) # fp[AA]
3021 movl OFF_FP_METHOD(rFP), %eax
3022 movl %eax, OUT_ARG2(%esp) # referrer
3023 movl rSELF, %ecx
3024 movl %ecx, OUT_ARG3(%esp) # self
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06003025 call SYMBOL(artSet16StaticFromCode)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00003026 testl %eax, %eax
3027 jnz MterpException
3028 REFRESH_IBASE
3029 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
3030
3031
3032/* ------------------------------ */
3033 .balign 128
3034.L_op_invoke_virtual: /* 0x6e */
3035/* File: x86/op_invoke_virtual.S */
3036/* File: x86/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 MterpInvokeVirtual
3043 EXPORT_PC
3044 movl rSELF, %ecx
3045 movl %ecx, OUT_ARG0(%esp)
3046 leal OFF_FP_SHADOWFRAME(rFP), %eax
3047 movl %eax, OUT_ARG1(%esp)
3048 movl rPC, OUT_ARG2(%esp)
3049 REFRESH_INST 110
3050 movl rINST, OUT_ARG3(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06003051 call SYMBOL(MterpInvokeVirtual)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00003052 testl %eax, %eax
3053 jz MterpException
3054 REFRESH_IBASE
3055 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
3056
3057/*
3058 * Handle a virtual method call.
3059 *
3060 * for: invoke-virtual, invoke-virtual/range
3061 */
3062 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3063 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3064
3065/* ------------------------------ */
3066 .balign 128
3067.L_op_invoke_super: /* 0x6f */
3068/* File: x86/op_invoke_super.S */
3069/* File: x86/invoke.S */
3070/*
3071 * Generic invoke handler wrapper.
3072 */
3073 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3074 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3075 .extern MterpInvokeSuper
3076 EXPORT_PC
3077 movl rSELF, %ecx
3078 movl %ecx, OUT_ARG0(%esp)
3079 leal OFF_FP_SHADOWFRAME(rFP), %eax
3080 movl %eax, OUT_ARG1(%esp)
3081 movl rPC, OUT_ARG2(%esp)
3082 REFRESH_INST 111
3083 movl rINST, OUT_ARG3(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06003084 call SYMBOL(MterpInvokeSuper)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00003085 testl %eax, %eax
3086 jz MterpException
3087 REFRESH_IBASE
3088 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
3089
3090/*
3091 * Handle a "super" method call.
3092 *
3093 * for: invoke-super, invoke-super/range
3094 */
3095 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3096 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3097
3098/* ------------------------------ */
3099 .balign 128
3100.L_op_invoke_direct: /* 0x70 */
3101/* File: x86/op_invoke_direct.S */
3102/* File: x86/invoke.S */
3103/*
3104 * Generic invoke handler wrapper.
3105 */
3106 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3107 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3108 .extern MterpInvokeDirect
3109 EXPORT_PC
3110 movl rSELF, %ecx
3111 movl %ecx, OUT_ARG0(%esp)
3112 leal OFF_FP_SHADOWFRAME(rFP), %eax
3113 movl %eax, OUT_ARG1(%esp)
3114 movl rPC, OUT_ARG2(%esp)
3115 REFRESH_INST 112
3116 movl rINST, OUT_ARG3(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06003117 call SYMBOL(MterpInvokeDirect)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00003118 testl %eax, %eax
3119 jz MterpException
3120 REFRESH_IBASE
3121 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
3122
3123
3124/* ------------------------------ */
3125 .balign 128
3126.L_op_invoke_static: /* 0x71 */
3127/* File: x86/op_invoke_static.S */
3128/* File: x86/invoke.S */
3129/*
3130 * Generic invoke handler wrapper.
3131 */
3132 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3133 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3134 .extern MterpInvokeStatic
3135 EXPORT_PC
3136 movl rSELF, %ecx
3137 movl %ecx, OUT_ARG0(%esp)
3138 leal OFF_FP_SHADOWFRAME(rFP), %eax
3139 movl %eax, OUT_ARG1(%esp)
3140 movl rPC, OUT_ARG2(%esp)
3141 REFRESH_INST 113
3142 movl rINST, OUT_ARG3(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06003143 call SYMBOL(MterpInvokeStatic)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00003144 testl %eax, %eax
3145 jz MterpException
3146 REFRESH_IBASE
3147 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
3148
3149
3150
3151/* ------------------------------ */
3152 .balign 128
3153.L_op_invoke_interface: /* 0x72 */
3154/* File: x86/op_invoke_interface.S */
3155/* File: x86/invoke.S */
3156/*
3157 * Generic invoke handler wrapper.
3158 */
3159 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3160 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3161 .extern MterpInvokeInterface
3162 EXPORT_PC
3163 movl rSELF, %ecx
3164 movl %ecx, OUT_ARG0(%esp)
3165 leal OFF_FP_SHADOWFRAME(rFP), %eax
3166 movl %eax, OUT_ARG1(%esp)
3167 movl rPC, OUT_ARG2(%esp)
3168 REFRESH_INST 114
3169 movl rINST, OUT_ARG3(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06003170 call SYMBOL(MterpInvokeInterface)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00003171 testl %eax, %eax
3172 jz MterpException
3173 REFRESH_IBASE
3174 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
3175
3176/*
3177 * Handle an interface method call.
3178 *
3179 * for: invoke-interface, invoke-interface/range
3180 */
3181 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3182 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3183
3184/* ------------------------------ */
3185 .balign 128
3186.L_op_return_void_no_barrier: /* 0x73 */
3187/* File: x86/op_return_void_no_barrier.S */
buzbeea2c97a92016-01-25 15:41:24 -08003188 movl rSELF, %eax
3189 testl $(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST), THREAD_FLAGS_OFFSET(%eax)
3190 jz 1f
3191 movl %eax, OUT_ARG0(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06003192 call SYMBOL(MterpSuspendCheck)
buzbeea2c97a92016-01-25 15:41:24 -080031931:
Bill Buzbee7c58bd42016-01-20 20:46:01 +00003194 xorl %eax, %eax
3195 xorl %ecx, %ecx
3196 jmp MterpReturn
3197
3198/* ------------------------------ */
3199 .balign 128
3200.L_op_invoke_virtual_range: /* 0x74 */
3201/* File: x86/op_invoke_virtual_range.S */
3202/* File: x86/invoke.S */
3203/*
3204 * Generic invoke handler wrapper.
3205 */
3206 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3207 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3208 .extern MterpInvokeVirtualRange
3209 EXPORT_PC
3210 movl rSELF, %ecx
3211 movl %ecx, OUT_ARG0(%esp)
3212 leal OFF_FP_SHADOWFRAME(rFP), %eax
3213 movl %eax, OUT_ARG1(%esp)
3214 movl rPC, OUT_ARG2(%esp)
3215 REFRESH_INST 116
3216 movl rINST, OUT_ARG3(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06003217 call SYMBOL(MterpInvokeVirtualRange)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00003218 testl %eax, %eax
3219 jz MterpException
3220 REFRESH_IBASE
3221 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
3222
3223
3224/* ------------------------------ */
3225 .balign 128
3226.L_op_invoke_super_range: /* 0x75 */
3227/* File: x86/op_invoke_super_range.S */
3228/* File: x86/invoke.S */
3229/*
3230 * Generic invoke handler wrapper.
3231 */
3232 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3233 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3234 .extern MterpInvokeSuperRange
3235 EXPORT_PC
3236 movl rSELF, %ecx
3237 movl %ecx, OUT_ARG0(%esp)
3238 leal OFF_FP_SHADOWFRAME(rFP), %eax
3239 movl %eax, OUT_ARG1(%esp)
3240 movl rPC, OUT_ARG2(%esp)
3241 REFRESH_INST 117
3242 movl rINST, OUT_ARG3(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06003243 call SYMBOL(MterpInvokeSuperRange)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00003244 testl %eax, %eax
3245 jz MterpException
3246 REFRESH_IBASE
3247 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
3248
3249
3250/* ------------------------------ */
3251 .balign 128
3252.L_op_invoke_direct_range: /* 0x76 */
3253/* File: x86/op_invoke_direct_range.S */
3254/* File: x86/invoke.S */
3255/*
3256 * Generic invoke handler wrapper.
3257 */
3258 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3259 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3260 .extern MterpInvokeDirectRange
3261 EXPORT_PC
3262 movl rSELF, %ecx
3263 movl %ecx, OUT_ARG0(%esp)
3264 leal OFF_FP_SHADOWFRAME(rFP), %eax
3265 movl %eax, OUT_ARG1(%esp)
3266 movl rPC, OUT_ARG2(%esp)
3267 REFRESH_INST 118
3268 movl rINST, OUT_ARG3(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06003269 call SYMBOL(MterpInvokeDirectRange)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00003270 testl %eax, %eax
3271 jz MterpException
3272 REFRESH_IBASE
3273 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
3274
3275
3276/* ------------------------------ */
3277 .balign 128
3278.L_op_invoke_static_range: /* 0x77 */
3279/* File: x86/op_invoke_static_range.S */
3280/* File: x86/invoke.S */
3281/*
3282 * Generic invoke handler wrapper.
3283 */
3284 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3285 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3286 .extern MterpInvokeStaticRange
3287 EXPORT_PC
3288 movl rSELF, %ecx
3289 movl %ecx, OUT_ARG0(%esp)
3290 leal OFF_FP_SHADOWFRAME(rFP), %eax
3291 movl %eax, OUT_ARG1(%esp)
3292 movl rPC, OUT_ARG2(%esp)
3293 REFRESH_INST 119
3294 movl rINST, OUT_ARG3(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06003295 call SYMBOL(MterpInvokeStaticRange)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00003296 testl %eax, %eax
3297 jz MterpException
3298 REFRESH_IBASE
3299 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
3300
3301
3302/* ------------------------------ */
3303 .balign 128
3304.L_op_invoke_interface_range: /* 0x78 */
3305/* File: x86/op_invoke_interface_range.S */
3306/* File: x86/invoke.S */
3307/*
3308 * Generic invoke handler wrapper.
3309 */
3310 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3311 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3312 .extern MterpInvokeInterfaceRange
3313 EXPORT_PC
3314 movl rSELF, %ecx
3315 movl %ecx, OUT_ARG0(%esp)
3316 leal OFF_FP_SHADOWFRAME(rFP), %eax
3317 movl %eax, OUT_ARG1(%esp)
3318 movl rPC, OUT_ARG2(%esp)
3319 REFRESH_INST 120
3320 movl rINST, OUT_ARG3(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06003321 call SYMBOL(MterpInvokeInterfaceRange)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00003322 testl %eax, %eax
3323 jz MterpException
3324 REFRESH_IBASE
3325 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
3326
3327
3328/* ------------------------------ */
3329 .balign 128
3330.L_op_unused_79: /* 0x79 */
3331/* File: x86/op_unused_79.S */
3332/* File: x86/unused.S */
3333/*
3334 * Bail to reference interpreter to throw.
3335 */
3336 jmp MterpFallback
3337
3338
3339/* ------------------------------ */
3340 .balign 128
3341.L_op_unused_7a: /* 0x7a */
3342/* File: x86/op_unused_7a.S */
3343/* File: x86/unused.S */
3344/*
3345 * Bail to reference interpreter to throw.
3346 */
3347 jmp MterpFallback
3348
3349
3350/* ------------------------------ */
3351 .balign 128
3352.L_op_neg_int: /* 0x7b */
3353/* File: x86/op_neg_int.S */
3354/* File: x86/unop.S */
3355/*
3356 * Generic 32-bit unary operation. Provide an "instr" line that
3357 * specifies an instruction that performs "result = op eax".
3358 */
3359 /* unop vA, vB */
3360 movzbl rINSTbl,%ecx # ecx <- A+
3361 sarl $4,rINST # rINST <- B
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06003362 GET_VREG %eax, rINST # eax <- vB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00003363 andb $0xf,%cl # ecx <- A
3364 negl %eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06003365 SET_VREG %eax, %ecx
Bill Buzbee7c58bd42016-01-20 20:46:01 +00003366 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3367
3368
3369/* ------------------------------ */
3370 .balign 128
3371.L_op_not_int: /* 0x7c */
3372/* File: x86/op_not_int.S */
3373/* File: x86/unop.S */
3374/*
3375 * Generic 32-bit unary operation. Provide an "instr" line that
3376 * specifies an instruction that performs "result = op eax".
3377 */
3378 /* unop vA, vB */
3379 movzbl rINSTbl,%ecx # ecx <- A+
3380 sarl $4,rINST # rINST <- B
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06003381 GET_VREG %eax, rINST # eax <- vB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00003382 andb $0xf,%cl # ecx <- A
3383 notl %eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06003384 SET_VREG %eax, %ecx
Bill Buzbee7c58bd42016-01-20 20:46:01 +00003385 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3386
3387
3388/* ------------------------------ */
3389 .balign 128
3390.L_op_neg_long: /* 0x7d */
3391/* File: x86/op_neg_long.S */
3392 /* unop vA, vB */
3393 movzbl rINSTbl, %ecx # ecx <- BA
3394 sarl $4, %ecx # ecx <- B
3395 andb $0xf, rINSTbl # rINST <- A
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06003396 GET_VREG %eax, %ecx # eax <- v[B+0]
3397 GET_VREG_HIGH %ecx, %ecx # ecx <- v[B+1]
Bill Buzbee7c58bd42016-01-20 20:46:01 +00003398 negl %eax
3399 adcl $0, %ecx
3400 negl %ecx
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06003401 SET_VREG %eax, rINST # v[A+0] <- eax
3402 SET_VREG_HIGH %ecx, rINST # v[A+1] <- ecx
Bill Buzbee7c58bd42016-01-20 20:46:01 +00003403 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3404
3405
3406/* ------------------------------ */
3407 .balign 128
3408.L_op_not_long: /* 0x7e */
3409/* File: x86/op_not_long.S */
3410 /* unop vA, vB */
3411 movzbl rINSTbl, %ecx # ecx <- BA
3412 sarl $4, %ecx # ecx <- B
3413 andb $0xf, rINSTbl # rINST <- A
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06003414 GET_VREG %eax, %ecx # eax <- v[B+0]
3415 GET_VREG_HIGH %ecx, %ecx # ecx <- v[B+1]
Bill Buzbee7c58bd42016-01-20 20:46:01 +00003416 notl %eax
3417 notl %ecx
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06003418 SET_VREG %eax, rINST # v[A+0] <- eax
3419 SET_VREG_HIGH %ecx, rINST # v[A+1] <- ecx
Bill Buzbee7c58bd42016-01-20 20:46:01 +00003420 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3421
3422/* ------------------------------ */
3423 .balign 128
3424.L_op_neg_float: /* 0x7f */
3425/* File: x86/op_neg_float.S */
3426/* File: x86/fpcvt.S */
3427/*
3428 * Generic 32-bit FP conversion operation.
3429 */
3430 /* unop vA, vB */
3431 movzbl rINSTbl, %ecx # ecx <- A+
3432 sarl $4, rINST # rINST <- B
3433 flds VREG_ADDRESS(rINST) # %st0 <- vB
3434 andb $0xf, %cl # ecx <- A
3435 fchs
3436 fstps VREG_ADDRESS(%ecx) # vA <- %st0
3437 .if 0
3438 CLEAR_WIDE_REF %ecx
3439 .else
3440 CLEAR_REF %ecx
3441 .endif
3442 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3443
3444
3445/* ------------------------------ */
3446 .balign 128
3447.L_op_neg_double: /* 0x80 */
3448/* File: x86/op_neg_double.S */
3449/* File: x86/fpcvt.S */
3450/*
3451 * Generic 32-bit FP conversion operation.
3452 */
3453 /* unop vA, vB */
3454 movzbl rINSTbl, %ecx # ecx <- A+
3455 sarl $4, rINST # rINST <- B
3456 fldl VREG_ADDRESS(rINST) # %st0 <- vB
3457 andb $0xf, %cl # ecx <- A
3458 fchs
3459 fstpl VREG_ADDRESS(%ecx) # vA <- %st0
3460 .if 1
3461 CLEAR_WIDE_REF %ecx
3462 .else
3463 CLEAR_REF %ecx
3464 .endif
3465 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3466
3467
3468/* ------------------------------ */
3469 .balign 128
3470.L_op_int_to_long: /* 0x81 */
3471/* File: x86/op_int_to_long.S */
3472 /* int to long vA, vB */
3473 movzbl rINSTbl, %eax # eax <- +A
3474 sarl $4, %eax # eax <- B
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06003475 GET_VREG %eax, %eax # eax <- vB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00003476 andb $0xf, rINSTbl # rINST <- A
3477 movl rIBASE, %ecx # cltd trashes rIBASE/edx
3478 cltd # rINST:eax<- sssssssBBBBBBBB
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06003479 SET_VREG_HIGH rIBASE, rINST # v[A+1] <- rIBASE
3480 SET_VREG %eax, rINST # v[A+0] <- %eax
Bill Buzbee7c58bd42016-01-20 20:46:01 +00003481 movl %ecx, rIBASE
3482 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3483
3484
3485/* ------------------------------ */
3486 .balign 128
3487.L_op_int_to_float: /* 0x82 */
3488/* File: x86/op_int_to_float.S */
3489/* File: x86/fpcvt.S */
3490/*
3491 * Generic 32-bit FP conversion operation.
3492 */
3493 /* unop vA, vB */
3494 movzbl rINSTbl, %ecx # ecx <- A+
3495 sarl $4, rINST # rINST <- B
3496 fildl VREG_ADDRESS(rINST) # %st0 <- vB
3497 andb $0xf, %cl # ecx <- A
3498
3499 fstps VREG_ADDRESS(%ecx) # vA <- %st0
3500 .if 0
3501 CLEAR_WIDE_REF %ecx
3502 .else
3503 CLEAR_REF %ecx
3504 .endif
3505 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3506
3507
3508/* ------------------------------ */
3509 .balign 128
3510.L_op_int_to_double: /* 0x83 */
3511/* File: x86/op_int_to_double.S */
3512/* File: x86/fpcvt.S */
3513/*
3514 * Generic 32-bit FP conversion operation.
3515 */
3516 /* unop vA, vB */
3517 movzbl rINSTbl, %ecx # ecx <- A+
3518 sarl $4, rINST # rINST <- B
3519 fildl VREG_ADDRESS(rINST) # %st0 <- vB
3520 andb $0xf, %cl # ecx <- A
3521
3522 fstpl VREG_ADDRESS(%ecx) # vA <- %st0
3523 .if 1
3524 CLEAR_WIDE_REF %ecx
3525 .else
3526 CLEAR_REF %ecx
3527 .endif
3528 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3529
3530
3531/* ------------------------------ */
3532 .balign 128
3533.L_op_long_to_int: /* 0x84 */
3534/* File: x86/op_long_to_int.S */
3535/* we ignore the high word, making this equivalent to a 32-bit reg move */
3536/* File: x86/op_move.S */
3537 /* for move, move-object, long-to-int */
3538 /* op vA, vB */
3539 movzbl rINSTbl, %eax # eax <- BA
3540 andb $0xf, %al # eax <- A
3541 shrl $4, rINST # rINST <- B
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06003542 GET_VREG rINST, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00003543 .if 0
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06003544 SET_VREG_OBJECT rINST, %eax # fp[A] <- fp[B]
Bill Buzbee7c58bd42016-01-20 20:46:01 +00003545 .else
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06003546 SET_VREG rINST, %eax # fp[A] <- fp[B]
Bill Buzbee7c58bd42016-01-20 20:46:01 +00003547 .endif
3548 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3549
3550
3551/* ------------------------------ */
3552 .balign 128
3553.L_op_long_to_float: /* 0x85 */
3554/* File: x86/op_long_to_float.S */
3555/* File: x86/fpcvt.S */
3556/*
3557 * Generic 32-bit FP conversion operation.
3558 */
3559 /* unop vA, vB */
3560 movzbl rINSTbl, %ecx # ecx <- A+
3561 sarl $4, rINST # rINST <- B
3562 fildll VREG_ADDRESS(rINST) # %st0 <- vB
3563 andb $0xf, %cl # ecx <- A
3564
3565 fstps VREG_ADDRESS(%ecx) # vA <- %st0
3566 .if 0
3567 CLEAR_WIDE_REF %ecx
3568 .else
3569 CLEAR_REF %ecx
3570 .endif
3571 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3572
3573
3574/* ------------------------------ */
3575 .balign 128
3576.L_op_long_to_double: /* 0x86 */
3577/* File: x86/op_long_to_double.S */
3578/* File: x86/fpcvt.S */
3579/*
3580 * Generic 32-bit FP conversion operation.
3581 */
3582 /* unop vA, vB */
3583 movzbl rINSTbl, %ecx # ecx <- A+
3584 sarl $4, rINST # rINST <- B
3585 fildll VREG_ADDRESS(rINST) # %st0 <- vB
3586 andb $0xf, %cl # ecx <- A
3587
3588 fstpl VREG_ADDRESS(%ecx) # vA <- %st0
3589 .if 1
3590 CLEAR_WIDE_REF %ecx
3591 .else
3592 CLEAR_REF %ecx
3593 .endif
3594 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3595
3596
3597/* ------------------------------ */
3598 .balign 128
3599.L_op_float_to_int: /* 0x87 */
3600/* File: x86/op_float_to_int.S */
3601/* File: x86/cvtfp_int.S */
3602/* On fp to int conversions, Java requires that
3603 * if the result > maxint, it should be clamped to maxint. If it is less
3604 * than minint, it should be clamped to minint. If it is a nan, the result
3605 * should be zero. Further, the rounding mode is to truncate. This model
3606 * differs from what is delivered normally via the x86 fpu, so we have
3607 * to play some games.
3608 */
3609 /* float/double to int/long vA, vB */
3610 movzbl rINSTbl, %ecx # ecx <- A+
3611 sarl $4, rINST # rINST <- B
3612 .if 0
3613 fldl VREG_ADDRESS(rINST) # %st0 <- vB
3614 .else
3615 flds VREG_ADDRESS(rINST) # %st0 <- vB
3616 .endif
3617 ftst
3618 fnstcw LOCAL0(%esp) # remember original rounding mode
3619 movzwl LOCAL0(%esp), %eax
3620 movb $0xc, %ah
3621 movw %ax, LOCAL0+2(%esp)
3622 fldcw LOCAL0+2(%esp) # set "to zero" rounding mode
3623 andb $0xf, %cl # ecx <- A
3624 .if 0
3625 fistpll VREG_ADDRESS(%ecx) # convert and store
3626 .else
3627 fistpl VREG_ADDRESS(%ecx) # convert and store
3628 .endif
3629 fldcw LOCAL0(%esp) # restore previous rounding mode
3630 .if 0
3631 movl $0x80000000, %eax
3632 xorl VREG_HIGH_ADDRESS(%ecx), %eax
3633 orl VREG_ADDRESS(%ecx), %eax
3634 .else
3635 cmpl $0x80000000, VREG_ADDRESS(%ecx)
3636 .endif
3637 je .Lop_float_to_int_special_case # fix up result
3638
3639.Lop_float_to_int_finish:
3640 xor %eax, %eax
3641 mov %eax, VREG_REF_ADDRESS(%ecx)
3642 .if 0
3643 mov %eax, VREG_REF_HIGH_ADDRESS(%ecx)
3644 .endif
3645 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3646
3647.Lop_float_to_int_special_case:
3648 fnstsw %ax
3649 sahf
3650 jp .Lop_float_to_int_isNaN
3651 adcl $-1, VREG_ADDRESS(%ecx)
3652 .if 0
3653 adcl $-1, VREG_HIGH_ADDRESS(%ecx)
3654 .endif
3655 jmp .Lop_float_to_int_finish
3656.Lop_float_to_int_isNaN:
3657 movl $0, VREG_ADDRESS(%ecx)
3658 .if 0
3659 movl $0, VREG_HIGH_ADDRESS(%ecx)
3660 .endif
3661 jmp .Lop_float_to_int_finish
3662
3663
3664/* ------------------------------ */
3665 .balign 128
3666.L_op_float_to_long: /* 0x88 */
3667/* File: x86/op_float_to_long.S */
3668/* File: x86/cvtfp_int.S */
3669/* On fp to int conversions, Java requires that
3670 * if the result > maxint, it should be clamped to maxint. If it is less
3671 * than minint, it should be clamped to minint. If it is a nan, the result
3672 * should be zero. Further, the rounding mode is to truncate. This model
3673 * differs from what is delivered normally via the x86 fpu, so we have
3674 * to play some games.
3675 */
3676 /* float/double to int/long vA, vB */
3677 movzbl rINSTbl, %ecx # ecx <- A+
3678 sarl $4, rINST # rINST <- B
3679 .if 0
3680 fldl VREG_ADDRESS(rINST) # %st0 <- vB
3681 .else
3682 flds VREG_ADDRESS(rINST) # %st0 <- vB
3683 .endif
3684 ftst
3685 fnstcw LOCAL0(%esp) # remember original rounding mode
3686 movzwl LOCAL0(%esp), %eax
3687 movb $0xc, %ah
3688 movw %ax, LOCAL0+2(%esp)
3689 fldcw LOCAL0+2(%esp) # set "to zero" rounding mode
3690 andb $0xf, %cl # ecx <- A
3691 .if 1
3692 fistpll VREG_ADDRESS(%ecx) # convert and store
3693 .else
3694 fistpl VREG_ADDRESS(%ecx) # convert and store
3695 .endif
3696 fldcw LOCAL0(%esp) # restore previous rounding mode
3697 .if 1
3698 movl $0x80000000, %eax
3699 xorl VREG_HIGH_ADDRESS(%ecx), %eax
3700 orl VREG_ADDRESS(%ecx), %eax
3701 .else
3702 cmpl $0x80000000, VREG_ADDRESS(%ecx)
3703 .endif
3704 je .Lop_float_to_long_special_case # fix up result
3705
3706.Lop_float_to_long_finish:
3707 xor %eax, %eax
3708 mov %eax, VREG_REF_ADDRESS(%ecx)
3709 .if 1
3710 mov %eax, VREG_REF_HIGH_ADDRESS(%ecx)
3711 .endif
3712 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3713
3714.Lop_float_to_long_special_case:
3715 fnstsw %ax
3716 sahf
3717 jp .Lop_float_to_long_isNaN
3718 adcl $-1, VREG_ADDRESS(%ecx)
3719 .if 1
3720 adcl $-1, VREG_HIGH_ADDRESS(%ecx)
3721 .endif
3722 jmp .Lop_float_to_long_finish
3723.Lop_float_to_long_isNaN:
3724 movl $0, VREG_ADDRESS(%ecx)
3725 .if 1
3726 movl $0, VREG_HIGH_ADDRESS(%ecx)
3727 .endif
3728 jmp .Lop_float_to_long_finish
3729
3730
3731/* ------------------------------ */
3732 .balign 128
3733.L_op_float_to_double: /* 0x89 */
3734/* File: x86/op_float_to_double.S */
3735/* File: x86/fpcvt.S */
3736/*
3737 * Generic 32-bit FP conversion operation.
3738 */
3739 /* unop vA, vB */
3740 movzbl rINSTbl, %ecx # ecx <- A+
3741 sarl $4, rINST # rINST <- B
3742 flds VREG_ADDRESS(rINST) # %st0 <- vB
3743 andb $0xf, %cl # ecx <- A
3744
3745 fstpl VREG_ADDRESS(%ecx) # vA <- %st0
3746 .if 1
3747 CLEAR_WIDE_REF %ecx
3748 .else
3749 CLEAR_REF %ecx
3750 .endif
3751 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3752
3753
3754/* ------------------------------ */
3755 .balign 128
3756.L_op_double_to_int: /* 0x8a */
3757/* File: x86/op_double_to_int.S */
3758/* File: x86/cvtfp_int.S */
3759/* On fp to int conversions, Java requires that
3760 * if the result > maxint, it should be clamped to maxint. If it is less
3761 * than minint, it should be clamped to minint. If it is a nan, the result
3762 * should be zero. Further, the rounding mode is to truncate. This model
3763 * differs from what is delivered normally via the x86 fpu, so we have
3764 * to play some games.
3765 */
3766 /* float/double to int/long vA, vB */
3767 movzbl rINSTbl, %ecx # ecx <- A+
3768 sarl $4, rINST # rINST <- B
3769 .if 1
3770 fldl VREG_ADDRESS(rINST) # %st0 <- vB
3771 .else
3772 flds VREG_ADDRESS(rINST) # %st0 <- vB
3773 .endif
3774 ftst
3775 fnstcw LOCAL0(%esp) # remember original rounding mode
3776 movzwl LOCAL0(%esp), %eax
3777 movb $0xc, %ah
3778 movw %ax, LOCAL0+2(%esp)
3779 fldcw LOCAL0+2(%esp) # set "to zero" rounding mode
3780 andb $0xf, %cl # ecx <- A
3781 .if 0
3782 fistpll VREG_ADDRESS(%ecx) # convert and store
3783 .else
3784 fistpl VREG_ADDRESS(%ecx) # convert and store
3785 .endif
3786 fldcw LOCAL0(%esp) # restore previous rounding mode
3787 .if 0
3788 movl $0x80000000, %eax
3789 xorl VREG_HIGH_ADDRESS(%ecx), %eax
3790 orl VREG_ADDRESS(%ecx), %eax
3791 .else
3792 cmpl $0x80000000, VREG_ADDRESS(%ecx)
3793 .endif
3794 je .Lop_double_to_int_special_case # fix up result
3795
3796.Lop_double_to_int_finish:
3797 xor %eax, %eax
3798 mov %eax, VREG_REF_ADDRESS(%ecx)
3799 .if 0
3800 mov %eax, VREG_REF_HIGH_ADDRESS(%ecx)
3801 .endif
3802 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3803
3804.Lop_double_to_int_special_case:
3805 fnstsw %ax
3806 sahf
3807 jp .Lop_double_to_int_isNaN
3808 adcl $-1, VREG_ADDRESS(%ecx)
3809 .if 0
3810 adcl $-1, VREG_HIGH_ADDRESS(%ecx)
3811 .endif
3812 jmp .Lop_double_to_int_finish
3813.Lop_double_to_int_isNaN:
3814 movl $0, VREG_ADDRESS(%ecx)
3815 .if 0
3816 movl $0, VREG_HIGH_ADDRESS(%ecx)
3817 .endif
3818 jmp .Lop_double_to_int_finish
3819
3820
3821/* ------------------------------ */
3822 .balign 128
3823.L_op_double_to_long: /* 0x8b */
3824/* File: x86/op_double_to_long.S */
3825/* File: x86/cvtfp_int.S */
3826/* On fp to int conversions, Java requires that
3827 * if the result > maxint, it should be clamped to maxint. If it is less
3828 * than minint, it should be clamped to minint. If it is a nan, the result
3829 * should be zero. Further, the rounding mode is to truncate. This model
3830 * differs from what is delivered normally via the x86 fpu, so we have
3831 * to play some games.
3832 */
3833 /* float/double to int/long vA, vB */
3834 movzbl rINSTbl, %ecx # ecx <- A+
3835 sarl $4, rINST # rINST <- B
3836 .if 1
3837 fldl VREG_ADDRESS(rINST) # %st0 <- vB
3838 .else
3839 flds VREG_ADDRESS(rINST) # %st0 <- vB
3840 .endif
3841 ftst
3842 fnstcw LOCAL0(%esp) # remember original rounding mode
3843 movzwl LOCAL0(%esp), %eax
3844 movb $0xc, %ah
3845 movw %ax, LOCAL0+2(%esp)
3846 fldcw LOCAL0+2(%esp) # set "to zero" rounding mode
3847 andb $0xf, %cl # ecx <- A
3848 .if 1
3849 fistpll VREG_ADDRESS(%ecx) # convert and store
3850 .else
3851 fistpl VREG_ADDRESS(%ecx) # convert and store
3852 .endif
3853 fldcw LOCAL0(%esp) # restore previous rounding mode
3854 .if 1
3855 movl $0x80000000, %eax
3856 xorl VREG_HIGH_ADDRESS(%ecx), %eax
3857 orl VREG_ADDRESS(%ecx), %eax
3858 .else
3859 cmpl $0x80000000, VREG_ADDRESS(%ecx)
3860 .endif
3861 je .Lop_double_to_long_special_case # fix up result
3862
3863.Lop_double_to_long_finish:
3864 xor %eax, %eax
3865 mov %eax, VREG_REF_ADDRESS(%ecx)
3866 .if 1
3867 mov %eax, VREG_REF_HIGH_ADDRESS(%ecx)
3868 .endif
3869 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3870
3871.Lop_double_to_long_special_case:
3872 fnstsw %ax
3873 sahf
3874 jp .Lop_double_to_long_isNaN
3875 adcl $-1, VREG_ADDRESS(%ecx)
3876 .if 1
3877 adcl $-1, VREG_HIGH_ADDRESS(%ecx)
3878 .endif
3879 jmp .Lop_double_to_long_finish
3880.Lop_double_to_long_isNaN:
3881 movl $0, VREG_ADDRESS(%ecx)
3882 .if 1
3883 movl $0, VREG_HIGH_ADDRESS(%ecx)
3884 .endif
3885 jmp .Lop_double_to_long_finish
3886
3887
3888/* ------------------------------ */
3889 .balign 128
3890.L_op_double_to_float: /* 0x8c */
3891/* File: x86/op_double_to_float.S */
3892/* File: x86/fpcvt.S */
3893/*
3894 * Generic 32-bit FP conversion operation.
3895 */
3896 /* unop vA, vB */
3897 movzbl rINSTbl, %ecx # ecx <- A+
3898 sarl $4, rINST # rINST <- B
3899 fldl VREG_ADDRESS(rINST) # %st0 <- vB
3900 andb $0xf, %cl # ecx <- A
3901
3902 fstps VREG_ADDRESS(%ecx) # vA <- %st0
3903 .if 0
3904 CLEAR_WIDE_REF %ecx
3905 .else
3906 CLEAR_REF %ecx
3907 .endif
3908 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3909
3910
3911/* ------------------------------ */
3912 .balign 128
3913.L_op_int_to_byte: /* 0x8d */
3914/* File: x86/op_int_to_byte.S */
3915/* File: x86/unop.S */
3916/*
3917 * Generic 32-bit unary operation. Provide an "instr" line that
3918 * specifies an instruction that performs "result = op eax".
3919 */
3920 /* unop vA, vB */
3921 movzbl rINSTbl,%ecx # ecx <- A+
3922 sarl $4,rINST # rINST <- B
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06003923 GET_VREG %eax, rINST # eax <- vB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00003924 andb $0xf,%cl # ecx <- A
3925 movsbl %al, %eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06003926 SET_VREG %eax, %ecx
Bill Buzbee7c58bd42016-01-20 20:46:01 +00003927 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3928
3929
3930/* ------------------------------ */
3931 .balign 128
3932.L_op_int_to_char: /* 0x8e */
3933/* File: x86/op_int_to_char.S */
3934/* File: x86/unop.S */
3935/*
3936 * Generic 32-bit unary operation. Provide an "instr" line that
3937 * specifies an instruction that performs "result = op eax".
3938 */
3939 /* unop vA, vB */
3940 movzbl rINSTbl,%ecx # ecx <- A+
3941 sarl $4,rINST # rINST <- B
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06003942 GET_VREG %eax, rINST # eax <- vB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00003943 andb $0xf,%cl # ecx <- A
3944 movzwl %ax,%eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06003945 SET_VREG %eax, %ecx
Bill Buzbee7c58bd42016-01-20 20:46:01 +00003946 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3947
3948
3949/* ------------------------------ */
3950 .balign 128
3951.L_op_int_to_short: /* 0x8f */
3952/* File: x86/op_int_to_short.S */
3953/* File: x86/unop.S */
3954/*
3955 * Generic 32-bit unary operation. Provide an "instr" line that
3956 * specifies an instruction that performs "result = op eax".
3957 */
3958 /* unop vA, vB */
3959 movzbl rINSTbl,%ecx # ecx <- A+
3960 sarl $4,rINST # rINST <- B
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06003961 GET_VREG %eax, rINST # eax <- vB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00003962 andb $0xf,%cl # ecx <- A
3963 movswl %ax, %eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06003964 SET_VREG %eax, %ecx
Bill Buzbee7c58bd42016-01-20 20:46:01 +00003965 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3966
3967
3968/* ------------------------------ */
3969 .balign 128
3970.L_op_add_int: /* 0x90 */
3971/* File: x86/op_add_int.S */
3972/* File: x86/binop.S */
3973/*
3974 * Generic 32-bit binary operation. Provide an "instr" line that
3975 * specifies an instruction that performs "result = eax op (rFP,%ecx,4)".
3976 * This could be an x86 instruction or a function call. (If the result
3977 * comes back in a register other than eax, you can override "result".)
3978 *
3979 * For: add-int, sub-int, and-int, or-int,
3980 * xor-int, shl-int, shr-int, ushr-int
3981 */
3982 /* binop vAA, vBB, vCC */
3983 movzbl 2(rPC), %eax # eax <- BB
3984 movzbl 3(rPC), %ecx # ecx <- CC
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06003985 GET_VREG %eax, %eax # eax <- vBB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00003986 addl (rFP,%ecx,4), %eax # ex: addl (rFP,%ecx,4),%eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06003987 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00003988 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
3989
3990
3991/* ------------------------------ */
3992 .balign 128
3993.L_op_sub_int: /* 0x91 */
3994/* File: x86/op_sub_int.S */
3995/* File: x86/binop.S */
3996/*
3997 * Generic 32-bit binary operation. Provide an "instr" line that
3998 * specifies an instruction that performs "result = eax op (rFP,%ecx,4)".
3999 * This could be an x86 instruction or a function call. (If the result
4000 * comes back in a register other than eax, you can override "result".)
4001 *
4002 * For: add-int, sub-int, and-int, or-int,
4003 * xor-int, shl-int, shr-int, ushr-int
4004 */
4005 /* binop vAA, vBB, vCC */
4006 movzbl 2(rPC), %eax # eax <- BB
4007 movzbl 3(rPC), %ecx # ecx <- CC
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004008 GET_VREG %eax, %eax # eax <- vBB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004009 subl (rFP,%ecx,4), %eax # ex: addl (rFP,%ecx,4),%eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004010 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004011 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4012
4013
4014/* ------------------------------ */
4015 .balign 128
4016.L_op_mul_int: /* 0x92 */
4017/* File: x86/op_mul_int.S */
4018 /*
4019 * 32-bit binary multiplication.
4020 */
4021 /* mul vAA, vBB, vCC */
4022 movzbl 2(rPC), %eax # eax <- BB
4023 movzbl 3(rPC), %ecx # ecx <- CC
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004024 GET_VREG %eax, %eax # eax <- vBB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004025 mov rIBASE, LOCAL0(%esp)
4026 imull (rFP,%ecx,4), %eax # trashes rIBASE/edx
4027 mov LOCAL0(%esp), rIBASE
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004028 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004029 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4030
4031/* ------------------------------ */
4032 .balign 128
4033.L_op_div_int: /* 0x93 */
4034/* File: x86/op_div_int.S */
4035/* File: x86/bindiv.S */
4036/*
4037 * 32-bit binary div/rem operation. Handles special case of op0=minint and
4038 * op1=-1.
4039 */
4040 /* div/rem vAA, vBB, vCC */
4041 movzbl 2(rPC), %eax # eax <- BB
4042 movzbl 3(rPC), %ecx # ecx <- CC
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004043 GET_VREG %eax, %eax # eax <- vBB
4044 GET_VREG %ecx, %ecx # ecx <- vCC
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004045 mov rIBASE, LOCAL0(%esp)
4046 testl %ecx, %ecx
4047 je common_errDivideByZero
4048 movl %eax, %edx
4049 orl %ecx, %edx
4050 test $0xFFFFFF00, %edx # If both arguments are less
4051 # than 8-bit and +ve
4052 jz .Lop_div_int_8 # Do 8-bit divide
4053 test $0xFFFF0000, %edx # If both arguments are less
4054 # than 16-bit and +ve
4055 jz .Lop_div_int_16 # Do 16-bit divide
4056 cmpl $-1, %ecx
4057 jne .Lop_div_int_32
4058 cmpl $0x80000000, %eax
4059 jne .Lop_div_int_32
4060 movl $0x80000000, %eax
4061 jmp .Lop_div_int_finish
4062.Lop_div_int_32:
4063 cltd
4064 idivl %ecx
4065 jmp .Lop_div_int_finish
4066.Lop_div_int_8:
4067 div %cl # 8-bit divide otherwise.
4068 # Remainder in %ah, quotient in %al
4069 .if 0
4070 movl %eax, %edx
4071 shr $8, %edx
4072 .else
4073 andl $0x000000FF, %eax
4074 .endif
4075 jmp .Lop_div_int_finish
4076.Lop_div_int_16:
4077 xorl %edx, %edx # Clear %edx before divide
4078 div %cx
4079.Lop_div_int_finish:
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004080 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004081 mov LOCAL0(%esp), rIBASE
4082 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4083
4084
4085/* ------------------------------ */
4086 .balign 128
4087.L_op_rem_int: /* 0x94 */
4088/* File: x86/op_rem_int.S */
4089/* File: x86/bindiv.S */
4090/*
4091 * 32-bit binary div/rem operation. Handles special case of op0=minint and
4092 * op1=-1.
4093 */
4094 /* div/rem vAA, vBB, vCC */
4095 movzbl 2(rPC), %eax # eax <- BB
4096 movzbl 3(rPC), %ecx # ecx <- CC
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004097 GET_VREG %eax, %eax # eax <- vBB
4098 GET_VREG %ecx, %ecx # ecx <- vCC
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004099 mov rIBASE, LOCAL0(%esp)
4100 testl %ecx, %ecx
4101 je common_errDivideByZero
4102 movl %eax, %edx
4103 orl %ecx, %edx
4104 test $0xFFFFFF00, %edx # If both arguments are less
4105 # than 8-bit and +ve
4106 jz .Lop_rem_int_8 # Do 8-bit divide
4107 test $0xFFFF0000, %edx # If both arguments are less
4108 # than 16-bit and +ve
4109 jz .Lop_rem_int_16 # Do 16-bit divide
4110 cmpl $-1, %ecx
4111 jne .Lop_rem_int_32
4112 cmpl $0x80000000, %eax
4113 jne .Lop_rem_int_32
4114 movl $0, rIBASE
4115 jmp .Lop_rem_int_finish
4116.Lop_rem_int_32:
4117 cltd
4118 idivl %ecx
4119 jmp .Lop_rem_int_finish
4120.Lop_rem_int_8:
4121 div %cl # 8-bit divide otherwise.
4122 # Remainder in %ah, quotient in %al
4123 .if 1
4124 movl %eax, %edx
4125 shr $8, %edx
4126 .else
4127 andl $0x000000FF, %eax
4128 .endif
4129 jmp .Lop_rem_int_finish
4130.Lop_rem_int_16:
4131 xorl %edx, %edx # Clear %edx before divide
4132 div %cx
4133.Lop_rem_int_finish:
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004134 SET_VREG rIBASE, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004135 mov LOCAL0(%esp), rIBASE
4136 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4137
4138
4139/* ------------------------------ */
4140 .balign 128
4141.L_op_and_int: /* 0x95 */
4142/* File: x86/op_and_int.S */
4143/* File: x86/binop.S */
4144/*
4145 * Generic 32-bit binary operation. Provide an "instr" line that
4146 * specifies an instruction that performs "result = eax op (rFP,%ecx,4)".
4147 * This could be an x86 instruction or a function call. (If the result
4148 * comes back in a register other than eax, you can override "result".)
4149 *
4150 * For: add-int, sub-int, and-int, or-int,
4151 * xor-int, shl-int, shr-int, ushr-int
4152 */
4153 /* binop vAA, vBB, vCC */
4154 movzbl 2(rPC), %eax # eax <- BB
4155 movzbl 3(rPC), %ecx # ecx <- CC
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004156 GET_VREG %eax, %eax # eax <- vBB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004157 andl (rFP,%ecx,4), %eax # ex: addl (rFP,%ecx,4),%eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004158 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004159 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4160
4161
4162/* ------------------------------ */
4163 .balign 128
4164.L_op_or_int: /* 0x96 */
4165/* File: x86/op_or_int.S */
4166/* File: x86/binop.S */
4167/*
4168 * Generic 32-bit binary operation. Provide an "instr" line that
4169 * specifies an instruction that performs "result = eax op (rFP,%ecx,4)".
4170 * This could be an x86 instruction or a function call. (If the result
4171 * comes back in a register other than eax, you can override "result".)
4172 *
4173 * For: add-int, sub-int, and-int, or-int,
4174 * xor-int, shl-int, shr-int, ushr-int
4175 */
4176 /* binop vAA, vBB, vCC */
4177 movzbl 2(rPC), %eax # eax <- BB
4178 movzbl 3(rPC), %ecx # ecx <- CC
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004179 GET_VREG %eax, %eax # eax <- vBB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004180 orl (rFP,%ecx,4), %eax # ex: addl (rFP,%ecx,4),%eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004181 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004182 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4183
4184
4185/* ------------------------------ */
4186 .balign 128
4187.L_op_xor_int: /* 0x97 */
4188/* File: x86/op_xor_int.S */
4189/* File: x86/binop.S */
4190/*
4191 * Generic 32-bit binary operation. Provide an "instr" line that
4192 * specifies an instruction that performs "result = eax op (rFP,%ecx,4)".
4193 * This could be an x86 instruction or a function call. (If the result
4194 * comes back in a register other than eax, you can override "result".)
4195 *
4196 * For: add-int, sub-int, and-int, or-int,
4197 * xor-int, shl-int, shr-int, ushr-int
4198 */
4199 /* binop vAA, vBB, vCC */
4200 movzbl 2(rPC), %eax # eax <- BB
4201 movzbl 3(rPC), %ecx # ecx <- CC
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004202 GET_VREG %eax, %eax # eax <- vBB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004203 xorl (rFP,%ecx,4), %eax # ex: addl (rFP,%ecx,4),%eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004204 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004205 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4206
4207
4208/* ------------------------------ */
4209 .balign 128
4210.L_op_shl_int: /* 0x98 */
4211/* File: x86/op_shl_int.S */
4212/* File: x86/binop1.S */
4213/*
4214 * Generic 32-bit binary operation in which both operands loaded to
4215 * registers (op0 in eax, op1 in ecx).
4216 */
4217 /* binop vAA, vBB, vCC */
4218 movzbl 2(rPC),%eax # eax <- BB
4219 movzbl 3(rPC),%ecx # ecx <- CC
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004220 GET_VREG %eax, %eax # eax <- vBB
4221 GET_VREG %ecx, %ecx # eax <- vBB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004222 sall %cl, %eax # ex: addl %ecx,%eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004223 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004224 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4225
4226
4227/* ------------------------------ */
4228 .balign 128
4229.L_op_shr_int: /* 0x99 */
4230/* File: x86/op_shr_int.S */
4231/* File: x86/binop1.S */
4232/*
4233 * Generic 32-bit binary operation in which both operands loaded to
4234 * registers (op0 in eax, op1 in ecx).
4235 */
4236 /* binop vAA, vBB, vCC */
4237 movzbl 2(rPC),%eax # eax <- BB
4238 movzbl 3(rPC),%ecx # ecx <- CC
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004239 GET_VREG %eax, %eax # eax <- vBB
4240 GET_VREG %ecx, %ecx # eax <- vBB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004241 sarl %cl, %eax # ex: addl %ecx,%eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004242 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004243 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4244
4245
4246/* ------------------------------ */
4247 .balign 128
4248.L_op_ushr_int: /* 0x9a */
4249/* File: x86/op_ushr_int.S */
4250/* File: x86/binop1.S */
4251/*
4252 * Generic 32-bit binary operation in which both operands loaded to
4253 * registers (op0 in eax, op1 in ecx).
4254 */
4255 /* binop vAA, vBB, vCC */
4256 movzbl 2(rPC),%eax # eax <- BB
4257 movzbl 3(rPC),%ecx # ecx <- CC
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004258 GET_VREG %eax, %eax # eax <- vBB
4259 GET_VREG %ecx, %ecx # eax <- vBB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004260 shrl %cl, %eax # ex: addl %ecx,%eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004261 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004262 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4263
4264
4265/* ------------------------------ */
4266 .balign 128
4267.L_op_add_long: /* 0x9b */
4268/* File: x86/op_add_long.S */
4269/* File: x86/binopWide.S */
4270/*
4271 * Generic 64-bit binary operation.
4272 */
4273 /* binop vAA, vBB, vCC */
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004274 movzbl 2(rPC), %eax # eax <- BB
4275 movzbl 3(rPC), %ecx # ecx <- CC
4276 movl rIBASE, LOCAL0(%esp) # save rIBASE
4277 GET_VREG rIBASE, %eax # rIBASE <- v[BB+0]
4278 GET_VREG_HIGH %eax, %eax # eax <- v[BB+1]
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004279 addl (rFP,%ecx,4), rIBASE # ex: addl (rFP,%ecx,4),rIBASE
4280 adcl 4(rFP,%ecx,4), %eax # ex: adcl 4(rFP,%ecx,4),%eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004281 SET_VREG rIBASE, rINST # v[AA+0] <- rIBASE
4282 movl LOCAL0(%esp), rIBASE # restore rIBASE
4283 SET_VREG_HIGH %eax, rINST # v[AA+1] <- eax
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004284 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4285
4286
4287/* ------------------------------ */
4288 .balign 128
4289.L_op_sub_long: /* 0x9c */
4290/* File: x86/op_sub_long.S */
4291/* File: x86/binopWide.S */
4292/*
4293 * Generic 64-bit binary operation.
4294 */
4295 /* binop vAA, vBB, vCC */
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004296 movzbl 2(rPC), %eax # eax <- BB
4297 movzbl 3(rPC), %ecx # ecx <- CC
4298 movl rIBASE, LOCAL0(%esp) # save rIBASE
4299 GET_VREG rIBASE, %eax # rIBASE <- v[BB+0]
4300 GET_VREG_HIGH %eax, %eax # eax <- v[BB+1]
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004301 subl (rFP,%ecx,4), rIBASE # ex: addl (rFP,%ecx,4),rIBASE
4302 sbbl 4(rFP,%ecx,4), %eax # ex: adcl 4(rFP,%ecx,4),%eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004303 SET_VREG rIBASE, rINST # v[AA+0] <- rIBASE
4304 movl LOCAL0(%esp), rIBASE # restore rIBASE
4305 SET_VREG_HIGH %eax, rINST # v[AA+1] <- eax
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004306 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4307
4308
4309/* ------------------------------ */
4310 .balign 128
4311.L_op_mul_long: /* 0x9d */
4312/* File: x86/op_mul_long.S */
4313/*
4314 * Signed 64-bit integer multiply.
4315 *
4316 * We could definately use more free registers for
4317 * this code. We spill rINSTw (ebx),
4318 * giving us eax, ebc, ecx and edx as computational
4319 * temps. On top of that, we'll spill edi (rFP)
4320 * for use as the vB pointer and esi (rPC) for use
4321 * as the vC pointer. Yuck.
4322 *
4323 */
4324 /* mul-long vAA, vBB, vCC */
4325 movzbl 2(rPC), %eax # eax <- B
4326 movzbl 3(rPC), %ecx # ecx <- C
4327 mov rPC, LOCAL0(%esp) # save Interpreter PC
4328 mov rFP, LOCAL1(%esp) # save FP
4329 mov rIBASE, LOCAL2(%esp) # save rIBASE
4330 leal (rFP,%eax,4), %esi # esi <- &v[B]
4331 leal (rFP,%ecx,4), rFP # rFP <- &v[C]
4332 movl 4(%esi), %ecx # ecx <- Bmsw
4333 imull (rFP), %ecx # ecx <- (Bmsw*Clsw)
4334 movl 4(rFP), %eax # eax <- Cmsw
4335 imull (%esi), %eax # eax <- (Cmsw*Blsw)
4336 addl %eax, %ecx # ecx <- (Bmsw*Clsw)+(Cmsw*Blsw)
4337 movl (rFP), %eax # eax <- Clsw
4338 mull (%esi) # eax <- (Clsw*Alsw)
4339 mov LOCAL0(%esp), rPC # restore Interpreter PC
4340 mov LOCAL1(%esp), rFP # restore FP
4341 leal (%ecx,rIBASE), rIBASE # full result now in rIBASE:%eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004342 SET_VREG_HIGH rIBASE, rINST # v[B+1] <- rIBASE
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004343 mov LOCAL2(%esp), rIBASE # restore IBASE
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004344 SET_VREG %eax, rINST # v[B] <- eax
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004345 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4346
4347/* ------------------------------ */
4348 .balign 128
4349.L_op_div_long: /* 0x9e */
4350/* File: x86/op_div_long.S */
4351/* art_quick_* methods has quick abi,
4352 * so use eax, ecx, edx, ebx for args
4353 */
4354 /* div vAA, vBB, vCC */
4355 .extern art_quick_ldiv
4356 mov rIBASE, LOCAL0(%esp) # save rIBASE/%edx
4357 mov rINST, LOCAL1(%esp) # save rINST/%ebx
4358 movzbl 3(rPC), %eax # eax <- CC
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004359 GET_VREG %ecx, %eax
4360 GET_VREG_HIGH %ebx, %eax
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004361 movl %ecx, %edx
4362 orl %ebx, %ecx
4363 jz common_errDivideByZero
4364 movzbl 2(rPC), %eax # eax <- BB
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004365 GET_VREG_HIGH %ecx, %eax
4366 GET_VREG %eax, %eax
4367 call SYMBOL(art_quick_ldiv)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004368 mov LOCAL1(%esp), rINST # restore rINST/%ebx
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004369 SET_VREG_HIGH rIBASE, rINST
4370 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004371 mov LOCAL0(%esp), rIBASE # restore rIBASE/%edx
4372 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4373
4374/* ------------------------------ */
4375 .balign 128
4376.L_op_rem_long: /* 0x9f */
4377/* File: x86/op_rem_long.S */
4378/* File: x86/op_div_long.S */
4379/* art_quick_* methods has quick abi,
4380 * so use eax, ecx, edx, ebx for args
4381 */
4382 /* div vAA, vBB, vCC */
4383 .extern art_quick_lmod
4384 mov rIBASE, LOCAL0(%esp) # save rIBASE/%edx
4385 mov rINST, LOCAL1(%esp) # save rINST/%ebx
4386 movzbl 3(rPC), %eax # eax <- CC
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004387 GET_VREG %ecx, %eax
4388 GET_VREG_HIGH %ebx, %eax
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004389 movl %ecx, %edx
4390 orl %ebx, %ecx
4391 jz common_errDivideByZero
4392 movzbl 2(rPC), %eax # eax <- BB
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004393 GET_VREG_HIGH %ecx, %eax
4394 GET_VREG %eax, %eax
4395 call SYMBOL(art_quick_lmod)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004396 mov LOCAL1(%esp), rINST # restore rINST/%ebx
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004397 SET_VREG_HIGH rIBASE, rINST
4398 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004399 mov LOCAL0(%esp), rIBASE # restore rIBASE/%edx
4400 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4401
4402
4403/* ------------------------------ */
4404 .balign 128
4405.L_op_and_long: /* 0xa0 */
4406/* File: x86/op_and_long.S */
4407/* File: x86/binopWide.S */
4408/*
4409 * Generic 64-bit binary operation.
4410 */
4411 /* binop vAA, vBB, vCC */
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004412 movzbl 2(rPC), %eax # eax <- BB
4413 movzbl 3(rPC), %ecx # ecx <- CC
4414 movl rIBASE, LOCAL0(%esp) # save rIBASE
4415 GET_VREG rIBASE, %eax # rIBASE <- v[BB+0]
4416 GET_VREG_HIGH %eax, %eax # eax <- v[BB+1]
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004417 andl (rFP,%ecx,4), rIBASE # ex: addl (rFP,%ecx,4),rIBASE
4418 andl 4(rFP,%ecx,4), %eax # ex: adcl 4(rFP,%ecx,4),%eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004419 SET_VREG rIBASE, rINST # v[AA+0] <- rIBASE
4420 movl LOCAL0(%esp), rIBASE # restore rIBASE
4421 SET_VREG_HIGH %eax, rINST # v[AA+1] <- eax
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004422 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4423
4424
4425/* ------------------------------ */
4426 .balign 128
4427.L_op_or_long: /* 0xa1 */
4428/* File: x86/op_or_long.S */
4429/* File: x86/binopWide.S */
4430/*
4431 * Generic 64-bit binary operation.
4432 */
4433 /* binop vAA, vBB, vCC */
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004434 movzbl 2(rPC), %eax # eax <- BB
4435 movzbl 3(rPC), %ecx # ecx <- CC
4436 movl rIBASE, LOCAL0(%esp) # save rIBASE
4437 GET_VREG rIBASE, %eax # rIBASE <- v[BB+0]
4438 GET_VREG_HIGH %eax, %eax # eax <- v[BB+1]
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004439 orl (rFP,%ecx,4), rIBASE # ex: addl (rFP,%ecx,4),rIBASE
4440 orl 4(rFP,%ecx,4), %eax # ex: adcl 4(rFP,%ecx,4),%eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004441 SET_VREG rIBASE, rINST # v[AA+0] <- rIBASE
4442 movl LOCAL0(%esp), rIBASE # restore rIBASE
4443 SET_VREG_HIGH %eax, rINST # v[AA+1] <- eax
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004444 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4445
4446
4447/* ------------------------------ */
4448 .balign 128
4449.L_op_xor_long: /* 0xa2 */
4450/* File: x86/op_xor_long.S */
4451/* File: x86/binopWide.S */
4452/*
4453 * Generic 64-bit binary operation.
4454 */
4455 /* binop vAA, vBB, vCC */
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004456 movzbl 2(rPC), %eax # eax <- BB
4457 movzbl 3(rPC), %ecx # ecx <- CC
4458 movl rIBASE, LOCAL0(%esp) # save rIBASE
4459 GET_VREG rIBASE, %eax # rIBASE <- v[BB+0]
4460 GET_VREG_HIGH %eax, %eax # eax <- v[BB+1]
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004461 xorl (rFP,%ecx,4), rIBASE # ex: addl (rFP,%ecx,4),rIBASE
4462 xorl 4(rFP,%ecx,4), %eax # ex: adcl 4(rFP,%ecx,4),%eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004463 SET_VREG rIBASE, rINST # v[AA+0] <- rIBASE
4464 movl LOCAL0(%esp), rIBASE # restore rIBASE
4465 SET_VREG_HIGH %eax, rINST # v[AA+1] <- eax
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004466 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4467
4468
4469/* ------------------------------ */
4470 .balign 128
4471.L_op_shl_long: /* 0xa3 */
4472/* File: x86/op_shl_long.S */
4473/*
4474 * Long integer shift. This is different from the generic 32/64-bit
4475 * binary operations because vAA/vBB are 64-bit but vCC (the shift
4476 * distance) is 32-bit. Also, Dalvik requires us to mask off the low
4477 * 6 bits of the shift distance. x86 shifts automatically mask off
4478 * the low 5 bits of %cl, so have to handle the 64 > shiftcount > 31
4479 * case specially.
4480 */
4481 /* shl-long vAA, vBB, vCC */
4482 /* ecx gets shift count */
4483 /* Need to spill rINST */
4484 /* rINSTw gets AA */
4485 movzbl 2(rPC), %eax # eax <- BB
4486 movzbl 3(rPC), %ecx # ecx <- CC
4487 movl rIBASE, LOCAL0(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004488 GET_VREG_HIGH rIBASE, %eax # ecx <- v[BB+1]
4489 GET_VREG %ecx, %ecx # ecx <- vCC
4490 GET_VREG %eax, %eax # eax <- v[BB+0]
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004491 shldl %eax,rIBASE
4492 sall %cl, %eax
4493 testb $32, %cl
4494 je 2f
4495 movl %eax, rIBASE
4496 xorl %eax, %eax
44972:
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004498 SET_VREG_HIGH rIBASE, rINST # v[AA+1] <- rIBASE
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004499 movl LOCAL0(%esp), rIBASE
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004500 SET_VREG %eax, rINST # v[AA+0] <- %eax
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004501 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4502
4503/* ------------------------------ */
4504 .balign 128
4505.L_op_shr_long: /* 0xa4 */
4506/* File: x86/op_shr_long.S */
4507/*
4508 * Long integer shift. This is different from the generic 32/64-bit
4509 * binary operations because vAA/vBB are 64-bit but vCC (the shift
4510 * distance) is 32-bit. Also, Dalvik requires us to mask off the low
4511 * 6 bits of the shift distance. x86 shifts automatically mask off
4512 * the low 5 bits of %cl, so have to handle the 64 > shiftcount > 31
4513 * case specially.
4514 */
4515 /* shr-long vAA, vBB, vCC */
4516 /* ecx gets shift count */
4517 /* Need to spill rIBASE */
4518 /* rINSTw gets AA */
4519 movzbl 2(rPC), %eax # eax <- BB
4520 movzbl 3(rPC), %ecx # ecx <- CC
4521 movl rIBASE, LOCAL0(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004522 GET_VREG_HIGH rIBASE, %eax # rIBASE<- v[BB+1]
4523 GET_VREG %ecx, %ecx # ecx <- vCC
4524 GET_VREG %eax, %eax # eax <- v[BB+0]
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004525 shrdl rIBASE, %eax
4526 sarl %cl, rIBASE
4527 testb $32, %cl
4528 je 2f
4529 movl rIBASE, %eax
4530 sarl $31, rIBASE
45312:
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004532 SET_VREG_HIGH rIBASE, rINST # v[AA+1] <- rIBASE
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004533 movl LOCAL0(%esp), rIBASE
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004534 SET_VREG %eax, rINST # v[AA+0] <- eax
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004535 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4536
4537/* ------------------------------ */
4538 .balign 128
4539.L_op_ushr_long: /* 0xa5 */
4540/* File: x86/op_ushr_long.S */
4541/*
4542 * Long integer shift. This is different from the generic 32/64-bit
4543 * binary operations because vAA/vBB are 64-bit but vCC (the shift
4544 * distance) is 32-bit. Also, Dalvik requires us to mask off the low
4545 * 6 bits of the shift distance. x86 shifts automatically mask off
4546 * the low 5 bits of %cl, so have to handle the 64 > shiftcount > 31
4547 * case specially.
4548 */
4549 /* shr-long vAA, vBB, vCC */
4550 /* ecx gets shift count */
4551 /* Need to spill rIBASE */
4552 /* rINSTw gets AA */
4553 movzbl 2(rPC), %eax # eax <- BB
4554 movzbl 3(rPC), %ecx # ecx <- CC
4555 movl rIBASE, LOCAL0(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004556 GET_VREG_HIGH rIBASE, %eax # rIBASE <- v[BB+1]
4557 GET_VREG %ecx, %ecx # ecx <- vCC
4558 GET_VREG %eax, %eax # eax <- v[BB+0]
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004559 shrdl rIBASE, %eax
4560 shrl %cl, rIBASE
4561 testb $32, %cl
4562 je 2f
4563 movl rIBASE, %eax
4564 xorl rIBASE, rIBASE
45652:
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004566 SET_VREG_HIGH rIBASE, rINST # v[AA+1] <- rIBASE
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004567 movl LOCAL0(%esp), rIBASE
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004568 SET_VREG %eax, rINST # v[BB+0] <- eax
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004569 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4570
4571/* ------------------------------ */
4572 .balign 128
4573.L_op_add_float: /* 0xa6 */
4574/* File: x86/op_add_float.S */
4575/* File: x86/sseBinop.S */
4576 movzbl 2(rPC), %ecx # ecx <- BB
4577 movzbl 3(rPC), %eax # eax <- CC
4578 movss VREG_ADDRESS(%ecx), %xmm0 # %xmm0 <- 1st src
4579 addss VREG_ADDRESS(%eax), %xmm0
4580 movss %xmm0, VREG_ADDRESS(rINST) # vAA <- %xmm0
4581 pxor %xmm0, %xmm0
4582 movss %xmm0, VREG_REF_ADDRESS(rINST) # clear ref
4583 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4584
4585
4586/* ------------------------------ */
4587 .balign 128
4588.L_op_sub_float: /* 0xa7 */
4589/* File: x86/op_sub_float.S */
4590/* File: x86/sseBinop.S */
4591 movzbl 2(rPC), %ecx # ecx <- BB
4592 movzbl 3(rPC), %eax # eax <- CC
4593 movss VREG_ADDRESS(%ecx), %xmm0 # %xmm0 <- 1st src
4594 subss VREG_ADDRESS(%eax), %xmm0
4595 movss %xmm0, VREG_ADDRESS(rINST) # vAA <- %xmm0
4596 pxor %xmm0, %xmm0
4597 movss %xmm0, VREG_REF_ADDRESS(rINST) # clear ref
4598 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4599
4600
4601/* ------------------------------ */
4602 .balign 128
4603.L_op_mul_float: /* 0xa8 */
4604/* File: x86/op_mul_float.S */
4605/* File: x86/sseBinop.S */
4606 movzbl 2(rPC), %ecx # ecx <- BB
4607 movzbl 3(rPC), %eax # eax <- CC
4608 movss VREG_ADDRESS(%ecx), %xmm0 # %xmm0 <- 1st src
4609 mulss VREG_ADDRESS(%eax), %xmm0
4610 movss %xmm0, VREG_ADDRESS(rINST) # vAA <- %xmm0
4611 pxor %xmm0, %xmm0
4612 movss %xmm0, VREG_REF_ADDRESS(rINST) # clear ref
4613 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4614
4615
4616/* ------------------------------ */
4617 .balign 128
4618.L_op_div_float: /* 0xa9 */
4619/* File: x86/op_div_float.S */
4620/* File: x86/sseBinop.S */
4621 movzbl 2(rPC), %ecx # ecx <- BB
4622 movzbl 3(rPC), %eax # eax <- CC
4623 movss VREG_ADDRESS(%ecx), %xmm0 # %xmm0 <- 1st src
4624 divss VREG_ADDRESS(%eax), %xmm0
4625 movss %xmm0, VREG_ADDRESS(rINST) # vAA <- %xmm0
4626 pxor %xmm0, %xmm0
4627 movss %xmm0, VREG_REF_ADDRESS(rINST) # clear ref
4628 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4629
4630
4631/* ------------------------------ */
4632 .balign 128
4633.L_op_rem_float: /* 0xaa */
4634/* File: x86/op_rem_float.S */
4635 /* rem_float vAA, vBB, vCC */
4636 movzbl 3(rPC), %ecx # ecx <- BB
4637 movzbl 2(rPC), %eax # eax <- CC
4638 flds VREG_ADDRESS(%ecx) # vBB to fp stack
4639 flds VREG_ADDRESS(%eax) # vCC to fp stack
46401:
4641 fprem
4642 fstsw %ax
4643 sahf
4644 jp 1b
4645 fstp %st(1)
4646 fstps VREG_ADDRESS(rINST) # %st to vAA
4647 CLEAR_REF rINST
4648 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4649
4650/* ------------------------------ */
4651 .balign 128
4652.L_op_add_double: /* 0xab */
4653/* File: x86/op_add_double.S */
4654/* File: x86/sseBinop.S */
4655 movzbl 2(rPC), %ecx # ecx <- BB
4656 movzbl 3(rPC), %eax # eax <- CC
4657 movsd VREG_ADDRESS(%ecx), %xmm0 # %xmm0 <- 1st src
4658 addsd VREG_ADDRESS(%eax), %xmm0
4659 movsd %xmm0, VREG_ADDRESS(rINST) # vAA <- %xmm0
4660 pxor %xmm0, %xmm0
4661 movsd %xmm0, VREG_REF_ADDRESS(rINST) # clear ref
4662 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4663
4664
4665/* ------------------------------ */
4666 .balign 128
4667.L_op_sub_double: /* 0xac */
4668/* File: x86/op_sub_double.S */
4669/* File: x86/sseBinop.S */
4670 movzbl 2(rPC), %ecx # ecx <- BB
4671 movzbl 3(rPC), %eax # eax <- CC
4672 movsd VREG_ADDRESS(%ecx), %xmm0 # %xmm0 <- 1st src
4673 subsd VREG_ADDRESS(%eax), %xmm0
4674 movsd %xmm0, VREG_ADDRESS(rINST) # vAA <- %xmm0
4675 pxor %xmm0, %xmm0
4676 movsd %xmm0, VREG_REF_ADDRESS(rINST) # clear ref
4677 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4678
4679
4680/* ------------------------------ */
4681 .balign 128
4682.L_op_mul_double: /* 0xad */
4683/* File: x86/op_mul_double.S */
4684/* File: x86/sseBinop.S */
4685 movzbl 2(rPC), %ecx # ecx <- BB
4686 movzbl 3(rPC), %eax # eax <- CC
4687 movsd VREG_ADDRESS(%ecx), %xmm0 # %xmm0 <- 1st src
4688 mulsd VREG_ADDRESS(%eax), %xmm0
4689 movsd %xmm0, VREG_ADDRESS(rINST) # vAA <- %xmm0
4690 pxor %xmm0, %xmm0
4691 movsd %xmm0, VREG_REF_ADDRESS(rINST) # clear ref
4692 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4693
4694
4695/* ------------------------------ */
4696 .balign 128
4697.L_op_div_double: /* 0xae */
4698/* File: x86/op_div_double.S */
4699/* File: x86/sseBinop.S */
4700 movzbl 2(rPC), %ecx # ecx <- BB
4701 movzbl 3(rPC), %eax # eax <- CC
4702 movsd VREG_ADDRESS(%ecx), %xmm0 # %xmm0 <- 1st src
4703 divsd VREG_ADDRESS(%eax), %xmm0
4704 movsd %xmm0, VREG_ADDRESS(rINST) # vAA <- %xmm0
4705 pxor %xmm0, %xmm0
4706 movsd %xmm0, VREG_REF_ADDRESS(rINST) # clear ref
4707 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4708
4709
4710/* ------------------------------ */
4711 .balign 128
4712.L_op_rem_double: /* 0xaf */
4713/* File: x86/op_rem_double.S */
4714 /* rem_double vAA, vBB, vCC */
4715 movzbl 3(rPC), %ecx # ecx <- BB
4716 movzbl 2(rPC), %eax # eax <- CC
4717 fldl VREG_ADDRESS(%ecx) # %st1 <- fp[vBB]
4718 fldl VREG_ADDRESS(%eax) # %st0 <- fp[vCC]
47191:
4720 fprem
4721 fstsw %ax
4722 sahf
4723 jp 1b
4724 fstp %st(1)
4725 fstpl VREG_ADDRESS(rINST) # fp[vAA] <- %st
4726 CLEAR_WIDE_REF rINST
4727 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4728
4729/* ------------------------------ */
4730 .balign 128
4731.L_op_add_int_2addr: /* 0xb0 */
4732/* File: x86/op_add_int_2addr.S */
4733/* File: x86/binop2addr.S */
4734/*
4735 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4736 * that specifies an instruction that performs "result = r0 op r1".
4737 * This could be an instruction or a function call.
4738 *
4739 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4740 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4741 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4742 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4743 */
4744 /* binop/2addr vA, vB */
4745 movzx rINSTbl, %ecx # ecx <- A+
4746 sarl $4, rINST # rINST <- B
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004747 GET_VREG %eax, rINST # eax <- vB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004748 andb $0xf, %cl # ecx <- A
4749 addl %eax, (rFP,%ecx,4) # for ex: addl %eax,(rFP,%ecx,4)
4750 CLEAR_REF %ecx
4751 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4752
4753
4754/* ------------------------------ */
4755 .balign 128
4756.L_op_sub_int_2addr: /* 0xb1 */
4757/* File: x86/op_sub_int_2addr.S */
4758/* File: x86/binop2addr.S */
4759/*
4760 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4761 * that specifies an instruction that performs "result = r0 op r1".
4762 * This could be an instruction or a function call.
4763 *
4764 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4765 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4766 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4767 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4768 */
4769 /* binop/2addr vA, vB */
4770 movzx rINSTbl, %ecx # ecx <- A+
4771 sarl $4, rINST # rINST <- B
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004772 GET_VREG %eax, rINST # eax <- vB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004773 andb $0xf, %cl # ecx <- A
4774 subl %eax, (rFP,%ecx,4) # for ex: addl %eax,(rFP,%ecx,4)
4775 CLEAR_REF %ecx
4776 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4777
4778
4779/* ------------------------------ */
4780 .balign 128
4781.L_op_mul_int_2addr: /* 0xb2 */
4782/* File: x86/op_mul_int_2addr.S */
4783 /* mul vA, vB */
4784 movzx rINSTbl, %ecx # ecx <- A+
4785 sarl $4, rINST # rINST <- B
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004786 GET_VREG %eax, rINST # eax <- vB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004787 andb $0xf, %cl # ecx <- A
4788 mov rIBASE, LOCAL0(%esp)
4789 imull (rFP,%ecx,4), %eax # trashes rIBASE/edx
4790 mov LOCAL0(%esp), rIBASE
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004791 SET_VREG %eax, %ecx
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004792 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4793
4794/* ------------------------------ */
4795 .balign 128
4796.L_op_div_int_2addr: /* 0xb3 */
4797/* File: x86/op_div_int_2addr.S */
4798/* File: x86/bindiv2addr.S */
4799/*
4800 * 32-bit binary div/rem operation. Handles special case of op0=minint and
4801 * op1=-1.
4802 */
4803 /* div/rem/2addr vA, vB */
4804 movzx rINSTbl, %ecx # eax <- BA
4805 mov rIBASE, LOCAL0(%esp)
4806 sarl $4, %ecx # ecx <- B
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004807 GET_VREG %ecx, %ecx # eax <- vBB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004808 andb $0xf, rINSTbl # rINST <- A
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004809 GET_VREG %eax, rINST # eax <- vBB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004810 testl %ecx, %ecx
4811 je common_errDivideByZero
4812 cmpl $-1, %ecx
4813 jne .Lop_div_int_2addr_continue_div2addr
4814 cmpl $0x80000000, %eax
4815 jne .Lop_div_int_2addr_continue_div2addr
4816 movl $0x80000000, %eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004817 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004818 mov LOCAL0(%esp), rIBASE
4819 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4820
4821.Lop_div_int_2addr_continue_div2addr:
4822 cltd
4823 idivl %ecx
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004824 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004825 mov LOCAL0(%esp), rIBASE
4826 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4827
4828
4829/* ------------------------------ */
4830 .balign 128
4831.L_op_rem_int_2addr: /* 0xb4 */
4832/* File: x86/op_rem_int_2addr.S */
4833/* File: x86/bindiv2addr.S */
4834/*
4835 * 32-bit binary div/rem operation. Handles special case of op0=minint and
4836 * op1=-1.
4837 */
4838 /* div/rem/2addr vA, vB */
4839 movzx rINSTbl, %ecx # eax <- BA
4840 mov rIBASE, LOCAL0(%esp)
4841 sarl $4, %ecx # ecx <- B
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004842 GET_VREG %ecx, %ecx # eax <- vBB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004843 andb $0xf, rINSTbl # rINST <- A
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004844 GET_VREG %eax, rINST # eax <- vBB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004845 testl %ecx, %ecx
4846 je common_errDivideByZero
4847 cmpl $-1, %ecx
4848 jne .Lop_rem_int_2addr_continue_div2addr
4849 cmpl $0x80000000, %eax
4850 jne .Lop_rem_int_2addr_continue_div2addr
4851 movl $0, rIBASE
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004852 SET_VREG rIBASE, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004853 mov LOCAL0(%esp), rIBASE
4854 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4855
4856.Lop_rem_int_2addr_continue_div2addr:
4857 cltd
4858 idivl %ecx
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004859 SET_VREG rIBASE, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004860 mov LOCAL0(%esp), rIBASE
4861 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4862
4863
4864/* ------------------------------ */
4865 .balign 128
4866.L_op_and_int_2addr: /* 0xb5 */
4867/* File: x86/op_and_int_2addr.S */
4868/* File: x86/binop2addr.S */
4869/*
4870 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4871 * that specifies an instruction that performs "result = r0 op r1".
4872 * This could be an instruction or a function call.
4873 *
4874 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4875 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4876 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4877 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4878 */
4879 /* binop/2addr vA, vB */
4880 movzx rINSTbl, %ecx # ecx <- A+
4881 sarl $4, rINST # rINST <- B
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004882 GET_VREG %eax, rINST # eax <- vB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004883 andb $0xf, %cl # ecx <- A
4884 andl %eax, (rFP,%ecx,4) # for ex: addl %eax,(rFP,%ecx,4)
4885 CLEAR_REF %ecx
4886 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4887
4888
4889/* ------------------------------ */
4890 .balign 128
4891.L_op_or_int_2addr: /* 0xb6 */
4892/* File: x86/op_or_int_2addr.S */
4893/* File: x86/binop2addr.S */
4894/*
4895 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4896 * that specifies an instruction that performs "result = r0 op r1".
4897 * This could be an instruction or a function call.
4898 *
4899 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4900 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4901 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4902 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4903 */
4904 /* binop/2addr vA, vB */
4905 movzx rINSTbl, %ecx # ecx <- A+
4906 sarl $4, rINST # rINST <- B
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004907 GET_VREG %eax, rINST # eax <- vB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004908 andb $0xf, %cl # ecx <- A
4909 orl %eax, (rFP,%ecx,4) # for ex: addl %eax,(rFP,%ecx,4)
4910 CLEAR_REF %ecx
4911 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4912
4913
4914/* ------------------------------ */
4915 .balign 128
4916.L_op_xor_int_2addr: /* 0xb7 */
4917/* File: x86/op_xor_int_2addr.S */
4918/* File: x86/binop2addr.S */
4919/*
4920 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4921 * that specifies an instruction that performs "result = r0 op r1".
4922 * This could be an instruction or a function call.
4923 *
4924 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4925 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4926 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4927 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4928 */
4929 /* binop/2addr vA, vB */
4930 movzx rINSTbl, %ecx # ecx <- A+
4931 sarl $4, rINST # rINST <- B
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004932 GET_VREG %eax, rINST # eax <- vB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004933 andb $0xf, %cl # ecx <- A
4934 xorl %eax, (rFP,%ecx,4) # for ex: addl %eax,(rFP,%ecx,4)
4935 CLEAR_REF %ecx
4936 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4937
4938
4939/* ------------------------------ */
4940 .balign 128
4941.L_op_shl_int_2addr: /* 0xb8 */
4942/* File: x86/op_shl_int_2addr.S */
4943/* File: x86/shop2addr.S */
4944/*
4945 * Generic 32-bit "shift/2addr" operation.
4946 */
4947 /* shift/2addr vA, vB */
4948 movzx rINSTbl, %ecx # eax <- BA
4949 sarl $4, %ecx # ecx <- B
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004950 GET_VREG %ecx, %ecx # eax <- vBB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004951 andb $0xf, rINSTbl # rINST <- A
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004952 GET_VREG %eax, rINST # eax <- vAA
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004953 sall %cl, %eax # ex: sarl %cl, %eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004954 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004955 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4956
4957
4958/* ------------------------------ */
4959 .balign 128
4960.L_op_shr_int_2addr: /* 0xb9 */
4961/* File: x86/op_shr_int_2addr.S */
4962/* File: x86/shop2addr.S */
4963/*
4964 * Generic 32-bit "shift/2addr" operation.
4965 */
4966 /* shift/2addr vA, vB */
4967 movzx rINSTbl, %ecx # eax <- BA
4968 sarl $4, %ecx # ecx <- B
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004969 GET_VREG %ecx, %ecx # eax <- vBB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004970 andb $0xf, rINSTbl # rINST <- A
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004971 GET_VREG %eax, rINST # eax <- vAA
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004972 sarl %cl, %eax # ex: sarl %cl, %eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004973 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004974 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4975
4976
4977/* ------------------------------ */
4978 .balign 128
4979.L_op_ushr_int_2addr: /* 0xba */
4980/* File: x86/op_ushr_int_2addr.S */
4981/* File: x86/shop2addr.S */
4982/*
4983 * Generic 32-bit "shift/2addr" operation.
4984 */
4985 /* shift/2addr vA, vB */
4986 movzx rINSTbl, %ecx # eax <- BA
4987 sarl $4, %ecx # ecx <- B
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004988 GET_VREG %ecx, %ecx # eax <- vBB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004989 andb $0xf, rINSTbl # rINST <- A
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004990 GET_VREG %eax, rINST # eax <- vAA
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004991 shrl %cl, %eax # ex: sarl %cl, %eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06004992 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00004993 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4994
4995
4996/* ------------------------------ */
4997 .balign 128
4998.L_op_add_long_2addr: /* 0xbb */
4999/* File: x86/op_add_long_2addr.S */
5000/* File: x86/binopWide2addr.S */
5001/*
5002 * Generic 64-bit binary operation.
5003 */
5004 /* binop/2addr vA, vB */
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005005 movzbl rINSTbl, %ecx # ecx<- BA
5006 sarl $4, %ecx # ecx<- B
5007 GET_VREG %eax, %ecx # eax<- v[B+0]
5008 GET_VREG_HIGH %ecx, %ecx # eax<- v[B+1]
5009 andb $0xF, rINSTbl # rINST<- A
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005010 addl %eax, (rFP,rINST,4) # ex: addl %eax,(rFP,rINST,4)
5011 adcl %ecx, 4(rFP,rINST,4) # ex: adcl %ecx,4(rFP,rINST,4)
5012 CLEAR_WIDE_REF rINST
5013 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
5014
5015
5016/* ------------------------------ */
5017 .balign 128
5018.L_op_sub_long_2addr: /* 0xbc */
5019/* File: x86/op_sub_long_2addr.S */
5020/* File: x86/binopWide2addr.S */
5021/*
5022 * Generic 64-bit binary operation.
5023 */
5024 /* binop/2addr vA, vB */
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005025 movzbl rINSTbl, %ecx # ecx<- BA
5026 sarl $4, %ecx # ecx<- B
5027 GET_VREG %eax, %ecx # eax<- v[B+0]
5028 GET_VREG_HIGH %ecx, %ecx # eax<- v[B+1]
5029 andb $0xF, rINSTbl # rINST<- A
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005030 subl %eax, (rFP,rINST,4) # ex: addl %eax,(rFP,rINST,4)
5031 sbbl %ecx, 4(rFP,rINST,4) # ex: adcl %ecx,4(rFP,rINST,4)
5032 CLEAR_WIDE_REF rINST
5033 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
5034
5035
5036/* ------------------------------ */
5037 .balign 128
5038.L_op_mul_long_2addr: /* 0xbd */
5039/* File: x86/op_mul_long_2addr.S */
5040/*
5041 * Signed 64-bit integer multiply, 2-addr version
5042 *
5043 * We could definately use more free registers for
5044 * this code. We must spill %edx (rIBASE) because it
5045 * is used by imul. We'll also spill rINST (ebx),
5046 * giving us eax, ebc, ecx and rIBASE as computational
5047 * temps. On top of that, we'll spill %esi (edi)
5048 * for use as the vA pointer and rFP (esi) for use
5049 * as the vB pointer. Yuck.
5050 */
5051 /* mul-long/2addr vA, vB */
5052 movzbl rINSTbl, %eax # eax <- BA
5053 andb $0xf, %al # eax <- A
5054 CLEAR_WIDE_REF %eax # clear refs in advance
5055 sarl $4, rINST # rINST <- B
5056 mov rPC, LOCAL0(%esp) # save Interpreter PC
5057 mov rFP, LOCAL1(%esp) # save FP
5058 mov rIBASE, LOCAL2(%esp) # save rIBASE
5059 leal (rFP,%eax,4), %esi # esi <- &v[A]
5060 leal (rFP,rINST,4), rFP # rFP <- &v[B]
5061 movl 4(%esi), %ecx # ecx <- Amsw
5062 imull (rFP), %ecx # ecx <- (Amsw*Blsw)
5063 movl 4(rFP), %eax # eax <- Bmsw
5064 imull (%esi), %eax # eax <- (Bmsw*Alsw)
5065 addl %eax, %ecx # ecx <- (Amsw*Blsw)+(Bmsw*Alsw)
5066 movl (rFP), %eax # eax <- Blsw
5067 mull (%esi) # eax <- (Blsw*Alsw)
5068 leal (%ecx,rIBASE), rIBASE # full result now in %edx:%eax
5069 movl rIBASE, 4(%esi) # v[A+1] <- rIBASE
5070 movl %eax, (%esi) # v[A] <- %eax
5071 mov LOCAL0(%esp), rPC # restore Interpreter PC
5072 mov LOCAL2(%esp), rIBASE # restore IBASE
5073 mov LOCAL1(%esp), rFP # restore FP
5074 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
5075
5076/* ------------------------------ */
5077 .balign 128
5078.L_op_div_long_2addr: /* 0xbe */
5079/* File: x86/op_div_long_2addr.S */
5080/* art_quick_* methods has quick abi,
5081 * so use eax, ecx, edx, ebx for args
5082 */
5083 /* div/2addr vA, vB */
5084 .extern art_quick_ldiv
5085 mov rIBASE, LOCAL0(%esp) # save rIBASE/%edx
5086 movzbl rINSTbl, %eax
5087 shrl $4, %eax # eax <- B
5088 andb $0xf, rINSTbl # rINST <- A
5089 mov rINST, LOCAL1(%esp) # save rINST/%ebx
5090 movl %ebx, %ecx
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005091 GET_VREG %edx, %eax
5092 GET_VREG_HIGH %ebx, %eax
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005093 movl %edx, %eax
5094 orl %ebx, %eax
5095 jz common_errDivideByZero
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005096 GET_VREG %eax, %ecx
5097 GET_VREG_HIGH %ecx, %ecx
5098 call SYMBOL(art_quick_ldiv)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005099 mov LOCAL1(%esp), rINST # restore rINST/%ebx
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005100 SET_VREG_HIGH rIBASE, rINST
5101 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005102 mov LOCAL0(%esp), rIBASE # restore rIBASE/%edx
5103 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
5104
5105/* ------------------------------ */
5106 .balign 128
5107.L_op_rem_long_2addr: /* 0xbf */
5108/* File: x86/op_rem_long_2addr.S */
5109/* File: x86/op_div_long_2addr.S */
5110/* art_quick_* methods has quick abi,
5111 * so use eax, ecx, edx, ebx for args
5112 */
5113 /* div/2addr vA, vB */
5114 .extern art_quick_lmod
5115 mov rIBASE, LOCAL0(%esp) # save rIBASE/%edx
5116 movzbl rINSTbl, %eax
5117 shrl $4, %eax # eax <- B
5118 andb $0xf, rINSTbl # rINST <- A
5119 mov rINST, LOCAL1(%esp) # save rINST/%ebx
5120 movl %ebx, %ecx
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005121 GET_VREG %edx, %eax
5122 GET_VREG_HIGH %ebx, %eax
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005123 movl %edx, %eax
5124 orl %ebx, %eax
5125 jz common_errDivideByZero
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005126 GET_VREG %eax, %ecx
5127 GET_VREG_HIGH %ecx, %ecx
5128 call SYMBOL(art_quick_lmod)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005129 mov LOCAL1(%esp), rINST # restore rINST/%ebx
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005130 SET_VREG_HIGH rIBASE, rINST
5131 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005132 mov LOCAL0(%esp), rIBASE # restore rIBASE/%edx
5133 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
5134
5135
5136/* ------------------------------ */
5137 .balign 128
5138.L_op_and_long_2addr: /* 0xc0 */
5139/* File: x86/op_and_long_2addr.S */
5140/* File: x86/binopWide2addr.S */
5141/*
5142 * Generic 64-bit binary operation.
5143 */
5144 /* binop/2addr vA, vB */
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005145 movzbl rINSTbl, %ecx # ecx<- BA
5146 sarl $4, %ecx # ecx<- B
5147 GET_VREG %eax, %ecx # eax<- v[B+0]
5148 GET_VREG_HIGH %ecx, %ecx # eax<- v[B+1]
5149 andb $0xF, rINSTbl # rINST<- A
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005150 andl %eax, (rFP,rINST,4) # ex: addl %eax,(rFP,rINST,4)
5151 andl %ecx, 4(rFP,rINST,4) # ex: adcl %ecx,4(rFP,rINST,4)
5152 CLEAR_WIDE_REF rINST
5153 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
5154
5155
5156/* ------------------------------ */
5157 .balign 128
5158.L_op_or_long_2addr: /* 0xc1 */
5159/* File: x86/op_or_long_2addr.S */
5160/* File: x86/binopWide2addr.S */
5161/*
5162 * Generic 64-bit binary operation.
5163 */
5164 /* binop/2addr vA, vB */
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005165 movzbl rINSTbl, %ecx # ecx<- BA
5166 sarl $4, %ecx # ecx<- B
5167 GET_VREG %eax, %ecx # eax<- v[B+0]
5168 GET_VREG_HIGH %ecx, %ecx # eax<- v[B+1]
5169 andb $0xF, rINSTbl # rINST<- A
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005170 orl %eax, (rFP,rINST,4) # ex: addl %eax,(rFP,rINST,4)
5171 orl %ecx, 4(rFP,rINST,4) # ex: adcl %ecx,4(rFP,rINST,4)
5172 CLEAR_WIDE_REF rINST
5173 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
5174
5175
5176/* ------------------------------ */
5177 .balign 128
5178.L_op_xor_long_2addr: /* 0xc2 */
5179/* File: x86/op_xor_long_2addr.S */
5180/* File: x86/binopWide2addr.S */
5181/*
5182 * Generic 64-bit binary operation.
5183 */
5184 /* binop/2addr vA, vB */
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005185 movzbl rINSTbl, %ecx # ecx<- BA
5186 sarl $4, %ecx # ecx<- B
5187 GET_VREG %eax, %ecx # eax<- v[B+0]
5188 GET_VREG_HIGH %ecx, %ecx # eax<- v[B+1]
5189 andb $0xF, rINSTbl # rINST<- A
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005190 xorl %eax, (rFP,rINST,4) # ex: addl %eax,(rFP,rINST,4)
5191 xorl %ecx, 4(rFP,rINST,4) # ex: adcl %ecx,4(rFP,rINST,4)
5192 CLEAR_WIDE_REF rINST
5193 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
5194
5195
5196/* ------------------------------ */
5197 .balign 128
5198.L_op_shl_long_2addr: /* 0xc3 */
5199/* File: x86/op_shl_long_2addr.S */
5200/*
5201 * Long integer shift, 2addr version. vA is 64-bit value/result, vB is
5202 * 32-bit shift distance.
5203 */
5204 /* shl-long/2addr vA, vB */
5205 /* ecx gets shift count */
5206 /* Need to spill rIBASE */
5207 /* rINSTw gets AA */
5208 movzbl rINSTbl, %ecx # ecx <- BA
5209 andb $0xf, rINSTbl # rINST <- A
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005210 GET_VREG %eax, rINST # eax <- v[AA+0]
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005211 sarl $4, %ecx # ecx <- B
5212 movl rIBASE, LOCAL0(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005213 GET_VREG_HIGH rIBASE, rINST # rIBASE <- v[AA+1]
5214 GET_VREG %ecx, %ecx # ecx <- vBB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005215 shldl %eax, rIBASE
5216 sall %cl, %eax
5217 testb $32, %cl
5218 je 2f
5219 movl %eax, rIBASE
5220 xorl %eax, %eax
52212:
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005222 SET_VREG_HIGH rIBASE, rINST # v[AA+1] <- rIBASE
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005223 movl LOCAL0(%esp), rIBASE
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005224 SET_VREG %eax, rINST # v[AA+0] <- eax
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005225 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
5226
5227/* ------------------------------ */
5228 .balign 128
5229.L_op_shr_long_2addr: /* 0xc4 */
5230/* File: x86/op_shr_long_2addr.S */
5231/*
5232 * Long integer shift, 2addr version. vA is 64-bit value/result, vB is
5233 * 32-bit shift distance.
5234 */
5235 /* shl-long/2addr vA, vB */
5236 /* ecx gets shift count */
5237 /* Need to spill rIBASE */
5238 /* rINSTw gets AA */
5239 movzbl rINSTbl, %ecx # ecx <- BA
5240 andb $0xf, rINSTbl # rINST <- A
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005241 GET_VREG %eax, rINST # eax <- v[AA+0]
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005242 sarl $4, %ecx # ecx <- B
5243 movl rIBASE, LOCAL0(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005244 GET_VREG_HIGH rIBASE, rINST # rIBASE <- v[AA+1]
5245 GET_VREG %ecx, %ecx # ecx <- vBB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005246 shrdl rIBASE, %eax
5247 sarl %cl, rIBASE
5248 testb $32, %cl
5249 je 2f
5250 movl rIBASE, %eax
5251 sarl $31, rIBASE
52522:
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005253 SET_VREG_HIGH rIBASE, rINST # v[AA+1] <- rIBASE
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005254 movl LOCAL0(%esp), rIBASE
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005255 SET_VREG %eax, rINST # v[AA+0] <- eax
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005256 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
5257
5258/* ------------------------------ */
5259 .balign 128
5260.L_op_ushr_long_2addr: /* 0xc5 */
5261/* File: x86/op_ushr_long_2addr.S */
5262/*
5263 * Long integer shift, 2addr version. vA is 64-bit value/result, vB is
5264 * 32-bit shift distance.
5265 */
5266 /* shl-long/2addr vA, vB */
5267 /* ecx gets shift count */
5268 /* Need to spill rIBASE */
5269 /* rINSTw gets AA */
5270 movzbl rINSTbl, %ecx # ecx <- BA
5271 andb $0xf, rINSTbl # rINST <- A
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005272 GET_VREG %eax, rINST # eax <- v[AA+0]
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005273 sarl $4, %ecx # ecx <- B
5274 movl rIBASE, LOCAL0(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005275 GET_VREG_HIGH rIBASE, rINST # rIBASE <- v[AA+1]
5276 GET_VREG %ecx, %ecx # ecx <- vBB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005277 shrdl rIBASE, %eax
5278 shrl %cl, rIBASE
5279 testb $32, %cl
5280 je 2f
5281 movl rIBASE, %eax
5282 xorl rIBASE, rIBASE
52832:
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005284 SET_VREG_HIGH rIBASE, rINST # v[AA+1] <- rIBASE
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005285 movl LOCAL0(%esp), rIBASE
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005286 SET_VREG %eax, rINST # v[AA+0] <- eax
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005287 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
5288
5289/* ------------------------------ */
5290 .balign 128
5291.L_op_add_float_2addr: /* 0xc6 */
5292/* File: x86/op_add_float_2addr.S */
5293/* File: x86/sseBinop2Addr.S */
5294 movzx rINSTbl, %ecx # ecx <- A+
5295 andl $0xf, %ecx # ecx <- A
5296 movss VREG_ADDRESS(%ecx), %xmm0 # %xmm0 <- 1st src
5297 sarl $4, rINST # rINST<- B
5298 addss VREG_ADDRESS(rINST), %xmm0
5299 movss %xmm0, VREG_ADDRESS(%ecx) # vAA<- %xmm0
5300 pxor %xmm0, %xmm0
5301 movss %xmm0, VREG_REF_ADDRESS(rINST) # clear ref
5302 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
5303
5304
5305/* ------------------------------ */
5306 .balign 128
5307.L_op_sub_float_2addr: /* 0xc7 */
5308/* File: x86/op_sub_float_2addr.S */
5309/* File: x86/sseBinop2Addr.S */
5310 movzx rINSTbl, %ecx # ecx <- A+
5311 andl $0xf, %ecx # ecx <- A
5312 movss VREG_ADDRESS(%ecx), %xmm0 # %xmm0 <- 1st src
5313 sarl $4, rINST # rINST<- B
5314 subss VREG_ADDRESS(rINST), %xmm0
5315 movss %xmm0, VREG_ADDRESS(%ecx) # vAA<- %xmm0
5316 pxor %xmm0, %xmm0
5317 movss %xmm0, VREG_REF_ADDRESS(rINST) # clear ref
5318 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
5319
5320
5321/* ------------------------------ */
5322 .balign 128
5323.L_op_mul_float_2addr: /* 0xc8 */
5324/* File: x86/op_mul_float_2addr.S */
5325/* File: x86/sseBinop2Addr.S */
5326 movzx rINSTbl, %ecx # ecx <- A+
5327 andl $0xf, %ecx # ecx <- A
5328 movss VREG_ADDRESS(%ecx), %xmm0 # %xmm0 <- 1st src
5329 sarl $4, rINST # rINST<- B
5330 mulss VREG_ADDRESS(rINST), %xmm0
5331 movss %xmm0, VREG_ADDRESS(%ecx) # vAA<- %xmm0
5332 pxor %xmm0, %xmm0
5333 movss %xmm0, VREG_REF_ADDRESS(rINST) # clear ref
5334 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
5335
5336
5337/* ------------------------------ */
5338 .balign 128
5339.L_op_div_float_2addr: /* 0xc9 */
5340/* File: x86/op_div_float_2addr.S */
5341/* File: x86/sseBinop2Addr.S */
5342 movzx rINSTbl, %ecx # ecx <- A+
5343 andl $0xf, %ecx # ecx <- A
5344 movss VREG_ADDRESS(%ecx), %xmm0 # %xmm0 <- 1st src
5345 sarl $4, rINST # rINST<- B
5346 divss VREG_ADDRESS(rINST), %xmm0
5347 movss %xmm0, VREG_ADDRESS(%ecx) # vAA<- %xmm0
5348 pxor %xmm0, %xmm0
5349 movss %xmm0, VREG_REF_ADDRESS(rINST) # clear ref
5350 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
5351
5352
5353/* ------------------------------ */
5354 .balign 128
5355.L_op_rem_float_2addr: /* 0xca */
5356/* File: x86/op_rem_float_2addr.S */
5357 /* rem_float/2addr vA, vB */
5358 movzx rINSTbl, %ecx # ecx <- A+
5359 sarl $4, rINST # rINST <- B
5360 flds VREG_ADDRESS(rINST) # vB to fp stack
5361 andb $0xf, %cl # ecx <- A
5362 flds VREG_ADDRESS(%ecx) # vA to fp stack
53631:
5364 fprem
5365 fstsw %ax
5366 sahf
5367 jp 1b
5368 fstp %st(1)
5369 fstps VREG_ADDRESS(%ecx) # %st to vA
5370 CLEAR_REF %ecx
5371 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
5372
5373/* ------------------------------ */
5374 .balign 128
5375.L_op_add_double_2addr: /* 0xcb */
5376/* File: x86/op_add_double_2addr.S */
5377/* File: x86/sseBinop2Addr.S */
5378 movzx rINSTbl, %ecx # ecx <- A+
5379 andl $0xf, %ecx # ecx <- A
5380 movsd VREG_ADDRESS(%ecx), %xmm0 # %xmm0 <- 1st src
5381 sarl $4, rINST # rINST<- B
5382 addsd VREG_ADDRESS(rINST), %xmm0
5383 movsd %xmm0, VREG_ADDRESS(%ecx) # vAA<- %xmm0
5384 pxor %xmm0, %xmm0
5385 movsd %xmm0, VREG_REF_ADDRESS(rINST) # clear ref
5386 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
5387
5388
5389/* ------------------------------ */
5390 .balign 128
5391.L_op_sub_double_2addr: /* 0xcc */
5392/* File: x86/op_sub_double_2addr.S */
5393/* File: x86/sseBinop2Addr.S */
5394 movzx rINSTbl, %ecx # ecx <- A+
5395 andl $0xf, %ecx # ecx <- A
5396 movsd VREG_ADDRESS(%ecx), %xmm0 # %xmm0 <- 1st src
5397 sarl $4, rINST # rINST<- B
5398 subsd VREG_ADDRESS(rINST), %xmm0
5399 movsd %xmm0, VREG_ADDRESS(%ecx) # vAA<- %xmm0
5400 pxor %xmm0, %xmm0
5401 movsd %xmm0, VREG_REF_ADDRESS(rINST) # clear ref
5402 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
5403
5404
5405/* ------------------------------ */
5406 .balign 128
5407.L_op_mul_double_2addr: /* 0xcd */
5408/* File: x86/op_mul_double_2addr.S */
5409/* File: x86/sseBinop2Addr.S */
5410 movzx rINSTbl, %ecx # ecx <- A+
5411 andl $0xf, %ecx # ecx <- A
5412 movsd VREG_ADDRESS(%ecx), %xmm0 # %xmm0 <- 1st src
5413 sarl $4, rINST # rINST<- B
5414 mulsd VREG_ADDRESS(rINST), %xmm0
5415 movsd %xmm0, VREG_ADDRESS(%ecx) # vAA<- %xmm0
5416 pxor %xmm0, %xmm0
5417 movsd %xmm0, VREG_REF_ADDRESS(rINST) # clear ref
5418 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
5419
5420
5421/* ------------------------------ */
5422 .balign 128
5423.L_op_div_double_2addr: /* 0xce */
5424/* File: x86/op_div_double_2addr.S */
5425/* File: x86/sseBinop2Addr.S */
5426 movzx rINSTbl, %ecx # ecx <- A+
5427 andl $0xf, %ecx # ecx <- A
5428 movsd VREG_ADDRESS(%ecx), %xmm0 # %xmm0 <- 1st src
5429 sarl $4, rINST # rINST<- B
5430 divsd VREG_ADDRESS(rINST), %xmm0
5431 movsd %xmm0, VREG_ADDRESS(%ecx) # vAA<- %xmm0
5432 pxor %xmm0, %xmm0
5433 movsd %xmm0, VREG_REF_ADDRESS(rINST) # clear ref
5434 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
5435
5436
5437/* ------------------------------ */
5438 .balign 128
5439.L_op_rem_double_2addr: /* 0xcf */
5440/* File: x86/op_rem_double_2addr.S */
5441 /* rem_double/2addr vA, vB */
5442 movzx rINSTbl, %ecx # ecx <- A+
5443 sarl $4, rINST # rINST <- B
5444 fldl VREG_ADDRESS(rINST) # vB to fp stack
5445 andb $0xf, %cl # ecx <- A
5446 fldl VREG_ADDRESS(%ecx) # vA to fp stack
54471:
5448 fprem
5449 fstsw %ax
5450 sahf
5451 jp 1b
5452 fstp %st(1)
5453 fstpl VREG_ADDRESS(%ecx) # %st to vA
5454 CLEAR_WIDE_REF %ecx
5455 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
5456
5457/* ------------------------------ */
5458 .balign 128
5459.L_op_add_int_lit16: /* 0xd0 */
5460/* File: x86/op_add_int_lit16.S */
5461/* File: x86/binopLit16.S */
5462/*
5463 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5464 * that specifies an instruction that performs "result = eax op ecx".
5465 * This could be an x86 instruction or a function call. (If the result
5466 * comes back in a register other than eax, you can override "result".)
5467 *
5468 * For: add-int/lit16, rsub-int,
5469 * and-int/lit16, or-int/lit16, xor-int/lit16
5470 */
5471 /* binop/lit16 vA, vB, #+CCCC */
5472 movzbl rINSTbl, %eax # eax <- 000000BA
5473 sarl $4, %eax # eax <- B
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005474 GET_VREG %eax, %eax # eax <- vB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005475 movswl 2(rPC), %ecx # ecx <- ssssCCCC
5476 andb $0xf, rINSTbl # rINST <- A
5477 addl %ecx, %eax # for example: addl %ecx, %eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005478 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005479 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5480
5481
5482/* ------------------------------ */
5483 .balign 128
5484.L_op_rsub_int: /* 0xd1 */
5485/* File: x86/op_rsub_int.S */
5486/* this op is "rsub-int", but can be thought of as "rsub-int/lit16" */
5487/* File: x86/binopLit16.S */
5488/*
5489 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5490 * that specifies an instruction that performs "result = eax op ecx".
5491 * This could be an x86 instruction or a function call. (If the result
5492 * comes back in a register other than eax, you can override "result".)
5493 *
5494 * For: add-int/lit16, rsub-int,
5495 * and-int/lit16, or-int/lit16, xor-int/lit16
5496 */
5497 /* binop/lit16 vA, vB, #+CCCC */
5498 movzbl rINSTbl, %eax # eax <- 000000BA
5499 sarl $4, %eax # eax <- B
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005500 GET_VREG %eax, %eax # eax <- vB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005501 movswl 2(rPC), %ecx # ecx <- ssssCCCC
5502 andb $0xf, rINSTbl # rINST <- A
5503 subl %eax, %ecx # for example: addl %ecx, %eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005504 SET_VREG %ecx, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005505 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5506
5507
5508/* ------------------------------ */
5509 .balign 128
5510.L_op_mul_int_lit16: /* 0xd2 */
5511/* File: x86/op_mul_int_lit16.S */
5512 /* mul/lit16 vA, vB, #+CCCC */
5513 /* Need A in rINST, ssssCCCC in ecx, vB in eax */
5514 movzbl rINSTbl, %eax # eax <- 000000BA
5515 sarl $4, %eax # eax <- B
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005516 GET_VREG %eax, %eax # eax <- vB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005517 movswl 2(rPC), %ecx # ecx <- ssssCCCC
5518 andb $0xf, rINSTbl # rINST <- A
5519 mov rIBASE, LOCAL0(%esp)
5520 imull %ecx, %eax # trashes rIBASE/edx
5521 mov LOCAL0(%esp), rIBASE
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005522 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005523 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5524
5525/* ------------------------------ */
5526 .balign 128
5527.L_op_div_int_lit16: /* 0xd3 */
5528/* File: x86/op_div_int_lit16.S */
5529/* File: x86/bindivLit16.S */
5530/*
5531 * 32-bit binary div/rem operation. Handles special case of op0=minint and
5532 * op1=-1.
5533 */
5534 /* div/rem/lit16 vA, vB, #+CCCC */
5535 /* Need A in rINST, ssssCCCC in ecx, vB in eax */
5536 movzbl rINSTbl, %eax # eax <- 000000BA
5537 sarl $4, %eax # eax <- B
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005538 GET_VREG %eax, %eax # eax <- vB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005539 movswl 2(rPC), %ecx # ecx <- ssssCCCC
5540 andb $0xf, rINSTbl # rINST <- A
5541 testl %ecx, %ecx
5542 je common_errDivideByZero
5543 cmpl $-1, %ecx
5544 jne .Lop_div_int_lit16_continue_div
5545 cmpl $0x80000000, %eax
5546 jne .Lop_div_int_lit16_continue_div
5547 movl $0x80000000, %eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005548 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005549 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5550
5551.Lop_div_int_lit16_continue_div:
5552 mov rIBASE, LOCAL0(%esp)
5553 cltd
5554 idivl %ecx
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005555 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005556 mov LOCAL0(%esp), rIBASE
5557 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5558
5559
5560/* ------------------------------ */
5561 .balign 128
5562.L_op_rem_int_lit16: /* 0xd4 */
5563/* File: x86/op_rem_int_lit16.S */
5564/* File: x86/bindivLit16.S */
5565/*
5566 * 32-bit binary div/rem operation. Handles special case of op0=minint and
5567 * op1=-1.
5568 */
5569 /* div/rem/lit16 vA, vB, #+CCCC */
5570 /* Need A in rINST, ssssCCCC in ecx, vB in eax */
5571 movzbl rINSTbl, %eax # eax <- 000000BA
5572 sarl $4, %eax # eax <- B
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005573 GET_VREG %eax, %eax # eax <- vB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005574 movswl 2(rPC), %ecx # ecx <- ssssCCCC
5575 andb $0xf, rINSTbl # rINST <- A
5576 testl %ecx, %ecx
5577 je common_errDivideByZero
5578 cmpl $-1, %ecx
5579 jne .Lop_rem_int_lit16_continue_div
5580 cmpl $0x80000000, %eax
5581 jne .Lop_rem_int_lit16_continue_div
5582 movl $0, %eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005583 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005584 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5585
5586.Lop_rem_int_lit16_continue_div:
5587 mov rIBASE, LOCAL0(%esp)
5588 cltd
5589 idivl %ecx
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005590 SET_VREG rIBASE, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005591 mov LOCAL0(%esp), rIBASE
5592 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5593
5594
5595/* ------------------------------ */
5596 .balign 128
5597.L_op_and_int_lit16: /* 0xd5 */
5598/* File: x86/op_and_int_lit16.S */
5599/* File: x86/binopLit16.S */
5600/*
5601 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5602 * that specifies an instruction that performs "result = eax op ecx".
5603 * This could be an x86 instruction or a function call. (If the result
5604 * comes back in a register other than eax, you can override "result".)
5605 *
5606 * For: add-int/lit16, rsub-int,
5607 * and-int/lit16, or-int/lit16, xor-int/lit16
5608 */
5609 /* binop/lit16 vA, vB, #+CCCC */
5610 movzbl rINSTbl, %eax # eax <- 000000BA
5611 sarl $4, %eax # eax <- B
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005612 GET_VREG %eax, %eax # eax <- vB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005613 movswl 2(rPC), %ecx # ecx <- ssssCCCC
5614 andb $0xf, rINSTbl # rINST <- A
5615 andl %ecx, %eax # for example: addl %ecx, %eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005616 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005617 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5618
5619
5620/* ------------------------------ */
5621 .balign 128
5622.L_op_or_int_lit16: /* 0xd6 */
5623/* File: x86/op_or_int_lit16.S */
5624/* File: x86/binopLit16.S */
5625/*
5626 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5627 * that specifies an instruction that performs "result = eax op ecx".
5628 * This could be an x86 instruction or a function call. (If the result
5629 * comes back in a register other than eax, you can override "result".)
5630 *
5631 * For: add-int/lit16, rsub-int,
5632 * and-int/lit16, or-int/lit16, xor-int/lit16
5633 */
5634 /* binop/lit16 vA, vB, #+CCCC */
5635 movzbl rINSTbl, %eax # eax <- 000000BA
5636 sarl $4, %eax # eax <- B
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005637 GET_VREG %eax, %eax # eax <- vB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005638 movswl 2(rPC), %ecx # ecx <- ssssCCCC
5639 andb $0xf, rINSTbl # rINST <- A
5640 orl %ecx, %eax # for example: addl %ecx, %eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005641 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005642 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5643
5644
5645/* ------------------------------ */
5646 .balign 128
5647.L_op_xor_int_lit16: /* 0xd7 */
5648/* File: x86/op_xor_int_lit16.S */
5649/* File: x86/binopLit16.S */
5650/*
5651 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5652 * that specifies an instruction that performs "result = eax op ecx".
5653 * This could be an x86 instruction or a function call. (If the result
5654 * comes back in a register other than eax, you can override "result".)
5655 *
5656 * For: add-int/lit16, rsub-int,
5657 * and-int/lit16, or-int/lit16, xor-int/lit16
5658 */
5659 /* binop/lit16 vA, vB, #+CCCC */
5660 movzbl rINSTbl, %eax # eax <- 000000BA
5661 sarl $4, %eax # eax <- B
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005662 GET_VREG %eax, %eax # eax <- vB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005663 movswl 2(rPC), %ecx # ecx <- ssssCCCC
5664 andb $0xf, rINSTbl # rINST <- A
5665 xorl %ecx, %eax # for example: addl %ecx, %eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005666 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005667 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5668
5669
5670/* ------------------------------ */
5671 .balign 128
5672.L_op_add_int_lit8: /* 0xd8 */
5673/* File: x86/op_add_int_lit8.S */
5674/* File: x86/binopLit8.S */
5675/*
5676 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
5677 * that specifies an instruction that performs "result = eax op ecx".
5678 * This could be an x86 instruction or a function call. (If the result
5679 * comes back in a register other than r0, you can override "result".)
5680 *
5681 * For: add-int/lit8, rsub-int/lit8
5682 * and-int/lit8, or-int/lit8, xor-int/lit8,
5683 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
5684 */
5685 /* binop/lit8 vAA, vBB, #+CC */
5686 movzbl 2(rPC), %eax # eax <- BB
5687 movsbl 3(rPC), %ecx # ecx <- ssssssCC
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005688 GET_VREG %eax, %eax # eax <- rBB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005689 addl %ecx, %eax # ex: addl %ecx,%eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005690 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005691 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5692
5693
5694/* ------------------------------ */
5695 .balign 128
5696.L_op_rsub_int_lit8: /* 0xd9 */
5697/* File: x86/op_rsub_int_lit8.S */
5698/* File: x86/binopLit8.S */
5699/*
5700 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
5701 * that specifies an instruction that performs "result = eax op ecx".
5702 * This could be an x86 instruction or a function call. (If the result
5703 * comes back in a register other than r0, you can override "result".)
5704 *
5705 * For: add-int/lit8, rsub-int/lit8
5706 * and-int/lit8, or-int/lit8, xor-int/lit8,
5707 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
5708 */
5709 /* binop/lit8 vAA, vBB, #+CC */
5710 movzbl 2(rPC), %eax # eax <- BB
5711 movsbl 3(rPC), %ecx # ecx <- ssssssCC
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005712 GET_VREG %eax, %eax # eax <- rBB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005713 subl %eax, %ecx # ex: addl %ecx,%eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005714 SET_VREG %ecx, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005715 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5716
5717
5718/* ------------------------------ */
5719 .balign 128
5720.L_op_mul_int_lit8: /* 0xda */
5721/* File: x86/op_mul_int_lit8.S */
5722 /* mul/lit8 vAA, vBB, #+CC */
5723 movzbl 2(rPC), %eax # eax <- BB
5724 movsbl 3(rPC), %ecx # ecx <- ssssssCC
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005725 GET_VREG %eax, %eax # eax <- rBB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005726 mov rIBASE, LOCAL0(%esp)
5727 imull %ecx, %eax # trashes rIBASE/edx
5728 mov LOCAL0(%esp), rIBASE
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005729 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005730 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5731
5732/* ------------------------------ */
5733 .balign 128
5734.L_op_div_int_lit8: /* 0xdb */
5735/* File: x86/op_div_int_lit8.S */
5736/* File: x86/bindivLit8.S */
5737/*
5738 * 32-bit div/rem "lit8" binary operation. Handles special case of
5739 * op0=minint & op1=-1
5740 */
5741 /* div/rem/lit8 vAA, vBB, #+CC */
5742 movzbl 2(rPC), %eax # eax <- BB
5743 movsbl 3(rPC), %ecx # ecx <- ssssssCC
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005744 GET_VREG %eax, %eax # eax <- rBB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005745 testl %ecx, %ecx
5746 je common_errDivideByZero
5747 cmpl $0x80000000, %eax
5748 jne .Lop_div_int_lit8_continue_div
5749 cmpl $-1, %ecx
5750 jne .Lop_div_int_lit8_continue_div
5751 movl $0x80000000, %eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005752 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005753 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5754
5755.Lop_div_int_lit8_continue_div:
5756 mov rIBASE, LOCAL0(%esp)
5757 cltd
5758 idivl %ecx
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005759 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005760 mov LOCAL0(%esp), rIBASE
5761 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5762
5763
5764/* ------------------------------ */
5765 .balign 128
5766.L_op_rem_int_lit8: /* 0xdc */
5767/* File: x86/op_rem_int_lit8.S */
5768/* File: x86/bindivLit8.S */
5769/*
5770 * 32-bit div/rem "lit8" binary operation. Handles special case of
5771 * op0=minint & op1=-1
5772 */
5773 /* div/rem/lit8 vAA, vBB, #+CC */
5774 movzbl 2(rPC), %eax # eax <- BB
5775 movsbl 3(rPC), %ecx # ecx <- ssssssCC
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005776 GET_VREG %eax, %eax # eax <- rBB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005777 testl %ecx, %ecx
5778 je common_errDivideByZero
5779 cmpl $0x80000000, %eax
5780 jne .Lop_rem_int_lit8_continue_div
5781 cmpl $-1, %ecx
5782 jne .Lop_rem_int_lit8_continue_div
5783 movl $0, %eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005784 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005785 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5786
5787.Lop_rem_int_lit8_continue_div:
5788 mov rIBASE, LOCAL0(%esp)
5789 cltd
5790 idivl %ecx
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005791 SET_VREG rIBASE, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005792 mov LOCAL0(%esp), rIBASE
5793 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5794
5795
5796/* ------------------------------ */
5797 .balign 128
5798.L_op_and_int_lit8: /* 0xdd */
5799/* File: x86/op_and_int_lit8.S */
5800/* File: x86/binopLit8.S */
5801/*
5802 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
5803 * that specifies an instruction that performs "result = eax op ecx".
5804 * This could be an x86 instruction or a function call. (If the result
5805 * comes back in a register other than r0, you can override "result".)
5806 *
5807 * For: add-int/lit8, rsub-int/lit8
5808 * and-int/lit8, or-int/lit8, xor-int/lit8,
5809 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
5810 */
5811 /* binop/lit8 vAA, vBB, #+CC */
5812 movzbl 2(rPC), %eax # eax <- BB
5813 movsbl 3(rPC), %ecx # ecx <- ssssssCC
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005814 GET_VREG %eax, %eax # eax <- rBB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005815 andl %ecx, %eax # ex: addl %ecx,%eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005816 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005817 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5818
5819
5820/* ------------------------------ */
5821 .balign 128
5822.L_op_or_int_lit8: /* 0xde */
5823/* File: x86/op_or_int_lit8.S */
5824/* File: x86/binopLit8.S */
5825/*
5826 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
5827 * that specifies an instruction that performs "result = eax op ecx".
5828 * This could be an x86 instruction or a function call. (If the result
5829 * comes back in a register other than r0, you can override "result".)
5830 *
5831 * For: add-int/lit8, rsub-int/lit8
5832 * and-int/lit8, or-int/lit8, xor-int/lit8,
5833 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
5834 */
5835 /* binop/lit8 vAA, vBB, #+CC */
5836 movzbl 2(rPC), %eax # eax <- BB
5837 movsbl 3(rPC), %ecx # ecx <- ssssssCC
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005838 GET_VREG %eax, %eax # eax <- rBB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005839 orl %ecx, %eax # ex: addl %ecx,%eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005840 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005841 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5842
5843
5844/* ------------------------------ */
5845 .balign 128
5846.L_op_xor_int_lit8: /* 0xdf */
5847/* File: x86/op_xor_int_lit8.S */
5848/* File: x86/binopLit8.S */
5849/*
5850 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
5851 * that specifies an instruction that performs "result = eax op ecx".
5852 * This could be an x86 instruction or a function call. (If the result
5853 * comes back in a register other than r0, you can override "result".)
5854 *
5855 * For: add-int/lit8, rsub-int/lit8
5856 * and-int/lit8, or-int/lit8, xor-int/lit8,
5857 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
5858 */
5859 /* binop/lit8 vAA, vBB, #+CC */
5860 movzbl 2(rPC), %eax # eax <- BB
5861 movsbl 3(rPC), %ecx # ecx <- ssssssCC
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005862 GET_VREG %eax, %eax # eax <- rBB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005863 xorl %ecx, %eax # ex: addl %ecx,%eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005864 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005865 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5866
5867
5868/* ------------------------------ */
5869 .balign 128
5870.L_op_shl_int_lit8: /* 0xe0 */
5871/* File: x86/op_shl_int_lit8.S */
5872/* File: x86/binopLit8.S */
5873/*
5874 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
5875 * that specifies an instruction that performs "result = eax op ecx".
5876 * This could be an x86 instruction or a function call. (If the result
5877 * comes back in a register other than r0, you can override "result".)
5878 *
5879 * For: add-int/lit8, rsub-int/lit8
5880 * and-int/lit8, or-int/lit8, xor-int/lit8,
5881 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
5882 */
5883 /* binop/lit8 vAA, vBB, #+CC */
5884 movzbl 2(rPC), %eax # eax <- BB
5885 movsbl 3(rPC), %ecx # ecx <- ssssssCC
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005886 GET_VREG %eax, %eax # eax <- rBB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005887 sall %cl, %eax # ex: addl %ecx,%eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005888 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005889 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5890
5891
5892/* ------------------------------ */
5893 .balign 128
5894.L_op_shr_int_lit8: /* 0xe1 */
5895/* File: x86/op_shr_int_lit8.S */
5896/* File: x86/binopLit8.S */
5897/*
5898 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
5899 * that specifies an instruction that performs "result = eax op ecx".
5900 * This could be an x86 instruction or a function call. (If the result
5901 * comes back in a register other than r0, you can override "result".)
5902 *
5903 * For: add-int/lit8, rsub-int/lit8
5904 * and-int/lit8, or-int/lit8, xor-int/lit8,
5905 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
5906 */
5907 /* binop/lit8 vAA, vBB, #+CC */
5908 movzbl 2(rPC), %eax # eax <- BB
5909 movsbl 3(rPC), %ecx # ecx <- ssssssCC
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005910 GET_VREG %eax, %eax # eax <- rBB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005911 sarl %cl, %eax # ex: addl %ecx,%eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005912 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005913 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5914
5915
5916/* ------------------------------ */
5917 .balign 128
5918.L_op_ushr_int_lit8: /* 0xe2 */
5919/* File: x86/op_ushr_int_lit8.S */
5920/* File: x86/binopLit8.S */
5921/*
5922 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
5923 * that specifies an instruction that performs "result = eax op ecx".
5924 * This could be an x86 instruction or a function call. (If the result
5925 * comes back in a register other than r0, you can override "result".)
5926 *
5927 * For: add-int/lit8, rsub-int/lit8
5928 * and-int/lit8, or-int/lit8, xor-int/lit8,
5929 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
5930 */
5931 /* binop/lit8 vAA, vBB, #+CC */
5932 movzbl 2(rPC), %eax # eax <- BB
5933 movsbl 3(rPC), %ecx # ecx <- ssssssCC
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005934 GET_VREG %eax, %eax # eax <- rBB
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005935 shrl %cl, %eax # ex: addl %ecx,%eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005936 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005937 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5938
5939
5940/* ------------------------------ */
5941 .balign 128
5942.L_op_iget_quick: /* 0xe3 */
5943/* File: x86/op_iget_quick.S */
5944 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
5945 /* op vA, vB, offset@CCCC */
5946 movzbl rINSTbl, %ecx # ecx <- BA
5947 sarl $4, %ecx # ecx <- B
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005948 GET_VREG %ecx, %ecx # vB (object we're operating on)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005949 movzwl 2(rPC), %eax # eax <- field byte offset
5950 testl %ecx, %ecx # is object null?
5951 je common_errNullObject
5952 movl (%ecx,%eax,1), %eax
5953 andb $0xf,rINSTbl # rINST <- A
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005954 SET_VREG %eax, rINST # fp[A] <- value
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005955 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5956
5957/* ------------------------------ */
5958 .balign 128
5959.L_op_iget_wide_quick: /* 0xe4 */
5960/* File: x86/op_iget_wide_quick.S */
5961 /* iget-wide-quick vA, vB, offset@CCCC */
5962 movzbl rINSTbl, %ecx # ecx <- BA
5963 sarl $4, %ecx # ecx <- B
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005964 GET_VREG %ecx, %ecx # vB (object we're operating on)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005965 movzwl 2(rPC), %eax # eax <- field byte offset
5966 testl %ecx, %ecx # is object null?
5967 je common_errNullObject
5968 movq (%ecx,%eax,1), %xmm0
5969 andb $0xf, rINSTbl # rINST <- A
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005970 SET_WIDE_FP_VREG %xmm0, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005971 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5972
5973/* ------------------------------ */
5974 .balign 128
5975.L_op_iget_object_quick: /* 0xe5 */
5976/* File: x86/op_iget_object_quick.S */
5977 /* For: iget-object-quick */
5978 /* op vA, vB, offset@CCCC */
5979 movzbl rINSTbl, %ecx # ecx <- BA
5980 sarl $4, %ecx # ecx <- B
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005981 GET_VREG %ecx, %ecx # vB (object we're operating on)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005982 movzwl 2(rPC), %eax # eax <- field byte offset
5983 movl %ecx, OUT_ARG0(%esp)
5984 movl %eax, OUT_ARG1(%esp)
5985 EXPORT_PC
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005986 call SYMBOL(artIGetObjectFromMterp) # (obj, offset)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005987 movl rSELF, %ecx
5988 REFRESH_IBASE_FROM_SELF %ecx
5989 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx)
5990 jnz MterpException # bail out
5991 andb $0xf,rINSTbl # rINST <- A
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06005992 SET_VREG_OBJECT %eax, rINST # fp[A] <- value
Bill Buzbee7c58bd42016-01-20 20:46:01 +00005993 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5994
5995/* ------------------------------ */
5996 .balign 128
5997.L_op_iput_quick: /* 0xe6 */
5998/* File: x86/op_iput_quick.S */
5999 /* For: iput-quick, iput-object-quick */
6000 /* op vA, vB, offset@CCCC */
6001 movzbl rINSTbl, %ecx # ecx <- BA
6002 sarl $4, %ecx # ecx <- B
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006003 GET_VREG %ecx, %ecx # vB (object we're operating on)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006004 testl %ecx, %ecx # is object null?
6005 je common_errNullObject
6006 andb $0xf, rINSTbl # rINST <- A
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006007 GET_VREG rINST, rINST # rINST <- v[A]
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006008 movzwl 2(rPC), %eax # eax <- field byte offset
6009 movl rINST, (%ecx,%eax,1)
6010 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
6011
6012/* ------------------------------ */
6013 .balign 128
6014.L_op_iput_wide_quick: /* 0xe7 */
6015/* File: x86/op_iput_wide_quick.S */
6016 /* iput-wide-quick vA, vB, offset@CCCC */
6017 movzbl rINSTbl, %ecx # ecx<- BA
6018 sarl $4, %ecx # ecx<- B
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006019 GET_VREG %ecx, %ecx # vB (object we're operating on)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006020 testl %ecx, %ecx # is object null?
6021 je common_errNullObject
6022 movzwl 2(rPC), %eax # eax<- field byte offset
6023 leal (%ecx,%eax,1), %ecx # ecx<- Address of 64-bit target
6024 andb $0xf, rINSTbl # rINST<- A
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006025 GET_WIDE_FP_VREG %xmm0, rINST # xmm0<- fp[A]/fp[A+1]
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006026 movq %xmm0, (%ecx) # obj.field<- r0/r1
6027 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
6028
6029/* ------------------------------ */
6030 .balign 128
6031.L_op_iput_object_quick: /* 0xe8 */
6032/* File: x86/op_iput_object_quick.S */
6033 EXPORT_PC
6034 leal OFF_FP_SHADOWFRAME(rFP), %eax
6035 movl %eax, OUT_ARG0(%esp)
6036 movl rPC, OUT_ARG1(%esp)
6037 REFRESH_INST 232
6038 movl rINST, OUT_ARG2(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006039 call SYMBOL(MterpIputObjectQuick)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006040 testl %eax, %eax
6041 jz MterpException
6042 REFRESH_IBASE
6043 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
6044
6045/* ------------------------------ */
6046 .balign 128
6047.L_op_invoke_virtual_quick: /* 0xe9 */
6048/* File: x86/op_invoke_virtual_quick.S */
6049/* File: x86/invoke.S */
6050/*
6051 * Generic invoke handler wrapper.
6052 */
6053 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
6054 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
6055 .extern MterpInvokeVirtualQuick
6056 EXPORT_PC
6057 movl rSELF, %ecx
6058 movl %ecx, OUT_ARG0(%esp)
6059 leal OFF_FP_SHADOWFRAME(rFP), %eax
6060 movl %eax, OUT_ARG1(%esp)
6061 movl rPC, OUT_ARG2(%esp)
6062 REFRESH_INST 233
6063 movl rINST, OUT_ARG3(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006064 call SYMBOL(MterpInvokeVirtualQuick)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006065 testl %eax, %eax
6066 jz MterpException
6067 REFRESH_IBASE
6068 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
6069
6070
6071/* ------------------------------ */
6072 .balign 128
6073.L_op_invoke_virtual_range_quick: /* 0xea */
6074/* File: x86/op_invoke_virtual_range_quick.S */
6075/* File: x86/invoke.S */
6076/*
6077 * Generic invoke handler wrapper.
6078 */
6079 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
6080 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
6081 .extern MterpInvokeVirtualQuickRange
6082 EXPORT_PC
6083 movl rSELF, %ecx
6084 movl %ecx, OUT_ARG0(%esp)
6085 leal OFF_FP_SHADOWFRAME(rFP), %eax
6086 movl %eax, OUT_ARG1(%esp)
6087 movl rPC, OUT_ARG2(%esp)
6088 REFRESH_INST 234
6089 movl rINST, OUT_ARG3(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006090 call SYMBOL(MterpInvokeVirtualQuickRange)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006091 testl %eax, %eax
6092 jz MterpException
6093 REFRESH_IBASE
6094 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
6095
6096
6097/* ------------------------------ */
6098 .balign 128
6099.L_op_iput_boolean_quick: /* 0xeb */
6100/* File: x86/op_iput_boolean_quick.S */
6101/* File: x86/op_iput_quick.S */
6102 /* For: iput-quick, iput-object-quick */
6103 /* op vA, vB, offset@CCCC */
6104 movzbl rINSTbl, %ecx # ecx <- BA
6105 sarl $4, %ecx # ecx <- B
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006106 GET_VREG %ecx, %ecx # vB (object we're operating on)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006107 testl %ecx, %ecx # is object null?
6108 je common_errNullObject
6109 andb $0xf, rINSTbl # rINST <- A
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006110 GET_VREG rINST, rINST # rINST <- v[A]
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006111 movzwl 2(rPC), %eax # eax <- field byte offset
6112 movb rINSTbl, (%ecx,%eax,1)
6113 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
6114
6115
6116/* ------------------------------ */
6117 .balign 128
6118.L_op_iput_byte_quick: /* 0xec */
6119/* File: x86/op_iput_byte_quick.S */
6120/* File: x86/op_iput_quick.S */
6121 /* For: iput-quick, iput-object-quick */
6122 /* op vA, vB, offset@CCCC */
6123 movzbl rINSTbl, %ecx # ecx <- BA
6124 sarl $4, %ecx # ecx <- B
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006125 GET_VREG %ecx, %ecx # vB (object we're operating on)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006126 testl %ecx, %ecx # is object null?
6127 je common_errNullObject
6128 andb $0xf, rINSTbl # rINST <- A
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006129 GET_VREG rINST, rINST # rINST <- v[A]
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006130 movzwl 2(rPC), %eax # eax <- field byte offset
6131 movb rINSTbl, (%ecx,%eax,1)
6132 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
6133
6134
6135/* ------------------------------ */
6136 .balign 128
6137.L_op_iput_char_quick: /* 0xed */
6138/* File: x86/op_iput_char_quick.S */
6139/* File: x86/op_iput_quick.S */
6140 /* For: iput-quick, iput-object-quick */
6141 /* op vA, vB, offset@CCCC */
6142 movzbl rINSTbl, %ecx # ecx <- BA
6143 sarl $4, %ecx # ecx <- B
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006144 GET_VREG %ecx, %ecx # vB (object we're operating on)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006145 testl %ecx, %ecx # is object null?
6146 je common_errNullObject
6147 andb $0xf, rINSTbl # rINST <- A
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006148 GET_VREG rINST, rINST # rINST <- v[A]
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006149 movzwl 2(rPC), %eax # eax <- field byte offset
6150 movw rINSTw, (%ecx,%eax,1)
6151 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
6152
6153
6154/* ------------------------------ */
6155 .balign 128
6156.L_op_iput_short_quick: /* 0xee */
6157/* File: x86/op_iput_short_quick.S */
6158/* File: x86/op_iput_quick.S */
6159 /* For: iput-quick, iput-object-quick */
6160 /* op vA, vB, offset@CCCC */
6161 movzbl rINSTbl, %ecx # ecx <- BA
6162 sarl $4, %ecx # ecx <- B
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006163 GET_VREG %ecx, %ecx # vB (object we're operating on)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006164 testl %ecx, %ecx # is object null?
6165 je common_errNullObject
6166 andb $0xf, rINSTbl # rINST <- A
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006167 GET_VREG rINST, rINST # rINST <- v[A]
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006168 movzwl 2(rPC), %eax # eax <- field byte offset
6169 movw rINSTw, (%ecx,%eax,1)
6170 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
6171
6172
6173/* ------------------------------ */
6174 .balign 128
6175.L_op_iget_boolean_quick: /* 0xef */
6176/* File: x86/op_iget_boolean_quick.S */
6177/* File: x86/op_iget_quick.S */
6178 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6179 /* op vA, vB, offset@CCCC */
6180 movzbl rINSTbl, %ecx # ecx <- BA
6181 sarl $4, %ecx # ecx <- B
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006182 GET_VREG %ecx, %ecx # vB (object we're operating on)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006183 movzwl 2(rPC), %eax # eax <- field byte offset
6184 testl %ecx, %ecx # is object null?
6185 je common_errNullObject
6186 movsbl (%ecx,%eax,1), %eax
6187 andb $0xf,rINSTbl # rINST <- A
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006188 SET_VREG %eax, rINST # fp[A] <- value
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006189 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
6190
6191
6192/* ------------------------------ */
6193 .balign 128
6194.L_op_iget_byte_quick: /* 0xf0 */
6195/* File: x86/op_iget_byte_quick.S */
6196/* File: x86/op_iget_quick.S */
6197 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6198 /* op vA, vB, offset@CCCC */
6199 movzbl rINSTbl, %ecx # ecx <- BA
6200 sarl $4, %ecx # ecx <- B
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006201 GET_VREG %ecx, %ecx # vB (object we're operating on)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006202 movzwl 2(rPC), %eax # eax <- field byte offset
6203 testl %ecx, %ecx # is object null?
6204 je common_errNullObject
6205 movsbl (%ecx,%eax,1), %eax
6206 andb $0xf,rINSTbl # rINST <- A
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006207 SET_VREG %eax, rINST # fp[A] <- value
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006208 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
6209
6210
6211/* ------------------------------ */
6212 .balign 128
6213.L_op_iget_char_quick: /* 0xf1 */
6214/* File: x86/op_iget_char_quick.S */
6215/* File: x86/op_iget_quick.S */
6216 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6217 /* op vA, vB, offset@CCCC */
6218 movzbl rINSTbl, %ecx # ecx <- BA
6219 sarl $4, %ecx # ecx <- B
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006220 GET_VREG %ecx, %ecx # vB (object we're operating on)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006221 movzwl 2(rPC), %eax # eax <- field byte offset
6222 testl %ecx, %ecx # is object null?
6223 je common_errNullObject
6224 movzwl (%ecx,%eax,1), %eax
6225 andb $0xf,rINSTbl # rINST <- A
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006226 SET_VREG %eax, rINST # fp[A] <- value
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006227 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
6228
6229
6230/* ------------------------------ */
6231 .balign 128
6232.L_op_iget_short_quick: /* 0xf2 */
6233/* File: x86/op_iget_short_quick.S */
6234/* File: x86/op_iget_quick.S */
6235 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6236 /* op vA, vB, offset@CCCC */
6237 movzbl rINSTbl, %ecx # ecx <- BA
6238 sarl $4, %ecx # ecx <- B
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006239 GET_VREG %ecx, %ecx # vB (object we're operating on)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006240 movzwl 2(rPC), %eax # eax <- field byte offset
6241 testl %ecx, %ecx # is object null?
6242 je common_errNullObject
6243 movswl (%ecx,%eax,1), %eax
6244 andb $0xf,rINSTbl # rINST <- A
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006245 SET_VREG %eax, rINST # fp[A] <- value
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006246 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
6247
6248
6249/* ------------------------------ */
6250 .balign 128
6251.L_op_invoke_lambda: /* 0xf3 */
6252/* Transfer stub to alternate interpreter */
6253 jmp MterpFallback
6254
6255
6256/* ------------------------------ */
6257 .balign 128
6258.L_op_unused_f4: /* 0xf4 */
6259/* File: x86/op_unused_f4.S */
6260/* File: x86/unused.S */
6261/*
6262 * Bail to reference interpreter to throw.
6263 */
6264 jmp MterpFallback
6265
6266
6267/* ------------------------------ */
6268 .balign 128
6269.L_op_capture_variable: /* 0xf5 */
6270/* Transfer stub to alternate interpreter */
6271 jmp MterpFallback
6272
6273
6274/* ------------------------------ */
6275 .balign 128
6276.L_op_create_lambda: /* 0xf6 */
6277/* Transfer stub to alternate interpreter */
6278 jmp MterpFallback
6279
6280
6281/* ------------------------------ */
6282 .balign 128
6283.L_op_liberate_variable: /* 0xf7 */
6284/* Transfer stub to alternate interpreter */
6285 jmp MterpFallback
6286
6287
6288/* ------------------------------ */
6289 .balign 128
6290.L_op_box_lambda: /* 0xf8 */
6291/* Transfer stub to alternate interpreter */
6292 jmp MterpFallback
6293
6294
6295/* ------------------------------ */
6296 .balign 128
6297.L_op_unbox_lambda: /* 0xf9 */
6298/* Transfer stub to alternate interpreter */
6299 jmp MterpFallback
6300
6301
6302/* ------------------------------ */
6303 .balign 128
6304.L_op_unused_fa: /* 0xfa */
6305/* File: x86/op_unused_fa.S */
6306/* File: x86/unused.S */
6307/*
6308 * Bail to reference interpreter to throw.
6309 */
6310 jmp MterpFallback
6311
6312
6313/* ------------------------------ */
6314 .balign 128
6315.L_op_unused_fb: /* 0xfb */
6316/* File: x86/op_unused_fb.S */
6317/* File: x86/unused.S */
6318/*
6319 * Bail to reference interpreter to throw.
6320 */
6321 jmp MterpFallback
6322
6323
6324/* ------------------------------ */
6325 .balign 128
6326.L_op_unused_fc: /* 0xfc */
6327/* File: x86/op_unused_fc.S */
6328/* File: x86/unused.S */
6329/*
6330 * Bail to reference interpreter to throw.
6331 */
6332 jmp MterpFallback
6333
6334
6335/* ------------------------------ */
6336 .balign 128
6337.L_op_unused_fd: /* 0xfd */
6338/* File: x86/op_unused_fd.S */
6339/* File: x86/unused.S */
6340/*
6341 * Bail to reference interpreter to throw.
6342 */
6343 jmp MterpFallback
6344
6345
6346/* ------------------------------ */
6347 .balign 128
6348.L_op_unused_fe: /* 0xfe */
6349/* File: x86/op_unused_fe.S */
6350/* File: x86/unused.S */
6351/*
6352 * Bail to reference interpreter to throw.
6353 */
6354 jmp MterpFallback
6355
6356
6357/* ------------------------------ */
6358 .balign 128
6359.L_op_unused_ff: /* 0xff */
6360/* File: x86/op_unused_ff.S */
6361/* File: x86/unused.S */
6362/*
6363 * Bail to reference interpreter to throw.
6364 */
6365 jmp MterpFallback
6366
6367
6368 .balign 128
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006369 SIZE(SYMBOL(artMterpAsmInstructionStart),SYMBOL(artMterpAsmInstructionStart))
6370 .global SYMBOL(artMterpAsmInstructionEnd)
6371SYMBOL(artMterpAsmInstructionEnd):
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006372
6373/*
6374 * ===========================================================================
6375 * Sister implementations
6376 * ===========================================================================
6377 */
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006378 .global SYMBOL(artMterpAsmSisterStart)
6379 FUNCTION_TYPE(SYMBOL(artMterpAsmSisterStart))
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006380 .text
6381 .balign 4
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006382SYMBOL(artMterpAsmSisterStart):
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006383
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006384 SIZE(SYMBOL(artMterpAsmSisterStart),SYMBOL(artMterpAsmSisterStart))
6385 .global SYMBOL(artMterpAsmSisterEnd)
6386SYMBOL(artMterpAsmSisterEnd):
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006387
6388
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006389 .global SYMBOL(artMterpAsmAltInstructionStart)
6390 FUNCTION_TYPE(SYMBOL(artMterpAsmAltInstructionStart))
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006391 .text
6392
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006393SYMBOL(artMterpAsmAltInstructionStart) = .L_ALT_op_nop
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006394/* ------------------------------ */
6395 .balign 128
6396.L_ALT_op_nop: /* 0x00 */
6397/* File: x86/alt_stub.S */
6398/*
6399 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6400 * any interesting requests and then jump to the real instruction
6401 * handler. Unlike the Arm handler, we can't do this as a tail call
6402 * because rIBASE is caller save and we need to reload it.
6403 *
6404 * Note that unlike in the Arm implementation, we should never arrive
6405 * here with a zero breakFlag because we always refresh rIBASE on
6406 * return.
6407 */
6408 .extern MterpCheckBefore
6409 EXPORT_PC
6410
6411 movl rSELF, %ecx
6412 movl %ecx, OUT_ARG0(%esp)
6413 leal OFF_FP_SHADOWFRAME(rFP), %eax
6414 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006415 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006416 REFRESH_IBASE
6417 jmp .L_op_nop+(0*128)
6418
6419/* ------------------------------ */
6420 .balign 128
6421.L_ALT_op_move: /* 0x01 */
6422/* File: x86/alt_stub.S */
6423/*
6424 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6425 * any interesting requests and then jump to the real instruction
6426 * handler. Unlike the Arm handler, we can't do this as a tail call
6427 * because rIBASE is caller save and we need to reload it.
6428 *
6429 * Note that unlike in the Arm implementation, we should never arrive
6430 * here with a zero breakFlag because we always refresh rIBASE on
6431 * return.
6432 */
6433 .extern MterpCheckBefore
6434 EXPORT_PC
6435
6436 movl rSELF, %ecx
6437 movl %ecx, OUT_ARG0(%esp)
6438 leal OFF_FP_SHADOWFRAME(rFP), %eax
6439 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006440 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006441 REFRESH_IBASE
6442 jmp .L_op_nop+(1*128)
6443
6444/* ------------------------------ */
6445 .balign 128
6446.L_ALT_op_move_from16: /* 0x02 */
6447/* File: x86/alt_stub.S */
6448/*
6449 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6450 * any interesting requests and then jump to the real instruction
6451 * handler. Unlike the Arm handler, we can't do this as a tail call
6452 * because rIBASE is caller save and we need to reload it.
6453 *
6454 * Note that unlike in the Arm implementation, we should never arrive
6455 * here with a zero breakFlag because we always refresh rIBASE on
6456 * return.
6457 */
6458 .extern MterpCheckBefore
6459 EXPORT_PC
6460
6461 movl rSELF, %ecx
6462 movl %ecx, OUT_ARG0(%esp)
6463 leal OFF_FP_SHADOWFRAME(rFP), %eax
6464 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006465 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006466 REFRESH_IBASE
6467 jmp .L_op_nop+(2*128)
6468
6469/* ------------------------------ */
6470 .balign 128
6471.L_ALT_op_move_16: /* 0x03 */
6472/* File: x86/alt_stub.S */
6473/*
6474 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6475 * any interesting requests and then jump to the real instruction
6476 * handler. Unlike the Arm handler, we can't do this as a tail call
6477 * because rIBASE is caller save and we need to reload it.
6478 *
6479 * Note that unlike in the Arm implementation, we should never arrive
6480 * here with a zero breakFlag because we always refresh rIBASE on
6481 * return.
6482 */
6483 .extern MterpCheckBefore
6484 EXPORT_PC
6485
6486 movl rSELF, %ecx
6487 movl %ecx, OUT_ARG0(%esp)
6488 leal OFF_FP_SHADOWFRAME(rFP), %eax
6489 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006490 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006491 REFRESH_IBASE
6492 jmp .L_op_nop+(3*128)
6493
6494/* ------------------------------ */
6495 .balign 128
6496.L_ALT_op_move_wide: /* 0x04 */
6497/* File: x86/alt_stub.S */
6498/*
6499 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6500 * any interesting requests and then jump to the real instruction
6501 * handler. Unlike the Arm handler, we can't do this as a tail call
6502 * because rIBASE is caller save and we need to reload it.
6503 *
6504 * Note that unlike in the Arm implementation, we should never arrive
6505 * here with a zero breakFlag because we always refresh rIBASE on
6506 * return.
6507 */
6508 .extern MterpCheckBefore
6509 EXPORT_PC
6510
6511 movl rSELF, %ecx
6512 movl %ecx, OUT_ARG0(%esp)
6513 leal OFF_FP_SHADOWFRAME(rFP), %eax
6514 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006515 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006516 REFRESH_IBASE
6517 jmp .L_op_nop+(4*128)
6518
6519/* ------------------------------ */
6520 .balign 128
6521.L_ALT_op_move_wide_from16: /* 0x05 */
6522/* File: x86/alt_stub.S */
6523/*
6524 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6525 * any interesting requests and then jump to the real instruction
6526 * handler. Unlike the Arm handler, we can't do this as a tail call
6527 * because rIBASE is caller save and we need to reload it.
6528 *
6529 * Note that unlike in the Arm implementation, we should never arrive
6530 * here with a zero breakFlag because we always refresh rIBASE on
6531 * return.
6532 */
6533 .extern MterpCheckBefore
6534 EXPORT_PC
6535
6536 movl rSELF, %ecx
6537 movl %ecx, OUT_ARG0(%esp)
6538 leal OFF_FP_SHADOWFRAME(rFP), %eax
6539 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006540 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006541 REFRESH_IBASE
6542 jmp .L_op_nop+(5*128)
6543
6544/* ------------------------------ */
6545 .balign 128
6546.L_ALT_op_move_wide_16: /* 0x06 */
6547/* File: x86/alt_stub.S */
6548/*
6549 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6550 * any interesting requests and then jump to the real instruction
6551 * handler. Unlike the Arm handler, we can't do this as a tail call
6552 * because rIBASE is caller save and we need to reload it.
6553 *
6554 * Note that unlike in the Arm implementation, we should never arrive
6555 * here with a zero breakFlag because we always refresh rIBASE on
6556 * return.
6557 */
6558 .extern MterpCheckBefore
6559 EXPORT_PC
6560
6561 movl rSELF, %ecx
6562 movl %ecx, OUT_ARG0(%esp)
6563 leal OFF_FP_SHADOWFRAME(rFP), %eax
6564 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006565 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006566 REFRESH_IBASE
6567 jmp .L_op_nop+(6*128)
6568
6569/* ------------------------------ */
6570 .balign 128
6571.L_ALT_op_move_object: /* 0x07 */
6572/* File: x86/alt_stub.S */
6573/*
6574 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6575 * any interesting requests and then jump to the real instruction
6576 * handler. Unlike the Arm handler, we can't do this as a tail call
6577 * because rIBASE is caller save and we need to reload it.
6578 *
6579 * Note that unlike in the Arm implementation, we should never arrive
6580 * here with a zero breakFlag because we always refresh rIBASE on
6581 * return.
6582 */
6583 .extern MterpCheckBefore
6584 EXPORT_PC
6585
6586 movl rSELF, %ecx
6587 movl %ecx, OUT_ARG0(%esp)
6588 leal OFF_FP_SHADOWFRAME(rFP), %eax
6589 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006590 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006591 REFRESH_IBASE
6592 jmp .L_op_nop+(7*128)
6593
6594/* ------------------------------ */
6595 .balign 128
6596.L_ALT_op_move_object_from16: /* 0x08 */
6597/* File: x86/alt_stub.S */
6598/*
6599 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6600 * any interesting requests and then jump to the real instruction
6601 * handler. Unlike the Arm handler, we can't do this as a tail call
6602 * because rIBASE is caller save and we need to reload it.
6603 *
6604 * Note that unlike in the Arm implementation, we should never arrive
6605 * here with a zero breakFlag because we always refresh rIBASE on
6606 * return.
6607 */
6608 .extern MterpCheckBefore
6609 EXPORT_PC
6610
6611 movl rSELF, %ecx
6612 movl %ecx, OUT_ARG0(%esp)
6613 leal OFF_FP_SHADOWFRAME(rFP), %eax
6614 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006615 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006616 REFRESH_IBASE
6617 jmp .L_op_nop+(8*128)
6618
6619/* ------------------------------ */
6620 .balign 128
6621.L_ALT_op_move_object_16: /* 0x09 */
6622/* File: x86/alt_stub.S */
6623/*
6624 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6625 * any interesting requests and then jump to the real instruction
6626 * handler. Unlike the Arm handler, we can't do this as a tail call
6627 * because rIBASE is caller save and we need to reload it.
6628 *
6629 * Note that unlike in the Arm implementation, we should never arrive
6630 * here with a zero breakFlag because we always refresh rIBASE on
6631 * return.
6632 */
6633 .extern MterpCheckBefore
6634 EXPORT_PC
6635
6636 movl rSELF, %ecx
6637 movl %ecx, OUT_ARG0(%esp)
6638 leal OFF_FP_SHADOWFRAME(rFP), %eax
6639 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006640 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006641 REFRESH_IBASE
6642 jmp .L_op_nop+(9*128)
6643
6644/* ------------------------------ */
6645 .balign 128
6646.L_ALT_op_move_result: /* 0x0a */
6647/* File: x86/alt_stub.S */
6648/*
6649 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6650 * any interesting requests and then jump to the real instruction
6651 * handler. Unlike the Arm handler, we can't do this as a tail call
6652 * because rIBASE is caller save and we need to reload it.
6653 *
6654 * Note that unlike in the Arm implementation, we should never arrive
6655 * here with a zero breakFlag because we always refresh rIBASE on
6656 * return.
6657 */
6658 .extern MterpCheckBefore
6659 EXPORT_PC
6660
6661 movl rSELF, %ecx
6662 movl %ecx, OUT_ARG0(%esp)
6663 leal OFF_FP_SHADOWFRAME(rFP), %eax
6664 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006665 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006666 REFRESH_IBASE
6667 jmp .L_op_nop+(10*128)
6668
6669/* ------------------------------ */
6670 .balign 128
6671.L_ALT_op_move_result_wide: /* 0x0b */
6672/* File: x86/alt_stub.S */
6673/*
6674 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6675 * any interesting requests and then jump to the real instruction
6676 * handler. Unlike the Arm handler, we can't do this as a tail call
6677 * because rIBASE is caller save and we need to reload it.
6678 *
6679 * Note that unlike in the Arm implementation, we should never arrive
6680 * here with a zero breakFlag because we always refresh rIBASE on
6681 * return.
6682 */
6683 .extern MterpCheckBefore
6684 EXPORT_PC
6685
6686 movl rSELF, %ecx
6687 movl %ecx, OUT_ARG0(%esp)
6688 leal OFF_FP_SHADOWFRAME(rFP), %eax
6689 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006690 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006691 REFRESH_IBASE
6692 jmp .L_op_nop+(11*128)
6693
6694/* ------------------------------ */
6695 .balign 128
6696.L_ALT_op_move_result_object: /* 0x0c */
6697/* File: x86/alt_stub.S */
6698/*
6699 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6700 * any interesting requests and then jump to the real instruction
6701 * handler. Unlike the Arm handler, we can't do this as a tail call
6702 * because rIBASE is caller save and we need to reload it.
6703 *
6704 * Note that unlike in the Arm implementation, we should never arrive
6705 * here with a zero breakFlag because we always refresh rIBASE on
6706 * return.
6707 */
6708 .extern MterpCheckBefore
6709 EXPORT_PC
6710
6711 movl rSELF, %ecx
6712 movl %ecx, OUT_ARG0(%esp)
6713 leal OFF_FP_SHADOWFRAME(rFP), %eax
6714 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006715 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006716 REFRESH_IBASE
6717 jmp .L_op_nop+(12*128)
6718
6719/* ------------------------------ */
6720 .balign 128
6721.L_ALT_op_move_exception: /* 0x0d */
6722/* File: x86/alt_stub.S */
6723/*
6724 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6725 * any interesting requests and then jump to the real instruction
6726 * handler. Unlike the Arm handler, we can't do this as a tail call
6727 * because rIBASE is caller save and we need to reload it.
6728 *
6729 * Note that unlike in the Arm implementation, we should never arrive
6730 * here with a zero breakFlag because we always refresh rIBASE on
6731 * return.
6732 */
6733 .extern MterpCheckBefore
6734 EXPORT_PC
6735
6736 movl rSELF, %ecx
6737 movl %ecx, OUT_ARG0(%esp)
6738 leal OFF_FP_SHADOWFRAME(rFP), %eax
6739 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006740 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006741 REFRESH_IBASE
6742 jmp .L_op_nop+(13*128)
6743
6744/* ------------------------------ */
6745 .balign 128
6746.L_ALT_op_return_void: /* 0x0e */
6747/* File: x86/alt_stub.S */
6748/*
6749 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6750 * any interesting requests and then jump to the real instruction
6751 * handler. Unlike the Arm handler, we can't do this as a tail call
6752 * because rIBASE is caller save and we need to reload it.
6753 *
6754 * Note that unlike in the Arm implementation, we should never arrive
6755 * here with a zero breakFlag because we always refresh rIBASE on
6756 * return.
6757 */
6758 .extern MterpCheckBefore
6759 EXPORT_PC
6760
6761 movl rSELF, %ecx
6762 movl %ecx, OUT_ARG0(%esp)
6763 leal OFF_FP_SHADOWFRAME(rFP), %eax
6764 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006765 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006766 REFRESH_IBASE
6767 jmp .L_op_nop+(14*128)
6768
6769/* ------------------------------ */
6770 .balign 128
6771.L_ALT_op_return: /* 0x0f */
6772/* File: x86/alt_stub.S */
6773/*
6774 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6775 * any interesting requests and then jump to the real instruction
6776 * handler. Unlike the Arm handler, we can't do this as a tail call
6777 * because rIBASE is caller save and we need to reload it.
6778 *
6779 * Note that unlike in the Arm implementation, we should never arrive
6780 * here with a zero breakFlag because we always refresh rIBASE on
6781 * return.
6782 */
6783 .extern MterpCheckBefore
6784 EXPORT_PC
6785
6786 movl rSELF, %ecx
6787 movl %ecx, OUT_ARG0(%esp)
6788 leal OFF_FP_SHADOWFRAME(rFP), %eax
6789 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006790 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006791 REFRESH_IBASE
6792 jmp .L_op_nop+(15*128)
6793
6794/* ------------------------------ */
6795 .balign 128
6796.L_ALT_op_return_wide: /* 0x10 */
6797/* File: x86/alt_stub.S */
6798/*
6799 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6800 * any interesting requests and then jump to the real instruction
6801 * handler. Unlike the Arm handler, we can't do this as a tail call
6802 * because rIBASE is caller save and we need to reload it.
6803 *
6804 * Note that unlike in the Arm implementation, we should never arrive
6805 * here with a zero breakFlag because we always refresh rIBASE on
6806 * return.
6807 */
6808 .extern MterpCheckBefore
6809 EXPORT_PC
6810
6811 movl rSELF, %ecx
6812 movl %ecx, OUT_ARG0(%esp)
6813 leal OFF_FP_SHADOWFRAME(rFP), %eax
6814 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006815 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006816 REFRESH_IBASE
6817 jmp .L_op_nop+(16*128)
6818
6819/* ------------------------------ */
6820 .balign 128
6821.L_ALT_op_return_object: /* 0x11 */
6822/* File: x86/alt_stub.S */
6823/*
6824 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6825 * any interesting requests and then jump to the real instruction
6826 * handler. Unlike the Arm handler, we can't do this as a tail call
6827 * because rIBASE is caller save and we need to reload it.
6828 *
6829 * Note that unlike in the Arm implementation, we should never arrive
6830 * here with a zero breakFlag because we always refresh rIBASE on
6831 * return.
6832 */
6833 .extern MterpCheckBefore
6834 EXPORT_PC
6835
6836 movl rSELF, %ecx
6837 movl %ecx, OUT_ARG0(%esp)
6838 leal OFF_FP_SHADOWFRAME(rFP), %eax
6839 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006840 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006841 REFRESH_IBASE
6842 jmp .L_op_nop+(17*128)
6843
6844/* ------------------------------ */
6845 .balign 128
6846.L_ALT_op_const_4: /* 0x12 */
6847/* File: x86/alt_stub.S */
6848/*
6849 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6850 * any interesting requests and then jump to the real instruction
6851 * handler. Unlike the Arm handler, we can't do this as a tail call
6852 * because rIBASE is caller save and we need to reload it.
6853 *
6854 * Note that unlike in the Arm implementation, we should never arrive
6855 * here with a zero breakFlag because we always refresh rIBASE on
6856 * return.
6857 */
6858 .extern MterpCheckBefore
6859 EXPORT_PC
6860
6861 movl rSELF, %ecx
6862 movl %ecx, OUT_ARG0(%esp)
6863 leal OFF_FP_SHADOWFRAME(rFP), %eax
6864 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006865 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006866 REFRESH_IBASE
6867 jmp .L_op_nop+(18*128)
6868
6869/* ------------------------------ */
6870 .balign 128
6871.L_ALT_op_const_16: /* 0x13 */
6872/* File: x86/alt_stub.S */
6873/*
6874 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6875 * any interesting requests and then jump to the real instruction
6876 * handler. Unlike the Arm handler, we can't do this as a tail call
6877 * because rIBASE is caller save and we need to reload it.
6878 *
6879 * Note that unlike in the Arm implementation, we should never arrive
6880 * here with a zero breakFlag because we always refresh rIBASE on
6881 * return.
6882 */
6883 .extern MterpCheckBefore
6884 EXPORT_PC
6885
6886 movl rSELF, %ecx
6887 movl %ecx, OUT_ARG0(%esp)
6888 leal OFF_FP_SHADOWFRAME(rFP), %eax
6889 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006890 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006891 REFRESH_IBASE
6892 jmp .L_op_nop+(19*128)
6893
6894/* ------------------------------ */
6895 .balign 128
6896.L_ALT_op_const: /* 0x14 */
6897/* File: x86/alt_stub.S */
6898/*
6899 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6900 * any interesting requests and then jump to the real instruction
6901 * handler. Unlike the Arm handler, we can't do this as a tail call
6902 * because rIBASE is caller save and we need to reload it.
6903 *
6904 * Note that unlike in the Arm implementation, we should never arrive
6905 * here with a zero breakFlag because we always refresh rIBASE on
6906 * return.
6907 */
6908 .extern MterpCheckBefore
6909 EXPORT_PC
6910
6911 movl rSELF, %ecx
6912 movl %ecx, OUT_ARG0(%esp)
6913 leal OFF_FP_SHADOWFRAME(rFP), %eax
6914 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006915 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006916 REFRESH_IBASE
6917 jmp .L_op_nop+(20*128)
6918
6919/* ------------------------------ */
6920 .balign 128
6921.L_ALT_op_const_high16: /* 0x15 */
6922/* File: x86/alt_stub.S */
6923/*
6924 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6925 * any interesting requests and then jump to the real instruction
6926 * handler. Unlike the Arm handler, we can't do this as a tail call
6927 * because rIBASE is caller save and we need to reload it.
6928 *
6929 * Note that unlike in the Arm implementation, we should never arrive
6930 * here with a zero breakFlag because we always refresh rIBASE on
6931 * return.
6932 */
6933 .extern MterpCheckBefore
6934 EXPORT_PC
6935
6936 movl rSELF, %ecx
6937 movl %ecx, OUT_ARG0(%esp)
6938 leal OFF_FP_SHADOWFRAME(rFP), %eax
6939 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006940 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006941 REFRESH_IBASE
6942 jmp .L_op_nop+(21*128)
6943
6944/* ------------------------------ */
6945 .balign 128
6946.L_ALT_op_const_wide_16: /* 0x16 */
6947/* File: x86/alt_stub.S */
6948/*
6949 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6950 * any interesting requests and then jump to the real instruction
6951 * handler. Unlike the Arm handler, we can't do this as a tail call
6952 * because rIBASE is caller save and we need to reload it.
6953 *
6954 * Note that unlike in the Arm implementation, we should never arrive
6955 * here with a zero breakFlag because we always refresh rIBASE on
6956 * return.
6957 */
6958 .extern MterpCheckBefore
6959 EXPORT_PC
6960
6961 movl rSELF, %ecx
6962 movl %ecx, OUT_ARG0(%esp)
6963 leal OFF_FP_SHADOWFRAME(rFP), %eax
6964 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006965 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006966 REFRESH_IBASE
6967 jmp .L_op_nop+(22*128)
6968
6969/* ------------------------------ */
6970 .balign 128
6971.L_ALT_op_const_wide_32: /* 0x17 */
6972/* File: x86/alt_stub.S */
6973/*
6974 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6975 * any interesting requests and then jump to the real instruction
6976 * handler. Unlike the Arm handler, we can't do this as a tail call
6977 * because rIBASE is caller save and we need to reload it.
6978 *
6979 * Note that unlike in the Arm implementation, we should never arrive
6980 * here with a zero breakFlag because we always refresh rIBASE on
6981 * return.
6982 */
6983 .extern MterpCheckBefore
6984 EXPORT_PC
6985
6986 movl rSELF, %ecx
6987 movl %ecx, OUT_ARG0(%esp)
6988 leal OFF_FP_SHADOWFRAME(rFP), %eax
6989 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06006990 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00006991 REFRESH_IBASE
6992 jmp .L_op_nop+(23*128)
6993
6994/* ------------------------------ */
6995 .balign 128
6996.L_ALT_op_const_wide: /* 0x18 */
6997/* File: x86/alt_stub.S */
6998/*
6999 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7000 * any interesting requests and then jump to the real instruction
7001 * handler. Unlike the Arm handler, we can't do this as a tail call
7002 * because rIBASE is caller save and we need to reload it.
7003 *
7004 * Note that unlike in the Arm implementation, we should never arrive
7005 * here with a zero breakFlag because we always refresh rIBASE on
7006 * return.
7007 */
7008 .extern MterpCheckBefore
7009 EXPORT_PC
7010
7011 movl rSELF, %ecx
7012 movl %ecx, OUT_ARG0(%esp)
7013 leal OFF_FP_SHADOWFRAME(rFP), %eax
7014 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06007015 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00007016 REFRESH_IBASE
7017 jmp .L_op_nop+(24*128)
7018
7019/* ------------------------------ */
7020 .balign 128
7021.L_ALT_op_const_wide_high16: /* 0x19 */
7022/* File: x86/alt_stub.S */
7023/*
7024 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7025 * any interesting requests and then jump to the real instruction
7026 * handler. Unlike the Arm handler, we can't do this as a tail call
7027 * because rIBASE is caller save and we need to reload it.
7028 *
7029 * Note that unlike in the Arm implementation, we should never arrive
7030 * here with a zero breakFlag because we always refresh rIBASE on
7031 * return.
7032 */
7033 .extern MterpCheckBefore
7034 EXPORT_PC
7035
7036 movl rSELF, %ecx
7037 movl %ecx, OUT_ARG0(%esp)
7038 leal OFF_FP_SHADOWFRAME(rFP), %eax
7039 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06007040 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00007041 REFRESH_IBASE
7042 jmp .L_op_nop+(25*128)
7043
7044/* ------------------------------ */
7045 .balign 128
7046.L_ALT_op_const_string: /* 0x1a */
7047/* File: x86/alt_stub.S */
7048/*
7049 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7050 * any interesting requests and then jump to the real instruction
7051 * handler. Unlike the Arm handler, we can't do this as a tail call
7052 * because rIBASE is caller save and we need to reload it.
7053 *
7054 * Note that unlike in the Arm implementation, we should never arrive
7055 * here with a zero breakFlag because we always refresh rIBASE on
7056 * return.
7057 */
7058 .extern MterpCheckBefore
7059 EXPORT_PC
7060
7061 movl rSELF, %ecx
7062 movl %ecx, OUT_ARG0(%esp)
7063 leal OFF_FP_SHADOWFRAME(rFP), %eax
7064 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06007065 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00007066 REFRESH_IBASE
7067 jmp .L_op_nop+(26*128)
7068
7069/* ------------------------------ */
7070 .balign 128
7071.L_ALT_op_const_string_jumbo: /* 0x1b */
7072/* File: x86/alt_stub.S */
7073/*
7074 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7075 * any interesting requests and then jump to the real instruction
7076 * handler. Unlike the Arm handler, we can't do this as a tail call
7077 * because rIBASE is caller save and we need to reload it.
7078 *
7079 * Note that unlike in the Arm implementation, we should never arrive
7080 * here with a zero breakFlag because we always refresh rIBASE on
7081 * return.
7082 */
7083 .extern MterpCheckBefore
7084 EXPORT_PC
7085
7086 movl rSELF, %ecx
7087 movl %ecx, OUT_ARG0(%esp)
7088 leal OFF_FP_SHADOWFRAME(rFP), %eax
7089 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06007090 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00007091 REFRESH_IBASE
7092 jmp .L_op_nop+(27*128)
7093
7094/* ------------------------------ */
7095 .balign 128
7096.L_ALT_op_const_class: /* 0x1c */
7097/* File: x86/alt_stub.S */
7098/*
7099 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7100 * any interesting requests and then jump to the real instruction
7101 * handler. Unlike the Arm handler, we can't do this as a tail call
7102 * because rIBASE is caller save and we need to reload it.
7103 *
7104 * Note that unlike in the Arm implementation, we should never arrive
7105 * here with a zero breakFlag because we always refresh rIBASE on
7106 * return.
7107 */
7108 .extern MterpCheckBefore
7109 EXPORT_PC
7110
7111 movl rSELF, %ecx
7112 movl %ecx, OUT_ARG0(%esp)
7113 leal OFF_FP_SHADOWFRAME(rFP), %eax
7114 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06007115 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00007116 REFRESH_IBASE
7117 jmp .L_op_nop+(28*128)
7118
7119/* ------------------------------ */
7120 .balign 128
7121.L_ALT_op_monitor_enter: /* 0x1d */
7122/* File: x86/alt_stub.S */
7123/*
7124 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7125 * any interesting requests and then jump to the real instruction
7126 * handler. Unlike the Arm handler, we can't do this as a tail call
7127 * because rIBASE is caller save and we need to reload it.
7128 *
7129 * Note that unlike in the Arm implementation, we should never arrive
7130 * here with a zero breakFlag because we always refresh rIBASE on
7131 * return.
7132 */
7133 .extern MterpCheckBefore
7134 EXPORT_PC
7135
7136 movl rSELF, %ecx
7137 movl %ecx, OUT_ARG0(%esp)
7138 leal OFF_FP_SHADOWFRAME(rFP), %eax
7139 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06007140 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00007141 REFRESH_IBASE
7142 jmp .L_op_nop+(29*128)
7143
7144/* ------------------------------ */
7145 .balign 128
7146.L_ALT_op_monitor_exit: /* 0x1e */
7147/* File: x86/alt_stub.S */
7148/*
7149 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7150 * any interesting requests and then jump to the real instruction
7151 * handler. Unlike the Arm handler, we can't do this as a tail call
7152 * because rIBASE is caller save and we need to reload it.
7153 *
7154 * Note that unlike in the Arm implementation, we should never arrive
7155 * here with a zero breakFlag because we always refresh rIBASE on
7156 * return.
7157 */
7158 .extern MterpCheckBefore
7159 EXPORT_PC
7160
7161 movl rSELF, %ecx
7162 movl %ecx, OUT_ARG0(%esp)
7163 leal OFF_FP_SHADOWFRAME(rFP), %eax
7164 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06007165 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00007166 REFRESH_IBASE
7167 jmp .L_op_nop+(30*128)
7168
7169/* ------------------------------ */
7170 .balign 128
7171.L_ALT_op_check_cast: /* 0x1f */
7172/* File: x86/alt_stub.S */
7173/*
7174 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7175 * any interesting requests and then jump to the real instruction
7176 * handler. Unlike the Arm handler, we can't do this as a tail call
7177 * because rIBASE is caller save and we need to reload it.
7178 *
7179 * Note that unlike in the Arm implementation, we should never arrive
7180 * here with a zero breakFlag because we always refresh rIBASE on
7181 * return.
7182 */
7183 .extern MterpCheckBefore
7184 EXPORT_PC
7185
7186 movl rSELF, %ecx
7187 movl %ecx, OUT_ARG0(%esp)
7188 leal OFF_FP_SHADOWFRAME(rFP), %eax
7189 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06007190 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00007191 REFRESH_IBASE
7192 jmp .L_op_nop+(31*128)
7193
7194/* ------------------------------ */
7195 .balign 128
7196.L_ALT_op_instance_of: /* 0x20 */
7197/* File: x86/alt_stub.S */
7198/*
7199 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7200 * any interesting requests and then jump to the real instruction
7201 * handler. Unlike the Arm handler, we can't do this as a tail call
7202 * because rIBASE is caller save and we need to reload it.
7203 *
7204 * Note that unlike in the Arm implementation, we should never arrive
7205 * here with a zero breakFlag because we always refresh rIBASE on
7206 * return.
7207 */
7208 .extern MterpCheckBefore
7209 EXPORT_PC
7210
7211 movl rSELF, %ecx
7212 movl %ecx, OUT_ARG0(%esp)
7213 leal OFF_FP_SHADOWFRAME(rFP), %eax
7214 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06007215 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00007216 REFRESH_IBASE
7217 jmp .L_op_nop+(32*128)
7218
7219/* ------------------------------ */
7220 .balign 128
7221.L_ALT_op_array_length: /* 0x21 */
7222/* File: x86/alt_stub.S */
7223/*
7224 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7225 * any interesting requests and then jump to the real instruction
7226 * handler. Unlike the Arm handler, we can't do this as a tail call
7227 * because rIBASE is caller save and we need to reload it.
7228 *
7229 * Note that unlike in the Arm implementation, we should never arrive
7230 * here with a zero breakFlag because we always refresh rIBASE on
7231 * return.
7232 */
7233 .extern MterpCheckBefore
7234 EXPORT_PC
7235
7236 movl rSELF, %ecx
7237 movl %ecx, OUT_ARG0(%esp)
7238 leal OFF_FP_SHADOWFRAME(rFP), %eax
7239 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06007240 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00007241 REFRESH_IBASE
7242 jmp .L_op_nop+(33*128)
7243
7244/* ------------------------------ */
7245 .balign 128
7246.L_ALT_op_new_instance: /* 0x22 */
7247/* File: x86/alt_stub.S */
7248/*
7249 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7250 * any interesting requests and then jump to the real instruction
7251 * handler. Unlike the Arm handler, we can't do this as a tail call
7252 * because rIBASE is caller save and we need to reload it.
7253 *
7254 * Note that unlike in the Arm implementation, we should never arrive
7255 * here with a zero breakFlag because we always refresh rIBASE on
7256 * return.
7257 */
7258 .extern MterpCheckBefore
7259 EXPORT_PC
7260
7261 movl rSELF, %ecx
7262 movl %ecx, OUT_ARG0(%esp)
7263 leal OFF_FP_SHADOWFRAME(rFP), %eax
7264 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06007265 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00007266 REFRESH_IBASE
7267 jmp .L_op_nop+(34*128)
7268
7269/* ------------------------------ */
7270 .balign 128
7271.L_ALT_op_new_array: /* 0x23 */
7272/* File: x86/alt_stub.S */
7273/*
7274 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7275 * any interesting requests and then jump to the real instruction
7276 * handler. Unlike the Arm handler, we can't do this as a tail call
7277 * because rIBASE is caller save and we need to reload it.
7278 *
7279 * Note that unlike in the Arm implementation, we should never arrive
7280 * here with a zero breakFlag because we always refresh rIBASE on
7281 * return.
7282 */
7283 .extern MterpCheckBefore
7284 EXPORT_PC
7285
7286 movl rSELF, %ecx
7287 movl %ecx, OUT_ARG0(%esp)
7288 leal OFF_FP_SHADOWFRAME(rFP), %eax
7289 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06007290 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00007291 REFRESH_IBASE
7292 jmp .L_op_nop+(35*128)
7293
7294/* ------------------------------ */
7295 .balign 128
7296.L_ALT_op_filled_new_array: /* 0x24 */
7297/* File: x86/alt_stub.S */
7298/*
7299 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7300 * any interesting requests and then jump to the real instruction
7301 * handler. Unlike the Arm handler, we can't do this as a tail call
7302 * because rIBASE is caller save and we need to reload it.
7303 *
7304 * Note that unlike in the Arm implementation, we should never arrive
7305 * here with a zero breakFlag because we always refresh rIBASE on
7306 * return.
7307 */
7308 .extern MterpCheckBefore
7309 EXPORT_PC
7310
7311 movl rSELF, %ecx
7312 movl %ecx, OUT_ARG0(%esp)
7313 leal OFF_FP_SHADOWFRAME(rFP), %eax
7314 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06007315 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00007316 REFRESH_IBASE
7317 jmp .L_op_nop+(36*128)
7318
7319/* ------------------------------ */
7320 .balign 128
7321.L_ALT_op_filled_new_array_range: /* 0x25 */
7322/* File: x86/alt_stub.S */
7323/*
7324 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7325 * any interesting requests and then jump to the real instruction
7326 * handler. Unlike the Arm handler, we can't do this as a tail call
7327 * because rIBASE is caller save and we need to reload it.
7328 *
7329 * Note that unlike in the Arm implementation, we should never arrive
7330 * here with a zero breakFlag because we always refresh rIBASE on
7331 * return.
7332 */
7333 .extern MterpCheckBefore
7334 EXPORT_PC
7335
7336 movl rSELF, %ecx
7337 movl %ecx, OUT_ARG0(%esp)
7338 leal OFF_FP_SHADOWFRAME(rFP), %eax
7339 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06007340 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00007341 REFRESH_IBASE
7342 jmp .L_op_nop+(37*128)
7343
7344/* ------------------------------ */
7345 .balign 128
7346.L_ALT_op_fill_array_data: /* 0x26 */
7347/* File: x86/alt_stub.S */
7348/*
7349 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7350 * any interesting requests and then jump to the real instruction
7351 * handler. Unlike the Arm handler, we can't do this as a tail call
7352 * because rIBASE is caller save and we need to reload it.
7353 *
7354 * Note that unlike in the Arm implementation, we should never arrive
7355 * here with a zero breakFlag because we always refresh rIBASE on
7356 * return.
7357 */
7358 .extern MterpCheckBefore
7359 EXPORT_PC
7360
7361 movl rSELF, %ecx
7362 movl %ecx, OUT_ARG0(%esp)
7363 leal OFF_FP_SHADOWFRAME(rFP), %eax
7364 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06007365 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00007366 REFRESH_IBASE
7367 jmp .L_op_nop+(38*128)
7368
7369/* ------------------------------ */
7370 .balign 128
7371.L_ALT_op_throw: /* 0x27 */
7372/* File: x86/alt_stub.S */
7373/*
7374 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7375 * any interesting requests and then jump to the real instruction
7376 * handler. Unlike the Arm handler, we can't do this as a tail call
7377 * because rIBASE is caller save and we need to reload it.
7378 *
7379 * Note that unlike in the Arm implementation, we should never arrive
7380 * here with a zero breakFlag because we always refresh rIBASE on
7381 * return.
7382 */
7383 .extern MterpCheckBefore
7384 EXPORT_PC
7385
7386 movl rSELF, %ecx
7387 movl %ecx, OUT_ARG0(%esp)
7388 leal OFF_FP_SHADOWFRAME(rFP), %eax
7389 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06007390 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00007391 REFRESH_IBASE
7392 jmp .L_op_nop+(39*128)
7393
7394/* ------------------------------ */
7395 .balign 128
7396.L_ALT_op_goto: /* 0x28 */
7397/* File: x86/alt_stub.S */
7398/*
7399 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7400 * any interesting requests and then jump to the real instruction
7401 * handler. Unlike the Arm handler, we can't do this as a tail call
7402 * because rIBASE is caller save and we need to reload it.
7403 *
7404 * Note that unlike in the Arm implementation, we should never arrive
7405 * here with a zero breakFlag because we always refresh rIBASE on
7406 * return.
7407 */
7408 .extern MterpCheckBefore
7409 EXPORT_PC
7410
7411 movl rSELF, %ecx
7412 movl %ecx, OUT_ARG0(%esp)
7413 leal OFF_FP_SHADOWFRAME(rFP), %eax
7414 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06007415 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00007416 REFRESH_IBASE
7417 jmp .L_op_nop+(40*128)
7418
7419/* ------------------------------ */
7420 .balign 128
7421.L_ALT_op_goto_16: /* 0x29 */
7422/* File: x86/alt_stub.S */
7423/*
7424 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7425 * any interesting requests and then jump to the real instruction
7426 * handler. Unlike the Arm handler, we can't do this as a tail call
7427 * because rIBASE is caller save and we need to reload it.
7428 *
7429 * Note that unlike in the Arm implementation, we should never arrive
7430 * here with a zero breakFlag because we always refresh rIBASE on
7431 * return.
7432 */
7433 .extern MterpCheckBefore
7434 EXPORT_PC
7435
7436 movl rSELF, %ecx
7437 movl %ecx, OUT_ARG0(%esp)
7438 leal OFF_FP_SHADOWFRAME(rFP), %eax
7439 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06007440 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00007441 REFRESH_IBASE
7442 jmp .L_op_nop+(41*128)
7443
7444/* ------------------------------ */
7445 .balign 128
7446.L_ALT_op_goto_32: /* 0x2a */
7447/* File: x86/alt_stub.S */
7448/*
7449 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7450 * any interesting requests and then jump to the real instruction
7451 * handler. Unlike the Arm handler, we can't do this as a tail call
7452 * because rIBASE is caller save and we need to reload it.
7453 *
7454 * Note that unlike in the Arm implementation, we should never arrive
7455 * here with a zero breakFlag because we always refresh rIBASE on
7456 * return.
7457 */
7458 .extern MterpCheckBefore
7459 EXPORT_PC
7460
7461 movl rSELF, %ecx
7462 movl %ecx, OUT_ARG0(%esp)
7463 leal OFF_FP_SHADOWFRAME(rFP), %eax
7464 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06007465 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00007466 REFRESH_IBASE
7467 jmp .L_op_nop+(42*128)
7468
7469/* ------------------------------ */
7470 .balign 128
7471.L_ALT_op_packed_switch: /* 0x2b */
7472/* File: x86/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. Unlike the Arm handler, we can't do this as a tail call
7477 * because rIBASE is caller save and we need to reload it.
7478 *
7479 * Note that unlike in the Arm implementation, we should never arrive
7480 * here with a zero breakFlag because we always refresh rIBASE on
7481 * return.
7482 */
7483 .extern MterpCheckBefore
7484 EXPORT_PC
7485
7486 movl rSELF, %ecx
7487 movl %ecx, OUT_ARG0(%esp)
7488 leal OFF_FP_SHADOWFRAME(rFP), %eax
7489 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06007490 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00007491 REFRESH_IBASE
7492 jmp .L_op_nop+(43*128)
7493
7494/* ------------------------------ */
7495 .balign 128
7496.L_ALT_op_sparse_switch: /* 0x2c */
7497/* File: x86/alt_stub.S */
7498/*
7499 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7500 * any interesting requests and then jump to the real instruction
7501 * handler. Unlike the Arm handler, we can't do this as a tail call
7502 * because rIBASE is caller save and we need to reload it.
7503 *
7504 * Note that unlike in the Arm implementation, we should never arrive
7505 * here with a zero breakFlag because we always refresh rIBASE on
7506 * return.
7507 */
7508 .extern MterpCheckBefore
7509 EXPORT_PC
7510
7511 movl rSELF, %ecx
7512 movl %ecx, OUT_ARG0(%esp)
7513 leal OFF_FP_SHADOWFRAME(rFP), %eax
7514 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06007515 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00007516 REFRESH_IBASE
7517 jmp .L_op_nop+(44*128)
7518
7519/* ------------------------------ */
7520 .balign 128
7521.L_ALT_op_cmpl_float: /* 0x2d */
7522/* File: x86/alt_stub.S */
7523/*
7524 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7525 * any interesting requests and then jump to the real instruction
7526 * handler. Unlike the Arm handler, we can't do this as a tail call
7527 * because rIBASE is caller save and we need to reload it.
7528 *
7529 * Note that unlike in the Arm implementation, we should never arrive
7530 * here with a zero breakFlag because we always refresh rIBASE on
7531 * return.
7532 */
7533 .extern MterpCheckBefore
7534 EXPORT_PC
7535
7536 movl rSELF, %ecx
7537 movl %ecx, OUT_ARG0(%esp)
7538 leal OFF_FP_SHADOWFRAME(rFP), %eax
7539 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06007540 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00007541 REFRESH_IBASE
7542 jmp .L_op_nop+(45*128)
7543
7544/* ------------------------------ */
7545 .balign 128
7546.L_ALT_op_cmpg_float: /* 0x2e */
7547/* File: x86/alt_stub.S */
7548/*
7549 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7550 * any interesting requests and then jump to the real instruction
7551 * handler. Unlike the Arm handler, we can't do this as a tail call
7552 * because rIBASE is caller save and we need to reload it.
7553 *
7554 * Note that unlike in the Arm implementation, we should never arrive
7555 * here with a zero breakFlag because we always refresh rIBASE on
7556 * return.
7557 */
7558 .extern MterpCheckBefore
7559 EXPORT_PC
7560
7561 movl rSELF, %ecx
7562 movl %ecx, OUT_ARG0(%esp)
7563 leal OFF_FP_SHADOWFRAME(rFP), %eax
7564 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06007565 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00007566 REFRESH_IBASE
7567 jmp .L_op_nop+(46*128)
7568
7569/* ------------------------------ */
7570 .balign 128
7571.L_ALT_op_cmpl_double: /* 0x2f */
7572/* File: x86/alt_stub.S */
7573/*
7574 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7575 * any interesting requests and then jump to the real instruction
7576 * handler. Unlike the Arm handler, we can't do this as a tail call
7577 * because rIBASE is caller save and we need to reload it.
7578 *
7579 * Note that unlike in the Arm implementation, we should never arrive
7580 * here with a zero breakFlag because we always refresh rIBASE on
7581 * return.
7582 */
7583 .extern MterpCheckBefore
7584 EXPORT_PC
7585
7586 movl rSELF, %ecx
7587 movl %ecx, OUT_ARG0(%esp)
7588 leal OFF_FP_SHADOWFRAME(rFP), %eax
7589 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06007590 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00007591 REFRESH_IBASE
7592 jmp .L_op_nop+(47*128)
7593
7594/* ------------------------------ */
7595 .balign 128
7596.L_ALT_op_cmpg_double: /* 0x30 */
7597/* File: x86/alt_stub.S */
7598/*
7599 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7600 * any interesting requests and then jump to the real instruction
7601 * handler. Unlike the Arm handler, we can't do this as a tail call
7602 * because rIBASE is caller save and we need to reload it.
7603 *
7604 * Note that unlike in the Arm implementation, we should never arrive
7605 * here with a zero breakFlag because we always refresh rIBASE on
7606 * return.
7607 */
7608 .extern MterpCheckBefore
7609 EXPORT_PC
7610
7611 movl rSELF, %ecx
7612 movl %ecx, OUT_ARG0(%esp)
7613 leal OFF_FP_SHADOWFRAME(rFP), %eax
7614 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06007615 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00007616 REFRESH_IBASE
7617 jmp .L_op_nop+(48*128)
7618
7619/* ------------------------------ */
7620 .balign 128
7621.L_ALT_op_cmp_long: /* 0x31 */
7622/* File: x86/alt_stub.S */
7623/*
7624 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7625 * any interesting requests and then jump to the real instruction
7626 * handler. Unlike the Arm handler, we can't do this as a tail call
7627 * because rIBASE is caller save and we need to reload it.
7628 *
7629 * Note that unlike in the Arm implementation, we should never arrive
7630 * here with a zero breakFlag because we always refresh rIBASE on
7631 * return.
7632 */
7633 .extern MterpCheckBefore
7634 EXPORT_PC
7635
7636 movl rSELF, %ecx
7637 movl %ecx, OUT_ARG0(%esp)
7638 leal OFF_FP_SHADOWFRAME(rFP), %eax
7639 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06007640 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00007641 REFRESH_IBASE
7642 jmp .L_op_nop+(49*128)
7643
7644/* ------------------------------ */
7645 .balign 128
7646.L_ALT_op_if_eq: /* 0x32 */
7647/* File: x86/alt_stub.S */
7648/*
7649 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7650 * any interesting requests and then jump to the real instruction
7651 * handler. Unlike the Arm handler, we can't do this as a tail call
7652 * because rIBASE is caller save and we need to reload it.
7653 *
7654 * Note that unlike in the Arm implementation, we should never arrive
7655 * here with a zero breakFlag because we always refresh rIBASE on
7656 * return.
7657 */
7658 .extern MterpCheckBefore
7659 EXPORT_PC
7660
7661 movl rSELF, %ecx
7662 movl %ecx, OUT_ARG0(%esp)
7663 leal OFF_FP_SHADOWFRAME(rFP), %eax
7664 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06007665 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00007666 REFRESH_IBASE
7667 jmp .L_op_nop+(50*128)
7668
7669/* ------------------------------ */
7670 .balign 128
7671.L_ALT_op_if_ne: /* 0x33 */
7672/* File: x86/alt_stub.S */
7673/*
7674 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7675 * any interesting requests and then jump to the real instruction
7676 * handler. Unlike the Arm handler, we can't do this as a tail call
7677 * because rIBASE is caller save and we need to reload it.
7678 *
7679 * Note that unlike in the Arm implementation, we should never arrive
7680 * here with a zero breakFlag because we always refresh rIBASE on
7681 * return.
7682 */
7683 .extern MterpCheckBefore
7684 EXPORT_PC
7685
7686 movl rSELF, %ecx
7687 movl %ecx, OUT_ARG0(%esp)
7688 leal OFF_FP_SHADOWFRAME(rFP), %eax
7689 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06007690 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00007691 REFRESH_IBASE
7692 jmp .L_op_nop+(51*128)
7693
7694/* ------------------------------ */
7695 .balign 128
7696.L_ALT_op_if_lt: /* 0x34 */
7697/* File: x86/alt_stub.S */
7698/*
7699 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7700 * any interesting requests and then jump to the real instruction
7701 * handler. Unlike the Arm handler, we can't do this as a tail call
7702 * because rIBASE is caller save and we need to reload it.
7703 *
7704 * Note that unlike in the Arm implementation, we should never arrive
7705 * here with a zero breakFlag because we always refresh rIBASE on
7706 * return.
7707 */
7708 .extern MterpCheckBefore
7709 EXPORT_PC
7710
7711 movl rSELF, %ecx
7712 movl %ecx, OUT_ARG0(%esp)
7713 leal OFF_FP_SHADOWFRAME(rFP), %eax
7714 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06007715 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00007716 REFRESH_IBASE
7717 jmp .L_op_nop+(52*128)
7718
7719/* ------------------------------ */
7720 .balign 128
7721.L_ALT_op_if_ge: /* 0x35 */
7722/* File: x86/alt_stub.S */
7723/*
7724 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7725 * any interesting requests and then jump to the real instruction
7726 * handler. Unlike the Arm handler, we can't do this as a tail call
7727 * because rIBASE is caller save and we need to reload it.
7728 *
7729 * Note that unlike in the Arm implementation, we should never arrive
7730 * here with a zero breakFlag because we always refresh rIBASE on
7731 * return.
7732 */
7733 .extern MterpCheckBefore
7734 EXPORT_PC
7735
7736 movl rSELF, %ecx
7737 movl %ecx, OUT_ARG0(%esp)
7738 leal OFF_FP_SHADOWFRAME(rFP), %eax
7739 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06007740 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00007741 REFRESH_IBASE
7742 jmp .L_op_nop+(53*128)
7743
7744/* ------------------------------ */
7745 .balign 128
7746.L_ALT_op_if_gt: /* 0x36 */
7747/* File: x86/alt_stub.S */
7748/*
7749 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7750 * any interesting requests and then jump to the real instruction
7751 * handler. Unlike the Arm handler, we can't do this as a tail call
7752 * because rIBASE is caller save and we need to reload it.
7753 *
7754 * Note that unlike in the Arm implementation, we should never arrive
7755 * here with a zero breakFlag because we always refresh rIBASE on
7756 * return.
7757 */
7758 .extern MterpCheckBefore
7759 EXPORT_PC
7760
7761 movl rSELF, %ecx
7762 movl %ecx, OUT_ARG0(%esp)
7763 leal OFF_FP_SHADOWFRAME(rFP), %eax
7764 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06007765 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00007766 REFRESH_IBASE
7767 jmp .L_op_nop+(54*128)
7768
7769/* ------------------------------ */
7770 .balign 128
7771.L_ALT_op_if_le: /* 0x37 */
7772/* File: x86/alt_stub.S */
7773/*
7774 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7775 * any interesting requests and then jump to the real instruction
7776 * handler. Unlike the Arm handler, we can't do this as a tail call
7777 * because rIBASE is caller save and we need to reload it.
7778 *
7779 * Note that unlike in the Arm implementation, we should never arrive
7780 * here with a zero breakFlag because we always refresh rIBASE on
7781 * return.
7782 */
7783 .extern MterpCheckBefore
7784 EXPORT_PC
7785
7786 movl rSELF, %ecx
7787 movl %ecx, OUT_ARG0(%esp)
7788 leal OFF_FP_SHADOWFRAME(rFP), %eax
7789 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06007790 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00007791 REFRESH_IBASE
7792 jmp .L_op_nop+(55*128)
7793
7794/* ------------------------------ */
7795 .balign 128
7796.L_ALT_op_if_eqz: /* 0x38 */
7797/* File: x86/alt_stub.S */
7798/*
7799 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7800 * any interesting requests and then jump to the real instruction
7801 * handler. Unlike the Arm handler, we can't do this as a tail call
7802 * because rIBASE is caller save and we need to reload it.
7803 *
7804 * Note that unlike in the Arm implementation, we should never arrive
7805 * here with a zero breakFlag because we always refresh rIBASE on
7806 * return.
7807 */
7808 .extern MterpCheckBefore
7809 EXPORT_PC
7810
7811 movl rSELF, %ecx
7812 movl %ecx, OUT_ARG0(%esp)
7813 leal OFF_FP_SHADOWFRAME(rFP), %eax
7814 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06007815 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00007816 REFRESH_IBASE
7817 jmp .L_op_nop+(56*128)
7818
7819/* ------------------------------ */
7820 .balign 128
7821.L_ALT_op_if_nez: /* 0x39 */
7822/* File: x86/alt_stub.S */
7823/*
7824 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7825 * any interesting requests and then jump to the real instruction
7826 * handler. Unlike the Arm handler, we can't do this as a tail call
7827 * because rIBASE is caller save and we need to reload it.
7828 *
7829 * Note that unlike in the Arm implementation, we should never arrive
7830 * here with a zero breakFlag because we always refresh rIBASE on
7831 * return.
7832 */
7833 .extern MterpCheckBefore
7834 EXPORT_PC
7835
7836 movl rSELF, %ecx
7837 movl %ecx, OUT_ARG0(%esp)
7838 leal OFF_FP_SHADOWFRAME(rFP), %eax
7839 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06007840 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00007841 REFRESH_IBASE
7842 jmp .L_op_nop+(57*128)
7843
7844/* ------------------------------ */
7845 .balign 128
7846.L_ALT_op_if_ltz: /* 0x3a */
7847/* File: x86/alt_stub.S */
7848/*
7849 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7850 * any interesting requests and then jump to the real instruction
7851 * handler. Unlike the Arm handler, we can't do this as a tail call
7852 * because rIBASE is caller save and we need to reload it.
7853 *
7854 * Note that unlike in the Arm implementation, we should never arrive
7855 * here with a zero breakFlag because we always refresh rIBASE on
7856 * return.
7857 */
7858 .extern MterpCheckBefore
7859 EXPORT_PC
7860
7861 movl rSELF, %ecx
7862 movl %ecx, OUT_ARG0(%esp)
7863 leal OFF_FP_SHADOWFRAME(rFP), %eax
7864 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06007865 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00007866 REFRESH_IBASE
7867 jmp .L_op_nop+(58*128)
7868
7869/* ------------------------------ */
7870 .balign 128
7871.L_ALT_op_if_gez: /* 0x3b */
7872/* File: x86/alt_stub.S */
7873/*
7874 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7875 * any interesting requests and then jump to the real instruction
7876 * handler. Unlike the Arm handler, we can't do this as a tail call
7877 * because rIBASE is caller save and we need to reload it.
7878 *
7879 * Note that unlike in the Arm implementation, we should never arrive
7880 * here with a zero breakFlag because we always refresh rIBASE on
7881 * return.
7882 */
7883 .extern MterpCheckBefore
7884 EXPORT_PC
7885
7886 movl rSELF, %ecx
7887 movl %ecx, OUT_ARG0(%esp)
7888 leal OFF_FP_SHADOWFRAME(rFP), %eax
7889 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06007890 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00007891 REFRESH_IBASE
7892 jmp .L_op_nop+(59*128)
7893
7894/* ------------------------------ */
7895 .balign 128
7896.L_ALT_op_if_gtz: /* 0x3c */
7897/* File: x86/alt_stub.S */
7898/*
7899 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7900 * any interesting requests and then jump to the real instruction
7901 * handler. Unlike the Arm handler, we can't do this as a tail call
7902 * because rIBASE is caller save and we need to reload it.
7903 *
7904 * Note that unlike in the Arm implementation, we should never arrive
7905 * here with a zero breakFlag because we always refresh rIBASE on
7906 * return.
7907 */
7908 .extern MterpCheckBefore
7909 EXPORT_PC
7910
7911 movl rSELF, %ecx
7912 movl %ecx, OUT_ARG0(%esp)
7913 leal OFF_FP_SHADOWFRAME(rFP), %eax
7914 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06007915 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00007916 REFRESH_IBASE
7917 jmp .L_op_nop+(60*128)
7918
7919/* ------------------------------ */
7920 .balign 128
7921.L_ALT_op_if_lez: /* 0x3d */
7922/* File: x86/alt_stub.S */
7923/*
7924 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7925 * any interesting requests and then jump to the real instruction
7926 * handler. Unlike the Arm handler, we can't do this as a tail call
7927 * because rIBASE is caller save and we need to reload it.
7928 *
7929 * Note that unlike in the Arm implementation, we should never arrive
7930 * here with a zero breakFlag because we always refresh rIBASE on
7931 * return.
7932 */
7933 .extern MterpCheckBefore
7934 EXPORT_PC
7935
7936 movl rSELF, %ecx
7937 movl %ecx, OUT_ARG0(%esp)
7938 leal OFF_FP_SHADOWFRAME(rFP), %eax
7939 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06007940 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00007941 REFRESH_IBASE
7942 jmp .L_op_nop+(61*128)
7943
7944/* ------------------------------ */
7945 .balign 128
7946.L_ALT_op_unused_3e: /* 0x3e */
7947/* File: x86/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. Unlike the Arm handler, we can't do this as a tail call
7952 * because rIBASE is caller save and we need to reload it.
7953 *
7954 * Note that unlike in the Arm implementation, we should never arrive
7955 * here with a zero breakFlag because we always refresh rIBASE on
7956 * return.
7957 */
7958 .extern MterpCheckBefore
7959 EXPORT_PC
7960
7961 movl rSELF, %ecx
7962 movl %ecx, OUT_ARG0(%esp)
7963 leal OFF_FP_SHADOWFRAME(rFP), %eax
7964 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06007965 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00007966 REFRESH_IBASE
7967 jmp .L_op_nop+(62*128)
7968
7969/* ------------------------------ */
7970 .balign 128
7971.L_ALT_op_unused_3f: /* 0x3f */
7972/* File: x86/alt_stub.S */
7973/*
7974 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7975 * any interesting requests and then jump to the real instruction
7976 * handler. Unlike the Arm handler, we can't do this as a tail call
7977 * because rIBASE is caller save and we need to reload it.
7978 *
7979 * Note that unlike in the Arm implementation, we should never arrive
7980 * here with a zero breakFlag because we always refresh rIBASE on
7981 * return.
7982 */
7983 .extern MterpCheckBefore
7984 EXPORT_PC
7985
7986 movl rSELF, %ecx
7987 movl %ecx, OUT_ARG0(%esp)
7988 leal OFF_FP_SHADOWFRAME(rFP), %eax
7989 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06007990 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00007991 REFRESH_IBASE
7992 jmp .L_op_nop+(63*128)
7993
7994/* ------------------------------ */
7995 .balign 128
7996.L_ALT_op_unused_40: /* 0x40 */
7997/* File: x86/alt_stub.S */
7998/*
7999 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8000 * any interesting requests and then jump to the real instruction
8001 * handler. Unlike the Arm handler, we can't do this as a tail call
8002 * because rIBASE is caller save and we need to reload it.
8003 *
8004 * Note that unlike in the Arm implementation, we should never arrive
8005 * here with a zero breakFlag because we always refresh rIBASE on
8006 * return.
8007 */
8008 .extern MterpCheckBefore
8009 EXPORT_PC
8010
8011 movl rSELF, %ecx
8012 movl %ecx, OUT_ARG0(%esp)
8013 leal OFF_FP_SHADOWFRAME(rFP), %eax
8014 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06008015 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00008016 REFRESH_IBASE
8017 jmp .L_op_nop+(64*128)
8018
8019/* ------------------------------ */
8020 .balign 128
8021.L_ALT_op_unused_41: /* 0x41 */
8022/* File: x86/alt_stub.S */
8023/*
8024 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8025 * any interesting requests and then jump to the real instruction
8026 * handler. Unlike the Arm handler, we can't do this as a tail call
8027 * because rIBASE is caller save and we need to reload it.
8028 *
8029 * Note that unlike in the Arm implementation, we should never arrive
8030 * here with a zero breakFlag because we always refresh rIBASE on
8031 * return.
8032 */
8033 .extern MterpCheckBefore
8034 EXPORT_PC
8035
8036 movl rSELF, %ecx
8037 movl %ecx, OUT_ARG0(%esp)
8038 leal OFF_FP_SHADOWFRAME(rFP), %eax
8039 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06008040 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00008041 REFRESH_IBASE
8042 jmp .L_op_nop+(65*128)
8043
8044/* ------------------------------ */
8045 .balign 128
8046.L_ALT_op_unused_42: /* 0x42 */
8047/* File: x86/alt_stub.S */
8048/*
8049 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8050 * any interesting requests and then jump to the real instruction
8051 * handler. Unlike the Arm handler, we can't do this as a tail call
8052 * because rIBASE is caller save and we need to reload it.
8053 *
8054 * Note that unlike in the Arm implementation, we should never arrive
8055 * here with a zero breakFlag because we always refresh rIBASE on
8056 * return.
8057 */
8058 .extern MterpCheckBefore
8059 EXPORT_PC
8060
8061 movl rSELF, %ecx
8062 movl %ecx, OUT_ARG0(%esp)
8063 leal OFF_FP_SHADOWFRAME(rFP), %eax
8064 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06008065 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00008066 REFRESH_IBASE
8067 jmp .L_op_nop+(66*128)
8068
8069/* ------------------------------ */
8070 .balign 128
8071.L_ALT_op_unused_43: /* 0x43 */
8072/* File: x86/alt_stub.S */
8073/*
8074 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8075 * any interesting requests and then jump to the real instruction
8076 * handler. Unlike the Arm handler, we can't do this as a tail call
8077 * because rIBASE is caller save and we need to reload it.
8078 *
8079 * Note that unlike in the Arm implementation, we should never arrive
8080 * here with a zero breakFlag because we always refresh rIBASE on
8081 * return.
8082 */
8083 .extern MterpCheckBefore
8084 EXPORT_PC
8085
8086 movl rSELF, %ecx
8087 movl %ecx, OUT_ARG0(%esp)
8088 leal OFF_FP_SHADOWFRAME(rFP), %eax
8089 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06008090 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00008091 REFRESH_IBASE
8092 jmp .L_op_nop+(67*128)
8093
8094/* ------------------------------ */
8095 .balign 128
8096.L_ALT_op_aget: /* 0x44 */
8097/* File: x86/alt_stub.S */
8098/*
8099 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8100 * any interesting requests and then jump to the real instruction
8101 * handler. Unlike the Arm handler, we can't do this as a tail call
8102 * because rIBASE is caller save and we need to reload it.
8103 *
8104 * Note that unlike in the Arm implementation, we should never arrive
8105 * here with a zero breakFlag because we always refresh rIBASE on
8106 * return.
8107 */
8108 .extern MterpCheckBefore
8109 EXPORT_PC
8110
8111 movl rSELF, %ecx
8112 movl %ecx, OUT_ARG0(%esp)
8113 leal OFF_FP_SHADOWFRAME(rFP), %eax
8114 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06008115 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00008116 REFRESH_IBASE
8117 jmp .L_op_nop+(68*128)
8118
8119/* ------------------------------ */
8120 .balign 128
8121.L_ALT_op_aget_wide: /* 0x45 */
8122/* File: x86/alt_stub.S */
8123/*
8124 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8125 * any interesting requests and then jump to the real instruction
8126 * handler. Unlike the Arm handler, we can't do this as a tail call
8127 * because rIBASE is caller save and we need to reload it.
8128 *
8129 * Note that unlike in the Arm implementation, we should never arrive
8130 * here with a zero breakFlag because we always refresh rIBASE on
8131 * return.
8132 */
8133 .extern MterpCheckBefore
8134 EXPORT_PC
8135
8136 movl rSELF, %ecx
8137 movl %ecx, OUT_ARG0(%esp)
8138 leal OFF_FP_SHADOWFRAME(rFP), %eax
8139 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06008140 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00008141 REFRESH_IBASE
8142 jmp .L_op_nop+(69*128)
8143
8144/* ------------------------------ */
8145 .balign 128
8146.L_ALT_op_aget_object: /* 0x46 */
8147/* File: x86/alt_stub.S */
8148/*
8149 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8150 * any interesting requests and then jump to the real instruction
8151 * handler. Unlike the Arm handler, we can't do this as a tail call
8152 * because rIBASE is caller save and we need to reload it.
8153 *
8154 * Note that unlike in the Arm implementation, we should never arrive
8155 * here with a zero breakFlag because we always refresh rIBASE on
8156 * return.
8157 */
8158 .extern MterpCheckBefore
8159 EXPORT_PC
8160
8161 movl rSELF, %ecx
8162 movl %ecx, OUT_ARG0(%esp)
8163 leal OFF_FP_SHADOWFRAME(rFP), %eax
8164 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06008165 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00008166 REFRESH_IBASE
8167 jmp .L_op_nop+(70*128)
8168
8169/* ------------------------------ */
8170 .balign 128
8171.L_ALT_op_aget_boolean: /* 0x47 */
8172/* File: x86/alt_stub.S */
8173/*
8174 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8175 * any interesting requests and then jump to the real instruction
8176 * handler. Unlike the Arm handler, we can't do this as a tail call
8177 * because rIBASE is caller save and we need to reload it.
8178 *
8179 * Note that unlike in the Arm implementation, we should never arrive
8180 * here with a zero breakFlag because we always refresh rIBASE on
8181 * return.
8182 */
8183 .extern MterpCheckBefore
8184 EXPORT_PC
8185
8186 movl rSELF, %ecx
8187 movl %ecx, OUT_ARG0(%esp)
8188 leal OFF_FP_SHADOWFRAME(rFP), %eax
8189 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06008190 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00008191 REFRESH_IBASE
8192 jmp .L_op_nop+(71*128)
8193
8194/* ------------------------------ */
8195 .balign 128
8196.L_ALT_op_aget_byte: /* 0x48 */
8197/* File: x86/alt_stub.S */
8198/*
8199 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8200 * any interesting requests and then jump to the real instruction
8201 * handler. Unlike the Arm handler, we can't do this as a tail call
8202 * because rIBASE is caller save and we need to reload it.
8203 *
8204 * Note that unlike in the Arm implementation, we should never arrive
8205 * here with a zero breakFlag because we always refresh rIBASE on
8206 * return.
8207 */
8208 .extern MterpCheckBefore
8209 EXPORT_PC
8210
8211 movl rSELF, %ecx
8212 movl %ecx, OUT_ARG0(%esp)
8213 leal OFF_FP_SHADOWFRAME(rFP), %eax
8214 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06008215 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00008216 REFRESH_IBASE
8217 jmp .L_op_nop+(72*128)
8218
8219/* ------------------------------ */
8220 .balign 128
8221.L_ALT_op_aget_char: /* 0x49 */
8222/* File: x86/alt_stub.S */
8223/*
8224 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8225 * any interesting requests and then jump to the real instruction
8226 * handler. Unlike the Arm handler, we can't do this as a tail call
8227 * because rIBASE is caller save and we need to reload it.
8228 *
8229 * Note that unlike in the Arm implementation, we should never arrive
8230 * here with a zero breakFlag because we always refresh rIBASE on
8231 * return.
8232 */
8233 .extern MterpCheckBefore
8234 EXPORT_PC
8235
8236 movl rSELF, %ecx
8237 movl %ecx, OUT_ARG0(%esp)
8238 leal OFF_FP_SHADOWFRAME(rFP), %eax
8239 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06008240 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00008241 REFRESH_IBASE
8242 jmp .L_op_nop+(73*128)
8243
8244/* ------------------------------ */
8245 .balign 128
8246.L_ALT_op_aget_short: /* 0x4a */
8247/* File: x86/alt_stub.S */
8248/*
8249 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8250 * any interesting requests and then jump to the real instruction
8251 * handler. Unlike the Arm handler, we can't do this as a tail call
8252 * because rIBASE is caller save and we need to reload it.
8253 *
8254 * Note that unlike in the Arm implementation, we should never arrive
8255 * here with a zero breakFlag because we always refresh rIBASE on
8256 * return.
8257 */
8258 .extern MterpCheckBefore
8259 EXPORT_PC
8260
8261 movl rSELF, %ecx
8262 movl %ecx, OUT_ARG0(%esp)
8263 leal OFF_FP_SHADOWFRAME(rFP), %eax
8264 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06008265 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00008266 REFRESH_IBASE
8267 jmp .L_op_nop+(74*128)
8268
8269/* ------------------------------ */
8270 .balign 128
8271.L_ALT_op_aput: /* 0x4b */
8272/* File: x86/alt_stub.S */
8273/*
8274 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8275 * any interesting requests and then jump to the real instruction
8276 * handler. Unlike the Arm handler, we can't do this as a tail call
8277 * because rIBASE is caller save and we need to reload it.
8278 *
8279 * Note that unlike in the Arm implementation, we should never arrive
8280 * here with a zero breakFlag because we always refresh rIBASE on
8281 * return.
8282 */
8283 .extern MterpCheckBefore
8284 EXPORT_PC
8285
8286 movl rSELF, %ecx
8287 movl %ecx, OUT_ARG0(%esp)
8288 leal OFF_FP_SHADOWFRAME(rFP), %eax
8289 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06008290 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00008291 REFRESH_IBASE
8292 jmp .L_op_nop+(75*128)
8293
8294/* ------------------------------ */
8295 .balign 128
8296.L_ALT_op_aput_wide: /* 0x4c */
8297/* File: x86/alt_stub.S */
8298/*
8299 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8300 * any interesting requests and then jump to the real instruction
8301 * handler. Unlike the Arm handler, we can't do this as a tail call
8302 * because rIBASE is caller save and we need to reload it.
8303 *
8304 * Note that unlike in the Arm implementation, we should never arrive
8305 * here with a zero breakFlag because we always refresh rIBASE on
8306 * return.
8307 */
8308 .extern MterpCheckBefore
8309 EXPORT_PC
8310
8311 movl rSELF, %ecx
8312 movl %ecx, OUT_ARG0(%esp)
8313 leal OFF_FP_SHADOWFRAME(rFP), %eax
8314 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06008315 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00008316 REFRESH_IBASE
8317 jmp .L_op_nop+(76*128)
8318
8319/* ------------------------------ */
8320 .balign 128
8321.L_ALT_op_aput_object: /* 0x4d */
8322/* File: x86/alt_stub.S */
8323/*
8324 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8325 * any interesting requests and then jump to the real instruction
8326 * handler. Unlike the Arm handler, we can't do this as a tail call
8327 * because rIBASE is caller save and we need to reload it.
8328 *
8329 * Note that unlike in the Arm implementation, we should never arrive
8330 * here with a zero breakFlag because we always refresh rIBASE on
8331 * return.
8332 */
8333 .extern MterpCheckBefore
8334 EXPORT_PC
8335
8336 movl rSELF, %ecx
8337 movl %ecx, OUT_ARG0(%esp)
8338 leal OFF_FP_SHADOWFRAME(rFP), %eax
8339 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06008340 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00008341 REFRESH_IBASE
8342 jmp .L_op_nop+(77*128)
8343
8344/* ------------------------------ */
8345 .balign 128
8346.L_ALT_op_aput_boolean: /* 0x4e */
8347/* File: x86/alt_stub.S */
8348/*
8349 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8350 * any interesting requests and then jump to the real instruction
8351 * handler. Unlike the Arm handler, we can't do this as a tail call
8352 * because rIBASE is caller save and we need to reload it.
8353 *
8354 * Note that unlike in the Arm implementation, we should never arrive
8355 * here with a zero breakFlag because we always refresh rIBASE on
8356 * return.
8357 */
8358 .extern MterpCheckBefore
8359 EXPORT_PC
8360
8361 movl rSELF, %ecx
8362 movl %ecx, OUT_ARG0(%esp)
8363 leal OFF_FP_SHADOWFRAME(rFP), %eax
8364 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06008365 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00008366 REFRESH_IBASE
8367 jmp .L_op_nop+(78*128)
8368
8369/* ------------------------------ */
8370 .balign 128
8371.L_ALT_op_aput_byte: /* 0x4f */
8372/* File: x86/alt_stub.S */
8373/*
8374 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8375 * any interesting requests and then jump to the real instruction
8376 * handler. Unlike the Arm handler, we can't do this as a tail call
8377 * because rIBASE is caller save and we need to reload it.
8378 *
8379 * Note that unlike in the Arm implementation, we should never arrive
8380 * here with a zero breakFlag because we always refresh rIBASE on
8381 * return.
8382 */
8383 .extern MterpCheckBefore
8384 EXPORT_PC
8385
8386 movl rSELF, %ecx
8387 movl %ecx, OUT_ARG0(%esp)
8388 leal OFF_FP_SHADOWFRAME(rFP), %eax
8389 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06008390 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00008391 REFRESH_IBASE
8392 jmp .L_op_nop+(79*128)
8393
8394/* ------------------------------ */
8395 .balign 128
8396.L_ALT_op_aput_char: /* 0x50 */
8397/* File: x86/alt_stub.S */
8398/*
8399 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8400 * any interesting requests and then jump to the real instruction
8401 * handler. Unlike the Arm handler, we can't do this as a tail call
8402 * because rIBASE is caller save and we need to reload it.
8403 *
8404 * Note that unlike in the Arm implementation, we should never arrive
8405 * here with a zero breakFlag because we always refresh rIBASE on
8406 * return.
8407 */
8408 .extern MterpCheckBefore
8409 EXPORT_PC
8410
8411 movl rSELF, %ecx
8412 movl %ecx, OUT_ARG0(%esp)
8413 leal OFF_FP_SHADOWFRAME(rFP), %eax
8414 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06008415 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00008416 REFRESH_IBASE
8417 jmp .L_op_nop+(80*128)
8418
8419/* ------------------------------ */
8420 .balign 128
8421.L_ALT_op_aput_short: /* 0x51 */
8422/* File: x86/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. Unlike the Arm handler, we can't do this as a tail call
8427 * because rIBASE is caller save and we need to reload it.
8428 *
8429 * Note that unlike in the Arm implementation, we should never arrive
8430 * here with a zero breakFlag because we always refresh rIBASE on
8431 * return.
8432 */
8433 .extern MterpCheckBefore
8434 EXPORT_PC
8435
8436 movl rSELF, %ecx
8437 movl %ecx, OUT_ARG0(%esp)
8438 leal OFF_FP_SHADOWFRAME(rFP), %eax
8439 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06008440 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00008441 REFRESH_IBASE
8442 jmp .L_op_nop+(81*128)
8443
8444/* ------------------------------ */
8445 .balign 128
8446.L_ALT_op_iget: /* 0x52 */
8447/* File: x86/alt_stub.S */
8448/*
8449 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8450 * any interesting requests and then jump to the real instruction
8451 * handler. Unlike the Arm handler, we can't do this as a tail call
8452 * because rIBASE is caller save and we need to reload it.
8453 *
8454 * Note that unlike in the Arm implementation, we should never arrive
8455 * here with a zero breakFlag because we always refresh rIBASE on
8456 * return.
8457 */
8458 .extern MterpCheckBefore
8459 EXPORT_PC
8460
8461 movl rSELF, %ecx
8462 movl %ecx, OUT_ARG0(%esp)
8463 leal OFF_FP_SHADOWFRAME(rFP), %eax
8464 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06008465 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00008466 REFRESH_IBASE
8467 jmp .L_op_nop+(82*128)
8468
8469/* ------------------------------ */
8470 .balign 128
8471.L_ALT_op_iget_wide: /* 0x53 */
8472/* File: x86/alt_stub.S */
8473/*
8474 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8475 * any interesting requests and then jump to the real instruction
8476 * handler. Unlike the Arm handler, we can't do this as a tail call
8477 * because rIBASE is caller save and we need to reload it.
8478 *
8479 * Note that unlike in the Arm implementation, we should never arrive
8480 * here with a zero breakFlag because we always refresh rIBASE on
8481 * return.
8482 */
8483 .extern MterpCheckBefore
8484 EXPORT_PC
8485
8486 movl rSELF, %ecx
8487 movl %ecx, OUT_ARG0(%esp)
8488 leal OFF_FP_SHADOWFRAME(rFP), %eax
8489 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06008490 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00008491 REFRESH_IBASE
8492 jmp .L_op_nop+(83*128)
8493
8494/* ------------------------------ */
8495 .balign 128
8496.L_ALT_op_iget_object: /* 0x54 */
8497/* File: x86/alt_stub.S */
8498/*
8499 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8500 * any interesting requests and then jump to the real instruction
8501 * handler. Unlike the Arm handler, we can't do this as a tail call
8502 * because rIBASE is caller save and we need to reload it.
8503 *
8504 * Note that unlike in the Arm implementation, we should never arrive
8505 * here with a zero breakFlag because we always refresh rIBASE on
8506 * return.
8507 */
8508 .extern MterpCheckBefore
8509 EXPORT_PC
8510
8511 movl rSELF, %ecx
8512 movl %ecx, OUT_ARG0(%esp)
8513 leal OFF_FP_SHADOWFRAME(rFP), %eax
8514 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06008515 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00008516 REFRESH_IBASE
8517 jmp .L_op_nop+(84*128)
8518
8519/* ------------------------------ */
8520 .balign 128
8521.L_ALT_op_iget_boolean: /* 0x55 */
8522/* File: x86/alt_stub.S */
8523/*
8524 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8525 * any interesting requests and then jump to the real instruction
8526 * handler. Unlike the Arm handler, we can't do this as a tail call
8527 * because rIBASE is caller save and we need to reload it.
8528 *
8529 * Note that unlike in the Arm implementation, we should never arrive
8530 * here with a zero breakFlag because we always refresh rIBASE on
8531 * return.
8532 */
8533 .extern MterpCheckBefore
8534 EXPORT_PC
8535
8536 movl rSELF, %ecx
8537 movl %ecx, OUT_ARG0(%esp)
8538 leal OFF_FP_SHADOWFRAME(rFP), %eax
8539 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06008540 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00008541 REFRESH_IBASE
8542 jmp .L_op_nop+(85*128)
8543
8544/* ------------------------------ */
8545 .balign 128
8546.L_ALT_op_iget_byte: /* 0x56 */
8547/* File: x86/alt_stub.S */
8548/*
8549 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8550 * any interesting requests and then jump to the real instruction
8551 * handler. Unlike the Arm handler, we can't do this as a tail call
8552 * because rIBASE is caller save and we need to reload it.
8553 *
8554 * Note that unlike in the Arm implementation, we should never arrive
8555 * here with a zero breakFlag because we always refresh rIBASE on
8556 * return.
8557 */
8558 .extern MterpCheckBefore
8559 EXPORT_PC
8560
8561 movl rSELF, %ecx
8562 movl %ecx, OUT_ARG0(%esp)
8563 leal OFF_FP_SHADOWFRAME(rFP), %eax
8564 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06008565 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00008566 REFRESH_IBASE
8567 jmp .L_op_nop+(86*128)
8568
8569/* ------------------------------ */
8570 .balign 128
8571.L_ALT_op_iget_char: /* 0x57 */
8572/* File: x86/alt_stub.S */
8573/*
8574 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8575 * any interesting requests and then jump to the real instruction
8576 * handler. Unlike the Arm handler, we can't do this as a tail call
8577 * because rIBASE is caller save and we need to reload it.
8578 *
8579 * Note that unlike in the Arm implementation, we should never arrive
8580 * here with a zero breakFlag because we always refresh rIBASE on
8581 * return.
8582 */
8583 .extern MterpCheckBefore
8584 EXPORT_PC
8585
8586 movl rSELF, %ecx
8587 movl %ecx, OUT_ARG0(%esp)
8588 leal OFF_FP_SHADOWFRAME(rFP), %eax
8589 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06008590 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00008591 REFRESH_IBASE
8592 jmp .L_op_nop+(87*128)
8593
8594/* ------------------------------ */
8595 .balign 128
8596.L_ALT_op_iget_short: /* 0x58 */
8597/* File: x86/alt_stub.S */
8598/*
8599 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8600 * any interesting requests and then jump to the real instruction
8601 * handler. Unlike the Arm handler, we can't do this as a tail call
8602 * because rIBASE is caller save and we need to reload it.
8603 *
8604 * Note that unlike in the Arm implementation, we should never arrive
8605 * here with a zero breakFlag because we always refresh rIBASE on
8606 * return.
8607 */
8608 .extern MterpCheckBefore
8609 EXPORT_PC
8610
8611 movl rSELF, %ecx
8612 movl %ecx, OUT_ARG0(%esp)
8613 leal OFF_FP_SHADOWFRAME(rFP), %eax
8614 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06008615 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00008616 REFRESH_IBASE
8617 jmp .L_op_nop+(88*128)
8618
8619/* ------------------------------ */
8620 .balign 128
8621.L_ALT_op_iput: /* 0x59 */
8622/* File: x86/alt_stub.S */
8623/*
8624 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8625 * any interesting requests and then jump to the real instruction
8626 * handler. Unlike the Arm handler, we can't do this as a tail call
8627 * because rIBASE is caller save and we need to reload it.
8628 *
8629 * Note that unlike in the Arm implementation, we should never arrive
8630 * here with a zero breakFlag because we always refresh rIBASE on
8631 * return.
8632 */
8633 .extern MterpCheckBefore
8634 EXPORT_PC
8635
8636 movl rSELF, %ecx
8637 movl %ecx, OUT_ARG0(%esp)
8638 leal OFF_FP_SHADOWFRAME(rFP), %eax
8639 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06008640 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00008641 REFRESH_IBASE
8642 jmp .L_op_nop+(89*128)
8643
8644/* ------------------------------ */
8645 .balign 128
8646.L_ALT_op_iput_wide: /* 0x5a */
8647/* File: x86/alt_stub.S */
8648/*
8649 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8650 * any interesting requests and then jump to the real instruction
8651 * handler. Unlike the Arm handler, we can't do this as a tail call
8652 * because rIBASE is caller save and we need to reload it.
8653 *
8654 * Note that unlike in the Arm implementation, we should never arrive
8655 * here with a zero breakFlag because we always refresh rIBASE on
8656 * return.
8657 */
8658 .extern MterpCheckBefore
8659 EXPORT_PC
8660
8661 movl rSELF, %ecx
8662 movl %ecx, OUT_ARG0(%esp)
8663 leal OFF_FP_SHADOWFRAME(rFP), %eax
8664 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06008665 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00008666 REFRESH_IBASE
8667 jmp .L_op_nop+(90*128)
8668
8669/* ------------------------------ */
8670 .balign 128
8671.L_ALT_op_iput_object: /* 0x5b */
8672/* File: x86/alt_stub.S */
8673/*
8674 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8675 * any interesting requests and then jump to the real instruction
8676 * handler. Unlike the Arm handler, we can't do this as a tail call
8677 * because rIBASE is caller save and we need to reload it.
8678 *
8679 * Note that unlike in the Arm implementation, we should never arrive
8680 * here with a zero breakFlag because we always refresh rIBASE on
8681 * return.
8682 */
8683 .extern MterpCheckBefore
8684 EXPORT_PC
8685
8686 movl rSELF, %ecx
8687 movl %ecx, OUT_ARG0(%esp)
8688 leal OFF_FP_SHADOWFRAME(rFP), %eax
8689 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06008690 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00008691 REFRESH_IBASE
8692 jmp .L_op_nop+(91*128)
8693
8694/* ------------------------------ */
8695 .balign 128
8696.L_ALT_op_iput_boolean: /* 0x5c */
8697/* File: x86/alt_stub.S */
8698/*
8699 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8700 * any interesting requests and then jump to the real instruction
8701 * handler. Unlike the Arm handler, we can't do this as a tail call
8702 * because rIBASE is caller save and we need to reload it.
8703 *
8704 * Note that unlike in the Arm implementation, we should never arrive
8705 * here with a zero breakFlag because we always refresh rIBASE on
8706 * return.
8707 */
8708 .extern MterpCheckBefore
8709 EXPORT_PC
8710
8711 movl rSELF, %ecx
8712 movl %ecx, OUT_ARG0(%esp)
8713 leal OFF_FP_SHADOWFRAME(rFP), %eax
8714 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06008715 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00008716 REFRESH_IBASE
8717 jmp .L_op_nop+(92*128)
8718
8719/* ------------------------------ */
8720 .balign 128
8721.L_ALT_op_iput_byte: /* 0x5d */
8722/* File: x86/alt_stub.S */
8723/*
8724 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8725 * any interesting requests and then jump to the real instruction
8726 * handler. Unlike the Arm handler, we can't do this as a tail call
8727 * because rIBASE is caller save and we need to reload it.
8728 *
8729 * Note that unlike in the Arm implementation, we should never arrive
8730 * here with a zero breakFlag because we always refresh rIBASE on
8731 * return.
8732 */
8733 .extern MterpCheckBefore
8734 EXPORT_PC
8735
8736 movl rSELF, %ecx
8737 movl %ecx, OUT_ARG0(%esp)
8738 leal OFF_FP_SHADOWFRAME(rFP), %eax
8739 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06008740 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00008741 REFRESH_IBASE
8742 jmp .L_op_nop+(93*128)
8743
8744/* ------------------------------ */
8745 .balign 128
8746.L_ALT_op_iput_char: /* 0x5e */
8747/* File: x86/alt_stub.S */
8748/*
8749 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8750 * any interesting requests and then jump to the real instruction
8751 * handler. Unlike the Arm handler, we can't do this as a tail call
8752 * because rIBASE is caller save and we need to reload it.
8753 *
8754 * Note that unlike in the Arm implementation, we should never arrive
8755 * here with a zero breakFlag because we always refresh rIBASE on
8756 * return.
8757 */
8758 .extern MterpCheckBefore
8759 EXPORT_PC
8760
8761 movl rSELF, %ecx
8762 movl %ecx, OUT_ARG0(%esp)
8763 leal OFF_FP_SHADOWFRAME(rFP), %eax
8764 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06008765 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00008766 REFRESH_IBASE
8767 jmp .L_op_nop+(94*128)
8768
8769/* ------------------------------ */
8770 .balign 128
8771.L_ALT_op_iput_short: /* 0x5f */
8772/* File: x86/alt_stub.S */
8773/*
8774 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8775 * any interesting requests and then jump to the real instruction
8776 * handler. Unlike the Arm handler, we can't do this as a tail call
8777 * because rIBASE is caller save and we need to reload it.
8778 *
8779 * Note that unlike in the Arm implementation, we should never arrive
8780 * here with a zero breakFlag because we always refresh rIBASE on
8781 * return.
8782 */
8783 .extern MterpCheckBefore
8784 EXPORT_PC
8785
8786 movl rSELF, %ecx
8787 movl %ecx, OUT_ARG0(%esp)
8788 leal OFF_FP_SHADOWFRAME(rFP), %eax
8789 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06008790 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00008791 REFRESH_IBASE
8792 jmp .L_op_nop+(95*128)
8793
8794/* ------------------------------ */
8795 .balign 128
8796.L_ALT_op_sget: /* 0x60 */
8797/* File: x86/alt_stub.S */
8798/*
8799 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8800 * any interesting requests and then jump to the real instruction
8801 * handler. Unlike the Arm handler, we can't do this as a tail call
8802 * because rIBASE is caller save and we need to reload it.
8803 *
8804 * Note that unlike in the Arm implementation, we should never arrive
8805 * here with a zero breakFlag because we always refresh rIBASE on
8806 * return.
8807 */
8808 .extern MterpCheckBefore
8809 EXPORT_PC
8810
8811 movl rSELF, %ecx
8812 movl %ecx, OUT_ARG0(%esp)
8813 leal OFF_FP_SHADOWFRAME(rFP), %eax
8814 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06008815 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00008816 REFRESH_IBASE
8817 jmp .L_op_nop+(96*128)
8818
8819/* ------------------------------ */
8820 .balign 128
8821.L_ALT_op_sget_wide: /* 0x61 */
8822/* File: x86/alt_stub.S */
8823/*
8824 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8825 * any interesting requests and then jump to the real instruction
8826 * handler. Unlike the Arm handler, we can't do this as a tail call
8827 * because rIBASE is caller save and we need to reload it.
8828 *
8829 * Note that unlike in the Arm implementation, we should never arrive
8830 * here with a zero breakFlag because we always refresh rIBASE on
8831 * return.
8832 */
8833 .extern MterpCheckBefore
8834 EXPORT_PC
8835
8836 movl rSELF, %ecx
8837 movl %ecx, OUT_ARG0(%esp)
8838 leal OFF_FP_SHADOWFRAME(rFP), %eax
8839 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06008840 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00008841 REFRESH_IBASE
8842 jmp .L_op_nop+(97*128)
8843
8844/* ------------------------------ */
8845 .balign 128
8846.L_ALT_op_sget_object: /* 0x62 */
8847/* File: x86/alt_stub.S */
8848/*
8849 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8850 * any interesting requests and then jump to the real instruction
8851 * handler. Unlike the Arm handler, we can't do this as a tail call
8852 * because rIBASE is caller save and we need to reload it.
8853 *
8854 * Note that unlike in the Arm implementation, we should never arrive
8855 * here with a zero breakFlag because we always refresh rIBASE on
8856 * return.
8857 */
8858 .extern MterpCheckBefore
8859 EXPORT_PC
8860
8861 movl rSELF, %ecx
8862 movl %ecx, OUT_ARG0(%esp)
8863 leal OFF_FP_SHADOWFRAME(rFP), %eax
8864 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06008865 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00008866 REFRESH_IBASE
8867 jmp .L_op_nop+(98*128)
8868
8869/* ------------------------------ */
8870 .balign 128
8871.L_ALT_op_sget_boolean: /* 0x63 */
8872/* File: x86/alt_stub.S */
8873/*
8874 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8875 * any interesting requests and then jump to the real instruction
8876 * handler. Unlike the Arm handler, we can't do this as a tail call
8877 * because rIBASE is caller save and we need to reload it.
8878 *
8879 * Note that unlike in the Arm implementation, we should never arrive
8880 * here with a zero breakFlag because we always refresh rIBASE on
8881 * return.
8882 */
8883 .extern MterpCheckBefore
8884 EXPORT_PC
8885
8886 movl rSELF, %ecx
8887 movl %ecx, OUT_ARG0(%esp)
8888 leal OFF_FP_SHADOWFRAME(rFP), %eax
8889 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06008890 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00008891 REFRESH_IBASE
8892 jmp .L_op_nop+(99*128)
8893
8894/* ------------------------------ */
8895 .balign 128
8896.L_ALT_op_sget_byte: /* 0x64 */
8897/* File: x86/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. Unlike the Arm handler, we can't do this as a tail call
8902 * because rIBASE is caller save and we need to reload it.
8903 *
8904 * Note that unlike in the Arm implementation, we should never arrive
8905 * here with a zero breakFlag because we always refresh rIBASE on
8906 * return.
8907 */
8908 .extern MterpCheckBefore
8909 EXPORT_PC
8910
8911 movl rSELF, %ecx
8912 movl %ecx, OUT_ARG0(%esp)
8913 leal OFF_FP_SHADOWFRAME(rFP), %eax
8914 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06008915 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00008916 REFRESH_IBASE
8917 jmp .L_op_nop+(100*128)
8918
8919/* ------------------------------ */
8920 .balign 128
8921.L_ALT_op_sget_char: /* 0x65 */
8922/* File: x86/alt_stub.S */
8923/*
8924 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8925 * any interesting requests and then jump to the real instruction
8926 * handler. Unlike the Arm handler, we can't do this as a tail call
8927 * because rIBASE is caller save and we need to reload it.
8928 *
8929 * Note that unlike in the Arm implementation, we should never arrive
8930 * here with a zero breakFlag because we always refresh rIBASE on
8931 * return.
8932 */
8933 .extern MterpCheckBefore
8934 EXPORT_PC
8935
8936 movl rSELF, %ecx
8937 movl %ecx, OUT_ARG0(%esp)
8938 leal OFF_FP_SHADOWFRAME(rFP), %eax
8939 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06008940 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00008941 REFRESH_IBASE
8942 jmp .L_op_nop+(101*128)
8943
8944/* ------------------------------ */
8945 .balign 128
8946.L_ALT_op_sget_short: /* 0x66 */
8947/* File: x86/alt_stub.S */
8948/*
8949 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8950 * any interesting requests and then jump to the real instruction
8951 * handler. Unlike the Arm handler, we can't do this as a tail call
8952 * because rIBASE is caller save and we need to reload it.
8953 *
8954 * Note that unlike in the Arm implementation, we should never arrive
8955 * here with a zero breakFlag because we always refresh rIBASE on
8956 * return.
8957 */
8958 .extern MterpCheckBefore
8959 EXPORT_PC
8960
8961 movl rSELF, %ecx
8962 movl %ecx, OUT_ARG0(%esp)
8963 leal OFF_FP_SHADOWFRAME(rFP), %eax
8964 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06008965 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00008966 REFRESH_IBASE
8967 jmp .L_op_nop+(102*128)
8968
8969/* ------------------------------ */
8970 .balign 128
8971.L_ALT_op_sput: /* 0x67 */
8972/* File: x86/alt_stub.S */
8973/*
8974 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8975 * any interesting requests and then jump to the real instruction
8976 * handler. Unlike the Arm handler, we can't do this as a tail call
8977 * because rIBASE is caller save and we need to reload it.
8978 *
8979 * Note that unlike in the Arm implementation, we should never arrive
8980 * here with a zero breakFlag because we always refresh rIBASE on
8981 * return.
8982 */
8983 .extern MterpCheckBefore
8984 EXPORT_PC
8985
8986 movl rSELF, %ecx
8987 movl %ecx, OUT_ARG0(%esp)
8988 leal OFF_FP_SHADOWFRAME(rFP), %eax
8989 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06008990 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00008991 REFRESH_IBASE
8992 jmp .L_op_nop+(103*128)
8993
8994/* ------------------------------ */
8995 .balign 128
8996.L_ALT_op_sput_wide: /* 0x68 */
8997/* File: x86/alt_stub.S */
8998/*
8999 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9000 * any interesting requests and then jump to the real instruction
9001 * handler. Unlike the Arm handler, we can't do this as a tail call
9002 * because rIBASE is caller save and we need to reload it.
9003 *
9004 * Note that unlike in the Arm implementation, we should never arrive
9005 * here with a zero breakFlag because we always refresh rIBASE on
9006 * return.
9007 */
9008 .extern MterpCheckBefore
9009 EXPORT_PC
9010
9011 movl rSELF, %ecx
9012 movl %ecx, OUT_ARG0(%esp)
9013 leal OFF_FP_SHADOWFRAME(rFP), %eax
9014 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06009015 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00009016 REFRESH_IBASE
9017 jmp .L_op_nop+(104*128)
9018
9019/* ------------------------------ */
9020 .balign 128
9021.L_ALT_op_sput_object: /* 0x69 */
9022/* File: x86/alt_stub.S */
9023/*
9024 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9025 * any interesting requests and then jump to the real instruction
9026 * handler. Unlike the Arm handler, we can't do this as a tail call
9027 * because rIBASE is caller save and we need to reload it.
9028 *
9029 * Note that unlike in the Arm implementation, we should never arrive
9030 * here with a zero breakFlag because we always refresh rIBASE on
9031 * return.
9032 */
9033 .extern MterpCheckBefore
9034 EXPORT_PC
9035
9036 movl rSELF, %ecx
9037 movl %ecx, OUT_ARG0(%esp)
9038 leal OFF_FP_SHADOWFRAME(rFP), %eax
9039 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06009040 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00009041 REFRESH_IBASE
9042 jmp .L_op_nop+(105*128)
9043
9044/* ------------------------------ */
9045 .balign 128
9046.L_ALT_op_sput_boolean: /* 0x6a */
9047/* File: x86/alt_stub.S */
9048/*
9049 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9050 * any interesting requests and then jump to the real instruction
9051 * handler. Unlike the Arm handler, we can't do this as a tail call
9052 * because rIBASE is caller save and we need to reload it.
9053 *
9054 * Note that unlike in the Arm implementation, we should never arrive
9055 * here with a zero breakFlag because we always refresh rIBASE on
9056 * return.
9057 */
9058 .extern MterpCheckBefore
9059 EXPORT_PC
9060
9061 movl rSELF, %ecx
9062 movl %ecx, OUT_ARG0(%esp)
9063 leal OFF_FP_SHADOWFRAME(rFP), %eax
9064 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06009065 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00009066 REFRESH_IBASE
9067 jmp .L_op_nop+(106*128)
9068
9069/* ------------------------------ */
9070 .balign 128
9071.L_ALT_op_sput_byte: /* 0x6b */
9072/* File: x86/alt_stub.S */
9073/*
9074 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9075 * any interesting requests and then jump to the real instruction
9076 * handler. Unlike the Arm handler, we can't do this as a tail call
9077 * because rIBASE is caller save and we need to reload it.
9078 *
9079 * Note that unlike in the Arm implementation, we should never arrive
9080 * here with a zero breakFlag because we always refresh rIBASE on
9081 * return.
9082 */
9083 .extern MterpCheckBefore
9084 EXPORT_PC
9085
9086 movl rSELF, %ecx
9087 movl %ecx, OUT_ARG0(%esp)
9088 leal OFF_FP_SHADOWFRAME(rFP), %eax
9089 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06009090 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00009091 REFRESH_IBASE
9092 jmp .L_op_nop+(107*128)
9093
9094/* ------------------------------ */
9095 .balign 128
9096.L_ALT_op_sput_char: /* 0x6c */
9097/* File: x86/alt_stub.S */
9098/*
9099 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9100 * any interesting requests and then jump to the real instruction
9101 * handler. Unlike the Arm handler, we can't do this as a tail call
9102 * because rIBASE is caller save and we need to reload it.
9103 *
9104 * Note that unlike in the Arm implementation, we should never arrive
9105 * here with a zero breakFlag because we always refresh rIBASE on
9106 * return.
9107 */
9108 .extern MterpCheckBefore
9109 EXPORT_PC
9110
9111 movl rSELF, %ecx
9112 movl %ecx, OUT_ARG0(%esp)
9113 leal OFF_FP_SHADOWFRAME(rFP), %eax
9114 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06009115 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00009116 REFRESH_IBASE
9117 jmp .L_op_nop+(108*128)
9118
9119/* ------------------------------ */
9120 .balign 128
9121.L_ALT_op_sput_short: /* 0x6d */
9122/* File: x86/alt_stub.S */
9123/*
9124 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9125 * any interesting requests and then jump to the real instruction
9126 * handler. Unlike the Arm handler, we can't do this as a tail call
9127 * because rIBASE is caller save and we need to reload it.
9128 *
9129 * Note that unlike in the Arm implementation, we should never arrive
9130 * here with a zero breakFlag because we always refresh rIBASE on
9131 * return.
9132 */
9133 .extern MterpCheckBefore
9134 EXPORT_PC
9135
9136 movl rSELF, %ecx
9137 movl %ecx, OUT_ARG0(%esp)
9138 leal OFF_FP_SHADOWFRAME(rFP), %eax
9139 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06009140 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00009141 REFRESH_IBASE
9142 jmp .L_op_nop+(109*128)
9143
9144/* ------------------------------ */
9145 .balign 128
9146.L_ALT_op_invoke_virtual: /* 0x6e */
9147/* File: x86/alt_stub.S */
9148/*
9149 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9150 * any interesting requests and then jump to the real instruction
9151 * handler. Unlike the Arm handler, we can't do this as a tail call
9152 * because rIBASE is caller save and we need to reload it.
9153 *
9154 * Note that unlike in the Arm implementation, we should never arrive
9155 * here with a zero breakFlag because we always refresh rIBASE on
9156 * return.
9157 */
9158 .extern MterpCheckBefore
9159 EXPORT_PC
9160
9161 movl rSELF, %ecx
9162 movl %ecx, OUT_ARG0(%esp)
9163 leal OFF_FP_SHADOWFRAME(rFP), %eax
9164 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06009165 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00009166 REFRESH_IBASE
9167 jmp .L_op_nop+(110*128)
9168
9169/* ------------------------------ */
9170 .balign 128
9171.L_ALT_op_invoke_super: /* 0x6f */
9172/* File: x86/alt_stub.S */
9173/*
9174 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9175 * any interesting requests and then jump to the real instruction
9176 * handler. Unlike the Arm handler, we can't do this as a tail call
9177 * because rIBASE is caller save and we need to reload it.
9178 *
9179 * Note that unlike in the Arm implementation, we should never arrive
9180 * here with a zero breakFlag because we always refresh rIBASE on
9181 * return.
9182 */
9183 .extern MterpCheckBefore
9184 EXPORT_PC
9185
9186 movl rSELF, %ecx
9187 movl %ecx, OUT_ARG0(%esp)
9188 leal OFF_FP_SHADOWFRAME(rFP), %eax
9189 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06009190 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00009191 REFRESH_IBASE
9192 jmp .L_op_nop+(111*128)
9193
9194/* ------------------------------ */
9195 .balign 128
9196.L_ALT_op_invoke_direct: /* 0x70 */
9197/* File: x86/alt_stub.S */
9198/*
9199 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9200 * any interesting requests and then jump to the real instruction
9201 * handler. Unlike the Arm handler, we can't do this as a tail call
9202 * because rIBASE is caller save and we need to reload it.
9203 *
9204 * Note that unlike in the Arm implementation, we should never arrive
9205 * here with a zero breakFlag because we always refresh rIBASE on
9206 * return.
9207 */
9208 .extern MterpCheckBefore
9209 EXPORT_PC
9210
9211 movl rSELF, %ecx
9212 movl %ecx, OUT_ARG0(%esp)
9213 leal OFF_FP_SHADOWFRAME(rFP), %eax
9214 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06009215 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00009216 REFRESH_IBASE
9217 jmp .L_op_nop+(112*128)
9218
9219/* ------------------------------ */
9220 .balign 128
9221.L_ALT_op_invoke_static: /* 0x71 */
9222/* File: x86/alt_stub.S */
9223/*
9224 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9225 * any interesting requests and then jump to the real instruction
9226 * handler. Unlike the Arm handler, we can't do this as a tail call
9227 * because rIBASE is caller save and we need to reload it.
9228 *
9229 * Note that unlike in the Arm implementation, we should never arrive
9230 * here with a zero breakFlag because we always refresh rIBASE on
9231 * return.
9232 */
9233 .extern MterpCheckBefore
9234 EXPORT_PC
9235
9236 movl rSELF, %ecx
9237 movl %ecx, OUT_ARG0(%esp)
9238 leal OFF_FP_SHADOWFRAME(rFP), %eax
9239 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06009240 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00009241 REFRESH_IBASE
9242 jmp .L_op_nop+(113*128)
9243
9244/* ------------------------------ */
9245 .balign 128
9246.L_ALT_op_invoke_interface: /* 0x72 */
9247/* File: x86/alt_stub.S */
9248/*
9249 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9250 * any interesting requests and then jump to the real instruction
9251 * handler. Unlike the Arm handler, we can't do this as a tail call
9252 * because rIBASE is caller save and we need to reload it.
9253 *
9254 * Note that unlike in the Arm implementation, we should never arrive
9255 * here with a zero breakFlag because we always refresh rIBASE on
9256 * return.
9257 */
9258 .extern MterpCheckBefore
9259 EXPORT_PC
9260
9261 movl rSELF, %ecx
9262 movl %ecx, OUT_ARG0(%esp)
9263 leal OFF_FP_SHADOWFRAME(rFP), %eax
9264 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06009265 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00009266 REFRESH_IBASE
9267 jmp .L_op_nop+(114*128)
9268
9269/* ------------------------------ */
9270 .balign 128
9271.L_ALT_op_return_void_no_barrier: /* 0x73 */
9272/* File: x86/alt_stub.S */
9273/*
9274 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9275 * any interesting requests and then jump to the real instruction
9276 * handler. Unlike the Arm handler, we can't do this as a tail call
9277 * because rIBASE is caller save and we need to reload it.
9278 *
9279 * Note that unlike in the Arm implementation, we should never arrive
9280 * here with a zero breakFlag because we always refresh rIBASE on
9281 * return.
9282 */
9283 .extern MterpCheckBefore
9284 EXPORT_PC
9285
9286 movl rSELF, %ecx
9287 movl %ecx, OUT_ARG0(%esp)
9288 leal OFF_FP_SHADOWFRAME(rFP), %eax
9289 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06009290 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00009291 REFRESH_IBASE
9292 jmp .L_op_nop+(115*128)
9293
9294/* ------------------------------ */
9295 .balign 128
9296.L_ALT_op_invoke_virtual_range: /* 0x74 */
9297/* File: x86/alt_stub.S */
9298/*
9299 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9300 * any interesting requests and then jump to the real instruction
9301 * handler. Unlike the Arm handler, we can't do this as a tail call
9302 * because rIBASE is caller save and we need to reload it.
9303 *
9304 * Note that unlike in the Arm implementation, we should never arrive
9305 * here with a zero breakFlag because we always refresh rIBASE on
9306 * return.
9307 */
9308 .extern MterpCheckBefore
9309 EXPORT_PC
9310
9311 movl rSELF, %ecx
9312 movl %ecx, OUT_ARG0(%esp)
9313 leal OFF_FP_SHADOWFRAME(rFP), %eax
9314 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06009315 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00009316 REFRESH_IBASE
9317 jmp .L_op_nop+(116*128)
9318
9319/* ------------------------------ */
9320 .balign 128
9321.L_ALT_op_invoke_super_range: /* 0x75 */
9322/* File: x86/alt_stub.S */
9323/*
9324 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9325 * any interesting requests and then jump to the real instruction
9326 * handler. Unlike the Arm handler, we can't do this as a tail call
9327 * because rIBASE is caller save and we need to reload it.
9328 *
9329 * Note that unlike in the Arm implementation, we should never arrive
9330 * here with a zero breakFlag because we always refresh rIBASE on
9331 * return.
9332 */
9333 .extern MterpCheckBefore
9334 EXPORT_PC
9335
9336 movl rSELF, %ecx
9337 movl %ecx, OUT_ARG0(%esp)
9338 leal OFF_FP_SHADOWFRAME(rFP), %eax
9339 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06009340 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00009341 REFRESH_IBASE
9342 jmp .L_op_nop+(117*128)
9343
9344/* ------------------------------ */
9345 .balign 128
9346.L_ALT_op_invoke_direct_range: /* 0x76 */
9347/* File: x86/alt_stub.S */
9348/*
9349 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9350 * any interesting requests and then jump to the real instruction
9351 * handler. Unlike the Arm handler, we can't do this as a tail call
9352 * because rIBASE is caller save and we need to reload it.
9353 *
9354 * Note that unlike in the Arm implementation, we should never arrive
9355 * here with a zero breakFlag because we always refresh rIBASE on
9356 * return.
9357 */
9358 .extern MterpCheckBefore
9359 EXPORT_PC
9360
9361 movl rSELF, %ecx
9362 movl %ecx, OUT_ARG0(%esp)
9363 leal OFF_FP_SHADOWFRAME(rFP), %eax
9364 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06009365 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00009366 REFRESH_IBASE
9367 jmp .L_op_nop+(118*128)
9368
9369/* ------------------------------ */
9370 .balign 128
9371.L_ALT_op_invoke_static_range: /* 0x77 */
9372/* File: x86/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. Unlike the Arm handler, we can't do this as a tail call
9377 * because rIBASE is caller save and we need to reload it.
9378 *
9379 * Note that unlike in the Arm implementation, we should never arrive
9380 * here with a zero breakFlag because we always refresh rIBASE on
9381 * return.
9382 */
9383 .extern MterpCheckBefore
9384 EXPORT_PC
9385
9386 movl rSELF, %ecx
9387 movl %ecx, OUT_ARG0(%esp)
9388 leal OFF_FP_SHADOWFRAME(rFP), %eax
9389 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06009390 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00009391 REFRESH_IBASE
9392 jmp .L_op_nop+(119*128)
9393
9394/* ------------------------------ */
9395 .balign 128
9396.L_ALT_op_invoke_interface_range: /* 0x78 */
9397/* File: x86/alt_stub.S */
9398/*
9399 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9400 * any interesting requests and then jump to the real instruction
9401 * handler. Unlike the Arm handler, we can't do this as a tail call
9402 * because rIBASE is caller save and we need to reload it.
9403 *
9404 * Note that unlike in the Arm implementation, we should never arrive
9405 * here with a zero breakFlag because we always refresh rIBASE on
9406 * return.
9407 */
9408 .extern MterpCheckBefore
9409 EXPORT_PC
9410
9411 movl rSELF, %ecx
9412 movl %ecx, OUT_ARG0(%esp)
9413 leal OFF_FP_SHADOWFRAME(rFP), %eax
9414 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06009415 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00009416 REFRESH_IBASE
9417 jmp .L_op_nop+(120*128)
9418
9419/* ------------------------------ */
9420 .balign 128
9421.L_ALT_op_unused_79: /* 0x79 */
9422/* File: x86/alt_stub.S */
9423/*
9424 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9425 * any interesting requests and then jump to the real instruction
9426 * handler. Unlike the Arm handler, we can't do this as a tail call
9427 * because rIBASE is caller save and we need to reload it.
9428 *
9429 * Note that unlike in the Arm implementation, we should never arrive
9430 * here with a zero breakFlag because we always refresh rIBASE on
9431 * return.
9432 */
9433 .extern MterpCheckBefore
9434 EXPORT_PC
9435
9436 movl rSELF, %ecx
9437 movl %ecx, OUT_ARG0(%esp)
9438 leal OFF_FP_SHADOWFRAME(rFP), %eax
9439 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06009440 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00009441 REFRESH_IBASE
9442 jmp .L_op_nop+(121*128)
9443
9444/* ------------------------------ */
9445 .balign 128
9446.L_ALT_op_unused_7a: /* 0x7a */
9447/* File: x86/alt_stub.S */
9448/*
9449 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9450 * any interesting requests and then jump to the real instruction
9451 * handler. Unlike the Arm handler, we can't do this as a tail call
9452 * because rIBASE is caller save and we need to reload it.
9453 *
9454 * Note that unlike in the Arm implementation, we should never arrive
9455 * here with a zero breakFlag because we always refresh rIBASE on
9456 * return.
9457 */
9458 .extern MterpCheckBefore
9459 EXPORT_PC
9460
9461 movl rSELF, %ecx
9462 movl %ecx, OUT_ARG0(%esp)
9463 leal OFF_FP_SHADOWFRAME(rFP), %eax
9464 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06009465 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00009466 REFRESH_IBASE
9467 jmp .L_op_nop+(122*128)
9468
9469/* ------------------------------ */
9470 .balign 128
9471.L_ALT_op_neg_int: /* 0x7b */
9472/* File: x86/alt_stub.S */
9473/*
9474 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9475 * any interesting requests and then jump to the real instruction
9476 * handler. Unlike the Arm handler, we can't do this as a tail call
9477 * because rIBASE is caller save and we need to reload it.
9478 *
9479 * Note that unlike in the Arm implementation, we should never arrive
9480 * here with a zero breakFlag because we always refresh rIBASE on
9481 * return.
9482 */
9483 .extern MterpCheckBefore
9484 EXPORT_PC
9485
9486 movl rSELF, %ecx
9487 movl %ecx, OUT_ARG0(%esp)
9488 leal OFF_FP_SHADOWFRAME(rFP), %eax
9489 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06009490 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00009491 REFRESH_IBASE
9492 jmp .L_op_nop+(123*128)
9493
9494/* ------------------------------ */
9495 .balign 128
9496.L_ALT_op_not_int: /* 0x7c */
9497/* File: x86/alt_stub.S */
9498/*
9499 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9500 * any interesting requests and then jump to the real instruction
9501 * handler. Unlike the Arm handler, we can't do this as a tail call
9502 * because rIBASE is caller save and we need to reload it.
9503 *
9504 * Note that unlike in the Arm implementation, we should never arrive
9505 * here with a zero breakFlag because we always refresh rIBASE on
9506 * return.
9507 */
9508 .extern MterpCheckBefore
9509 EXPORT_PC
9510
9511 movl rSELF, %ecx
9512 movl %ecx, OUT_ARG0(%esp)
9513 leal OFF_FP_SHADOWFRAME(rFP), %eax
9514 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06009515 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00009516 REFRESH_IBASE
9517 jmp .L_op_nop+(124*128)
9518
9519/* ------------------------------ */
9520 .balign 128
9521.L_ALT_op_neg_long: /* 0x7d */
9522/* File: x86/alt_stub.S */
9523/*
9524 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9525 * any interesting requests and then jump to the real instruction
9526 * handler. Unlike the Arm handler, we can't do this as a tail call
9527 * because rIBASE is caller save and we need to reload it.
9528 *
9529 * Note that unlike in the Arm implementation, we should never arrive
9530 * here with a zero breakFlag because we always refresh rIBASE on
9531 * return.
9532 */
9533 .extern MterpCheckBefore
9534 EXPORT_PC
9535
9536 movl rSELF, %ecx
9537 movl %ecx, OUT_ARG0(%esp)
9538 leal OFF_FP_SHADOWFRAME(rFP), %eax
9539 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06009540 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00009541 REFRESH_IBASE
9542 jmp .L_op_nop+(125*128)
9543
9544/* ------------------------------ */
9545 .balign 128
9546.L_ALT_op_not_long: /* 0x7e */
9547/* File: x86/alt_stub.S */
9548/*
9549 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9550 * any interesting requests and then jump to the real instruction
9551 * handler. Unlike the Arm handler, we can't do this as a tail call
9552 * because rIBASE is caller save and we need to reload it.
9553 *
9554 * Note that unlike in the Arm implementation, we should never arrive
9555 * here with a zero breakFlag because we always refresh rIBASE on
9556 * return.
9557 */
9558 .extern MterpCheckBefore
9559 EXPORT_PC
9560
9561 movl rSELF, %ecx
9562 movl %ecx, OUT_ARG0(%esp)
9563 leal OFF_FP_SHADOWFRAME(rFP), %eax
9564 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06009565 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00009566 REFRESH_IBASE
9567 jmp .L_op_nop+(126*128)
9568
9569/* ------------------------------ */
9570 .balign 128
9571.L_ALT_op_neg_float: /* 0x7f */
9572/* File: x86/alt_stub.S */
9573/*
9574 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9575 * any interesting requests and then jump to the real instruction
9576 * handler. Unlike the Arm handler, we can't do this as a tail call
9577 * because rIBASE is caller save and we need to reload it.
9578 *
9579 * Note that unlike in the Arm implementation, we should never arrive
9580 * here with a zero breakFlag because we always refresh rIBASE on
9581 * return.
9582 */
9583 .extern MterpCheckBefore
9584 EXPORT_PC
9585
9586 movl rSELF, %ecx
9587 movl %ecx, OUT_ARG0(%esp)
9588 leal OFF_FP_SHADOWFRAME(rFP), %eax
9589 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06009590 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00009591 REFRESH_IBASE
9592 jmp .L_op_nop+(127*128)
9593
9594/* ------------------------------ */
9595 .balign 128
9596.L_ALT_op_neg_double: /* 0x80 */
9597/* File: x86/alt_stub.S */
9598/*
9599 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9600 * any interesting requests and then jump to the real instruction
9601 * handler. Unlike the Arm handler, we can't do this as a tail call
9602 * because rIBASE is caller save and we need to reload it.
9603 *
9604 * Note that unlike in the Arm implementation, we should never arrive
9605 * here with a zero breakFlag because we always refresh rIBASE on
9606 * return.
9607 */
9608 .extern MterpCheckBefore
9609 EXPORT_PC
9610
9611 movl rSELF, %ecx
9612 movl %ecx, OUT_ARG0(%esp)
9613 leal OFF_FP_SHADOWFRAME(rFP), %eax
9614 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06009615 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00009616 REFRESH_IBASE
9617 jmp .L_op_nop+(128*128)
9618
9619/* ------------------------------ */
9620 .balign 128
9621.L_ALT_op_int_to_long: /* 0x81 */
9622/* File: x86/alt_stub.S */
9623/*
9624 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9625 * any interesting requests and then jump to the real instruction
9626 * handler. Unlike the Arm handler, we can't do this as a tail call
9627 * because rIBASE is caller save and we need to reload it.
9628 *
9629 * Note that unlike in the Arm implementation, we should never arrive
9630 * here with a zero breakFlag because we always refresh rIBASE on
9631 * return.
9632 */
9633 .extern MterpCheckBefore
9634 EXPORT_PC
9635
9636 movl rSELF, %ecx
9637 movl %ecx, OUT_ARG0(%esp)
9638 leal OFF_FP_SHADOWFRAME(rFP), %eax
9639 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06009640 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00009641 REFRESH_IBASE
9642 jmp .L_op_nop+(129*128)
9643
9644/* ------------------------------ */
9645 .balign 128
9646.L_ALT_op_int_to_float: /* 0x82 */
9647/* File: x86/alt_stub.S */
9648/*
9649 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9650 * any interesting requests and then jump to the real instruction
9651 * handler. Unlike the Arm handler, we can't do this as a tail call
9652 * because rIBASE is caller save and we need to reload it.
9653 *
9654 * Note that unlike in the Arm implementation, we should never arrive
9655 * here with a zero breakFlag because we always refresh rIBASE on
9656 * return.
9657 */
9658 .extern MterpCheckBefore
9659 EXPORT_PC
9660
9661 movl rSELF, %ecx
9662 movl %ecx, OUT_ARG0(%esp)
9663 leal OFF_FP_SHADOWFRAME(rFP), %eax
9664 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06009665 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00009666 REFRESH_IBASE
9667 jmp .L_op_nop+(130*128)
9668
9669/* ------------------------------ */
9670 .balign 128
9671.L_ALT_op_int_to_double: /* 0x83 */
9672/* File: x86/alt_stub.S */
9673/*
9674 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9675 * any interesting requests and then jump to the real instruction
9676 * handler. Unlike the Arm handler, we can't do this as a tail call
9677 * because rIBASE is caller save and we need to reload it.
9678 *
9679 * Note that unlike in the Arm implementation, we should never arrive
9680 * here with a zero breakFlag because we always refresh rIBASE on
9681 * return.
9682 */
9683 .extern MterpCheckBefore
9684 EXPORT_PC
9685
9686 movl rSELF, %ecx
9687 movl %ecx, OUT_ARG0(%esp)
9688 leal OFF_FP_SHADOWFRAME(rFP), %eax
9689 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06009690 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00009691 REFRESH_IBASE
9692 jmp .L_op_nop+(131*128)
9693
9694/* ------------------------------ */
9695 .balign 128
9696.L_ALT_op_long_to_int: /* 0x84 */
9697/* File: x86/alt_stub.S */
9698/*
9699 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9700 * any interesting requests and then jump to the real instruction
9701 * handler. Unlike the Arm handler, we can't do this as a tail call
9702 * because rIBASE is caller save and we need to reload it.
9703 *
9704 * Note that unlike in the Arm implementation, we should never arrive
9705 * here with a zero breakFlag because we always refresh rIBASE on
9706 * return.
9707 */
9708 .extern MterpCheckBefore
9709 EXPORT_PC
9710
9711 movl rSELF, %ecx
9712 movl %ecx, OUT_ARG0(%esp)
9713 leal OFF_FP_SHADOWFRAME(rFP), %eax
9714 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06009715 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00009716 REFRESH_IBASE
9717 jmp .L_op_nop+(132*128)
9718
9719/* ------------------------------ */
9720 .balign 128
9721.L_ALT_op_long_to_float: /* 0x85 */
9722/* File: x86/alt_stub.S */
9723/*
9724 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9725 * any interesting requests and then jump to the real instruction
9726 * handler. Unlike the Arm handler, we can't do this as a tail call
9727 * because rIBASE is caller save and we need to reload it.
9728 *
9729 * Note that unlike in the Arm implementation, we should never arrive
9730 * here with a zero breakFlag because we always refresh rIBASE on
9731 * return.
9732 */
9733 .extern MterpCheckBefore
9734 EXPORT_PC
9735
9736 movl rSELF, %ecx
9737 movl %ecx, OUT_ARG0(%esp)
9738 leal OFF_FP_SHADOWFRAME(rFP), %eax
9739 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06009740 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00009741 REFRESH_IBASE
9742 jmp .L_op_nop+(133*128)
9743
9744/* ------------------------------ */
9745 .balign 128
9746.L_ALT_op_long_to_double: /* 0x86 */
9747/* File: x86/alt_stub.S */
9748/*
9749 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9750 * any interesting requests and then jump to the real instruction
9751 * handler. Unlike the Arm handler, we can't do this as a tail call
9752 * because rIBASE is caller save and we need to reload it.
9753 *
9754 * Note that unlike in the Arm implementation, we should never arrive
9755 * here with a zero breakFlag because we always refresh rIBASE on
9756 * return.
9757 */
9758 .extern MterpCheckBefore
9759 EXPORT_PC
9760
9761 movl rSELF, %ecx
9762 movl %ecx, OUT_ARG0(%esp)
9763 leal OFF_FP_SHADOWFRAME(rFP), %eax
9764 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06009765 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00009766 REFRESH_IBASE
9767 jmp .L_op_nop+(134*128)
9768
9769/* ------------------------------ */
9770 .balign 128
9771.L_ALT_op_float_to_int: /* 0x87 */
9772/* File: x86/alt_stub.S */
9773/*
9774 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9775 * any interesting requests and then jump to the real instruction
9776 * handler. Unlike the Arm handler, we can't do this as a tail call
9777 * because rIBASE is caller save and we need to reload it.
9778 *
9779 * Note that unlike in the Arm implementation, we should never arrive
9780 * here with a zero breakFlag because we always refresh rIBASE on
9781 * return.
9782 */
9783 .extern MterpCheckBefore
9784 EXPORT_PC
9785
9786 movl rSELF, %ecx
9787 movl %ecx, OUT_ARG0(%esp)
9788 leal OFF_FP_SHADOWFRAME(rFP), %eax
9789 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06009790 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00009791 REFRESH_IBASE
9792 jmp .L_op_nop+(135*128)
9793
9794/* ------------------------------ */
9795 .balign 128
9796.L_ALT_op_float_to_long: /* 0x88 */
9797/* File: x86/alt_stub.S */
9798/*
9799 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9800 * any interesting requests and then jump to the real instruction
9801 * handler. Unlike the Arm handler, we can't do this as a tail call
9802 * because rIBASE is caller save and we need to reload it.
9803 *
9804 * Note that unlike in the Arm implementation, we should never arrive
9805 * here with a zero breakFlag because we always refresh rIBASE on
9806 * return.
9807 */
9808 .extern MterpCheckBefore
9809 EXPORT_PC
9810
9811 movl rSELF, %ecx
9812 movl %ecx, OUT_ARG0(%esp)
9813 leal OFF_FP_SHADOWFRAME(rFP), %eax
9814 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06009815 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00009816 REFRESH_IBASE
9817 jmp .L_op_nop+(136*128)
9818
9819/* ------------------------------ */
9820 .balign 128
9821.L_ALT_op_float_to_double: /* 0x89 */
9822/* File: x86/alt_stub.S */
9823/*
9824 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9825 * any interesting requests and then jump to the real instruction
9826 * handler. Unlike the Arm handler, we can't do this as a tail call
9827 * because rIBASE is caller save and we need to reload it.
9828 *
9829 * Note that unlike in the Arm implementation, we should never arrive
9830 * here with a zero breakFlag because we always refresh rIBASE on
9831 * return.
9832 */
9833 .extern MterpCheckBefore
9834 EXPORT_PC
9835
9836 movl rSELF, %ecx
9837 movl %ecx, OUT_ARG0(%esp)
9838 leal OFF_FP_SHADOWFRAME(rFP), %eax
9839 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06009840 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00009841 REFRESH_IBASE
9842 jmp .L_op_nop+(137*128)
9843
9844/* ------------------------------ */
9845 .balign 128
9846.L_ALT_op_double_to_int: /* 0x8a */
9847/* File: x86/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. Unlike the Arm handler, we can't do this as a tail call
9852 * because rIBASE is caller save and we need to reload it.
9853 *
9854 * Note that unlike in the Arm implementation, we should never arrive
9855 * here with a zero breakFlag because we always refresh rIBASE on
9856 * return.
9857 */
9858 .extern MterpCheckBefore
9859 EXPORT_PC
9860
9861 movl rSELF, %ecx
9862 movl %ecx, OUT_ARG0(%esp)
9863 leal OFF_FP_SHADOWFRAME(rFP), %eax
9864 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06009865 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00009866 REFRESH_IBASE
9867 jmp .L_op_nop+(138*128)
9868
9869/* ------------------------------ */
9870 .balign 128
9871.L_ALT_op_double_to_long: /* 0x8b */
9872/* File: x86/alt_stub.S */
9873/*
9874 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9875 * any interesting requests and then jump to the real instruction
9876 * handler. Unlike the Arm handler, we can't do this as a tail call
9877 * because rIBASE is caller save and we need to reload it.
9878 *
9879 * Note that unlike in the Arm implementation, we should never arrive
9880 * here with a zero breakFlag because we always refresh rIBASE on
9881 * return.
9882 */
9883 .extern MterpCheckBefore
9884 EXPORT_PC
9885
9886 movl rSELF, %ecx
9887 movl %ecx, OUT_ARG0(%esp)
9888 leal OFF_FP_SHADOWFRAME(rFP), %eax
9889 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06009890 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00009891 REFRESH_IBASE
9892 jmp .L_op_nop+(139*128)
9893
9894/* ------------------------------ */
9895 .balign 128
9896.L_ALT_op_double_to_float: /* 0x8c */
9897/* File: x86/alt_stub.S */
9898/*
9899 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9900 * any interesting requests and then jump to the real instruction
9901 * handler. Unlike the Arm handler, we can't do this as a tail call
9902 * because rIBASE is caller save and we need to reload it.
9903 *
9904 * Note that unlike in the Arm implementation, we should never arrive
9905 * here with a zero breakFlag because we always refresh rIBASE on
9906 * return.
9907 */
9908 .extern MterpCheckBefore
9909 EXPORT_PC
9910
9911 movl rSELF, %ecx
9912 movl %ecx, OUT_ARG0(%esp)
9913 leal OFF_FP_SHADOWFRAME(rFP), %eax
9914 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06009915 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00009916 REFRESH_IBASE
9917 jmp .L_op_nop+(140*128)
9918
9919/* ------------------------------ */
9920 .balign 128
9921.L_ALT_op_int_to_byte: /* 0x8d */
9922/* File: x86/alt_stub.S */
9923/*
9924 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9925 * any interesting requests and then jump to the real instruction
9926 * handler. Unlike the Arm handler, we can't do this as a tail call
9927 * because rIBASE is caller save and we need to reload it.
9928 *
9929 * Note that unlike in the Arm implementation, we should never arrive
9930 * here with a zero breakFlag because we always refresh rIBASE on
9931 * return.
9932 */
9933 .extern MterpCheckBefore
9934 EXPORT_PC
9935
9936 movl rSELF, %ecx
9937 movl %ecx, OUT_ARG0(%esp)
9938 leal OFF_FP_SHADOWFRAME(rFP), %eax
9939 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06009940 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00009941 REFRESH_IBASE
9942 jmp .L_op_nop+(141*128)
9943
9944/* ------------------------------ */
9945 .balign 128
9946.L_ALT_op_int_to_char: /* 0x8e */
9947/* File: x86/alt_stub.S */
9948/*
9949 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9950 * any interesting requests and then jump to the real instruction
9951 * handler. Unlike the Arm handler, we can't do this as a tail call
9952 * because rIBASE is caller save and we need to reload it.
9953 *
9954 * Note that unlike in the Arm implementation, we should never arrive
9955 * here with a zero breakFlag because we always refresh rIBASE on
9956 * return.
9957 */
9958 .extern MterpCheckBefore
9959 EXPORT_PC
9960
9961 movl rSELF, %ecx
9962 movl %ecx, OUT_ARG0(%esp)
9963 leal OFF_FP_SHADOWFRAME(rFP), %eax
9964 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06009965 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00009966 REFRESH_IBASE
9967 jmp .L_op_nop+(142*128)
9968
9969/* ------------------------------ */
9970 .balign 128
9971.L_ALT_op_int_to_short: /* 0x8f */
9972/* File: x86/alt_stub.S */
9973/*
9974 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9975 * any interesting requests and then jump to the real instruction
9976 * handler. Unlike the Arm handler, we can't do this as a tail call
9977 * because rIBASE is caller save and we need to reload it.
9978 *
9979 * Note that unlike in the Arm implementation, we should never arrive
9980 * here with a zero breakFlag because we always refresh rIBASE on
9981 * return.
9982 */
9983 .extern MterpCheckBefore
9984 EXPORT_PC
9985
9986 movl rSELF, %ecx
9987 movl %ecx, OUT_ARG0(%esp)
9988 leal OFF_FP_SHADOWFRAME(rFP), %eax
9989 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +06009990 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +00009991 REFRESH_IBASE
9992 jmp .L_op_nop+(143*128)
9993
9994/* ------------------------------ */
9995 .balign 128
9996.L_ALT_op_add_int: /* 0x90 */
9997/* File: x86/alt_stub.S */
9998/*
9999 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10000 * any interesting requests and then jump to the real instruction
10001 * handler. Unlike the Arm handler, we can't do this as a tail call
10002 * because rIBASE is caller save and we need to reload it.
10003 *
10004 * Note that unlike in the Arm implementation, we should never arrive
10005 * here with a zero breakFlag because we always refresh rIBASE on
10006 * return.
10007 */
10008 .extern MterpCheckBefore
10009 EXPORT_PC
10010
10011 movl rSELF, %ecx
10012 movl %ecx, OUT_ARG0(%esp)
10013 leal OFF_FP_SHADOWFRAME(rFP), %eax
10014 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060010015 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000010016 REFRESH_IBASE
10017 jmp .L_op_nop+(144*128)
10018
10019/* ------------------------------ */
10020 .balign 128
10021.L_ALT_op_sub_int: /* 0x91 */
10022/* File: x86/alt_stub.S */
10023/*
10024 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10025 * any interesting requests and then jump to the real instruction
10026 * handler. Unlike the Arm handler, we can't do this as a tail call
10027 * because rIBASE is caller save and we need to reload it.
10028 *
10029 * Note that unlike in the Arm implementation, we should never arrive
10030 * here with a zero breakFlag because we always refresh rIBASE on
10031 * return.
10032 */
10033 .extern MterpCheckBefore
10034 EXPORT_PC
10035
10036 movl rSELF, %ecx
10037 movl %ecx, OUT_ARG0(%esp)
10038 leal OFF_FP_SHADOWFRAME(rFP), %eax
10039 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060010040 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000010041 REFRESH_IBASE
10042 jmp .L_op_nop+(145*128)
10043
10044/* ------------------------------ */
10045 .balign 128
10046.L_ALT_op_mul_int: /* 0x92 */
10047/* File: x86/alt_stub.S */
10048/*
10049 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10050 * any interesting requests and then jump to the real instruction
10051 * handler. Unlike the Arm handler, we can't do this as a tail call
10052 * because rIBASE is caller save and we need to reload it.
10053 *
10054 * Note that unlike in the Arm implementation, we should never arrive
10055 * here with a zero breakFlag because we always refresh rIBASE on
10056 * return.
10057 */
10058 .extern MterpCheckBefore
10059 EXPORT_PC
10060
10061 movl rSELF, %ecx
10062 movl %ecx, OUT_ARG0(%esp)
10063 leal OFF_FP_SHADOWFRAME(rFP), %eax
10064 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060010065 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000010066 REFRESH_IBASE
10067 jmp .L_op_nop+(146*128)
10068
10069/* ------------------------------ */
10070 .balign 128
10071.L_ALT_op_div_int: /* 0x93 */
10072/* File: x86/alt_stub.S */
10073/*
10074 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10075 * any interesting requests and then jump to the real instruction
10076 * handler. Unlike the Arm handler, we can't do this as a tail call
10077 * because rIBASE is caller save and we need to reload it.
10078 *
10079 * Note that unlike in the Arm implementation, we should never arrive
10080 * here with a zero breakFlag because we always refresh rIBASE on
10081 * return.
10082 */
10083 .extern MterpCheckBefore
10084 EXPORT_PC
10085
10086 movl rSELF, %ecx
10087 movl %ecx, OUT_ARG0(%esp)
10088 leal OFF_FP_SHADOWFRAME(rFP), %eax
10089 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060010090 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000010091 REFRESH_IBASE
10092 jmp .L_op_nop+(147*128)
10093
10094/* ------------------------------ */
10095 .balign 128
10096.L_ALT_op_rem_int: /* 0x94 */
10097/* File: x86/alt_stub.S */
10098/*
10099 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10100 * any interesting requests and then jump to the real instruction
10101 * handler. Unlike the Arm handler, we can't do this as a tail call
10102 * because rIBASE is caller save and we need to reload it.
10103 *
10104 * Note that unlike in the Arm implementation, we should never arrive
10105 * here with a zero breakFlag because we always refresh rIBASE on
10106 * return.
10107 */
10108 .extern MterpCheckBefore
10109 EXPORT_PC
10110
10111 movl rSELF, %ecx
10112 movl %ecx, OUT_ARG0(%esp)
10113 leal OFF_FP_SHADOWFRAME(rFP), %eax
10114 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060010115 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000010116 REFRESH_IBASE
10117 jmp .L_op_nop+(148*128)
10118
10119/* ------------------------------ */
10120 .balign 128
10121.L_ALT_op_and_int: /* 0x95 */
10122/* File: x86/alt_stub.S */
10123/*
10124 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10125 * any interesting requests and then jump to the real instruction
10126 * handler. Unlike the Arm handler, we can't do this as a tail call
10127 * because rIBASE is caller save and we need to reload it.
10128 *
10129 * Note that unlike in the Arm implementation, we should never arrive
10130 * here with a zero breakFlag because we always refresh rIBASE on
10131 * return.
10132 */
10133 .extern MterpCheckBefore
10134 EXPORT_PC
10135
10136 movl rSELF, %ecx
10137 movl %ecx, OUT_ARG0(%esp)
10138 leal OFF_FP_SHADOWFRAME(rFP), %eax
10139 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060010140 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000010141 REFRESH_IBASE
10142 jmp .L_op_nop+(149*128)
10143
10144/* ------------------------------ */
10145 .balign 128
10146.L_ALT_op_or_int: /* 0x96 */
10147/* File: x86/alt_stub.S */
10148/*
10149 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10150 * any interesting requests and then jump to the real instruction
10151 * handler. Unlike the Arm handler, we can't do this as a tail call
10152 * because rIBASE is caller save and we need to reload it.
10153 *
10154 * Note that unlike in the Arm implementation, we should never arrive
10155 * here with a zero breakFlag because we always refresh rIBASE on
10156 * return.
10157 */
10158 .extern MterpCheckBefore
10159 EXPORT_PC
10160
10161 movl rSELF, %ecx
10162 movl %ecx, OUT_ARG0(%esp)
10163 leal OFF_FP_SHADOWFRAME(rFP), %eax
10164 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060010165 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000010166 REFRESH_IBASE
10167 jmp .L_op_nop+(150*128)
10168
10169/* ------------------------------ */
10170 .balign 128
10171.L_ALT_op_xor_int: /* 0x97 */
10172/* File: x86/alt_stub.S */
10173/*
10174 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10175 * any interesting requests and then jump to the real instruction
10176 * handler. Unlike the Arm handler, we can't do this as a tail call
10177 * because rIBASE is caller save and we need to reload it.
10178 *
10179 * Note that unlike in the Arm implementation, we should never arrive
10180 * here with a zero breakFlag because we always refresh rIBASE on
10181 * return.
10182 */
10183 .extern MterpCheckBefore
10184 EXPORT_PC
10185
10186 movl rSELF, %ecx
10187 movl %ecx, OUT_ARG0(%esp)
10188 leal OFF_FP_SHADOWFRAME(rFP), %eax
10189 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060010190 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000010191 REFRESH_IBASE
10192 jmp .L_op_nop+(151*128)
10193
10194/* ------------------------------ */
10195 .balign 128
10196.L_ALT_op_shl_int: /* 0x98 */
10197/* File: x86/alt_stub.S */
10198/*
10199 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10200 * any interesting requests and then jump to the real instruction
10201 * handler. Unlike the Arm handler, we can't do this as a tail call
10202 * because rIBASE is caller save and we need to reload it.
10203 *
10204 * Note that unlike in the Arm implementation, we should never arrive
10205 * here with a zero breakFlag because we always refresh rIBASE on
10206 * return.
10207 */
10208 .extern MterpCheckBefore
10209 EXPORT_PC
10210
10211 movl rSELF, %ecx
10212 movl %ecx, OUT_ARG0(%esp)
10213 leal OFF_FP_SHADOWFRAME(rFP), %eax
10214 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060010215 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000010216 REFRESH_IBASE
10217 jmp .L_op_nop+(152*128)
10218
10219/* ------------------------------ */
10220 .balign 128
10221.L_ALT_op_shr_int: /* 0x99 */
10222/* File: x86/alt_stub.S */
10223/*
10224 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10225 * any interesting requests and then jump to the real instruction
10226 * handler. Unlike the Arm handler, we can't do this as a tail call
10227 * because rIBASE is caller save and we need to reload it.
10228 *
10229 * Note that unlike in the Arm implementation, we should never arrive
10230 * here with a zero breakFlag because we always refresh rIBASE on
10231 * return.
10232 */
10233 .extern MterpCheckBefore
10234 EXPORT_PC
10235
10236 movl rSELF, %ecx
10237 movl %ecx, OUT_ARG0(%esp)
10238 leal OFF_FP_SHADOWFRAME(rFP), %eax
10239 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060010240 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000010241 REFRESH_IBASE
10242 jmp .L_op_nop+(153*128)
10243
10244/* ------------------------------ */
10245 .balign 128
10246.L_ALT_op_ushr_int: /* 0x9a */
10247/* File: x86/alt_stub.S */
10248/*
10249 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10250 * any interesting requests and then jump to the real instruction
10251 * handler. Unlike the Arm handler, we can't do this as a tail call
10252 * because rIBASE is caller save and we need to reload it.
10253 *
10254 * Note that unlike in the Arm implementation, we should never arrive
10255 * here with a zero breakFlag because we always refresh rIBASE on
10256 * return.
10257 */
10258 .extern MterpCheckBefore
10259 EXPORT_PC
10260
10261 movl rSELF, %ecx
10262 movl %ecx, OUT_ARG0(%esp)
10263 leal OFF_FP_SHADOWFRAME(rFP), %eax
10264 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060010265 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000010266 REFRESH_IBASE
10267 jmp .L_op_nop+(154*128)
10268
10269/* ------------------------------ */
10270 .balign 128
10271.L_ALT_op_add_long: /* 0x9b */
10272/* File: x86/alt_stub.S */
10273/*
10274 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10275 * any interesting requests and then jump to the real instruction
10276 * handler. Unlike the Arm handler, we can't do this as a tail call
10277 * because rIBASE is caller save and we need to reload it.
10278 *
10279 * Note that unlike in the Arm implementation, we should never arrive
10280 * here with a zero breakFlag because we always refresh rIBASE on
10281 * return.
10282 */
10283 .extern MterpCheckBefore
10284 EXPORT_PC
10285
10286 movl rSELF, %ecx
10287 movl %ecx, OUT_ARG0(%esp)
10288 leal OFF_FP_SHADOWFRAME(rFP), %eax
10289 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060010290 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000010291 REFRESH_IBASE
10292 jmp .L_op_nop+(155*128)
10293
10294/* ------------------------------ */
10295 .balign 128
10296.L_ALT_op_sub_long: /* 0x9c */
10297/* File: x86/alt_stub.S */
10298/*
10299 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10300 * any interesting requests and then jump to the real instruction
10301 * handler. Unlike the Arm handler, we can't do this as a tail call
10302 * because rIBASE is caller save and we need to reload it.
10303 *
10304 * Note that unlike in the Arm implementation, we should never arrive
10305 * here with a zero breakFlag because we always refresh rIBASE on
10306 * return.
10307 */
10308 .extern MterpCheckBefore
10309 EXPORT_PC
10310
10311 movl rSELF, %ecx
10312 movl %ecx, OUT_ARG0(%esp)
10313 leal OFF_FP_SHADOWFRAME(rFP), %eax
10314 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060010315 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000010316 REFRESH_IBASE
10317 jmp .L_op_nop+(156*128)
10318
10319/* ------------------------------ */
10320 .balign 128
10321.L_ALT_op_mul_long: /* 0x9d */
10322/* File: x86/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. Unlike the Arm handler, we can't do this as a tail call
10327 * because rIBASE is caller save and we need to reload it.
10328 *
10329 * Note that unlike in the Arm implementation, we should never arrive
10330 * here with a zero breakFlag because we always refresh rIBASE on
10331 * return.
10332 */
10333 .extern MterpCheckBefore
10334 EXPORT_PC
10335
10336 movl rSELF, %ecx
10337 movl %ecx, OUT_ARG0(%esp)
10338 leal OFF_FP_SHADOWFRAME(rFP), %eax
10339 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060010340 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000010341 REFRESH_IBASE
10342 jmp .L_op_nop+(157*128)
10343
10344/* ------------------------------ */
10345 .balign 128
10346.L_ALT_op_div_long: /* 0x9e */
10347/* File: x86/alt_stub.S */
10348/*
10349 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10350 * any interesting requests and then jump to the real instruction
10351 * handler. Unlike the Arm handler, we can't do this as a tail call
10352 * because rIBASE is caller save and we need to reload it.
10353 *
10354 * Note that unlike in the Arm implementation, we should never arrive
10355 * here with a zero breakFlag because we always refresh rIBASE on
10356 * return.
10357 */
10358 .extern MterpCheckBefore
10359 EXPORT_PC
10360
10361 movl rSELF, %ecx
10362 movl %ecx, OUT_ARG0(%esp)
10363 leal OFF_FP_SHADOWFRAME(rFP), %eax
10364 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060010365 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000010366 REFRESH_IBASE
10367 jmp .L_op_nop+(158*128)
10368
10369/* ------------------------------ */
10370 .balign 128
10371.L_ALT_op_rem_long: /* 0x9f */
10372/* File: x86/alt_stub.S */
10373/*
10374 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10375 * any interesting requests and then jump to the real instruction
10376 * handler. Unlike the Arm handler, we can't do this as a tail call
10377 * because rIBASE is caller save and we need to reload it.
10378 *
10379 * Note that unlike in the Arm implementation, we should never arrive
10380 * here with a zero breakFlag because we always refresh rIBASE on
10381 * return.
10382 */
10383 .extern MterpCheckBefore
10384 EXPORT_PC
10385
10386 movl rSELF, %ecx
10387 movl %ecx, OUT_ARG0(%esp)
10388 leal OFF_FP_SHADOWFRAME(rFP), %eax
10389 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060010390 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000010391 REFRESH_IBASE
10392 jmp .L_op_nop+(159*128)
10393
10394/* ------------------------------ */
10395 .balign 128
10396.L_ALT_op_and_long: /* 0xa0 */
10397/* File: x86/alt_stub.S */
10398/*
10399 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10400 * any interesting requests and then jump to the real instruction
10401 * handler. Unlike the Arm handler, we can't do this as a tail call
10402 * because rIBASE is caller save and we need to reload it.
10403 *
10404 * Note that unlike in the Arm implementation, we should never arrive
10405 * here with a zero breakFlag because we always refresh rIBASE on
10406 * return.
10407 */
10408 .extern MterpCheckBefore
10409 EXPORT_PC
10410
10411 movl rSELF, %ecx
10412 movl %ecx, OUT_ARG0(%esp)
10413 leal OFF_FP_SHADOWFRAME(rFP), %eax
10414 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060010415 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000010416 REFRESH_IBASE
10417 jmp .L_op_nop+(160*128)
10418
10419/* ------------------------------ */
10420 .balign 128
10421.L_ALT_op_or_long: /* 0xa1 */
10422/* File: x86/alt_stub.S */
10423/*
10424 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10425 * any interesting requests and then jump to the real instruction
10426 * handler. Unlike the Arm handler, we can't do this as a tail call
10427 * because rIBASE is caller save and we need to reload it.
10428 *
10429 * Note that unlike in the Arm implementation, we should never arrive
10430 * here with a zero breakFlag because we always refresh rIBASE on
10431 * return.
10432 */
10433 .extern MterpCheckBefore
10434 EXPORT_PC
10435
10436 movl rSELF, %ecx
10437 movl %ecx, OUT_ARG0(%esp)
10438 leal OFF_FP_SHADOWFRAME(rFP), %eax
10439 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060010440 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000010441 REFRESH_IBASE
10442 jmp .L_op_nop+(161*128)
10443
10444/* ------------------------------ */
10445 .balign 128
10446.L_ALT_op_xor_long: /* 0xa2 */
10447/* File: x86/alt_stub.S */
10448/*
10449 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10450 * any interesting requests and then jump to the real instruction
10451 * handler. Unlike the Arm handler, we can't do this as a tail call
10452 * because rIBASE is caller save and we need to reload it.
10453 *
10454 * Note that unlike in the Arm implementation, we should never arrive
10455 * here with a zero breakFlag because we always refresh rIBASE on
10456 * return.
10457 */
10458 .extern MterpCheckBefore
10459 EXPORT_PC
10460
10461 movl rSELF, %ecx
10462 movl %ecx, OUT_ARG0(%esp)
10463 leal OFF_FP_SHADOWFRAME(rFP), %eax
10464 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060010465 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000010466 REFRESH_IBASE
10467 jmp .L_op_nop+(162*128)
10468
10469/* ------------------------------ */
10470 .balign 128
10471.L_ALT_op_shl_long: /* 0xa3 */
10472/* File: x86/alt_stub.S */
10473/*
10474 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10475 * any interesting requests and then jump to the real instruction
10476 * handler. Unlike the Arm handler, we can't do this as a tail call
10477 * because rIBASE is caller save and we need to reload it.
10478 *
10479 * Note that unlike in the Arm implementation, we should never arrive
10480 * here with a zero breakFlag because we always refresh rIBASE on
10481 * return.
10482 */
10483 .extern MterpCheckBefore
10484 EXPORT_PC
10485
10486 movl rSELF, %ecx
10487 movl %ecx, OUT_ARG0(%esp)
10488 leal OFF_FP_SHADOWFRAME(rFP), %eax
10489 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060010490 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000010491 REFRESH_IBASE
10492 jmp .L_op_nop+(163*128)
10493
10494/* ------------------------------ */
10495 .balign 128
10496.L_ALT_op_shr_long: /* 0xa4 */
10497/* File: x86/alt_stub.S */
10498/*
10499 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10500 * any interesting requests and then jump to the real instruction
10501 * handler. Unlike the Arm handler, we can't do this as a tail call
10502 * because rIBASE is caller save and we need to reload it.
10503 *
10504 * Note that unlike in the Arm implementation, we should never arrive
10505 * here with a zero breakFlag because we always refresh rIBASE on
10506 * return.
10507 */
10508 .extern MterpCheckBefore
10509 EXPORT_PC
10510
10511 movl rSELF, %ecx
10512 movl %ecx, OUT_ARG0(%esp)
10513 leal OFF_FP_SHADOWFRAME(rFP), %eax
10514 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060010515 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000010516 REFRESH_IBASE
10517 jmp .L_op_nop+(164*128)
10518
10519/* ------------------------------ */
10520 .balign 128
10521.L_ALT_op_ushr_long: /* 0xa5 */
10522/* File: x86/alt_stub.S */
10523/*
10524 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10525 * any interesting requests and then jump to the real instruction
10526 * handler. Unlike the Arm handler, we can't do this as a tail call
10527 * because rIBASE is caller save and we need to reload it.
10528 *
10529 * Note that unlike in the Arm implementation, we should never arrive
10530 * here with a zero breakFlag because we always refresh rIBASE on
10531 * return.
10532 */
10533 .extern MterpCheckBefore
10534 EXPORT_PC
10535
10536 movl rSELF, %ecx
10537 movl %ecx, OUT_ARG0(%esp)
10538 leal OFF_FP_SHADOWFRAME(rFP), %eax
10539 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060010540 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000010541 REFRESH_IBASE
10542 jmp .L_op_nop+(165*128)
10543
10544/* ------------------------------ */
10545 .balign 128
10546.L_ALT_op_add_float: /* 0xa6 */
10547/* File: x86/alt_stub.S */
10548/*
10549 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10550 * any interesting requests and then jump to the real instruction
10551 * handler. Unlike the Arm handler, we can't do this as a tail call
10552 * because rIBASE is caller save and we need to reload it.
10553 *
10554 * Note that unlike in the Arm implementation, we should never arrive
10555 * here with a zero breakFlag because we always refresh rIBASE on
10556 * return.
10557 */
10558 .extern MterpCheckBefore
10559 EXPORT_PC
10560
10561 movl rSELF, %ecx
10562 movl %ecx, OUT_ARG0(%esp)
10563 leal OFF_FP_SHADOWFRAME(rFP), %eax
10564 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060010565 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000010566 REFRESH_IBASE
10567 jmp .L_op_nop+(166*128)
10568
10569/* ------------------------------ */
10570 .balign 128
10571.L_ALT_op_sub_float: /* 0xa7 */
10572/* File: x86/alt_stub.S */
10573/*
10574 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10575 * any interesting requests and then jump to the real instruction
10576 * handler. Unlike the Arm handler, we can't do this as a tail call
10577 * because rIBASE is caller save and we need to reload it.
10578 *
10579 * Note that unlike in the Arm implementation, we should never arrive
10580 * here with a zero breakFlag because we always refresh rIBASE on
10581 * return.
10582 */
10583 .extern MterpCheckBefore
10584 EXPORT_PC
10585
10586 movl rSELF, %ecx
10587 movl %ecx, OUT_ARG0(%esp)
10588 leal OFF_FP_SHADOWFRAME(rFP), %eax
10589 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060010590 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000010591 REFRESH_IBASE
10592 jmp .L_op_nop+(167*128)
10593
10594/* ------------------------------ */
10595 .balign 128
10596.L_ALT_op_mul_float: /* 0xa8 */
10597/* File: x86/alt_stub.S */
10598/*
10599 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10600 * any interesting requests and then jump to the real instruction
10601 * handler. Unlike the Arm handler, we can't do this as a tail call
10602 * because rIBASE is caller save and we need to reload it.
10603 *
10604 * Note that unlike in the Arm implementation, we should never arrive
10605 * here with a zero breakFlag because we always refresh rIBASE on
10606 * return.
10607 */
10608 .extern MterpCheckBefore
10609 EXPORT_PC
10610
10611 movl rSELF, %ecx
10612 movl %ecx, OUT_ARG0(%esp)
10613 leal OFF_FP_SHADOWFRAME(rFP), %eax
10614 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060010615 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000010616 REFRESH_IBASE
10617 jmp .L_op_nop+(168*128)
10618
10619/* ------------------------------ */
10620 .balign 128
10621.L_ALT_op_div_float: /* 0xa9 */
10622/* File: x86/alt_stub.S */
10623/*
10624 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10625 * any interesting requests and then jump to the real instruction
10626 * handler. Unlike the Arm handler, we can't do this as a tail call
10627 * because rIBASE is caller save and we need to reload it.
10628 *
10629 * Note that unlike in the Arm implementation, we should never arrive
10630 * here with a zero breakFlag because we always refresh rIBASE on
10631 * return.
10632 */
10633 .extern MterpCheckBefore
10634 EXPORT_PC
10635
10636 movl rSELF, %ecx
10637 movl %ecx, OUT_ARG0(%esp)
10638 leal OFF_FP_SHADOWFRAME(rFP), %eax
10639 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060010640 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000010641 REFRESH_IBASE
10642 jmp .L_op_nop+(169*128)
10643
10644/* ------------------------------ */
10645 .balign 128
10646.L_ALT_op_rem_float: /* 0xaa */
10647/* File: x86/alt_stub.S */
10648/*
10649 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10650 * any interesting requests and then jump to the real instruction
10651 * handler. Unlike the Arm handler, we can't do this as a tail call
10652 * because rIBASE is caller save and we need to reload it.
10653 *
10654 * Note that unlike in the Arm implementation, we should never arrive
10655 * here with a zero breakFlag because we always refresh rIBASE on
10656 * return.
10657 */
10658 .extern MterpCheckBefore
10659 EXPORT_PC
10660
10661 movl rSELF, %ecx
10662 movl %ecx, OUT_ARG0(%esp)
10663 leal OFF_FP_SHADOWFRAME(rFP), %eax
10664 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060010665 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000010666 REFRESH_IBASE
10667 jmp .L_op_nop+(170*128)
10668
10669/* ------------------------------ */
10670 .balign 128
10671.L_ALT_op_add_double: /* 0xab */
10672/* File: x86/alt_stub.S */
10673/*
10674 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10675 * any interesting requests and then jump to the real instruction
10676 * handler. Unlike the Arm handler, we can't do this as a tail call
10677 * because rIBASE is caller save and we need to reload it.
10678 *
10679 * Note that unlike in the Arm implementation, we should never arrive
10680 * here with a zero breakFlag because we always refresh rIBASE on
10681 * return.
10682 */
10683 .extern MterpCheckBefore
10684 EXPORT_PC
10685
10686 movl rSELF, %ecx
10687 movl %ecx, OUT_ARG0(%esp)
10688 leal OFF_FP_SHADOWFRAME(rFP), %eax
10689 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060010690 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000010691 REFRESH_IBASE
10692 jmp .L_op_nop+(171*128)
10693
10694/* ------------------------------ */
10695 .balign 128
10696.L_ALT_op_sub_double: /* 0xac */
10697/* File: x86/alt_stub.S */
10698/*
10699 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10700 * any interesting requests and then jump to the real instruction
10701 * handler. Unlike the Arm handler, we can't do this as a tail call
10702 * because rIBASE is caller save and we need to reload it.
10703 *
10704 * Note that unlike in the Arm implementation, we should never arrive
10705 * here with a zero breakFlag because we always refresh rIBASE on
10706 * return.
10707 */
10708 .extern MterpCheckBefore
10709 EXPORT_PC
10710
10711 movl rSELF, %ecx
10712 movl %ecx, OUT_ARG0(%esp)
10713 leal OFF_FP_SHADOWFRAME(rFP), %eax
10714 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060010715 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000010716 REFRESH_IBASE
10717 jmp .L_op_nop+(172*128)
10718
10719/* ------------------------------ */
10720 .balign 128
10721.L_ALT_op_mul_double: /* 0xad */
10722/* File: x86/alt_stub.S */
10723/*
10724 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10725 * any interesting requests and then jump to the real instruction
10726 * handler. Unlike the Arm handler, we can't do this as a tail call
10727 * because rIBASE is caller save and we need to reload it.
10728 *
10729 * Note that unlike in the Arm implementation, we should never arrive
10730 * here with a zero breakFlag because we always refresh rIBASE on
10731 * return.
10732 */
10733 .extern MterpCheckBefore
10734 EXPORT_PC
10735
10736 movl rSELF, %ecx
10737 movl %ecx, OUT_ARG0(%esp)
10738 leal OFF_FP_SHADOWFRAME(rFP), %eax
10739 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060010740 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000010741 REFRESH_IBASE
10742 jmp .L_op_nop+(173*128)
10743
10744/* ------------------------------ */
10745 .balign 128
10746.L_ALT_op_div_double: /* 0xae */
10747/* File: x86/alt_stub.S */
10748/*
10749 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10750 * any interesting requests and then jump to the real instruction
10751 * handler. Unlike the Arm handler, we can't do this as a tail call
10752 * because rIBASE is caller save and we need to reload it.
10753 *
10754 * Note that unlike in the Arm implementation, we should never arrive
10755 * here with a zero breakFlag because we always refresh rIBASE on
10756 * return.
10757 */
10758 .extern MterpCheckBefore
10759 EXPORT_PC
10760
10761 movl rSELF, %ecx
10762 movl %ecx, OUT_ARG0(%esp)
10763 leal OFF_FP_SHADOWFRAME(rFP), %eax
10764 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060010765 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000010766 REFRESH_IBASE
10767 jmp .L_op_nop+(174*128)
10768
10769/* ------------------------------ */
10770 .balign 128
10771.L_ALT_op_rem_double: /* 0xaf */
10772/* File: x86/alt_stub.S */
10773/*
10774 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10775 * any interesting requests and then jump to the real instruction
10776 * handler. Unlike the Arm handler, we can't do this as a tail call
10777 * because rIBASE is caller save and we need to reload it.
10778 *
10779 * Note that unlike in the Arm implementation, we should never arrive
10780 * here with a zero breakFlag because we always refresh rIBASE on
10781 * return.
10782 */
10783 .extern MterpCheckBefore
10784 EXPORT_PC
10785
10786 movl rSELF, %ecx
10787 movl %ecx, OUT_ARG0(%esp)
10788 leal OFF_FP_SHADOWFRAME(rFP), %eax
10789 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060010790 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000010791 REFRESH_IBASE
10792 jmp .L_op_nop+(175*128)
10793
10794/* ------------------------------ */
10795 .balign 128
10796.L_ALT_op_add_int_2addr: /* 0xb0 */
10797/* File: x86/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. Unlike the Arm handler, we can't do this as a tail call
10802 * because rIBASE is caller save and we need to reload it.
10803 *
10804 * Note that unlike in the Arm implementation, we should never arrive
10805 * here with a zero breakFlag because we always refresh rIBASE on
10806 * return.
10807 */
10808 .extern MterpCheckBefore
10809 EXPORT_PC
10810
10811 movl rSELF, %ecx
10812 movl %ecx, OUT_ARG0(%esp)
10813 leal OFF_FP_SHADOWFRAME(rFP), %eax
10814 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060010815 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000010816 REFRESH_IBASE
10817 jmp .L_op_nop+(176*128)
10818
10819/* ------------------------------ */
10820 .balign 128
10821.L_ALT_op_sub_int_2addr: /* 0xb1 */
10822/* File: x86/alt_stub.S */
10823/*
10824 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10825 * any interesting requests and then jump to the real instruction
10826 * handler. Unlike the Arm handler, we can't do this as a tail call
10827 * because rIBASE is caller save and we need to reload it.
10828 *
10829 * Note that unlike in the Arm implementation, we should never arrive
10830 * here with a zero breakFlag because we always refresh rIBASE on
10831 * return.
10832 */
10833 .extern MterpCheckBefore
10834 EXPORT_PC
10835
10836 movl rSELF, %ecx
10837 movl %ecx, OUT_ARG0(%esp)
10838 leal OFF_FP_SHADOWFRAME(rFP), %eax
10839 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060010840 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000010841 REFRESH_IBASE
10842 jmp .L_op_nop+(177*128)
10843
10844/* ------------------------------ */
10845 .balign 128
10846.L_ALT_op_mul_int_2addr: /* 0xb2 */
10847/* File: x86/alt_stub.S */
10848/*
10849 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10850 * any interesting requests and then jump to the real instruction
10851 * handler. Unlike the Arm handler, we can't do this as a tail call
10852 * because rIBASE is caller save and we need to reload it.
10853 *
10854 * Note that unlike in the Arm implementation, we should never arrive
10855 * here with a zero breakFlag because we always refresh rIBASE on
10856 * return.
10857 */
10858 .extern MterpCheckBefore
10859 EXPORT_PC
10860
10861 movl rSELF, %ecx
10862 movl %ecx, OUT_ARG0(%esp)
10863 leal OFF_FP_SHADOWFRAME(rFP), %eax
10864 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060010865 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000010866 REFRESH_IBASE
10867 jmp .L_op_nop+(178*128)
10868
10869/* ------------------------------ */
10870 .balign 128
10871.L_ALT_op_div_int_2addr: /* 0xb3 */
10872/* File: x86/alt_stub.S */
10873/*
10874 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10875 * any interesting requests and then jump to the real instruction
10876 * handler. Unlike the Arm handler, we can't do this as a tail call
10877 * because rIBASE is caller save and we need to reload it.
10878 *
10879 * Note that unlike in the Arm implementation, we should never arrive
10880 * here with a zero breakFlag because we always refresh rIBASE on
10881 * return.
10882 */
10883 .extern MterpCheckBefore
10884 EXPORT_PC
10885
10886 movl rSELF, %ecx
10887 movl %ecx, OUT_ARG0(%esp)
10888 leal OFF_FP_SHADOWFRAME(rFP), %eax
10889 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060010890 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000010891 REFRESH_IBASE
10892 jmp .L_op_nop+(179*128)
10893
10894/* ------------------------------ */
10895 .balign 128
10896.L_ALT_op_rem_int_2addr: /* 0xb4 */
10897/* File: x86/alt_stub.S */
10898/*
10899 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10900 * any interesting requests and then jump to the real instruction
10901 * handler. Unlike the Arm handler, we can't do this as a tail call
10902 * because rIBASE is caller save and we need to reload it.
10903 *
10904 * Note that unlike in the Arm implementation, we should never arrive
10905 * here with a zero breakFlag because we always refresh rIBASE on
10906 * return.
10907 */
10908 .extern MterpCheckBefore
10909 EXPORT_PC
10910
10911 movl rSELF, %ecx
10912 movl %ecx, OUT_ARG0(%esp)
10913 leal OFF_FP_SHADOWFRAME(rFP), %eax
10914 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060010915 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000010916 REFRESH_IBASE
10917 jmp .L_op_nop+(180*128)
10918
10919/* ------------------------------ */
10920 .balign 128
10921.L_ALT_op_and_int_2addr: /* 0xb5 */
10922/* File: x86/alt_stub.S */
10923/*
10924 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10925 * any interesting requests and then jump to the real instruction
10926 * handler. Unlike the Arm handler, we can't do this as a tail call
10927 * because rIBASE is caller save and we need to reload it.
10928 *
10929 * Note that unlike in the Arm implementation, we should never arrive
10930 * here with a zero breakFlag because we always refresh rIBASE on
10931 * return.
10932 */
10933 .extern MterpCheckBefore
10934 EXPORT_PC
10935
10936 movl rSELF, %ecx
10937 movl %ecx, OUT_ARG0(%esp)
10938 leal OFF_FP_SHADOWFRAME(rFP), %eax
10939 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060010940 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000010941 REFRESH_IBASE
10942 jmp .L_op_nop+(181*128)
10943
10944/* ------------------------------ */
10945 .balign 128
10946.L_ALT_op_or_int_2addr: /* 0xb6 */
10947/* File: x86/alt_stub.S */
10948/*
10949 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10950 * any interesting requests and then jump to the real instruction
10951 * handler. Unlike the Arm handler, we can't do this as a tail call
10952 * because rIBASE is caller save and we need to reload it.
10953 *
10954 * Note that unlike in the Arm implementation, we should never arrive
10955 * here with a zero breakFlag because we always refresh rIBASE on
10956 * return.
10957 */
10958 .extern MterpCheckBefore
10959 EXPORT_PC
10960
10961 movl rSELF, %ecx
10962 movl %ecx, OUT_ARG0(%esp)
10963 leal OFF_FP_SHADOWFRAME(rFP), %eax
10964 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060010965 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000010966 REFRESH_IBASE
10967 jmp .L_op_nop+(182*128)
10968
10969/* ------------------------------ */
10970 .balign 128
10971.L_ALT_op_xor_int_2addr: /* 0xb7 */
10972/* File: x86/alt_stub.S */
10973/*
10974 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10975 * any interesting requests and then jump to the real instruction
10976 * handler. Unlike the Arm handler, we can't do this as a tail call
10977 * because rIBASE is caller save and we need to reload it.
10978 *
10979 * Note that unlike in the Arm implementation, we should never arrive
10980 * here with a zero breakFlag because we always refresh rIBASE on
10981 * return.
10982 */
10983 .extern MterpCheckBefore
10984 EXPORT_PC
10985
10986 movl rSELF, %ecx
10987 movl %ecx, OUT_ARG0(%esp)
10988 leal OFF_FP_SHADOWFRAME(rFP), %eax
10989 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060010990 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000010991 REFRESH_IBASE
10992 jmp .L_op_nop+(183*128)
10993
10994/* ------------------------------ */
10995 .balign 128
10996.L_ALT_op_shl_int_2addr: /* 0xb8 */
10997/* File: x86/alt_stub.S */
10998/*
10999 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11000 * any interesting requests and then jump to the real instruction
11001 * handler. Unlike the Arm handler, we can't do this as a tail call
11002 * because rIBASE is caller save and we need to reload it.
11003 *
11004 * Note that unlike in the Arm implementation, we should never arrive
11005 * here with a zero breakFlag because we always refresh rIBASE on
11006 * return.
11007 */
11008 .extern MterpCheckBefore
11009 EXPORT_PC
11010
11011 movl rSELF, %ecx
11012 movl %ecx, OUT_ARG0(%esp)
11013 leal OFF_FP_SHADOWFRAME(rFP), %eax
11014 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060011015 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000011016 REFRESH_IBASE
11017 jmp .L_op_nop+(184*128)
11018
11019/* ------------------------------ */
11020 .balign 128
11021.L_ALT_op_shr_int_2addr: /* 0xb9 */
11022/* File: x86/alt_stub.S */
11023/*
11024 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11025 * any interesting requests and then jump to the real instruction
11026 * handler. Unlike the Arm handler, we can't do this as a tail call
11027 * because rIBASE is caller save and we need to reload it.
11028 *
11029 * Note that unlike in the Arm implementation, we should never arrive
11030 * here with a zero breakFlag because we always refresh rIBASE on
11031 * return.
11032 */
11033 .extern MterpCheckBefore
11034 EXPORT_PC
11035
11036 movl rSELF, %ecx
11037 movl %ecx, OUT_ARG0(%esp)
11038 leal OFF_FP_SHADOWFRAME(rFP), %eax
11039 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060011040 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000011041 REFRESH_IBASE
11042 jmp .L_op_nop+(185*128)
11043
11044/* ------------------------------ */
11045 .balign 128
11046.L_ALT_op_ushr_int_2addr: /* 0xba */
11047/* File: x86/alt_stub.S */
11048/*
11049 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11050 * any interesting requests and then jump to the real instruction
11051 * handler. Unlike the Arm handler, we can't do this as a tail call
11052 * because rIBASE is caller save and we need to reload it.
11053 *
11054 * Note that unlike in the Arm implementation, we should never arrive
11055 * here with a zero breakFlag because we always refresh rIBASE on
11056 * return.
11057 */
11058 .extern MterpCheckBefore
11059 EXPORT_PC
11060
11061 movl rSELF, %ecx
11062 movl %ecx, OUT_ARG0(%esp)
11063 leal OFF_FP_SHADOWFRAME(rFP), %eax
11064 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060011065 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000011066 REFRESH_IBASE
11067 jmp .L_op_nop+(186*128)
11068
11069/* ------------------------------ */
11070 .balign 128
11071.L_ALT_op_add_long_2addr: /* 0xbb */
11072/* File: x86/alt_stub.S */
11073/*
11074 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11075 * any interesting requests and then jump to the real instruction
11076 * handler. Unlike the Arm handler, we can't do this as a tail call
11077 * because rIBASE is caller save and we need to reload it.
11078 *
11079 * Note that unlike in the Arm implementation, we should never arrive
11080 * here with a zero breakFlag because we always refresh rIBASE on
11081 * return.
11082 */
11083 .extern MterpCheckBefore
11084 EXPORT_PC
11085
11086 movl rSELF, %ecx
11087 movl %ecx, OUT_ARG0(%esp)
11088 leal OFF_FP_SHADOWFRAME(rFP), %eax
11089 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060011090 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000011091 REFRESH_IBASE
11092 jmp .L_op_nop+(187*128)
11093
11094/* ------------------------------ */
11095 .balign 128
11096.L_ALT_op_sub_long_2addr: /* 0xbc */
11097/* File: x86/alt_stub.S */
11098/*
11099 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11100 * any interesting requests and then jump to the real instruction
11101 * handler. Unlike the Arm handler, we can't do this as a tail call
11102 * because rIBASE is caller save and we need to reload it.
11103 *
11104 * Note that unlike in the Arm implementation, we should never arrive
11105 * here with a zero breakFlag because we always refresh rIBASE on
11106 * return.
11107 */
11108 .extern MterpCheckBefore
11109 EXPORT_PC
11110
11111 movl rSELF, %ecx
11112 movl %ecx, OUT_ARG0(%esp)
11113 leal OFF_FP_SHADOWFRAME(rFP), %eax
11114 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060011115 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000011116 REFRESH_IBASE
11117 jmp .L_op_nop+(188*128)
11118
11119/* ------------------------------ */
11120 .balign 128
11121.L_ALT_op_mul_long_2addr: /* 0xbd */
11122/* File: x86/alt_stub.S */
11123/*
11124 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11125 * any interesting requests and then jump to the real instruction
11126 * handler. Unlike the Arm handler, we can't do this as a tail call
11127 * because rIBASE is caller save and we need to reload it.
11128 *
11129 * Note that unlike in the Arm implementation, we should never arrive
11130 * here with a zero breakFlag because we always refresh rIBASE on
11131 * return.
11132 */
11133 .extern MterpCheckBefore
11134 EXPORT_PC
11135
11136 movl rSELF, %ecx
11137 movl %ecx, OUT_ARG0(%esp)
11138 leal OFF_FP_SHADOWFRAME(rFP), %eax
11139 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060011140 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000011141 REFRESH_IBASE
11142 jmp .L_op_nop+(189*128)
11143
11144/* ------------------------------ */
11145 .balign 128
11146.L_ALT_op_div_long_2addr: /* 0xbe */
11147/* File: x86/alt_stub.S */
11148/*
11149 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11150 * any interesting requests and then jump to the real instruction
11151 * handler. Unlike the Arm handler, we can't do this as a tail call
11152 * because rIBASE is caller save and we need to reload it.
11153 *
11154 * Note that unlike in the Arm implementation, we should never arrive
11155 * here with a zero breakFlag because we always refresh rIBASE on
11156 * return.
11157 */
11158 .extern MterpCheckBefore
11159 EXPORT_PC
11160
11161 movl rSELF, %ecx
11162 movl %ecx, OUT_ARG0(%esp)
11163 leal OFF_FP_SHADOWFRAME(rFP), %eax
11164 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060011165 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000011166 REFRESH_IBASE
11167 jmp .L_op_nop+(190*128)
11168
11169/* ------------------------------ */
11170 .balign 128
11171.L_ALT_op_rem_long_2addr: /* 0xbf */
11172/* File: x86/alt_stub.S */
11173/*
11174 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11175 * any interesting requests and then jump to the real instruction
11176 * handler. Unlike the Arm handler, we can't do this as a tail call
11177 * because rIBASE is caller save and we need to reload it.
11178 *
11179 * Note that unlike in the Arm implementation, we should never arrive
11180 * here with a zero breakFlag because we always refresh rIBASE on
11181 * return.
11182 */
11183 .extern MterpCheckBefore
11184 EXPORT_PC
11185
11186 movl rSELF, %ecx
11187 movl %ecx, OUT_ARG0(%esp)
11188 leal OFF_FP_SHADOWFRAME(rFP), %eax
11189 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060011190 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000011191 REFRESH_IBASE
11192 jmp .L_op_nop+(191*128)
11193
11194/* ------------------------------ */
11195 .balign 128
11196.L_ALT_op_and_long_2addr: /* 0xc0 */
11197/* File: x86/alt_stub.S */
11198/*
11199 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11200 * any interesting requests and then jump to the real instruction
11201 * handler. Unlike the Arm handler, we can't do this as a tail call
11202 * because rIBASE is caller save and we need to reload it.
11203 *
11204 * Note that unlike in the Arm implementation, we should never arrive
11205 * here with a zero breakFlag because we always refresh rIBASE on
11206 * return.
11207 */
11208 .extern MterpCheckBefore
11209 EXPORT_PC
11210
11211 movl rSELF, %ecx
11212 movl %ecx, OUT_ARG0(%esp)
11213 leal OFF_FP_SHADOWFRAME(rFP), %eax
11214 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060011215 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000011216 REFRESH_IBASE
11217 jmp .L_op_nop+(192*128)
11218
11219/* ------------------------------ */
11220 .balign 128
11221.L_ALT_op_or_long_2addr: /* 0xc1 */
11222/* File: x86/alt_stub.S */
11223/*
11224 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11225 * any interesting requests and then jump to the real instruction
11226 * handler. Unlike the Arm handler, we can't do this as a tail call
11227 * because rIBASE is caller save and we need to reload it.
11228 *
11229 * Note that unlike in the Arm implementation, we should never arrive
11230 * here with a zero breakFlag because we always refresh rIBASE on
11231 * return.
11232 */
11233 .extern MterpCheckBefore
11234 EXPORT_PC
11235
11236 movl rSELF, %ecx
11237 movl %ecx, OUT_ARG0(%esp)
11238 leal OFF_FP_SHADOWFRAME(rFP), %eax
11239 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060011240 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000011241 REFRESH_IBASE
11242 jmp .L_op_nop+(193*128)
11243
11244/* ------------------------------ */
11245 .balign 128
11246.L_ALT_op_xor_long_2addr: /* 0xc2 */
11247/* File: x86/alt_stub.S */
11248/*
11249 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11250 * any interesting requests and then jump to the real instruction
11251 * handler. Unlike the Arm handler, we can't do this as a tail call
11252 * because rIBASE is caller save and we need to reload it.
11253 *
11254 * Note that unlike in the Arm implementation, we should never arrive
11255 * here with a zero breakFlag because we always refresh rIBASE on
11256 * return.
11257 */
11258 .extern MterpCheckBefore
11259 EXPORT_PC
11260
11261 movl rSELF, %ecx
11262 movl %ecx, OUT_ARG0(%esp)
11263 leal OFF_FP_SHADOWFRAME(rFP), %eax
11264 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060011265 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000011266 REFRESH_IBASE
11267 jmp .L_op_nop+(194*128)
11268
11269/* ------------------------------ */
11270 .balign 128
11271.L_ALT_op_shl_long_2addr: /* 0xc3 */
11272/* File: x86/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. Unlike the Arm handler, we can't do this as a tail call
11277 * because rIBASE is caller save and we need to reload it.
11278 *
11279 * Note that unlike in the Arm implementation, we should never arrive
11280 * here with a zero breakFlag because we always refresh rIBASE on
11281 * return.
11282 */
11283 .extern MterpCheckBefore
11284 EXPORT_PC
11285
11286 movl rSELF, %ecx
11287 movl %ecx, OUT_ARG0(%esp)
11288 leal OFF_FP_SHADOWFRAME(rFP), %eax
11289 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060011290 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000011291 REFRESH_IBASE
11292 jmp .L_op_nop+(195*128)
11293
11294/* ------------------------------ */
11295 .balign 128
11296.L_ALT_op_shr_long_2addr: /* 0xc4 */
11297/* File: x86/alt_stub.S */
11298/*
11299 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11300 * any interesting requests and then jump to the real instruction
11301 * handler. Unlike the Arm handler, we can't do this as a tail call
11302 * because rIBASE is caller save and we need to reload it.
11303 *
11304 * Note that unlike in the Arm implementation, we should never arrive
11305 * here with a zero breakFlag because we always refresh rIBASE on
11306 * return.
11307 */
11308 .extern MterpCheckBefore
11309 EXPORT_PC
11310
11311 movl rSELF, %ecx
11312 movl %ecx, OUT_ARG0(%esp)
11313 leal OFF_FP_SHADOWFRAME(rFP), %eax
11314 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060011315 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000011316 REFRESH_IBASE
11317 jmp .L_op_nop+(196*128)
11318
11319/* ------------------------------ */
11320 .balign 128
11321.L_ALT_op_ushr_long_2addr: /* 0xc5 */
11322/* File: x86/alt_stub.S */
11323/*
11324 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11325 * any interesting requests and then jump to the real instruction
11326 * handler. Unlike the Arm handler, we can't do this as a tail call
11327 * because rIBASE is caller save and we need to reload it.
11328 *
11329 * Note that unlike in the Arm implementation, we should never arrive
11330 * here with a zero breakFlag because we always refresh rIBASE on
11331 * return.
11332 */
11333 .extern MterpCheckBefore
11334 EXPORT_PC
11335
11336 movl rSELF, %ecx
11337 movl %ecx, OUT_ARG0(%esp)
11338 leal OFF_FP_SHADOWFRAME(rFP), %eax
11339 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060011340 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000011341 REFRESH_IBASE
11342 jmp .L_op_nop+(197*128)
11343
11344/* ------------------------------ */
11345 .balign 128
11346.L_ALT_op_add_float_2addr: /* 0xc6 */
11347/* File: x86/alt_stub.S */
11348/*
11349 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11350 * any interesting requests and then jump to the real instruction
11351 * handler. Unlike the Arm handler, we can't do this as a tail call
11352 * because rIBASE is caller save and we need to reload it.
11353 *
11354 * Note that unlike in the Arm implementation, we should never arrive
11355 * here with a zero breakFlag because we always refresh rIBASE on
11356 * return.
11357 */
11358 .extern MterpCheckBefore
11359 EXPORT_PC
11360
11361 movl rSELF, %ecx
11362 movl %ecx, OUT_ARG0(%esp)
11363 leal OFF_FP_SHADOWFRAME(rFP), %eax
11364 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060011365 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000011366 REFRESH_IBASE
11367 jmp .L_op_nop+(198*128)
11368
11369/* ------------------------------ */
11370 .balign 128
11371.L_ALT_op_sub_float_2addr: /* 0xc7 */
11372/* File: x86/alt_stub.S */
11373/*
11374 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11375 * any interesting requests and then jump to the real instruction
11376 * handler. Unlike the Arm handler, we can't do this as a tail call
11377 * because rIBASE is caller save and we need to reload it.
11378 *
11379 * Note that unlike in the Arm implementation, we should never arrive
11380 * here with a zero breakFlag because we always refresh rIBASE on
11381 * return.
11382 */
11383 .extern MterpCheckBefore
11384 EXPORT_PC
11385
11386 movl rSELF, %ecx
11387 movl %ecx, OUT_ARG0(%esp)
11388 leal OFF_FP_SHADOWFRAME(rFP), %eax
11389 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060011390 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000011391 REFRESH_IBASE
11392 jmp .L_op_nop+(199*128)
11393
11394/* ------------------------------ */
11395 .balign 128
11396.L_ALT_op_mul_float_2addr: /* 0xc8 */
11397/* File: x86/alt_stub.S */
11398/*
11399 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11400 * any interesting requests and then jump to the real instruction
11401 * handler. Unlike the Arm handler, we can't do this as a tail call
11402 * because rIBASE is caller save and we need to reload it.
11403 *
11404 * Note that unlike in the Arm implementation, we should never arrive
11405 * here with a zero breakFlag because we always refresh rIBASE on
11406 * return.
11407 */
11408 .extern MterpCheckBefore
11409 EXPORT_PC
11410
11411 movl rSELF, %ecx
11412 movl %ecx, OUT_ARG0(%esp)
11413 leal OFF_FP_SHADOWFRAME(rFP), %eax
11414 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060011415 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000011416 REFRESH_IBASE
11417 jmp .L_op_nop+(200*128)
11418
11419/* ------------------------------ */
11420 .balign 128
11421.L_ALT_op_div_float_2addr: /* 0xc9 */
11422/* File: x86/alt_stub.S */
11423/*
11424 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11425 * any interesting requests and then jump to the real instruction
11426 * handler. Unlike the Arm handler, we can't do this as a tail call
11427 * because rIBASE is caller save and we need to reload it.
11428 *
11429 * Note that unlike in the Arm implementation, we should never arrive
11430 * here with a zero breakFlag because we always refresh rIBASE on
11431 * return.
11432 */
11433 .extern MterpCheckBefore
11434 EXPORT_PC
11435
11436 movl rSELF, %ecx
11437 movl %ecx, OUT_ARG0(%esp)
11438 leal OFF_FP_SHADOWFRAME(rFP), %eax
11439 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060011440 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000011441 REFRESH_IBASE
11442 jmp .L_op_nop+(201*128)
11443
11444/* ------------------------------ */
11445 .balign 128
11446.L_ALT_op_rem_float_2addr: /* 0xca */
11447/* File: x86/alt_stub.S */
11448/*
11449 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11450 * any interesting requests and then jump to the real instruction
11451 * handler. Unlike the Arm handler, we can't do this as a tail call
11452 * because rIBASE is caller save and we need to reload it.
11453 *
11454 * Note that unlike in the Arm implementation, we should never arrive
11455 * here with a zero breakFlag because we always refresh rIBASE on
11456 * return.
11457 */
11458 .extern MterpCheckBefore
11459 EXPORT_PC
11460
11461 movl rSELF, %ecx
11462 movl %ecx, OUT_ARG0(%esp)
11463 leal OFF_FP_SHADOWFRAME(rFP), %eax
11464 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060011465 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000011466 REFRESH_IBASE
11467 jmp .L_op_nop+(202*128)
11468
11469/* ------------------------------ */
11470 .balign 128
11471.L_ALT_op_add_double_2addr: /* 0xcb */
11472/* File: x86/alt_stub.S */
11473/*
11474 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11475 * any interesting requests and then jump to the real instruction
11476 * handler. Unlike the Arm handler, we can't do this as a tail call
11477 * because rIBASE is caller save and we need to reload it.
11478 *
11479 * Note that unlike in the Arm implementation, we should never arrive
11480 * here with a zero breakFlag because we always refresh rIBASE on
11481 * return.
11482 */
11483 .extern MterpCheckBefore
11484 EXPORT_PC
11485
11486 movl rSELF, %ecx
11487 movl %ecx, OUT_ARG0(%esp)
11488 leal OFF_FP_SHADOWFRAME(rFP), %eax
11489 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060011490 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000011491 REFRESH_IBASE
11492 jmp .L_op_nop+(203*128)
11493
11494/* ------------------------------ */
11495 .balign 128
11496.L_ALT_op_sub_double_2addr: /* 0xcc */
11497/* File: x86/alt_stub.S */
11498/*
11499 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11500 * any interesting requests and then jump to the real instruction
11501 * handler. Unlike the Arm handler, we can't do this as a tail call
11502 * because rIBASE is caller save and we need to reload it.
11503 *
11504 * Note that unlike in the Arm implementation, we should never arrive
11505 * here with a zero breakFlag because we always refresh rIBASE on
11506 * return.
11507 */
11508 .extern MterpCheckBefore
11509 EXPORT_PC
11510
11511 movl rSELF, %ecx
11512 movl %ecx, OUT_ARG0(%esp)
11513 leal OFF_FP_SHADOWFRAME(rFP), %eax
11514 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060011515 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000011516 REFRESH_IBASE
11517 jmp .L_op_nop+(204*128)
11518
11519/* ------------------------------ */
11520 .balign 128
11521.L_ALT_op_mul_double_2addr: /* 0xcd */
11522/* File: x86/alt_stub.S */
11523/*
11524 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11525 * any interesting requests and then jump to the real instruction
11526 * handler. Unlike the Arm handler, we can't do this as a tail call
11527 * because rIBASE is caller save and we need to reload it.
11528 *
11529 * Note that unlike in the Arm implementation, we should never arrive
11530 * here with a zero breakFlag because we always refresh rIBASE on
11531 * return.
11532 */
11533 .extern MterpCheckBefore
11534 EXPORT_PC
11535
11536 movl rSELF, %ecx
11537 movl %ecx, OUT_ARG0(%esp)
11538 leal OFF_FP_SHADOWFRAME(rFP), %eax
11539 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060011540 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000011541 REFRESH_IBASE
11542 jmp .L_op_nop+(205*128)
11543
11544/* ------------------------------ */
11545 .balign 128
11546.L_ALT_op_div_double_2addr: /* 0xce */
11547/* File: x86/alt_stub.S */
11548/*
11549 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11550 * any interesting requests and then jump to the real instruction
11551 * handler. Unlike the Arm handler, we can't do this as a tail call
11552 * because rIBASE is caller save and we need to reload it.
11553 *
11554 * Note that unlike in the Arm implementation, we should never arrive
11555 * here with a zero breakFlag because we always refresh rIBASE on
11556 * return.
11557 */
11558 .extern MterpCheckBefore
11559 EXPORT_PC
11560
11561 movl rSELF, %ecx
11562 movl %ecx, OUT_ARG0(%esp)
11563 leal OFF_FP_SHADOWFRAME(rFP), %eax
11564 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060011565 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000011566 REFRESH_IBASE
11567 jmp .L_op_nop+(206*128)
11568
11569/* ------------------------------ */
11570 .balign 128
11571.L_ALT_op_rem_double_2addr: /* 0xcf */
11572/* File: x86/alt_stub.S */
11573/*
11574 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11575 * any interesting requests and then jump to the real instruction
11576 * handler. Unlike the Arm handler, we can't do this as a tail call
11577 * because rIBASE is caller save and we need to reload it.
11578 *
11579 * Note that unlike in the Arm implementation, we should never arrive
11580 * here with a zero breakFlag because we always refresh rIBASE on
11581 * return.
11582 */
11583 .extern MterpCheckBefore
11584 EXPORT_PC
11585
11586 movl rSELF, %ecx
11587 movl %ecx, OUT_ARG0(%esp)
11588 leal OFF_FP_SHADOWFRAME(rFP), %eax
11589 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060011590 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000011591 REFRESH_IBASE
11592 jmp .L_op_nop+(207*128)
11593
11594/* ------------------------------ */
11595 .balign 128
11596.L_ALT_op_add_int_lit16: /* 0xd0 */
11597/* File: x86/alt_stub.S */
11598/*
11599 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11600 * any interesting requests and then jump to the real instruction
11601 * handler. Unlike the Arm handler, we can't do this as a tail call
11602 * because rIBASE is caller save and we need to reload it.
11603 *
11604 * Note that unlike in the Arm implementation, we should never arrive
11605 * here with a zero breakFlag because we always refresh rIBASE on
11606 * return.
11607 */
11608 .extern MterpCheckBefore
11609 EXPORT_PC
11610
11611 movl rSELF, %ecx
11612 movl %ecx, OUT_ARG0(%esp)
11613 leal OFF_FP_SHADOWFRAME(rFP), %eax
11614 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060011615 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000011616 REFRESH_IBASE
11617 jmp .L_op_nop+(208*128)
11618
11619/* ------------------------------ */
11620 .balign 128
11621.L_ALT_op_rsub_int: /* 0xd1 */
11622/* File: x86/alt_stub.S */
11623/*
11624 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11625 * any interesting requests and then jump to the real instruction
11626 * handler. Unlike the Arm handler, we can't do this as a tail call
11627 * because rIBASE is caller save and we need to reload it.
11628 *
11629 * Note that unlike in the Arm implementation, we should never arrive
11630 * here with a zero breakFlag because we always refresh rIBASE on
11631 * return.
11632 */
11633 .extern MterpCheckBefore
11634 EXPORT_PC
11635
11636 movl rSELF, %ecx
11637 movl %ecx, OUT_ARG0(%esp)
11638 leal OFF_FP_SHADOWFRAME(rFP), %eax
11639 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060011640 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000011641 REFRESH_IBASE
11642 jmp .L_op_nop+(209*128)
11643
11644/* ------------------------------ */
11645 .balign 128
11646.L_ALT_op_mul_int_lit16: /* 0xd2 */
11647/* File: x86/alt_stub.S */
11648/*
11649 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11650 * any interesting requests and then jump to the real instruction
11651 * handler. Unlike the Arm handler, we can't do this as a tail call
11652 * because rIBASE is caller save and we need to reload it.
11653 *
11654 * Note that unlike in the Arm implementation, we should never arrive
11655 * here with a zero breakFlag because we always refresh rIBASE on
11656 * return.
11657 */
11658 .extern MterpCheckBefore
11659 EXPORT_PC
11660
11661 movl rSELF, %ecx
11662 movl %ecx, OUT_ARG0(%esp)
11663 leal OFF_FP_SHADOWFRAME(rFP), %eax
11664 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060011665 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000011666 REFRESH_IBASE
11667 jmp .L_op_nop+(210*128)
11668
11669/* ------------------------------ */
11670 .balign 128
11671.L_ALT_op_div_int_lit16: /* 0xd3 */
11672/* File: x86/alt_stub.S */
11673/*
11674 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11675 * any interesting requests and then jump to the real instruction
11676 * handler. Unlike the Arm handler, we can't do this as a tail call
11677 * because rIBASE is caller save and we need to reload it.
11678 *
11679 * Note that unlike in the Arm implementation, we should never arrive
11680 * here with a zero breakFlag because we always refresh rIBASE on
11681 * return.
11682 */
11683 .extern MterpCheckBefore
11684 EXPORT_PC
11685
11686 movl rSELF, %ecx
11687 movl %ecx, OUT_ARG0(%esp)
11688 leal OFF_FP_SHADOWFRAME(rFP), %eax
11689 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060011690 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000011691 REFRESH_IBASE
11692 jmp .L_op_nop+(211*128)
11693
11694/* ------------------------------ */
11695 .balign 128
11696.L_ALT_op_rem_int_lit16: /* 0xd4 */
11697/* File: x86/alt_stub.S */
11698/*
11699 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11700 * any interesting requests and then jump to the real instruction
11701 * handler. Unlike the Arm handler, we can't do this as a tail call
11702 * because rIBASE is caller save and we need to reload it.
11703 *
11704 * Note that unlike in the Arm implementation, we should never arrive
11705 * here with a zero breakFlag because we always refresh rIBASE on
11706 * return.
11707 */
11708 .extern MterpCheckBefore
11709 EXPORT_PC
11710
11711 movl rSELF, %ecx
11712 movl %ecx, OUT_ARG0(%esp)
11713 leal OFF_FP_SHADOWFRAME(rFP), %eax
11714 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060011715 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000011716 REFRESH_IBASE
11717 jmp .L_op_nop+(212*128)
11718
11719/* ------------------------------ */
11720 .balign 128
11721.L_ALT_op_and_int_lit16: /* 0xd5 */
11722/* File: x86/alt_stub.S */
11723/*
11724 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11725 * any interesting requests and then jump to the real instruction
11726 * handler. Unlike the Arm handler, we can't do this as a tail call
11727 * because rIBASE is caller save and we need to reload it.
11728 *
11729 * Note that unlike in the Arm implementation, we should never arrive
11730 * here with a zero breakFlag because we always refresh rIBASE on
11731 * return.
11732 */
11733 .extern MterpCheckBefore
11734 EXPORT_PC
11735
11736 movl rSELF, %ecx
11737 movl %ecx, OUT_ARG0(%esp)
11738 leal OFF_FP_SHADOWFRAME(rFP), %eax
11739 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060011740 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000011741 REFRESH_IBASE
11742 jmp .L_op_nop+(213*128)
11743
11744/* ------------------------------ */
11745 .balign 128
11746.L_ALT_op_or_int_lit16: /* 0xd6 */
11747/* File: x86/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. Unlike the Arm handler, we can't do this as a tail call
11752 * because rIBASE is caller save and we need to reload it.
11753 *
11754 * Note that unlike in the Arm implementation, we should never arrive
11755 * here with a zero breakFlag because we always refresh rIBASE on
11756 * return.
11757 */
11758 .extern MterpCheckBefore
11759 EXPORT_PC
11760
11761 movl rSELF, %ecx
11762 movl %ecx, OUT_ARG0(%esp)
11763 leal OFF_FP_SHADOWFRAME(rFP), %eax
11764 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060011765 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000011766 REFRESH_IBASE
11767 jmp .L_op_nop+(214*128)
11768
11769/* ------------------------------ */
11770 .balign 128
11771.L_ALT_op_xor_int_lit16: /* 0xd7 */
11772/* File: x86/alt_stub.S */
11773/*
11774 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11775 * any interesting requests and then jump to the real instruction
11776 * handler. Unlike the Arm handler, we can't do this as a tail call
11777 * because rIBASE is caller save and we need to reload it.
11778 *
11779 * Note that unlike in the Arm implementation, we should never arrive
11780 * here with a zero breakFlag because we always refresh rIBASE on
11781 * return.
11782 */
11783 .extern MterpCheckBefore
11784 EXPORT_PC
11785
11786 movl rSELF, %ecx
11787 movl %ecx, OUT_ARG0(%esp)
11788 leal OFF_FP_SHADOWFRAME(rFP), %eax
11789 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060011790 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000011791 REFRESH_IBASE
11792 jmp .L_op_nop+(215*128)
11793
11794/* ------------------------------ */
11795 .balign 128
11796.L_ALT_op_add_int_lit8: /* 0xd8 */
11797/* File: x86/alt_stub.S */
11798/*
11799 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11800 * any interesting requests and then jump to the real instruction
11801 * handler. Unlike the Arm handler, we can't do this as a tail call
11802 * because rIBASE is caller save and we need to reload it.
11803 *
11804 * Note that unlike in the Arm implementation, we should never arrive
11805 * here with a zero breakFlag because we always refresh rIBASE on
11806 * return.
11807 */
11808 .extern MterpCheckBefore
11809 EXPORT_PC
11810
11811 movl rSELF, %ecx
11812 movl %ecx, OUT_ARG0(%esp)
11813 leal OFF_FP_SHADOWFRAME(rFP), %eax
11814 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060011815 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000011816 REFRESH_IBASE
11817 jmp .L_op_nop+(216*128)
11818
11819/* ------------------------------ */
11820 .balign 128
11821.L_ALT_op_rsub_int_lit8: /* 0xd9 */
11822/* File: x86/alt_stub.S */
11823/*
11824 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11825 * any interesting requests and then jump to the real instruction
11826 * handler. Unlike the Arm handler, we can't do this as a tail call
11827 * because rIBASE is caller save and we need to reload it.
11828 *
11829 * Note that unlike in the Arm implementation, we should never arrive
11830 * here with a zero breakFlag because we always refresh rIBASE on
11831 * return.
11832 */
11833 .extern MterpCheckBefore
11834 EXPORT_PC
11835
11836 movl rSELF, %ecx
11837 movl %ecx, OUT_ARG0(%esp)
11838 leal OFF_FP_SHADOWFRAME(rFP), %eax
11839 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060011840 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000011841 REFRESH_IBASE
11842 jmp .L_op_nop+(217*128)
11843
11844/* ------------------------------ */
11845 .balign 128
11846.L_ALT_op_mul_int_lit8: /* 0xda */
11847/* File: x86/alt_stub.S */
11848/*
11849 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11850 * any interesting requests and then jump to the real instruction
11851 * handler. Unlike the Arm handler, we can't do this as a tail call
11852 * because rIBASE is caller save and we need to reload it.
11853 *
11854 * Note that unlike in the Arm implementation, we should never arrive
11855 * here with a zero breakFlag because we always refresh rIBASE on
11856 * return.
11857 */
11858 .extern MterpCheckBefore
11859 EXPORT_PC
11860
11861 movl rSELF, %ecx
11862 movl %ecx, OUT_ARG0(%esp)
11863 leal OFF_FP_SHADOWFRAME(rFP), %eax
11864 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060011865 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000011866 REFRESH_IBASE
11867 jmp .L_op_nop+(218*128)
11868
11869/* ------------------------------ */
11870 .balign 128
11871.L_ALT_op_div_int_lit8: /* 0xdb */
11872/* File: x86/alt_stub.S */
11873/*
11874 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11875 * any interesting requests and then jump to the real instruction
11876 * handler. Unlike the Arm handler, we can't do this as a tail call
11877 * because rIBASE is caller save and we need to reload it.
11878 *
11879 * Note that unlike in the Arm implementation, we should never arrive
11880 * here with a zero breakFlag because we always refresh rIBASE on
11881 * return.
11882 */
11883 .extern MterpCheckBefore
11884 EXPORT_PC
11885
11886 movl rSELF, %ecx
11887 movl %ecx, OUT_ARG0(%esp)
11888 leal OFF_FP_SHADOWFRAME(rFP), %eax
11889 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060011890 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000011891 REFRESH_IBASE
11892 jmp .L_op_nop+(219*128)
11893
11894/* ------------------------------ */
11895 .balign 128
11896.L_ALT_op_rem_int_lit8: /* 0xdc */
11897/* File: x86/alt_stub.S */
11898/*
11899 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11900 * any interesting requests and then jump to the real instruction
11901 * handler. Unlike the Arm handler, we can't do this as a tail call
11902 * because rIBASE is caller save and we need to reload it.
11903 *
11904 * Note that unlike in the Arm implementation, we should never arrive
11905 * here with a zero breakFlag because we always refresh rIBASE on
11906 * return.
11907 */
11908 .extern MterpCheckBefore
11909 EXPORT_PC
11910
11911 movl rSELF, %ecx
11912 movl %ecx, OUT_ARG0(%esp)
11913 leal OFF_FP_SHADOWFRAME(rFP), %eax
11914 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060011915 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000011916 REFRESH_IBASE
11917 jmp .L_op_nop+(220*128)
11918
11919/* ------------------------------ */
11920 .balign 128
11921.L_ALT_op_and_int_lit8: /* 0xdd */
11922/* File: x86/alt_stub.S */
11923/*
11924 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11925 * any interesting requests and then jump to the real instruction
11926 * handler. Unlike the Arm handler, we can't do this as a tail call
11927 * because rIBASE is caller save and we need to reload it.
11928 *
11929 * Note that unlike in the Arm implementation, we should never arrive
11930 * here with a zero breakFlag because we always refresh rIBASE on
11931 * return.
11932 */
11933 .extern MterpCheckBefore
11934 EXPORT_PC
11935
11936 movl rSELF, %ecx
11937 movl %ecx, OUT_ARG0(%esp)
11938 leal OFF_FP_SHADOWFRAME(rFP), %eax
11939 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060011940 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000011941 REFRESH_IBASE
11942 jmp .L_op_nop+(221*128)
11943
11944/* ------------------------------ */
11945 .balign 128
11946.L_ALT_op_or_int_lit8: /* 0xde */
11947/* File: x86/alt_stub.S */
11948/*
11949 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11950 * any interesting requests and then jump to the real instruction
11951 * handler. Unlike the Arm handler, we can't do this as a tail call
11952 * because rIBASE is caller save and we need to reload it.
11953 *
11954 * Note that unlike in the Arm implementation, we should never arrive
11955 * here with a zero breakFlag because we always refresh rIBASE on
11956 * return.
11957 */
11958 .extern MterpCheckBefore
11959 EXPORT_PC
11960
11961 movl rSELF, %ecx
11962 movl %ecx, OUT_ARG0(%esp)
11963 leal OFF_FP_SHADOWFRAME(rFP), %eax
11964 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060011965 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000011966 REFRESH_IBASE
11967 jmp .L_op_nop+(222*128)
11968
11969/* ------------------------------ */
11970 .balign 128
11971.L_ALT_op_xor_int_lit8: /* 0xdf */
11972/* File: x86/alt_stub.S */
11973/*
11974 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11975 * any interesting requests and then jump to the real instruction
11976 * handler. Unlike the Arm handler, we can't do this as a tail call
11977 * because rIBASE is caller save and we need to reload it.
11978 *
11979 * Note that unlike in the Arm implementation, we should never arrive
11980 * here with a zero breakFlag because we always refresh rIBASE on
11981 * return.
11982 */
11983 .extern MterpCheckBefore
11984 EXPORT_PC
11985
11986 movl rSELF, %ecx
11987 movl %ecx, OUT_ARG0(%esp)
11988 leal OFF_FP_SHADOWFRAME(rFP), %eax
11989 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060011990 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000011991 REFRESH_IBASE
11992 jmp .L_op_nop+(223*128)
11993
11994/* ------------------------------ */
11995 .balign 128
11996.L_ALT_op_shl_int_lit8: /* 0xe0 */
11997/* File: x86/alt_stub.S */
11998/*
11999 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12000 * any interesting requests and then jump to the real instruction
12001 * handler. Unlike the Arm handler, we can't do this as a tail call
12002 * because rIBASE is caller save and we need to reload it.
12003 *
12004 * Note that unlike in the Arm implementation, we should never arrive
12005 * here with a zero breakFlag because we always refresh rIBASE on
12006 * return.
12007 */
12008 .extern MterpCheckBefore
12009 EXPORT_PC
12010
12011 movl rSELF, %ecx
12012 movl %ecx, OUT_ARG0(%esp)
12013 leal OFF_FP_SHADOWFRAME(rFP), %eax
12014 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012015 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012016 REFRESH_IBASE
12017 jmp .L_op_nop+(224*128)
12018
12019/* ------------------------------ */
12020 .balign 128
12021.L_ALT_op_shr_int_lit8: /* 0xe1 */
12022/* File: x86/alt_stub.S */
12023/*
12024 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12025 * any interesting requests and then jump to the real instruction
12026 * handler. Unlike the Arm handler, we can't do this as a tail call
12027 * because rIBASE is caller save and we need to reload it.
12028 *
12029 * Note that unlike in the Arm implementation, we should never arrive
12030 * here with a zero breakFlag because we always refresh rIBASE on
12031 * return.
12032 */
12033 .extern MterpCheckBefore
12034 EXPORT_PC
12035
12036 movl rSELF, %ecx
12037 movl %ecx, OUT_ARG0(%esp)
12038 leal OFF_FP_SHADOWFRAME(rFP), %eax
12039 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012040 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012041 REFRESH_IBASE
12042 jmp .L_op_nop+(225*128)
12043
12044/* ------------------------------ */
12045 .balign 128
12046.L_ALT_op_ushr_int_lit8: /* 0xe2 */
12047/* File: x86/alt_stub.S */
12048/*
12049 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12050 * any interesting requests and then jump to the real instruction
12051 * handler. Unlike the Arm handler, we can't do this as a tail call
12052 * because rIBASE is caller save and we need to reload it.
12053 *
12054 * Note that unlike in the Arm implementation, we should never arrive
12055 * here with a zero breakFlag because we always refresh rIBASE on
12056 * return.
12057 */
12058 .extern MterpCheckBefore
12059 EXPORT_PC
12060
12061 movl rSELF, %ecx
12062 movl %ecx, OUT_ARG0(%esp)
12063 leal OFF_FP_SHADOWFRAME(rFP), %eax
12064 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012065 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012066 REFRESH_IBASE
12067 jmp .L_op_nop+(226*128)
12068
12069/* ------------------------------ */
12070 .balign 128
12071.L_ALT_op_iget_quick: /* 0xe3 */
12072/* File: x86/alt_stub.S */
12073/*
12074 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12075 * any interesting requests and then jump to the real instruction
12076 * handler. Unlike the Arm handler, we can't do this as a tail call
12077 * because rIBASE is caller save and we need to reload it.
12078 *
12079 * Note that unlike in the Arm implementation, we should never arrive
12080 * here with a zero breakFlag because we always refresh rIBASE on
12081 * return.
12082 */
12083 .extern MterpCheckBefore
12084 EXPORT_PC
12085
12086 movl rSELF, %ecx
12087 movl %ecx, OUT_ARG0(%esp)
12088 leal OFF_FP_SHADOWFRAME(rFP), %eax
12089 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012090 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012091 REFRESH_IBASE
12092 jmp .L_op_nop+(227*128)
12093
12094/* ------------------------------ */
12095 .balign 128
12096.L_ALT_op_iget_wide_quick: /* 0xe4 */
12097/* File: x86/alt_stub.S */
12098/*
12099 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12100 * any interesting requests and then jump to the real instruction
12101 * handler. Unlike the Arm handler, we can't do this as a tail call
12102 * because rIBASE is caller save and we need to reload it.
12103 *
12104 * Note that unlike in the Arm implementation, we should never arrive
12105 * here with a zero breakFlag because we always refresh rIBASE on
12106 * return.
12107 */
12108 .extern MterpCheckBefore
12109 EXPORT_PC
12110
12111 movl rSELF, %ecx
12112 movl %ecx, OUT_ARG0(%esp)
12113 leal OFF_FP_SHADOWFRAME(rFP), %eax
12114 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012115 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012116 REFRESH_IBASE
12117 jmp .L_op_nop+(228*128)
12118
12119/* ------------------------------ */
12120 .balign 128
12121.L_ALT_op_iget_object_quick: /* 0xe5 */
12122/* File: x86/alt_stub.S */
12123/*
12124 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12125 * any interesting requests and then jump to the real instruction
12126 * handler. Unlike the Arm handler, we can't do this as a tail call
12127 * because rIBASE is caller save and we need to reload it.
12128 *
12129 * Note that unlike in the Arm implementation, we should never arrive
12130 * here with a zero breakFlag because we always refresh rIBASE on
12131 * return.
12132 */
12133 .extern MterpCheckBefore
12134 EXPORT_PC
12135
12136 movl rSELF, %ecx
12137 movl %ecx, OUT_ARG0(%esp)
12138 leal OFF_FP_SHADOWFRAME(rFP), %eax
12139 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012140 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012141 REFRESH_IBASE
12142 jmp .L_op_nop+(229*128)
12143
12144/* ------------------------------ */
12145 .balign 128
12146.L_ALT_op_iput_quick: /* 0xe6 */
12147/* File: x86/alt_stub.S */
12148/*
12149 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12150 * any interesting requests and then jump to the real instruction
12151 * handler. Unlike the Arm handler, we can't do this as a tail call
12152 * because rIBASE is caller save and we need to reload it.
12153 *
12154 * Note that unlike in the Arm implementation, we should never arrive
12155 * here with a zero breakFlag because we always refresh rIBASE on
12156 * return.
12157 */
12158 .extern MterpCheckBefore
12159 EXPORT_PC
12160
12161 movl rSELF, %ecx
12162 movl %ecx, OUT_ARG0(%esp)
12163 leal OFF_FP_SHADOWFRAME(rFP), %eax
12164 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012165 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012166 REFRESH_IBASE
12167 jmp .L_op_nop+(230*128)
12168
12169/* ------------------------------ */
12170 .balign 128
12171.L_ALT_op_iput_wide_quick: /* 0xe7 */
12172/* File: x86/alt_stub.S */
12173/*
12174 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12175 * any interesting requests and then jump to the real instruction
12176 * handler. Unlike the Arm handler, we can't do this as a tail call
12177 * because rIBASE is caller save and we need to reload it.
12178 *
12179 * Note that unlike in the Arm implementation, we should never arrive
12180 * here with a zero breakFlag because we always refresh rIBASE on
12181 * return.
12182 */
12183 .extern MterpCheckBefore
12184 EXPORT_PC
12185
12186 movl rSELF, %ecx
12187 movl %ecx, OUT_ARG0(%esp)
12188 leal OFF_FP_SHADOWFRAME(rFP), %eax
12189 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012190 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012191 REFRESH_IBASE
12192 jmp .L_op_nop+(231*128)
12193
12194/* ------------------------------ */
12195 .balign 128
12196.L_ALT_op_iput_object_quick: /* 0xe8 */
12197/* File: x86/alt_stub.S */
12198/*
12199 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12200 * any interesting requests and then jump to the real instruction
12201 * handler. Unlike the Arm handler, we can't do this as a tail call
12202 * because rIBASE is caller save and we need to reload it.
12203 *
12204 * Note that unlike in the Arm implementation, we should never arrive
12205 * here with a zero breakFlag because we always refresh rIBASE on
12206 * return.
12207 */
12208 .extern MterpCheckBefore
12209 EXPORT_PC
12210
12211 movl rSELF, %ecx
12212 movl %ecx, OUT_ARG0(%esp)
12213 leal OFF_FP_SHADOWFRAME(rFP), %eax
12214 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012215 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012216 REFRESH_IBASE
12217 jmp .L_op_nop+(232*128)
12218
12219/* ------------------------------ */
12220 .balign 128
12221.L_ALT_op_invoke_virtual_quick: /* 0xe9 */
12222/* File: x86/alt_stub.S */
12223/*
12224 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12225 * any interesting requests and then jump to the real instruction
12226 * handler. Unlike the Arm handler, we can't do this as a tail call
12227 * because rIBASE is caller save and we need to reload it.
12228 *
12229 * Note that unlike in the Arm implementation, we should never arrive
12230 * here with a zero breakFlag because we always refresh rIBASE on
12231 * return.
12232 */
12233 .extern MterpCheckBefore
12234 EXPORT_PC
12235
12236 movl rSELF, %ecx
12237 movl %ecx, OUT_ARG0(%esp)
12238 leal OFF_FP_SHADOWFRAME(rFP), %eax
12239 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012240 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012241 REFRESH_IBASE
12242 jmp .L_op_nop+(233*128)
12243
12244/* ------------------------------ */
12245 .balign 128
12246.L_ALT_op_invoke_virtual_range_quick: /* 0xea */
12247/* File: x86/alt_stub.S */
12248/*
12249 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12250 * any interesting requests and then jump to the real instruction
12251 * handler. Unlike the Arm handler, we can't do this as a tail call
12252 * because rIBASE is caller save and we need to reload it.
12253 *
12254 * Note that unlike in the Arm implementation, we should never arrive
12255 * here with a zero breakFlag because we always refresh rIBASE on
12256 * return.
12257 */
12258 .extern MterpCheckBefore
12259 EXPORT_PC
12260
12261 movl rSELF, %ecx
12262 movl %ecx, OUT_ARG0(%esp)
12263 leal OFF_FP_SHADOWFRAME(rFP), %eax
12264 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012265 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012266 REFRESH_IBASE
12267 jmp .L_op_nop+(234*128)
12268
12269/* ------------------------------ */
12270 .balign 128
12271.L_ALT_op_iput_boolean_quick: /* 0xeb */
12272/* File: x86/alt_stub.S */
12273/*
12274 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12275 * any interesting requests and then jump to the real instruction
12276 * handler. Unlike the Arm handler, we can't do this as a tail call
12277 * because rIBASE is caller save and we need to reload it.
12278 *
12279 * Note that unlike in the Arm implementation, we should never arrive
12280 * here with a zero breakFlag because we always refresh rIBASE on
12281 * return.
12282 */
12283 .extern MterpCheckBefore
12284 EXPORT_PC
12285
12286 movl rSELF, %ecx
12287 movl %ecx, OUT_ARG0(%esp)
12288 leal OFF_FP_SHADOWFRAME(rFP), %eax
12289 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012290 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012291 REFRESH_IBASE
12292 jmp .L_op_nop+(235*128)
12293
12294/* ------------------------------ */
12295 .balign 128
12296.L_ALT_op_iput_byte_quick: /* 0xec */
12297/* File: x86/alt_stub.S */
12298/*
12299 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12300 * any interesting requests and then jump to the real instruction
12301 * handler. Unlike the Arm handler, we can't do this as a tail call
12302 * because rIBASE is caller save and we need to reload it.
12303 *
12304 * Note that unlike in the Arm implementation, we should never arrive
12305 * here with a zero breakFlag because we always refresh rIBASE on
12306 * return.
12307 */
12308 .extern MterpCheckBefore
12309 EXPORT_PC
12310
12311 movl rSELF, %ecx
12312 movl %ecx, OUT_ARG0(%esp)
12313 leal OFF_FP_SHADOWFRAME(rFP), %eax
12314 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012315 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012316 REFRESH_IBASE
12317 jmp .L_op_nop+(236*128)
12318
12319/* ------------------------------ */
12320 .balign 128
12321.L_ALT_op_iput_char_quick: /* 0xed */
12322/* File: x86/alt_stub.S */
12323/*
12324 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12325 * any interesting requests and then jump to the real instruction
12326 * handler. Unlike the Arm handler, we can't do this as a tail call
12327 * because rIBASE is caller save and we need to reload it.
12328 *
12329 * Note that unlike in the Arm implementation, we should never arrive
12330 * here with a zero breakFlag because we always refresh rIBASE on
12331 * return.
12332 */
12333 .extern MterpCheckBefore
12334 EXPORT_PC
12335
12336 movl rSELF, %ecx
12337 movl %ecx, OUT_ARG0(%esp)
12338 leal OFF_FP_SHADOWFRAME(rFP), %eax
12339 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012340 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012341 REFRESH_IBASE
12342 jmp .L_op_nop+(237*128)
12343
12344/* ------------------------------ */
12345 .balign 128
12346.L_ALT_op_iput_short_quick: /* 0xee */
12347/* File: x86/alt_stub.S */
12348/*
12349 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12350 * any interesting requests and then jump to the real instruction
12351 * handler. Unlike the Arm handler, we can't do this as a tail call
12352 * because rIBASE is caller save and we need to reload it.
12353 *
12354 * Note that unlike in the Arm implementation, we should never arrive
12355 * here with a zero breakFlag because we always refresh rIBASE on
12356 * return.
12357 */
12358 .extern MterpCheckBefore
12359 EXPORT_PC
12360
12361 movl rSELF, %ecx
12362 movl %ecx, OUT_ARG0(%esp)
12363 leal OFF_FP_SHADOWFRAME(rFP), %eax
12364 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012365 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012366 REFRESH_IBASE
12367 jmp .L_op_nop+(238*128)
12368
12369/* ------------------------------ */
12370 .balign 128
12371.L_ALT_op_iget_boolean_quick: /* 0xef */
12372/* File: x86/alt_stub.S */
12373/*
12374 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12375 * any interesting requests and then jump to the real instruction
12376 * handler. Unlike the Arm handler, we can't do this as a tail call
12377 * because rIBASE is caller save and we need to reload it.
12378 *
12379 * Note that unlike in the Arm implementation, we should never arrive
12380 * here with a zero breakFlag because we always refresh rIBASE on
12381 * return.
12382 */
12383 .extern MterpCheckBefore
12384 EXPORT_PC
12385
12386 movl rSELF, %ecx
12387 movl %ecx, OUT_ARG0(%esp)
12388 leal OFF_FP_SHADOWFRAME(rFP), %eax
12389 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012390 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012391 REFRESH_IBASE
12392 jmp .L_op_nop+(239*128)
12393
12394/* ------------------------------ */
12395 .balign 128
12396.L_ALT_op_iget_byte_quick: /* 0xf0 */
12397/* File: x86/alt_stub.S */
12398/*
12399 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12400 * any interesting requests and then jump to the real instruction
12401 * handler. Unlike the Arm handler, we can't do this as a tail call
12402 * because rIBASE is caller save and we need to reload it.
12403 *
12404 * Note that unlike in the Arm implementation, we should never arrive
12405 * here with a zero breakFlag because we always refresh rIBASE on
12406 * return.
12407 */
12408 .extern MterpCheckBefore
12409 EXPORT_PC
12410
12411 movl rSELF, %ecx
12412 movl %ecx, OUT_ARG0(%esp)
12413 leal OFF_FP_SHADOWFRAME(rFP), %eax
12414 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012415 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012416 REFRESH_IBASE
12417 jmp .L_op_nop+(240*128)
12418
12419/* ------------------------------ */
12420 .balign 128
12421.L_ALT_op_iget_char_quick: /* 0xf1 */
12422/* File: x86/alt_stub.S */
12423/*
12424 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12425 * any interesting requests and then jump to the real instruction
12426 * handler. Unlike the Arm handler, we can't do this as a tail call
12427 * because rIBASE is caller save and we need to reload it.
12428 *
12429 * Note that unlike in the Arm implementation, we should never arrive
12430 * here with a zero breakFlag because we always refresh rIBASE on
12431 * return.
12432 */
12433 .extern MterpCheckBefore
12434 EXPORT_PC
12435
12436 movl rSELF, %ecx
12437 movl %ecx, OUT_ARG0(%esp)
12438 leal OFF_FP_SHADOWFRAME(rFP), %eax
12439 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012440 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012441 REFRESH_IBASE
12442 jmp .L_op_nop+(241*128)
12443
12444/* ------------------------------ */
12445 .balign 128
12446.L_ALT_op_iget_short_quick: /* 0xf2 */
12447/* File: x86/alt_stub.S */
12448/*
12449 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12450 * any interesting requests and then jump to the real instruction
12451 * handler. Unlike the Arm handler, we can't do this as a tail call
12452 * because rIBASE is caller save and we need to reload it.
12453 *
12454 * Note that unlike in the Arm implementation, we should never arrive
12455 * here with a zero breakFlag because we always refresh rIBASE on
12456 * return.
12457 */
12458 .extern MterpCheckBefore
12459 EXPORT_PC
12460
12461 movl rSELF, %ecx
12462 movl %ecx, OUT_ARG0(%esp)
12463 leal OFF_FP_SHADOWFRAME(rFP), %eax
12464 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012465 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012466 REFRESH_IBASE
12467 jmp .L_op_nop+(242*128)
12468
12469/* ------------------------------ */
12470 .balign 128
12471.L_ALT_op_invoke_lambda: /* 0xf3 */
12472/* File: x86/alt_stub.S */
12473/*
12474 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12475 * any interesting requests and then jump to the real instruction
12476 * handler. Unlike the Arm handler, we can't do this as a tail call
12477 * because rIBASE is caller save and we need to reload it.
12478 *
12479 * Note that unlike in the Arm implementation, we should never arrive
12480 * here with a zero breakFlag because we always refresh rIBASE on
12481 * return.
12482 */
12483 .extern MterpCheckBefore
12484 EXPORT_PC
12485
12486 movl rSELF, %ecx
12487 movl %ecx, OUT_ARG0(%esp)
12488 leal OFF_FP_SHADOWFRAME(rFP), %eax
12489 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012490 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012491 REFRESH_IBASE
12492 jmp .L_op_nop+(243*128)
12493
12494/* ------------------------------ */
12495 .balign 128
12496.L_ALT_op_unused_f4: /* 0xf4 */
12497/* File: x86/alt_stub.S */
12498/*
12499 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12500 * any interesting requests and then jump to the real instruction
12501 * handler. Unlike the Arm handler, we can't do this as a tail call
12502 * because rIBASE is caller save and we need to reload it.
12503 *
12504 * Note that unlike in the Arm implementation, we should never arrive
12505 * here with a zero breakFlag because we always refresh rIBASE on
12506 * return.
12507 */
12508 .extern MterpCheckBefore
12509 EXPORT_PC
12510
12511 movl rSELF, %ecx
12512 movl %ecx, OUT_ARG0(%esp)
12513 leal OFF_FP_SHADOWFRAME(rFP), %eax
12514 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012515 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012516 REFRESH_IBASE
12517 jmp .L_op_nop+(244*128)
12518
12519/* ------------------------------ */
12520 .balign 128
12521.L_ALT_op_capture_variable: /* 0xf5 */
12522/* File: x86/alt_stub.S */
12523/*
12524 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12525 * any interesting requests and then jump to the real instruction
12526 * handler. Unlike the Arm handler, we can't do this as a tail call
12527 * because rIBASE is caller save and we need to reload it.
12528 *
12529 * Note that unlike in the Arm implementation, we should never arrive
12530 * here with a zero breakFlag because we always refresh rIBASE on
12531 * return.
12532 */
12533 .extern MterpCheckBefore
12534 EXPORT_PC
12535
12536 movl rSELF, %ecx
12537 movl %ecx, OUT_ARG0(%esp)
12538 leal OFF_FP_SHADOWFRAME(rFP), %eax
12539 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012540 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012541 REFRESH_IBASE
12542 jmp .L_op_nop+(245*128)
12543
12544/* ------------------------------ */
12545 .balign 128
12546.L_ALT_op_create_lambda: /* 0xf6 */
12547/* File: x86/alt_stub.S */
12548/*
12549 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12550 * any interesting requests and then jump to the real instruction
12551 * handler. Unlike the Arm handler, we can't do this as a tail call
12552 * because rIBASE is caller save and we need to reload it.
12553 *
12554 * Note that unlike in the Arm implementation, we should never arrive
12555 * here with a zero breakFlag because we always refresh rIBASE on
12556 * return.
12557 */
12558 .extern MterpCheckBefore
12559 EXPORT_PC
12560
12561 movl rSELF, %ecx
12562 movl %ecx, OUT_ARG0(%esp)
12563 leal OFF_FP_SHADOWFRAME(rFP), %eax
12564 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012565 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012566 REFRESH_IBASE
12567 jmp .L_op_nop+(246*128)
12568
12569/* ------------------------------ */
12570 .balign 128
12571.L_ALT_op_liberate_variable: /* 0xf7 */
12572/* File: x86/alt_stub.S */
12573/*
12574 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12575 * any interesting requests and then jump to the real instruction
12576 * handler. Unlike the Arm handler, we can't do this as a tail call
12577 * because rIBASE is caller save and we need to reload it.
12578 *
12579 * Note that unlike in the Arm implementation, we should never arrive
12580 * here with a zero breakFlag because we always refresh rIBASE on
12581 * return.
12582 */
12583 .extern MterpCheckBefore
12584 EXPORT_PC
12585
12586 movl rSELF, %ecx
12587 movl %ecx, OUT_ARG0(%esp)
12588 leal OFF_FP_SHADOWFRAME(rFP), %eax
12589 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012590 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012591 REFRESH_IBASE
12592 jmp .L_op_nop+(247*128)
12593
12594/* ------------------------------ */
12595 .balign 128
12596.L_ALT_op_box_lambda: /* 0xf8 */
12597/* File: x86/alt_stub.S */
12598/*
12599 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12600 * any interesting requests and then jump to the real instruction
12601 * handler. Unlike the Arm handler, we can't do this as a tail call
12602 * because rIBASE is caller save and we need to reload it.
12603 *
12604 * Note that unlike in the Arm implementation, we should never arrive
12605 * here with a zero breakFlag because we always refresh rIBASE on
12606 * return.
12607 */
12608 .extern MterpCheckBefore
12609 EXPORT_PC
12610
12611 movl rSELF, %ecx
12612 movl %ecx, OUT_ARG0(%esp)
12613 leal OFF_FP_SHADOWFRAME(rFP), %eax
12614 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012615 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012616 REFRESH_IBASE
12617 jmp .L_op_nop+(248*128)
12618
12619/* ------------------------------ */
12620 .balign 128
12621.L_ALT_op_unbox_lambda: /* 0xf9 */
12622/* File: x86/alt_stub.S */
12623/*
12624 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12625 * any interesting requests and then jump to the real instruction
12626 * handler. Unlike the Arm handler, we can't do this as a tail call
12627 * because rIBASE is caller save and we need to reload it.
12628 *
12629 * Note that unlike in the Arm implementation, we should never arrive
12630 * here with a zero breakFlag because we always refresh rIBASE on
12631 * return.
12632 */
12633 .extern MterpCheckBefore
12634 EXPORT_PC
12635
12636 movl rSELF, %ecx
12637 movl %ecx, OUT_ARG0(%esp)
12638 leal OFF_FP_SHADOWFRAME(rFP), %eax
12639 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012640 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012641 REFRESH_IBASE
12642 jmp .L_op_nop+(249*128)
12643
12644/* ------------------------------ */
12645 .balign 128
12646.L_ALT_op_unused_fa: /* 0xfa */
12647/* File: x86/alt_stub.S */
12648/*
12649 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12650 * any interesting requests and then jump to the real instruction
12651 * handler. Unlike the Arm handler, we can't do this as a tail call
12652 * because rIBASE is caller save and we need to reload it.
12653 *
12654 * Note that unlike in the Arm implementation, we should never arrive
12655 * here with a zero breakFlag because we always refresh rIBASE on
12656 * return.
12657 */
12658 .extern MterpCheckBefore
12659 EXPORT_PC
12660
12661 movl rSELF, %ecx
12662 movl %ecx, OUT_ARG0(%esp)
12663 leal OFF_FP_SHADOWFRAME(rFP), %eax
12664 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012665 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012666 REFRESH_IBASE
12667 jmp .L_op_nop+(250*128)
12668
12669/* ------------------------------ */
12670 .balign 128
12671.L_ALT_op_unused_fb: /* 0xfb */
12672/* File: x86/alt_stub.S */
12673/*
12674 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12675 * any interesting requests and then jump to the real instruction
12676 * handler. Unlike the Arm handler, we can't do this as a tail call
12677 * because rIBASE is caller save and we need to reload it.
12678 *
12679 * Note that unlike in the Arm implementation, we should never arrive
12680 * here with a zero breakFlag because we always refresh rIBASE on
12681 * return.
12682 */
12683 .extern MterpCheckBefore
12684 EXPORT_PC
12685
12686 movl rSELF, %ecx
12687 movl %ecx, OUT_ARG0(%esp)
12688 leal OFF_FP_SHADOWFRAME(rFP), %eax
12689 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012690 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012691 REFRESH_IBASE
12692 jmp .L_op_nop+(251*128)
12693
12694/* ------------------------------ */
12695 .balign 128
12696.L_ALT_op_unused_fc: /* 0xfc */
12697/* File: x86/alt_stub.S */
12698/*
12699 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12700 * any interesting requests and then jump to the real instruction
12701 * handler. Unlike the Arm handler, we can't do this as a tail call
12702 * because rIBASE is caller save and we need to reload it.
12703 *
12704 * Note that unlike in the Arm implementation, we should never arrive
12705 * here with a zero breakFlag because we always refresh rIBASE on
12706 * return.
12707 */
12708 .extern MterpCheckBefore
12709 EXPORT_PC
12710
12711 movl rSELF, %ecx
12712 movl %ecx, OUT_ARG0(%esp)
12713 leal OFF_FP_SHADOWFRAME(rFP), %eax
12714 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012715 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012716 REFRESH_IBASE
12717 jmp .L_op_nop+(252*128)
12718
12719/* ------------------------------ */
12720 .balign 128
12721.L_ALT_op_unused_fd: /* 0xfd */
12722/* File: x86/alt_stub.S */
12723/*
12724 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12725 * any interesting requests and then jump to the real instruction
12726 * handler. Unlike the Arm handler, we can't do this as a tail call
12727 * because rIBASE is caller save and we need to reload it.
12728 *
12729 * Note that unlike in the Arm implementation, we should never arrive
12730 * here with a zero breakFlag because we always refresh rIBASE on
12731 * return.
12732 */
12733 .extern MterpCheckBefore
12734 EXPORT_PC
12735
12736 movl rSELF, %ecx
12737 movl %ecx, OUT_ARG0(%esp)
12738 leal OFF_FP_SHADOWFRAME(rFP), %eax
12739 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012740 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012741 REFRESH_IBASE
12742 jmp .L_op_nop+(253*128)
12743
12744/* ------------------------------ */
12745 .balign 128
12746.L_ALT_op_unused_fe: /* 0xfe */
12747/* File: x86/alt_stub.S */
12748/*
12749 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12750 * any interesting requests and then jump to the real instruction
12751 * handler. Unlike the Arm handler, we can't do this as a tail call
12752 * because rIBASE is caller save and we need to reload it.
12753 *
12754 * Note that unlike in the Arm implementation, we should never arrive
12755 * here with a zero breakFlag because we always refresh rIBASE on
12756 * return.
12757 */
12758 .extern MterpCheckBefore
12759 EXPORT_PC
12760
12761 movl rSELF, %ecx
12762 movl %ecx, OUT_ARG0(%esp)
12763 leal OFF_FP_SHADOWFRAME(rFP), %eax
12764 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012765 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012766 REFRESH_IBASE
12767 jmp .L_op_nop+(254*128)
12768
12769/* ------------------------------ */
12770 .balign 128
12771.L_ALT_op_unused_ff: /* 0xff */
12772/* File: x86/alt_stub.S */
12773/*
12774 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12775 * any interesting requests and then jump to the real instruction
12776 * handler. Unlike the Arm handler, we can't do this as a tail call
12777 * because rIBASE is caller save and we need to reload it.
12778 *
12779 * Note that unlike in the Arm implementation, we should never arrive
12780 * here with a zero breakFlag because we always refresh rIBASE on
12781 * return.
12782 */
12783 .extern MterpCheckBefore
12784 EXPORT_PC
12785
12786 movl rSELF, %ecx
12787 movl %ecx, OUT_ARG0(%esp)
12788 leal OFF_FP_SHADOWFRAME(rFP), %eax
12789 movl %eax, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012790 call SYMBOL(MterpCheckBefore) # (self, shadow_frame)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012791 REFRESH_IBASE
12792 jmp .L_op_nop+(255*128)
12793
12794 .balign 128
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012795 SIZE(SYMBOL(artMterpAsmAltInstructionStart),SYMBOL(artMterpAsmAltInstructionStart))
12796 .global SYMBOL(artMterpAsmAltInstructionEnd)
12797SYMBOL(artMterpAsmAltInstructionEnd):
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012798/* File: x86/footer.S */
12799/*
12800 * ===========================================================================
12801 * Common subroutines and data
12802 * ===========================================================================
12803 */
12804
12805 .text
12806 .align 2
12807
12808/*
12809 * We've detected a condition that will result in an exception, but the exception
12810 * has not yet been thrown. Just bail out to the reference interpreter to deal with it.
12811 * TUNING: for consistency, we may want to just go ahead and handle these here.
12812 */
12813#define MTERP_LOGGING 0
12814common_errDivideByZero:
12815 EXPORT_PC
12816#if MTERP_LOGGING
12817 movl rSELF, %eax
12818 movl %eax, OUT_ARG0(%esp)
12819 lea OFF_FP_SHADOWFRAME(rFP), %ecx
12820 movl %ecx, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012821 call SYMBOL(MterpLogDivideByZeroException)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012822#endif
12823 jmp MterpCommonFallback
12824
12825common_errArrayIndex:
12826 EXPORT_PC
12827#if MTERP_LOGGING
12828 movl rSELF, %eax
12829 movl %eax, OUT_ARG0(%esp)
12830 lea OFF_FP_SHADOWFRAME(rFP), %ecx
12831 movl %ecx, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012832 call SYMBOL(MterpLogArrayIndexException)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012833#endif
12834 jmp MterpCommonFallback
12835
12836common_errNegativeArraySize:
12837 EXPORT_PC
12838#if MTERP_LOGGING
12839 movl rSELF, %eax
12840 movl %eax, OUT_ARG0(%esp)
12841 lea OFF_FP_SHADOWFRAME(rFP), %ecx
12842 movl %ecx, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012843 call SYMBOL(MterpLogNegativeArraySizeException)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012844#endif
12845 jmp MterpCommonFallback
12846
12847common_errNoSuchMethod:
12848 EXPORT_PC
12849#if MTERP_LOGGING
12850 movl rSELF, %eax
12851 movl %eax, OUT_ARG0(%esp)
12852 lea OFF_FP_SHADOWFRAME(rFP), %ecx
12853 movl %ecx, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012854 call SYMBOL(MterpLogNoSuchMethodException)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012855#endif
12856 jmp MterpCommonFallback
12857
12858common_errNullObject:
12859 EXPORT_PC
12860#if MTERP_LOGGING
12861 movl rSELF, %eax
12862 movl %eax, OUT_ARG0(%esp)
12863 lea OFF_FP_SHADOWFRAME(rFP), %ecx
12864 movl %ecx, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012865 call SYMBOL(MterpLogNullObjectException)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012866#endif
12867 jmp MterpCommonFallback
12868
12869common_exceptionThrown:
12870 EXPORT_PC
12871#if MTERP_LOGGING
12872 movl rSELF, %eax
12873 movl %eax, OUT_ARG0(%esp)
12874 lea OFF_FP_SHADOWFRAME(rFP), %ecx
12875 movl %ecx, OUT_ARG0(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012876 call SYMBOL(MterpLogExceptionThrownException)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012877#endif
12878 jmp MterpCommonFallback
12879
12880MterpSuspendFallback:
12881 EXPORT_PC
12882#if MTERP_LOGGING
12883 movl rSELF, %eax
12884 movl %eax, OUT_ARG0(%esp)
12885 lea OFF_FP_SHADOWFRAME(rFP), %ecx
12886 movl %ecx, OUT_ARG0(%esp)
12887 movl THREAD_FLAGS_OFFSET(%eax), %eax
12888 movl %eax, OUT_ARG2(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012889 call SYMBOL(MterpLogSuspendFallback)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012890#endif
12891 jmp MterpCommonFallback
12892
12893/*
12894 * If we're here, something is out of the ordinary. If there is a pending
12895 * exception, handle it. Otherwise, roll back and retry with the reference
12896 * interpreter.
12897 */
12898MterpPossibleException:
12899 movl rSELF, %eax
12900 testl $-1, THREAD_EXCEPTION_OFFSET(%eax)
12901 jz MterpFallback
12902 /* intentional fallthrough - handle pending exception. */
12903
12904/*
12905 * On return from a runtime helper routine, we've found a pending exception.
12906 * Can we handle it here - or need to bail out to caller?
12907 *
12908 */
12909MterpException:
12910 movl rSELF, %eax
12911 movl %eax, OUT_ARG0(%esp)
12912 lea OFF_FP_SHADOWFRAME(rFP), %ecx
12913 movl %ecx, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012914 call SYMBOL(MterpHandleException)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012915 testl %eax, %eax
12916 jz MterpExceptionReturn
12917 REFRESH_IBASE
12918 movl OFF_FP_CODE_ITEM(rFP), %eax
12919 movl OFF_FP_DEX_PC(rFP), %ecx
12920 lea CODEITEM_INSNS_OFFSET(%eax), rPC
12921 lea (rPC, %ecx, 2), rPC
12922 movl rPC, OFF_FP_DEX_PC_PTR(rFP)
12923 /* resume execution at catch block */
12924 FETCH_INST
12925 GOTO_NEXT
12926 /* NOTE: no fallthrough */
12927
12928/*
12929 * Check for suspend check request. Assumes rINST already loaded, rPC advanced and
12930 * still needs to get the opcode and branch to it, and flags are in lr.
12931 */
12932MterpCheckSuspendAndContinue:
12933 movl rSELF, %eax
12934 EXPORT_PC
12935 testl $(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST), THREAD_FLAGS_OFFSET(%eax)
12936 jz 1f
12937 movl %eax, OUT_ARG0(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012938 call SYMBOL(MterpSuspendCheck)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012939 REFRESH_IBASE
129401:
12941 GOTO_NEXT
12942
12943/*
12944 * Bail out to reference interpreter.
12945 */
12946MterpFallback:
12947 EXPORT_PC
12948#if MTERP_LOGGING
12949 movl rSELF, %eax
12950 movl %eax, OUT_ARG0(%esp)
12951 lea OFF_FP_SHADOWFRAME(rFP), %ecx
12952 movl %ecx, OUT_ARG1(%esp)
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012953 call SYMBOL(MterpLogFallback)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012954#endif
12955MterpCommonFallback:
12956 xor %eax, %eax
12957 jmp MterpDone
12958
12959/*
12960 * On entry:
12961 * uint32_t* rFP (should still be live, pointer to base of vregs)
12962 */
12963MterpExceptionReturn:
12964 movl $1, %eax
12965 jmp MterpDone
12966MterpReturn:
12967 movl OFF_FP_RESULT_REGISTER(rFP), %edx
12968 movl %eax, (%edx)
12969 movl %ecx, 4(%edx)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012970 mov $1, %eax
12971MterpDone:
12972 /* Restore callee save register */
12973 movl EBP_SPILL(%esp), %ebp
12974 movl EDI_SPILL(%esp), %edi
12975 movl ESI_SPILL(%esp), %esi
12976 movl EBX_SPILL(%esp), %ebx
12977
12978 /* pop up frame */
12979 addl $FRAME_SIZE, %esp
12980 .cfi_adjust_cfa_offset -FRAME_SIZE
12981 ret
12982
12983 .cfi_endproc
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060012984 SIZE(ExecuteMterpImpl,ExecuteMterpImpl)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012985