blob: e2918dcfb27321891bbff592a6ca57cb23402464 [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
99/* Frame size must be 16-byte aligned.
100 * Remember about 4 bytes for return address
101 */
102#define FRAME_SIZE 44
103
104/* Frame diagram while executing ExecuteMterpImpl, high to low addresses */
105#define IN_ARG3 (FRAME_SIZE + 16)
106#define IN_ARG2 (FRAME_SIZE + 12)
107#define IN_ARG1 (FRAME_SIZE + 8)
108#define IN_ARG0 (FRAME_SIZE + 4)
109#define CALLER_RP (FRAME_SIZE + 0)
110/* Spill offsets relative to %esp */
111#define EBP_SPILL (FRAME_SIZE - 4)
112#define EDI_SPILL (FRAME_SIZE - 8)
113#define ESI_SPILL (FRAME_SIZE - 12)
114#define EBX_SPILL (FRAME_SIZE - 16)
115#define LOCAL0 (FRAME_SIZE - 20)
116#define LOCAL1 (FRAME_SIZE - 24)
117#define LOCAL2 (FRAME_SIZE - 28)
118/* Out Arg offsets, relative to %esp */
119#define OUT_ARG3 ( 12)
120#define OUT_ARG2 ( 8)
121#define OUT_ARG1 ( 4)
122#define OUT_ARG0 ( 0) /* <- ExecuteMterpImpl esp + 0 */
123
124/* During bringup, we'll use the shadow frame model instead of rFP */
125/* single-purpose registers, given names for clarity */
126#define rSELF IN_ARG0(%esp)
127#define rPC %esi
128#define rFP %edi
129#define rINST %ebx
130#define rINSTw %bx
131#define rINSTbh %bh
132#define rINSTbl %bl
133#define rIBASE %edx
134#define rREFS %ebp
135
136/*
137 * Instead of holding a pointer to the shadow frame, we keep rFP at the base of the vregs. So,
138 * to access other shadow frame fields, we need to use a backwards offset. Define those here.
139 */
140#define OFF_FP(a) (a - SHADOWFRAME_VREGS_OFFSET)
141#define OFF_FP_NUMBER_OF_VREGS OFF_FP(SHADOWFRAME_NUMBER_OF_VREGS_OFFSET)
142#define OFF_FP_DEX_PC OFF_FP(SHADOWFRAME_DEX_PC_OFFSET)
143#define OFF_FP_LINK OFF_FP(SHADOWFRAME_LINK_OFFSET)
144#define OFF_FP_METHOD OFF_FP(SHADOWFRAME_METHOD_OFFSET)
145#define OFF_FP_RESULT_REGISTER OFF_FP(SHADOWFRAME_RESULT_REGISTER_OFFSET)
146#define OFF_FP_DEX_PC_PTR OFF_FP(SHADOWFRAME_DEX_PC_PTR_OFFSET)
147#define OFF_FP_CODE_ITEM OFF_FP(SHADOWFRAME_CODE_ITEM_OFFSET)
148#define OFF_FP_SHADOWFRAME (-SHADOWFRAME_VREGS_OFFSET)
149
150/*
151 *
152 * The reference interpreter performs explicit suspect checks, which is somewhat wasteful.
153 * Dalvik's interpreter folded suspend checks into the jump table mechanism, and eventually
154 * mterp should do so as well.
155 */
156#define MTERP_SUSPEND 0
157
158/*
159 * "export" the PC to dex_pc field in the shadow frame, f/b/o future exception objects. Must
160 * be done *before* something throws.
161 *
162 * It's okay to do this more than once.
163 *
164 * NOTE: the fast interpreter keeps track of dex pc as a direct pointer to the mapped
165 * dex byte codes. However, the rest of the runtime expects dex pc to be an instruction
166 * offset into the code_items_[] array. For effiency, we will "export" the
167 * current dex pc as a direct pointer using the EXPORT_PC macro, and rely on GetDexPC
168 * to convert to a dex pc when needed.
169 */
170.macro EXPORT_PC
171 movl rPC, OFF_FP_DEX_PC_PTR(rFP)
172.endm
173
174/*
175 * Refresh handler table.
176 * IBase handles uses the caller save register so we must restore it after each call.
177 * Also it is used as a result of some 64-bit operations (like imul) and we should
178 * restore it in such cases also.
179 *
180 * TODO: Consider spilling the IBase instead of restoring it from Thread structure.
181 */
182.macro REFRESH_IBASE
183 movl rSELF, rIBASE
184 movl THREAD_CURRENT_IBASE_OFFSET(rIBASE), rIBASE
185.endm
186
187/*
188 * If rSELF is already loaded then we can use it from known reg.
189 */
190.macro REFRESH_IBASE_FROM_SELF _reg
191 movl THREAD_CURRENT_IBASE_OFFSET(\_reg), rIBASE
192.endm
193
194/*
195 * Refresh rINST.
196 * At enter to handler rINST does not contain the opcode number.
197 * However some utilities require the full value, so this macro
198 * restores the opcode number.
199 */
200.macro REFRESH_INST _opnum
201 movb rINSTbl, rINSTbh
202 movb $\_opnum, rINSTbl
203.endm
204
205/*
206 * Fetch the next instruction from rPC into rINSTw. Does not advance rPC.
207 */
208.macro FETCH_INST
209 movzwl (rPC), rINST
210.endm
211
212/*
213 * Remove opcode from rINST, compute the address of handler and jump to it.
214 */
215.macro GOTO_NEXT
216 movzx rINSTbl,%eax
217 movzbl rINSTbh,rINST
218 shll $7, %eax
219 addl rIBASE, %eax
220 jmp *%eax
221.endm
222
223/*
224 * Advance rPC by instruction count.
225 */
226.macro ADVANCE_PC _count
227 leal 2*\_count(rPC), rPC
228.endm
229
230/*
231 * Advance rPC by instruction count, fetch instruction and jump to handler.
232 */
233.macro ADVANCE_PC_FETCH_AND_GOTO_NEXT _count
234 ADVANCE_PC \_count
235 FETCH_INST
236 GOTO_NEXT
237.endm
238
239/*
240 * Get/set the 32-bit value from a Dalvik register.
241 */
242#define VREG_ADDRESS(_vreg) (rFP,_vreg,4)
243#define VREG_HIGH_ADDRESS(_vreg) 4(rFP,_vreg,4)
244#define VREG_REF_ADDRESS(_vreg) (rREFS,_vreg,4)
245#define VREG_REF_HIGH_ADDRESS(_vreg) 4(rREFS,_vreg,4)
246
247.macro GET_VREG _reg _vreg
248 movl (rFP,\_vreg,4), \_reg
249.endm
250
251/* Read wide value to xmm. */
252.macro GET_WIDE_FP_VREG _reg _vreg
253 movq (rFP,\_vreg,4), \_reg
254.endm
255
256.macro SET_VREG _reg _vreg
257 movl \_reg, (rFP,\_vreg,4)
258 movl $0, (rREFS,\_vreg,4)
259.endm
260
261/* Write wide value from xmm. xmm is clobbered. */
262.macro SET_WIDE_FP_VREG _reg _vreg
263 movq \_reg, (rFP,\_vreg,4)
264 pxor \_reg, \_reg
265 movq \_reg, (rREFS,\_vreg,4)
266.endm
267
268.macro SET_VREG_OBJECT _reg _vreg
269 movl \_reg, (rFP,\_vreg,4)
270 movl \_reg, (rREFS,\_vreg,4)
271.endm
272
273.macro GET_VREG_HIGH _reg _vreg
274 movl 4(rFP,\_vreg,4), \_reg
275.endm
276
277.macro SET_VREG_HIGH _reg _vreg
278 movl \_reg, 4(rFP,\_vreg,4)
279 movl $0, 4(rREFS,\_vreg,4)
280.endm
281
282.macro CLEAR_REF _vreg
283 movl $0, (rREFS,\_vreg,4)
284.endm
285
286.macro CLEAR_WIDE_REF _vreg
287 movl $0, (rREFS,\_vreg,4)
288 movl $0, 4(rREFS,\_vreg,4)
289.endm
290
291/* File: x86/entry.S */
292/*
293 * Copyright (C) 2016 The Android Open Source Project
294 *
295 * Licensed under the Apache License, Version 2.0 (the "License");
296 * you may not use this file except in compliance with the License.
297 * You may obtain a copy of the License at
298 *
299 * http://www.apache.org/licenses/LICENSE-2.0
300 *
301 * Unless required by applicable law or agreed to in writing, software
302 * distributed under the License is distributed on an "AS IS" BASIS,
303 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
304 * See the License for the specific language governing permissions and
305 * limitations under the License.
306 */
307/*
308 * Interpreter entry point.
309 */
310
311 .text
312 .global ExecuteMterpImpl
313 .type ExecuteMterpImpl, %function
314
315/*
316 * On entry:
317 * 0 Thread* self
318 * 1 code_item
319 * 2 ShadowFrame
320 * 3 JValue* result_register
321 *
322 */
323
324ExecuteMterpImpl:
325 .cfi_startproc
326 /* Allocate frame */
327 subl $FRAME_SIZE, %esp
328 .cfi_adjust_cfa_offset FRAME_SIZE
329
330 /* Spill callee save regs */
331 movl %ebp, EBP_SPILL(%esp)
332 movl %edi, EDI_SPILL(%esp)
333 movl %esi, ESI_SPILL(%esp)
334 movl %ebx, EBX_SPILL(%esp)
335
336 /* Load ShadowFrame pointer */
337 movl IN_ARG2(%esp), %edx
338
339 /* Remember the return register */
340 movl IN_ARG3(%esp), %eax
341 movl %eax, SHADOWFRAME_RESULT_REGISTER_OFFSET(%edx)
342
343 /* Remember the code_item */
344 movl IN_ARG1(%esp), %ecx
345 movl %ecx, SHADOWFRAME_CODE_ITEM_OFFSET(%edx)
346
347 /* set up "named" registers */
348 movl SHADOWFRAME_NUMBER_OF_VREGS_OFFSET(%edx), %eax
349 leal SHADOWFRAME_VREGS_OFFSET(%edx), rFP
350 leal (rFP, %eax, 4), rREFS
351 movl SHADOWFRAME_DEX_PC_OFFSET(%edx), %eax
352 lea CODEITEM_INSNS_OFFSET(%ecx), rPC
353 lea (rPC, %eax, 2), rPC
354 EXPORT_PC
355
356 /* Starting ibase */
357 REFRESH_IBASE
358
359 /* start executing the instruction at rPC */
360 FETCH_INST
361 GOTO_NEXT
362 /* NOTE: no fallthrough */
363
364
365 .global artMterpAsmInstructionStart
366 .type artMterpAsmInstructionStart, %function
367artMterpAsmInstructionStart = .L_op_nop
368 .text
369
370/* ------------------------------ */
371 .balign 128
372.L_op_nop: /* 0x00 */
373/* File: x86/op_nop.S */
374 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
375
376/* ------------------------------ */
377 .balign 128
378.L_op_move: /* 0x01 */
379/* File: x86/op_move.S */
380 /* for move, move-object, long-to-int */
381 /* op vA, vB */
382 movzbl rINSTbl, %eax # eax <- BA
383 andb $0xf, %al # eax <- A
384 shrl $4, rINST # rINST <- B
385 GET_VREG rINST rINST
386 .if 0
387 SET_VREG_OBJECT rINST %eax # fp[A] <- fp[B]
388 .else
389 SET_VREG rINST %eax # fp[A] <- fp[B]
390 .endif
391 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
392
393/* ------------------------------ */
394 .balign 128
395.L_op_move_from16: /* 0x02 */
396/* File: x86/op_move_from16.S */
397 /* for: move/from16, move-object/from16 */
398 /* op vAA, vBBBB */
399 movzx rINSTbl, %eax # eax <- AA
400 movw 2(rPC), rINSTw # rINSTw <- BBBB
401 GET_VREG rINST rINST # rINST <- fp[BBBB]
402 .if 0
403 SET_VREG_OBJECT rINST %eax # fp[A] <- fp[B]
404 .else
405 SET_VREG rINST %eax # fp[A] <- fp[B]
406 .endif
407 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
408
409/* ------------------------------ */
410 .balign 128
411.L_op_move_16: /* 0x03 */
412/* File: x86/op_move_16.S */
413 /* for: move/16, move-object/16 */
414 /* op vAAAA, vBBBB */
415 movzwl 4(rPC), %ecx # ecx <- BBBB
416 movzwl 2(rPC), %eax # eax <- AAAA
417 GET_VREG rINST %ecx
418 .if 0
419 SET_VREG_OBJECT rINST %eax # fp[A] <- fp[B]
420 .else
421 SET_VREG rINST %eax # fp[A] <- fp[B]
422 .endif
423 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
424
425/* ------------------------------ */
426 .balign 128
427.L_op_move_wide: /* 0x04 */
428/* File: x86/op_move_wide.S */
429 /* move-wide vA, vB */
430 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
431 movzbl rINSTbl, %ecx # ecx <- BA
432 sarl $4, rINST # rINST <- B
433 andb $0xf, %cl # ecx <- A
434 GET_WIDE_FP_VREG %xmm0 rINST # xmm0 <- v[B]
435 SET_WIDE_FP_VREG %xmm0 %ecx # v[A] <- xmm0
436 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
437
438/* ------------------------------ */
439 .balign 128
440.L_op_move_wide_from16: /* 0x05 */
441/* File: x86/op_move_wide_from16.S */
442 /* move-wide/from16 vAA, vBBBB */
443 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
444 movzwl 2(rPC), %ecx # ecx <- BBBB
445 movzbl rINSTbl, %eax # eax <- AAAA
446 GET_WIDE_FP_VREG %xmm0 %ecx # xmm0 <- v[B]
447 SET_WIDE_FP_VREG %xmm0 %eax # v[A] <- xmm0
448 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
449
450/* ------------------------------ */
451 .balign 128
452.L_op_move_wide_16: /* 0x06 */
453/* File: x86/op_move_wide_16.S */
454 /* move-wide/16 vAAAA, vBBBB */
455 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
456 movzwl 4(rPC), %ecx # ecx<- BBBB
457 movzwl 2(rPC), %eax # eax<- AAAA
458 GET_WIDE_FP_VREG %xmm0 %ecx # xmm0 <- v[B]
459 SET_WIDE_FP_VREG %xmm0 %eax # v[A] <- xmm0
460 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
461
462/* ------------------------------ */
463 .balign 128
464.L_op_move_object: /* 0x07 */
465/* File: x86/op_move_object.S */
466/* File: x86/op_move.S */
467 /* for move, move-object, long-to-int */
468 /* op vA, vB */
469 movzbl rINSTbl, %eax # eax <- BA
470 andb $0xf, %al # eax <- A
471 shrl $4, rINST # rINST <- B
472 GET_VREG rINST rINST
473 .if 1
474 SET_VREG_OBJECT rINST %eax # fp[A] <- fp[B]
475 .else
476 SET_VREG rINST %eax # fp[A] <- fp[B]
477 .endif
478 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
479
480
481/* ------------------------------ */
482 .balign 128
483.L_op_move_object_from16: /* 0x08 */
484/* File: x86/op_move_object_from16.S */
485/* File: x86/op_move_from16.S */
486 /* for: move/from16, move-object/from16 */
487 /* op vAA, vBBBB */
488 movzx rINSTbl, %eax # eax <- AA
489 movw 2(rPC), rINSTw # rINSTw <- BBBB
490 GET_VREG rINST rINST # rINST <- fp[BBBB]
491 .if 1
492 SET_VREG_OBJECT rINST %eax # fp[A] <- fp[B]
493 .else
494 SET_VREG rINST %eax # fp[A] <- fp[B]
495 .endif
496 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
497
498
499/* ------------------------------ */
500 .balign 128
501.L_op_move_object_16: /* 0x09 */
502/* File: x86/op_move_object_16.S */
503/* File: x86/op_move_16.S */
504 /* for: move/16, move-object/16 */
505 /* op vAAAA, vBBBB */
506 movzwl 4(rPC), %ecx # ecx <- BBBB
507 movzwl 2(rPC), %eax # eax <- AAAA
508 GET_VREG rINST %ecx
509 .if 1
510 SET_VREG_OBJECT rINST %eax # fp[A] <- fp[B]
511 .else
512 SET_VREG rINST %eax # fp[A] <- fp[B]
513 .endif
514 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
515
516
517/* ------------------------------ */
518 .balign 128
519.L_op_move_result: /* 0x0a */
520/* File: x86/op_move_result.S */
521 /* for: move-result, move-result-object */
522 /* op vAA */
523 movl OFF_FP_RESULT_REGISTER(rFP), %eax # get pointer to result JType.
524 movl (%eax), %eax # r0 <- result.i.
525 .if 0
526 SET_VREG_OBJECT %eax rINST # fp[A] <- fp[B]
527 .else
528 SET_VREG %eax rINST # fp[A] <- fp[B]
529 .endif
530 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
531
532/* ------------------------------ */
533 .balign 128
534.L_op_move_result_wide: /* 0x0b */
535/* File: x86/op_move_result_wide.S */
536 /* move-result-wide vAA */
537 movl OFF_FP_RESULT_REGISTER(rFP), %eax # get pointer to result JType.
538 movl 4(%eax), %ecx # Get high
539 movl (%eax), %eax # Get low
540 SET_VREG %eax rINST # v[AA+0] <- eax
541 SET_VREG_HIGH %ecx rINST # v[AA+1] <- ecx
542 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
543
544/* ------------------------------ */
545 .balign 128
546.L_op_move_result_object: /* 0x0c */
547/* File: x86/op_move_result_object.S */
548/* File: x86/op_move_result.S */
549 /* for: move-result, move-result-object */
550 /* op vAA */
551 movl OFF_FP_RESULT_REGISTER(rFP), %eax # get pointer to result JType.
552 movl (%eax), %eax # r0 <- result.i.
553 .if 1
554 SET_VREG_OBJECT %eax rINST # fp[A] <- fp[B]
555 .else
556 SET_VREG %eax rINST # fp[A] <- fp[B]
557 .endif
558 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
559
560
561/* ------------------------------ */
562 .balign 128
563.L_op_move_exception: /* 0x0d */
564/* File: x86/op_move_exception.S */
565 /* move-exception vAA */
566 movl rSELF, %ecx
567 movl THREAD_EXCEPTION_OFFSET(%ecx), %eax
568 SET_VREG_OBJECT %eax rINST # fp[AA] <- exception object
569 movl $0, THREAD_EXCEPTION_OFFSET(%ecx)
570 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
571
572/* ------------------------------ */
573 .balign 128
574.L_op_return_void: /* 0x0e */
575/* File: x86/op_return_void.S */
576 .extern MterpThreadFenceForConstructor
577 call MterpThreadFenceForConstructor
buzbeea2c97a92016-01-25 15:41:24 -0800578 movl rSELF, %eax
579 testl $(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST), THREAD_FLAGS_OFFSET(%eax)
580 jz 1f
581 movl %eax, OUT_ARG0(%esp)
582 call MterpSuspendCheck
5831:
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000584 xorl %eax, %eax
585 xorl %ecx, %ecx
586 jmp MterpReturn
587
588/* ------------------------------ */
589 .balign 128
590.L_op_return: /* 0x0f */
591/* File: x86/op_return.S */
592/*
593 * Return a 32-bit value.
594 *
595 * for: return, return-object
596 */
597 /* op vAA */
598 .extern MterpThreadFenceForConstructor
599 call MterpThreadFenceForConstructor
buzbeea2c97a92016-01-25 15:41:24 -0800600 movl rSELF, %eax
601 testl $(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST), THREAD_FLAGS_OFFSET(%eax)
602 jz 1f
603 movl %eax, OUT_ARG0(%esp)
604 call MterpSuspendCheck
6051:
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000606 GET_VREG %eax rINST # eax <- vAA
607 xorl %ecx, %ecx
608 jmp MterpReturn
609
610/* ------------------------------ */
611 .balign 128
612.L_op_return_wide: /* 0x10 */
613/* File: x86/op_return_wide.S */
614/*
615 * Return a 64-bit value.
616 */
617 /* return-wide vAA */
618 .extern MterpThreadFenceForConstructor
619 call MterpThreadFenceForConstructor
buzbeea2c97a92016-01-25 15:41:24 -0800620 movl rSELF, %eax
621 testl $(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST), THREAD_FLAGS_OFFSET(%eax)
622 jz 1f
623 movl %eax, OUT_ARG0(%esp)
624 call MterpSuspendCheck
6251:
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000626 GET_VREG %eax rINST # eax <- v[AA+0]
627 GET_VREG_HIGH %ecx rINST # ecx <- v[AA+1]
628 jmp MterpReturn
629
630/* ------------------------------ */
631 .balign 128
632.L_op_return_object: /* 0x11 */
633/* File: x86/op_return_object.S */
634/* File: x86/op_return.S */
635/*
636 * Return a 32-bit value.
637 *
638 * for: return, return-object
639 */
640 /* op vAA */
641 .extern MterpThreadFenceForConstructor
642 call MterpThreadFenceForConstructor
buzbeea2c97a92016-01-25 15:41:24 -0800643 movl rSELF, %eax
644 testl $(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST), THREAD_FLAGS_OFFSET(%eax)
645 jz 1f
646 movl %eax, OUT_ARG0(%esp)
647 call MterpSuspendCheck
6481:
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000649 GET_VREG %eax rINST # eax <- vAA
650 xorl %ecx, %ecx
651 jmp MterpReturn
652
653
654/* ------------------------------ */
655 .balign 128
656.L_op_const_4: /* 0x12 */
657/* File: x86/op_const_4.S */
658 /* const/4 vA, #+B */
659 movsx rINSTbl, %eax # eax <-ssssssBx
660 movl $0xf, rINST
661 andl %eax, rINST # rINST <- A
662 sarl $4, %eax
663 SET_VREG %eax rINST
664 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
665
666/* ------------------------------ */
667 .balign 128
668.L_op_const_16: /* 0x13 */
669/* File: x86/op_const_16.S */
670 /* const/16 vAA, #+BBBB */
671 movswl 2(rPC), %ecx # ecx <- ssssBBBB
672 SET_VREG %ecx rINST # vAA <- ssssBBBB
673 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
674
675/* ------------------------------ */
676 .balign 128
677.L_op_const: /* 0x14 */
678/* File: x86/op_const.S */
679 /* const vAA, #+BBBBbbbb */
680 movl 2(rPC), %eax # grab all 32 bits at once
681 SET_VREG %eax rINST # vAA<- eax
682 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
683
684/* ------------------------------ */
685 .balign 128
686.L_op_const_high16: /* 0x15 */
687/* File: x86/op_const_high16.S */
688 /* const/high16 vAA, #+BBBB0000 */
689 movzwl 2(rPC), %eax # eax <- 0000BBBB
690 sall $16, %eax # eax <- BBBB0000
691 SET_VREG %eax rINST # vAA <- eax
692 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
693
694/* ------------------------------ */
695 .balign 128
696.L_op_const_wide_16: /* 0x16 */
697/* File: x86/op_const_wide_16.S */
698 /* const-wide/16 vAA, #+BBBB */
699 movswl 2(rPC), %eax # eax <- ssssBBBB
700 movl rIBASE, %ecx # preserve rIBASE (cltd trashes it)
701 cltd # rIBASE:eax <- ssssssssssssBBBB
702 SET_VREG_HIGH rIBASE rINST # store msw
703 SET_VREG %eax rINST # store lsw
704 movl %ecx, rIBASE # restore rIBASE
705 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
706
707/* ------------------------------ */
708 .balign 128
709.L_op_const_wide_32: /* 0x17 */
710/* File: x86/op_const_wide_32.S */
711 /* const-wide/32 vAA, #+BBBBbbbb */
712 movl 2(rPC), %eax # eax <- BBBBbbbb
713 movl rIBASE, %ecx # preserve rIBASE (cltd trashes it)
714 cltd # rIBASE:eax <- ssssssssssssBBBB
715 SET_VREG_HIGH rIBASE rINST # store msw
716 SET_VREG %eax rINST # store lsw
717 movl %ecx, rIBASE # restore rIBASE
718 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
719
720/* ------------------------------ */
721 .balign 128
722.L_op_const_wide: /* 0x18 */
723/* File: x86/op_const_wide.S */
724 /* const-wide vAA, #+HHHHhhhhBBBBbbbb */
725 movl 2(rPC), %eax # eax <- lsw
726 movzbl rINSTbl, %ecx # ecx <- AA
727 movl 6(rPC), rINST # rINST <- msw
728 SET_VREG %eax %ecx
729 SET_VREG_HIGH rINST %ecx
730 ADVANCE_PC_FETCH_AND_GOTO_NEXT 5
731
732/* ------------------------------ */
733 .balign 128
734.L_op_const_wide_high16: /* 0x19 */
735/* File: x86/op_const_wide_high16.S */
736 /* const-wide/high16 vAA, #+BBBB000000000000 */
737 movzwl 2(rPC), %eax # eax <- 0000BBBB
738 sall $16, %eax # eax <- BBBB0000
739 SET_VREG_HIGH %eax rINST # v[AA+1] <- eax
740 xorl %eax, %eax
741 SET_VREG %eax rINST # v[AA+0] <- eax
742 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
743
744/* ------------------------------ */
745 .balign 128
746.L_op_const_string: /* 0x1a */
747/* File: x86/op_const_string.S */
748 /* const/string vAA, String@BBBB */
749 EXPORT_PC
750 movzwl 2(rPC), %eax # eax <- BBBB
751 movl %eax, OUT_ARG0(%esp)
752 movl rINST, OUT_ARG1(%esp)
753 leal OFF_FP_SHADOWFRAME(rFP), %eax
754 movl %eax, OUT_ARG2(%esp)
755 movl rSELF, %eax
756 movl %eax, OUT_ARG3(%esp)
757 call MterpConstString # (index, tgt_reg, shadow_frame, self)
758 REFRESH_IBASE
759 testl %eax, %eax
760 jnz MterpPossibleException
761 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
762
763/* ------------------------------ */
764 .balign 128
765.L_op_const_string_jumbo: /* 0x1b */
766/* File: x86/op_const_string_jumbo.S */
767 /* const/string vAA, String@BBBBBBBB */
768 EXPORT_PC
769 movl 2(rPC), %eax # eax <- BBBB
770 movl %eax, OUT_ARG0(%esp)
771 movl rINST, OUT_ARG1(%esp)
772 leal OFF_FP_SHADOWFRAME(rFP), %eax
773 movl %eax, OUT_ARG2(%esp)
774 movl rSELF, %eax
775 movl %eax, OUT_ARG3(%esp)
776 call MterpConstString # (index, tgt_reg, shadow_frame, self)
777 REFRESH_IBASE
778 testl %eax, %eax
779 jnz MterpPossibleException
780 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
781
782/* ------------------------------ */
783 .balign 128
784.L_op_const_class: /* 0x1c */
785/* File: x86/op_const_class.S */
786 /* const/class vAA, Class@BBBB */
787 EXPORT_PC
788 movzwl 2(rPC), %eax # eax<- BBBB
789 movl %eax, OUT_ARG0(%esp)
790 movl rINST, OUT_ARG1(%esp)
791 leal OFF_FP_SHADOWFRAME(rFP), %eax
792 movl %eax, OUT_ARG2(%esp)
793 movl rSELF, %eax
794 movl %eax, OUT_ARG3(%esp)
795 call MterpConstClass # (index, tgt_reg, shadow_frame, self)
796 REFRESH_IBASE
797 testl %eax, %eax
798 jnz MterpPossibleException
799 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
800
801/* ------------------------------ */
802 .balign 128
803.L_op_monitor_enter: /* 0x1d */
804/* File: x86/op_monitor_enter.S */
805/*
806 * Synchronize on an object.
807 */
808 /* monitor-enter vAA */
809 EXPORT_PC
810 GET_VREG %ecx rINST
811 movl %ecx, OUT_ARG0(%esp)
812 movl rSELF, %eax
813 movl %eax, OUT_ARG1(%esp)
814 call artLockObjectFromCode # (object, self)
815 REFRESH_IBASE
816 testl %eax, %eax
817 jnz MterpException
818 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
819
820/* ------------------------------ */
821 .balign 128
822.L_op_monitor_exit: /* 0x1e */
823/* File: x86/op_monitor_exit.S */
824/*
825 * Unlock an object.
826 *
827 * Exceptions that occur when unlocking a monitor need to appear as
828 * if they happened at the following instruction. See the Dalvik
829 * instruction spec.
830 */
831 /* monitor-exit vAA */
832 EXPORT_PC
833 GET_VREG %ecx rINST
834 movl %ecx, OUT_ARG0(%esp)
835 movl rSELF, %eax
836 movl %eax, OUT_ARG1(%esp)
837 call artUnlockObjectFromCode # (object, self)
838 REFRESH_IBASE
839 testl %eax, %eax
840 jnz MterpException
841 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
842
843/* ------------------------------ */
844 .balign 128
845.L_op_check_cast: /* 0x1f */
846/* File: x86/op_check_cast.S */
847/*
848 * Check to see if a cast from one class to another is allowed.
849 */
850 /* check-cast vAA, class@BBBB */
851 EXPORT_PC
852 movzwl 2(rPC), %eax # eax <- BBBB
853 movl %eax, OUT_ARG0(%esp)
buzbeea2c97a92016-01-25 15:41:24 -0800854 leal VREG_ADDRESS(rINST), %ecx
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000855 movl %ecx, OUT_ARG1(%esp)
856 movl OFF_FP_METHOD(rFP),%eax
857 movl %eax, OUT_ARG2(%esp)
858 movl rSELF, %ecx
859 movl %ecx, OUT_ARG3(%esp)
buzbeea2c97a92016-01-25 15:41:24 -0800860 call MterpCheckCast # (index, &obj, method, self)
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000861 REFRESH_IBASE
862 testl %eax, %eax
863 jnz MterpPossibleException
864 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
865
866/* ------------------------------ */
867 .balign 128
868.L_op_instance_of: /* 0x20 */
869/* File: x86/op_instance_of.S */
870/*
871 * Check to see if an object reference is an instance of a class.
872 *
873 * Most common situation is a non-null object, being compared against
874 * an already-resolved class.
875 */
876 /* instance-of vA, vB, class@CCCC */
877 EXPORT_PC
878 movzwl 2(rPC), %eax # eax <- BBBB
879 movl %eax, OUT_ARG0(%esp)
880 movl rINST, %eax # eax <- BA
881 sarl $4, %eax # eax <- B
buzbeea2c97a92016-01-25 15:41:24 -0800882 leal VREG_ADDRESS(%eax), %ecx # Get object address
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000883 movl %ecx, OUT_ARG1(%esp)
884 movl OFF_FP_METHOD(rFP),%eax
885 movl %eax, OUT_ARG2(%esp)
886 movl rSELF, %ecx
887 movl %ecx, OUT_ARG3(%esp)
buzbeea2c97a92016-01-25 15:41:24 -0800888 call MterpInstanceOf # (index, &obj, method, self)
Bill Buzbee7c58bd42016-01-20 20:46:01 +0000889 movl rSELF, %ecx
890 REFRESH_IBASE_FROM_SELF %ecx
891 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx)
892 jnz MterpException
893 andb $0xf, rINSTbl # rINSTbl <- A
894 SET_VREG %eax rINST
895 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
896
897/* ------------------------------ */
898 .balign 128
899.L_op_array_length: /* 0x21 */
900/* File: x86/op_array_length.S */
901/*
902 * Return the length of an array.
903 */
904 mov rINST, %eax # eax <- BA
905 sarl $4, rINST # rINST <- B
906 GET_VREG %ecx rINST # ecx <- vB (object ref)
907 testl %ecx, %ecx # is null?
908 je common_errNullObject
909 andb $0xf, %al # eax <- A
910 movl MIRROR_ARRAY_LENGTH_OFFSET(%ecx), rINST
911 SET_VREG rINST %eax
912 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
913
914/* ------------------------------ */
915 .balign 128
916.L_op_new_instance: /* 0x22 */
917/* File: x86/op_new_instance.S */
918/*
919 * Create a new instance of a class.
920 */
921 /* new-instance vAA, class@BBBB */
922 EXPORT_PC
923 leal OFF_FP_SHADOWFRAME(rFP), %eax
924 movl %eax, OUT_ARG0(%esp)
925 movl rSELF, %ecx
926 movl %ecx, OUT_ARG1(%esp)
927 REFRESH_INST 34
928 movl rINST, OUT_ARG2(%esp)
929 call MterpNewInstance
930 REFRESH_IBASE
931 testl %eax, %eax # 0 means an exception is thrown
932 jz MterpPossibleException
933 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
934
935/* ------------------------------ */
936 .balign 128
937.L_op_new_array: /* 0x23 */
938/* File: x86/op_new_array.S */
939/*
940 * Allocate an array of objects, specified with the array class
941 * and a count.
942 *
943 * The verifier guarantees that this is an array class, so we don't
944 * check for it here.
945 */
946 /* new-array vA, vB, class@CCCC */
947 EXPORT_PC
948 leal OFF_FP_SHADOWFRAME(rFP), %eax
949 movl %eax, OUT_ARG0(%esp)
950 movl rPC, OUT_ARG1(%esp)
951 REFRESH_INST 35
952 movl rINST, OUT_ARG2(%esp)
953 movl rSELF, %ecx
954 movl %ecx, OUT_ARG3(%esp)
955 call MterpNewArray
956 REFRESH_IBASE
957 testl %eax, %eax # 0 means an exception is thrown
958 jz MterpPossibleException
959 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
960
961/* ------------------------------ */
962 .balign 128
963.L_op_filled_new_array: /* 0x24 */
964/* File: x86/op_filled_new_array.S */
965/*
966 * Create a new array with elements filled from registers.
967 *
968 * for: filled-new-array, filled-new-array/range
969 */
970 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
971 /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
972 .extern MterpFilledNewArray
973 EXPORT_PC
974 leal OFF_FP_SHADOWFRAME(rFP), %eax
975 movl %eax, OUT_ARG0(%esp)
976 movl rPC, OUT_ARG1(%esp)
977 movl rSELF, %ecx
978 movl %ecx, OUT_ARG2(%esp)
979 call MterpFilledNewArray
980 REFRESH_IBASE
981 testl %eax, %eax # 0 means an exception is thrown
982 jz MterpPossibleException
983 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
984
985/* ------------------------------ */
986 .balign 128
987.L_op_filled_new_array_range: /* 0x25 */
988/* File: x86/op_filled_new_array_range.S */
989/* File: x86/op_filled_new_array.S */
990/*
991 * Create a new array with elements filled from registers.
992 *
993 * for: filled-new-array, filled-new-array/range
994 */
995 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
996 /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
997 .extern MterpFilledNewArrayRange
998 EXPORT_PC
999 leal OFF_FP_SHADOWFRAME(rFP), %eax
1000 movl %eax, OUT_ARG0(%esp)
1001 movl rPC, OUT_ARG1(%esp)
1002 movl rSELF, %ecx
1003 movl %ecx, OUT_ARG2(%esp)
1004 call MterpFilledNewArrayRange
1005 REFRESH_IBASE
1006 testl %eax, %eax # 0 means an exception is thrown
1007 jz MterpPossibleException
1008 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
1009
1010
1011/* ------------------------------ */
1012 .balign 128
1013.L_op_fill_array_data: /* 0x26 */
1014/* File: x86/op_fill_array_data.S */
1015 /* fill-array-data vAA, +BBBBBBBB */
1016 EXPORT_PC
1017 movl 2(rPC), %ecx # ecx <- BBBBbbbb
1018 leal (rPC,%ecx,2), %ecx # ecx <- PC + BBBBbbbb*2
1019 GET_VREG %eax rINST # eax <- vAA (array object)
1020 movl %eax, OUT_ARG0(%esp)
1021 movl %ecx, OUT_ARG1(%esp)
1022 call MterpFillArrayData # (obj, payload)
1023 REFRESH_IBASE
1024 testl %eax, %eax # 0 means an exception is thrown
1025 jz MterpPossibleException
1026 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
1027
1028/* ------------------------------ */
1029 .balign 128
1030.L_op_throw: /* 0x27 */
1031/* File: x86/op_throw.S */
1032/*
1033 * Throw an exception object in the current thread.
1034 */
1035 /* throw vAA */
1036 EXPORT_PC
1037 GET_VREG %eax rINST # eax<- vAA (exception object)
1038 testl %eax, %eax
1039 jz common_errNullObject
1040 movl rSELF,%ecx
1041 movl %eax, THREAD_EXCEPTION_OFFSET(%ecx)
1042 jmp MterpException
1043
1044/* ------------------------------ */
1045 .balign 128
1046.L_op_goto: /* 0x28 */
1047/* File: x86/op_goto.S */
1048/*
1049 * Unconditional branch, 8-bit offset.
1050 *
1051 * The branch distance is a signed code-unit offset, which we need to
1052 * double to get a byte offset.
1053 */
1054 /* goto +AA */
1055 movsbl rINSTbl, %eax # eax <- ssssssAA
1056 addl %eax, %eax # eax <- AA * 2
1057 leal (rPC, %eax), rPC
1058 FETCH_INST
1059 jg 1f # AA * 2 > 0 => no suspend check
1060#if MTERP_SUSPEND
1061 REFRESH_IBASE
1062#else
1063 jmp MterpCheckSuspendAndContinue
1064#endif
10651:
1066 GOTO_NEXT
1067
1068/* ------------------------------ */
1069 .balign 128
1070.L_op_goto_16: /* 0x29 */
1071/* File: x86/op_goto_16.S */
1072/*
1073 * Unconditional branch, 16-bit offset.
1074 *
1075 * The branch distance is a signed code-unit offset, which we need to
1076 * double to get a byte offset.
1077 */
1078 /* goto/16 +AAAA */
1079 movswl 2(rPC), %eax # eax <- ssssAAAA
1080 addl %eax, %eax # eax <- AA * 2
1081 leal (rPC, %eax), rPC
1082 FETCH_INST
1083 jg 1f # AA * 2 > 0 => no suspend check
1084#if MTERP_SUSPEND
1085 REFRESH_IBASE
1086#else
1087 jmp MterpCheckSuspendAndContinue
1088#endif
10891:
1090 GOTO_NEXT
1091
1092/* ------------------------------ */
1093 .balign 128
1094.L_op_goto_32: /* 0x2a */
1095/* File: x86/op_goto_32.S */
1096/*
1097 * Unconditional branch, 32-bit offset.
1098 *
1099 * The branch distance is a signed code-unit offset, which we need to
1100 * double to get a byte offset.
1101 *
1102 * Unlike most opcodes, this one is allowed to branch to itself, so
1103 * our "backward branch" test must be "<=0" instead of "<0". Because
1104 * we need the V bit set, we'll use an adds to convert from Dalvik
1105 * offset to byte offset.
1106 */
1107 /* goto/32 +AAAAAAAA */
1108 movl 2(rPC), %eax # eax <- AAAAAAAA
1109 addl %eax, %eax # eax <- AA * 2
1110 leal (rPC, %eax), rPC
1111 FETCH_INST
1112 jg 1f # AA * 2 > 0 => no suspend check
1113#if MTERP_SUSPEND
1114 REFRESH_IBASE
1115#else
1116 jmp MterpCheckSuspendAndContinue
1117#endif
11181:
1119 GOTO_NEXT
1120
1121/* ------------------------------ */
1122 .balign 128
1123.L_op_packed_switch: /* 0x2b */
1124/* File: x86/op_packed_switch.S */
1125/*
1126 * Handle a packed-switch or sparse-switch instruction. In both cases
1127 * we decode it and hand it off to a helper function.
1128 *
1129 * We don't really expect backward branches in a switch statement, but
1130 * they're perfectly legal, so we check for them here.
1131 *
1132 * for: packed-switch, sparse-switch
1133 */
1134 /* op vAA, +BBBB */
1135 movl 2(rPC), %ecx # ecx <- BBBBbbbb
1136 GET_VREG %eax rINST # eax <- vAA
1137 leal (rPC,%ecx,2), %ecx # ecx <- PC + BBBBbbbb*2
1138 movl %eax, OUT_ARG1(%esp) # ARG1 <- vAA
1139 movl %ecx, OUT_ARG0(%esp) # ARG0 <- switchData
1140 call MterpDoPackedSwitch
1141 addl %eax, %eax
1142 leal (rPC, %eax), rPC
1143 FETCH_INST
1144 REFRESH_IBASE
1145 jg 1f
1146#if MTERP_SUSPEND
1147 # REFRESH_IBASE - we did it above.
1148#else
1149 jmp MterpCheckSuspendAndContinue
1150#endif
11511:
1152 GOTO_NEXT
1153
1154/* ------------------------------ */
1155 .balign 128
1156.L_op_sparse_switch: /* 0x2c */
1157/* File: x86/op_sparse_switch.S */
1158/* File: x86/op_packed_switch.S */
1159/*
1160 * Handle a packed-switch or sparse-switch instruction. In both cases
1161 * we decode it and hand it off to a helper function.
1162 *
1163 * We don't really expect backward branches in a switch statement, but
1164 * they're perfectly legal, so we check for them here.
1165 *
1166 * for: packed-switch, sparse-switch
1167 */
1168 /* op vAA, +BBBB */
1169 movl 2(rPC), %ecx # ecx <- BBBBbbbb
1170 GET_VREG %eax rINST # eax <- vAA
1171 leal (rPC,%ecx,2), %ecx # ecx <- PC + BBBBbbbb*2
1172 movl %eax, OUT_ARG1(%esp) # ARG1 <- vAA
1173 movl %ecx, OUT_ARG0(%esp) # ARG0 <- switchData
1174 call MterpDoSparseSwitch
1175 addl %eax, %eax
1176 leal (rPC, %eax), rPC
1177 FETCH_INST
1178 REFRESH_IBASE
1179 jg 1f
1180#if MTERP_SUSPEND
1181 # REFRESH_IBASE - we did it above.
1182#else
1183 jmp MterpCheckSuspendAndContinue
1184#endif
11851:
1186 GOTO_NEXT
1187
1188
1189/* ------------------------------ */
1190 .balign 128
1191.L_op_cmpl_float: /* 0x2d */
1192/* File: x86/op_cmpl_float.S */
1193/* File: x86/fpcmp.S */
1194/*
1195 * Compare two floating-point values. Puts 0, 1, or -1 into the
1196 * destination register based on the results of the comparison.
1197 *
1198 * int compare(x, y) {
1199 * if (x == y) {
1200 * return 0;
1201 * } else if (x < y) {
1202 * return -1;
1203 * } else if (x > y) {
1204 * return 1;
1205 * } else {
1206 * return nanval ? 1 : -1;
1207 * }
1208 * }
1209 */
1210 /* op vAA, vBB, vCC */
1211 movzbl 3(rPC), %ecx # ecx<- CC
1212 movzbl 2(rPC), %eax # eax<- BB
1213 movss VREG_ADDRESS(%eax), %xmm0
1214 xor %eax, %eax
1215 ucomiss VREG_ADDRESS(%ecx), %xmm0
1216 jp .Lop_cmpl_float_nan_is_neg
1217 je .Lop_cmpl_float_finish
1218 jb .Lop_cmpl_float_less
1219.Lop_cmpl_float_nan_is_pos:
1220 incl %eax
1221 jmp .Lop_cmpl_float_finish
1222.Lop_cmpl_float_nan_is_neg:
1223.Lop_cmpl_float_less:
1224 decl %eax
1225.Lop_cmpl_float_finish:
1226 SET_VREG %eax rINST
1227 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1228
1229
1230/* ------------------------------ */
1231 .balign 128
1232.L_op_cmpg_float: /* 0x2e */
1233/* File: x86/op_cmpg_float.S */
1234/* File: x86/fpcmp.S */
1235/*
1236 * Compare two floating-point values. Puts 0, 1, or -1 into the
1237 * destination register based on the results of the comparison.
1238 *
1239 * int compare(x, y) {
1240 * if (x == y) {
1241 * return 0;
1242 * } else if (x < y) {
1243 * return -1;
1244 * } else if (x > y) {
1245 * return 1;
1246 * } else {
1247 * return nanval ? 1 : -1;
1248 * }
1249 * }
1250 */
1251 /* op vAA, vBB, vCC */
1252 movzbl 3(rPC), %ecx # ecx<- CC
1253 movzbl 2(rPC), %eax # eax<- BB
1254 movss VREG_ADDRESS(%eax), %xmm0
1255 xor %eax, %eax
1256 ucomiss VREG_ADDRESS(%ecx), %xmm0
1257 jp .Lop_cmpg_float_nan_is_pos
1258 je .Lop_cmpg_float_finish
1259 jb .Lop_cmpg_float_less
1260.Lop_cmpg_float_nan_is_pos:
1261 incl %eax
1262 jmp .Lop_cmpg_float_finish
1263.Lop_cmpg_float_nan_is_neg:
1264.Lop_cmpg_float_less:
1265 decl %eax
1266.Lop_cmpg_float_finish:
1267 SET_VREG %eax rINST
1268 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1269
1270
1271/* ------------------------------ */
1272 .balign 128
1273.L_op_cmpl_double: /* 0x2f */
1274/* File: x86/op_cmpl_double.S */
1275/* File: x86/fpcmp.S */
1276/*
1277 * Compare two floating-point values. Puts 0, 1, or -1 into the
1278 * destination register based on the results of the comparison.
1279 *
1280 * int compare(x, y) {
1281 * if (x == y) {
1282 * return 0;
1283 * } else if (x < y) {
1284 * return -1;
1285 * } else if (x > y) {
1286 * return 1;
1287 * } else {
1288 * return nanval ? 1 : -1;
1289 * }
1290 * }
1291 */
1292 /* op vAA, vBB, vCC */
1293 movzbl 3(rPC), %ecx # ecx<- CC
1294 movzbl 2(rPC), %eax # eax<- BB
1295 movsd VREG_ADDRESS(%eax), %xmm0
1296 xor %eax, %eax
1297 ucomisd VREG_ADDRESS(%ecx), %xmm0
1298 jp .Lop_cmpl_double_nan_is_neg
1299 je .Lop_cmpl_double_finish
1300 jb .Lop_cmpl_double_less
1301.Lop_cmpl_double_nan_is_pos:
1302 incl %eax
1303 jmp .Lop_cmpl_double_finish
1304.Lop_cmpl_double_nan_is_neg:
1305.Lop_cmpl_double_less:
1306 decl %eax
1307.Lop_cmpl_double_finish:
1308 SET_VREG %eax rINST
1309 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1310
1311
1312/* ------------------------------ */
1313 .balign 128
1314.L_op_cmpg_double: /* 0x30 */
1315/* File: x86/op_cmpg_double.S */
1316/* File: x86/fpcmp.S */
1317/*
1318 * Compare two floating-point values. Puts 0, 1, or -1 into the
1319 * destination register based on the results of the comparison.
1320 *
1321 * int compare(x, y) {
1322 * if (x == y) {
1323 * return 0;
1324 * } else if (x < y) {
1325 * return -1;
1326 * } else if (x > y) {
1327 * return 1;
1328 * } else {
1329 * return nanval ? 1 : -1;
1330 * }
1331 * }
1332 */
1333 /* op vAA, vBB, vCC */
1334 movzbl 3(rPC), %ecx # ecx<- CC
1335 movzbl 2(rPC), %eax # eax<- BB
1336 movsd VREG_ADDRESS(%eax), %xmm0
1337 xor %eax, %eax
1338 ucomisd VREG_ADDRESS(%ecx), %xmm0
1339 jp .Lop_cmpg_double_nan_is_pos
1340 je .Lop_cmpg_double_finish
1341 jb .Lop_cmpg_double_less
1342.Lop_cmpg_double_nan_is_pos:
1343 incl %eax
1344 jmp .Lop_cmpg_double_finish
1345.Lop_cmpg_double_nan_is_neg:
1346.Lop_cmpg_double_less:
1347 decl %eax
1348.Lop_cmpg_double_finish:
1349 SET_VREG %eax rINST
1350 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1351
1352
1353/* ------------------------------ */
1354 .balign 128
1355.L_op_cmp_long: /* 0x31 */
1356/* File: x86/op_cmp_long.S */
1357/*
1358 * Compare two 64-bit values. Puts 0, 1, or -1 into the destination
1359 * register based on the results of the comparison.
1360 */
1361 /* cmp-long vAA, vBB, vCC */
1362 movzbl 2(rPC), %eax # eax <- BB
1363 movzbl 3(rPC), %ecx # ecx <- CC
1364 GET_VREG_HIGH %eax %eax # eax <- v[BB+1], BB is clobbered
1365 cmpl VREG_HIGH_ADDRESS(%ecx), %eax
1366 jl .Lop_cmp_long_smaller
1367 jg .Lop_cmp_long_bigger
1368 movzbl 2(rPC), %eax # eax <- BB, restore BB
1369 GET_VREG %eax %eax # eax <- v[BB]
1370 sub VREG_ADDRESS(%ecx), %eax
1371 ja .Lop_cmp_long_bigger
1372 jb .Lop_cmp_long_smaller
1373.Lop_cmp_long_finish:
1374 SET_VREG %eax rINST
1375 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1376
1377.Lop_cmp_long_bigger:
1378 movl $1, %eax
1379 jmp .Lop_cmp_long_finish
1380
1381.Lop_cmp_long_smaller:
1382 movl $-1, %eax
1383 jmp .Lop_cmp_long_finish
1384
1385/* ------------------------------ */
1386 .balign 128
1387.L_op_if_eq: /* 0x32 */
1388/* File: x86/op_if_eq.S */
1389/* File: x86/bincmp.S */
1390/*
1391 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1392 * fragment that specifies the *reverse* comparison to perform, e.g.
1393 * for "if-le" you would use "gt".
1394 *
1395 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1396 */
1397 /* if-cmp vA, vB, +CCCC */
1398 movzx rINSTbl, %ecx # ecx <- A+
1399 andb $0xf, %cl # ecx <- A
1400 GET_VREG %eax %ecx # eax <- vA
1401 sarl $4, rINST # rINST <- B
1402 cmpl VREG_ADDRESS(rINST), %eax # compare (vA, vB)
1403 movl $2, %eax # assume not taken
1404 jne 1f
1405 movswl 2(rPC),%eax # Get signed branch offset
14061:
1407 addl %eax, %eax # eax <- AA * 2
1408 leal (rPC, %eax), rPC
1409 FETCH_INST
1410 jg 2f # AA * 2 > 0 => no suspend check
1411#if MTERP_SUSPEND
1412 REFRESH_IBASE
1413#else
1414 jmp MterpCheckSuspendAndContinue
1415#endif
14162:
1417 GOTO_NEXT
1418
1419
1420/* ------------------------------ */
1421 .balign 128
1422.L_op_if_ne: /* 0x33 */
1423/* File: x86/op_if_ne.S */
1424/* File: x86/bincmp.S */
1425/*
1426 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1427 * fragment that specifies the *reverse* comparison to perform, e.g.
1428 * for "if-le" you would use "gt".
1429 *
1430 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1431 */
1432 /* if-cmp vA, vB, +CCCC */
1433 movzx rINSTbl, %ecx # ecx <- A+
1434 andb $0xf, %cl # ecx <- A
1435 GET_VREG %eax %ecx # eax <- vA
1436 sarl $4, rINST # rINST <- B
1437 cmpl VREG_ADDRESS(rINST), %eax # compare (vA, vB)
1438 movl $2, %eax # assume not taken
1439 je 1f
1440 movswl 2(rPC),%eax # Get signed branch offset
14411:
1442 addl %eax, %eax # eax <- AA * 2
1443 leal (rPC, %eax), rPC
1444 FETCH_INST
1445 jg 2f # AA * 2 > 0 => no suspend check
1446#if MTERP_SUSPEND
1447 REFRESH_IBASE
1448#else
1449 jmp MterpCheckSuspendAndContinue
1450#endif
14512:
1452 GOTO_NEXT
1453
1454
1455/* ------------------------------ */
1456 .balign 128
1457.L_op_if_lt: /* 0x34 */
1458/* File: x86/op_if_lt.S */
1459/* File: x86/bincmp.S */
1460/*
1461 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1462 * fragment that specifies the *reverse* comparison to perform, e.g.
1463 * for "if-le" you would use "gt".
1464 *
1465 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1466 */
1467 /* if-cmp vA, vB, +CCCC */
1468 movzx rINSTbl, %ecx # ecx <- A+
1469 andb $0xf, %cl # ecx <- A
1470 GET_VREG %eax %ecx # eax <- vA
1471 sarl $4, rINST # rINST <- B
1472 cmpl VREG_ADDRESS(rINST), %eax # compare (vA, vB)
1473 movl $2, %eax # assume not taken
1474 jge 1f
1475 movswl 2(rPC),%eax # Get signed branch offset
14761:
1477 addl %eax, %eax # eax <- AA * 2
1478 leal (rPC, %eax), rPC
1479 FETCH_INST
1480 jg 2f # AA * 2 > 0 => no suspend check
1481#if MTERP_SUSPEND
1482 REFRESH_IBASE
1483#else
1484 jmp MterpCheckSuspendAndContinue
1485#endif
14862:
1487 GOTO_NEXT
1488
1489
1490/* ------------------------------ */
1491 .balign 128
1492.L_op_if_ge: /* 0x35 */
1493/* File: x86/op_if_ge.S */
1494/* File: x86/bincmp.S */
1495/*
1496 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1497 * fragment that specifies the *reverse* comparison to perform, e.g.
1498 * for "if-le" you would use "gt".
1499 *
1500 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1501 */
1502 /* if-cmp vA, vB, +CCCC */
1503 movzx rINSTbl, %ecx # ecx <- A+
1504 andb $0xf, %cl # ecx <- A
1505 GET_VREG %eax %ecx # eax <- vA
1506 sarl $4, rINST # rINST <- B
1507 cmpl VREG_ADDRESS(rINST), %eax # compare (vA, vB)
1508 movl $2, %eax # assume not taken
1509 jl 1f
1510 movswl 2(rPC),%eax # Get signed branch offset
15111:
1512 addl %eax, %eax # eax <- AA * 2
1513 leal (rPC, %eax), rPC
1514 FETCH_INST
1515 jg 2f # AA * 2 > 0 => no suspend check
1516#if MTERP_SUSPEND
1517 REFRESH_IBASE
1518#else
1519 jmp MterpCheckSuspendAndContinue
1520#endif
15212:
1522 GOTO_NEXT
1523
1524
1525/* ------------------------------ */
1526 .balign 128
1527.L_op_if_gt: /* 0x36 */
1528/* File: x86/op_if_gt.S */
1529/* File: x86/bincmp.S */
1530/*
1531 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1532 * fragment that specifies the *reverse* comparison to perform, e.g.
1533 * for "if-le" you would use "gt".
1534 *
1535 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1536 */
1537 /* if-cmp vA, vB, +CCCC */
1538 movzx rINSTbl, %ecx # ecx <- A+
1539 andb $0xf, %cl # ecx <- A
1540 GET_VREG %eax %ecx # eax <- vA
1541 sarl $4, rINST # rINST <- B
1542 cmpl VREG_ADDRESS(rINST), %eax # compare (vA, vB)
1543 movl $2, %eax # assume not taken
1544 jle 1f
1545 movswl 2(rPC),%eax # Get signed branch offset
15461:
1547 addl %eax, %eax # eax <- AA * 2
1548 leal (rPC, %eax), rPC
1549 FETCH_INST
1550 jg 2f # AA * 2 > 0 => no suspend check
1551#if MTERP_SUSPEND
1552 REFRESH_IBASE
1553#else
1554 jmp MterpCheckSuspendAndContinue
1555#endif
15562:
1557 GOTO_NEXT
1558
1559
1560/* ------------------------------ */
1561 .balign 128
1562.L_op_if_le: /* 0x37 */
1563/* File: x86/op_if_le.S */
1564/* File: x86/bincmp.S */
1565/*
1566 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1567 * fragment that specifies the *reverse* comparison to perform, e.g.
1568 * for "if-le" you would use "gt".
1569 *
1570 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1571 */
1572 /* if-cmp vA, vB, +CCCC */
1573 movzx rINSTbl, %ecx # ecx <- A+
1574 andb $0xf, %cl # ecx <- A
1575 GET_VREG %eax %ecx # eax <- vA
1576 sarl $4, rINST # rINST <- B
1577 cmpl VREG_ADDRESS(rINST), %eax # compare (vA, vB)
1578 movl $2, %eax # assume not taken
1579 jg 1f
1580 movswl 2(rPC),%eax # Get signed branch offset
15811:
1582 addl %eax, %eax # eax <- AA * 2
1583 leal (rPC, %eax), rPC
1584 FETCH_INST
1585 jg 2f # AA * 2 > 0 => no suspend check
1586#if MTERP_SUSPEND
1587 REFRESH_IBASE
1588#else
1589 jmp MterpCheckSuspendAndContinue
1590#endif
15912:
1592 GOTO_NEXT
1593
1594
1595/* ------------------------------ */
1596 .balign 128
1597.L_op_if_eqz: /* 0x38 */
1598/* File: x86/op_if_eqz.S */
1599/* File: x86/zcmp.S */
1600/*
1601 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1602 * fragment that specifies the *reverse* comparison to perform, e.g.
1603 * for "if-le" you would use "gt".
1604 *
1605 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1606 */
1607 /* if-cmp vAA, +BBBB */
1608 cmpl $0, VREG_ADDRESS(rINST) # compare (vA, 0)
1609 movl $2, %eax # assume branch not taken
1610 jne 1f
1611 movswl 2(rPC),%eax # fetch signed displacement
16121:
1613 addl %eax, %eax # eax <- AA * 2
1614 leal (rPC, %eax), rPC
1615 FETCH_INST
1616 jg 2f # AA * 2 > 0 => no suspend check
1617#if MTERP_SUSPEND
1618 REFRESH_IBASE
1619#else
1620 jmp MterpCheckSuspendAndContinue
1621#endif
16222:
1623 GOTO_NEXT
1624
1625
1626/* ------------------------------ */
1627 .balign 128
1628.L_op_if_nez: /* 0x39 */
1629/* File: x86/op_if_nez.S */
1630/* File: x86/zcmp.S */
1631/*
1632 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1633 * fragment that specifies the *reverse* comparison to perform, e.g.
1634 * for "if-le" you would use "gt".
1635 *
1636 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1637 */
1638 /* if-cmp vAA, +BBBB */
1639 cmpl $0, VREG_ADDRESS(rINST) # compare (vA, 0)
1640 movl $2, %eax # assume branch not taken
1641 je 1f
1642 movswl 2(rPC),%eax # fetch signed displacement
16431:
1644 addl %eax, %eax # eax <- AA * 2
1645 leal (rPC, %eax), rPC
1646 FETCH_INST
1647 jg 2f # AA * 2 > 0 => no suspend check
1648#if MTERP_SUSPEND
1649 REFRESH_IBASE
1650#else
1651 jmp MterpCheckSuspendAndContinue
1652#endif
16532:
1654 GOTO_NEXT
1655
1656
1657/* ------------------------------ */
1658 .balign 128
1659.L_op_if_ltz: /* 0x3a */
1660/* File: x86/op_if_ltz.S */
1661/* File: x86/zcmp.S */
1662/*
1663 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1664 * fragment that specifies the *reverse* comparison to perform, e.g.
1665 * for "if-le" you would use "gt".
1666 *
1667 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1668 */
1669 /* if-cmp vAA, +BBBB */
1670 cmpl $0, VREG_ADDRESS(rINST) # compare (vA, 0)
1671 movl $2, %eax # assume branch not taken
1672 jge 1f
1673 movswl 2(rPC),%eax # fetch signed displacement
16741:
1675 addl %eax, %eax # eax <- AA * 2
1676 leal (rPC, %eax), rPC
1677 FETCH_INST
1678 jg 2f # AA * 2 > 0 => no suspend check
1679#if MTERP_SUSPEND
1680 REFRESH_IBASE
1681#else
1682 jmp MterpCheckSuspendAndContinue
1683#endif
16842:
1685 GOTO_NEXT
1686
1687
1688/* ------------------------------ */
1689 .balign 128
1690.L_op_if_gez: /* 0x3b */
1691/* File: x86/op_if_gez.S */
1692/* File: x86/zcmp.S */
1693/*
1694 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1695 * fragment that specifies the *reverse* comparison to perform, e.g.
1696 * for "if-le" you would use "gt".
1697 *
1698 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1699 */
1700 /* if-cmp vAA, +BBBB */
1701 cmpl $0, VREG_ADDRESS(rINST) # compare (vA, 0)
1702 movl $2, %eax # assume branch not taken
1703 jl 1f
1704 movswl 2(rPC),%eax # fetch signed displacement
17051:
1706 addl %eax, %eax # eax <- AA * 2
1707 leal (rPC, %eax), rPC
1708 FETCH_INST
1709 jg 2f # AA * 2 > 0 => no suspend check
1710#if MTERP_SUSPEND
1711 REFRESH_IBASE
1712#else
1713 jmp MterpCheckSuspendAndContinue
1714#endif
17152:
1716 GOTO_NEXT
1717
1718
1719/* ------------------------------ */
1720 .balign 128
1721.L_op_if_gtz: /* 0x3c */
1722/* File: x86/op_if_gtz.S */
1723/* File: x86/zcmp.S */
1724/*
1725 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1726 * fragment that specifies the *reverse* comparison to perform, e.g.
1727 * for "if-le" you would use "gt".
1728 *
1729 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1730 */
1731 /* if-cmp vAA, +BBBB */
1732 cmpl $0, VREG_ADDRESS(rINST) # compare (vA, 0)
1733 movl $2, %eax # assume branch not taken
1734 jle 1f
1735 movswl 2(rPC),%eax # fetch signed displacement
17361:
1737 addl %eax, %eax # eax <- AA * 2
1738 leal (rPC, %eax), rPC
1739 FETCH_INST
1740 jg 2f # AA * 2 > 0 => no suspend check
1741#if MTERP_SUSPEND
1742 REFRESH_IBASE
1743#else
1744 jmp MterpCheckSuspendAndContinue
1745#endif
17462:
1747 GOTO_NEXT
1748
1749
1750/* ------------------------------ */
1751 .balign 128
1752.L_op_if_lez: /* 0x3d */
1753/* File: x86/op_if_lez.S */
1754/* File: x86/zcmp.S */
1755/*
1756 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1757 * fragment that specifies the *reverse* comparison to perform, e.g.
1758 * for "if-le" you would use "gt".
1759 *
1760 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1761 */
1762 /* if-cmp vAA, +BBBB */
1763 cmpl $0, VREG_ADDRESS(rINST) # compare (vA, 0)
1764 movl $2, %eax # assume branch not taken
1765 jg 1f
1766 movswl 2(rPC),%eax # fetch signed displacement
17671:
1768 addl %eax, %eax # eax <- AA * 2
1769 leal (rPC, %eax), rPC
1770 FETCH_INST
1771 jg 2f # AA * 2 > 0 => no suspend check
1772#if MTERP_SUSPEND
1773 REFRESH_IBASE
1774#else
1775 jmp MterpCheckSuspendAndContinue
1776#endif
17772:
1778 GOTO_NEXT
1779
1780
1781/* ------------------------------ */
1782 .balign 128
1783.L_op_unused_3e: /* 0x3e */
1784/* File: x86/op_unused_3e.S */
1785/* File: x86/unused.S */
1786/*
1787 * Bail to reference interpreter to throw.
1788 */
1789 jmp MterpFallback
1790
1791
1792/* ------------------------------ */
1793 .balign 128
1794.L_op_unused_3f: /* 0x3f */
1795/* File: x86/op_unused_3f.S */
1796/* File: x86/unused.S */
1797/*
1798 * Bail to reference interpreter to throw.
1799 */
1800 jmp MterpFallback
1801
1802
1803/* ------------------------------ */
1804 .balign 128
1805.L_op_unused_40: /* 0x40 */
1806/* File: x86/op_unused_40.S */
1807/* File: x86/unused.S */
1808/*
1809 * Bail to reference interpreter to throw.
1810 */
1811 jmp MterpFallback
1812
1813
1814/* ------------------------------ */
1815 .balign 128
1816.L_op_unused_41: /* 0x41 */
1817/* File: x86/op_unused_41.S */
1818/* File: x86/unused.S */
1819/*
1820 * Bail to reference interpreter to throw.
1821 */
1822 jmp MterpFallback
1823
1824
1825/* ------------------------------ */
1826 .balign 128
1827.L_op_unused_42: /* 0x42 */
1828/* File: x86/op_unused_42.S */
1829/* File: x86/unused.S */
1830/*
1831 * Bail to reference interpreter to throw.
1832 */
1833 jmp MterpFallback
1834
1835
1836/* ------------------------------ */
1837 .balign 128
1838.L_op_unused_43: /* 0x43 */
1839/* File: x86/op_unused_43.S */
1840/* File: x86/unused.S */
1841/*
1842 * Bail to reference interpreter to throw.
1843 */
1844 jmp MterpFallback
1845
1846
1847/* ------------------------------ */
1848 .balign 128
1849.L_op_aget: /* 0x44 */
1850/* File: x86/op_aget.S */
1851/*
1852 * Array get, 32 bits or less. vAA <- vBB[vCC].
1853 *
1854 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1855 *
1856 */
1857 /* op vAA, vBB, vCC */
1858 movzbl 2(rPC), %eax # eax <- BB
1859 movzbl 3(rPC), %ecx # ecx <- CC
1860 GET_VREG %eax %eax # eax <- vBB (array object)
1861 GET_VREG %ecx %ecx # ecx <- vCC (requested index)
1862 testl %eax, %eax # null array object?
1863 je common_errNullObject # bail if so
1864 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx
1865 jae common_errArrayIndex # index >= length, bail.
1866 movl MIRROR_INT_ARRAY_DATA_OFFSET(%eax,%ecx,4), %eax
1867 SET_VREG %eax rINST
1868 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1869
1870/* ------------------------------ */
1871 .balign 128
1872.L_op_aget_wide: /* 0x45 */
1873/* File: x86/op_aget_wide.S */
1874/*
1875 * Array get, 64 bits. vAA <- vBB[vCC].
1876 */
1877 /* aget-wide vAA, vBB, vCC */
1878 movzbl 2(rPC), %eax # eax <- BB
1879 movzbl 3(rPC), %ecx # ecx <- CC
1880 GET_VREG %eax %eax # eax <- vBB (array object)
1881 GET_VREG %ecx %ecx # ecx <- vCC (requested index)
1882 testl %eax, %eax # null array object?
1883 je common_errNullObject # bail if so
1884 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx
1885 jae common_errArrayIndex # index >= length, bail.
1886 leal MIRROR_WIDE_ARRAY_DATA_OFFSET(%eax,%ecx,8), %eax
1887 movq (%eax), %xmm0 # xmm0 <- vBB[vCC]
1888 SET_WIDE_FP_VREG %xmm0 rINST # vAA <- xmm0
1889 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1890
1891/* ------------------------------ */
1892 .balign 128
1893.L_op_aget_object: /* 0x46 */
1894/* File: x86/op_aget_object.S */
1895/*
1896 * Array object get. vAA <- vBB[vCC].
1897 *
1898 * for: aget-object
1899 */
1900 /* op vAA, vBB, vCC */
1901 movzbl 2(rPC), %eax # eax <- BB
1902 movzbl 3(rPC), %ecx # ecx <- CC
1903 GET_VREG %eax %eax # eax <- vBB (array object)
1904 GET_VREG %ecx %ecx # ecs <- vCC (requested index)
1905 EXPORT_PC
1906 movl %eax, OUT_ARG0(%esp)
1907 movl %ecx, OUT_ARG1(%esp)
1908 call artAGetObjectFromMterp # (array, index)
1909 movl rSELF, %ecx
1910 REFRESH_IBASE_FROM_SELF %ecx
1911 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx)
1912 jnz MterpException
1913 SET_VREG_OBJECT %eax rINST
1914 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1915
1916/* ------------------------------ */
1917 .balign 128
1918.L_op_aget_boolean: /* 0x47 */
1919/* File: x86/op_aget_boolean.S */
1920/* File: x86/op_aget.S */
1921/*
1922 * Array get, 32 bits or less. vAA <- vBB[vCC].
1923 *
1924 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1925 *
1926 */
1927 /* op vAA, vBB, vCC */
1928 movzbl 2(rPC), %eax # eax <- BB
1929 movzbl 3(rPC), %ecx # ecx <- CC
1930 GET_VREG %eax %eax # eax <- vBB (array object)
1931 GET_VREG %ecx %ecx # ecx <- vCC (requested index)
1932 testl %eax, %eax # null array object?
1933 je common_errNullObject # bail if so
1934 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx
1935 jae common_errArrayIndex # index >= length, bail.
1936 movzbl MIRROR_BOOLEAN_ARRAY_DATA_OFFSET(%eax,%ecx,1), %eax
1937 SET_VREG %eax rINST
1938 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1939
1940
1941/* ------------------------------ */
1942 .balign 128
1943.L_op_aget_byte: /* 0x48 */
1944/* File: x86/op_aget_byte.S */
1945/* File: x86/op_aget.S */
1946/*
1947 * Array get, 32 bits or less. vAA <- vBB[vCC].
1948 *
1949 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1950 *
1951 */
1952 /* op vAA, vBB, vCC */
1953 movzbl 2(rPC), %eax # eax <- BB
1954 movzbl 3(rPC), %ecx # ecx <- CC
1955 GET_VREG %eax %eax # eax <- vBB (array object)
1956 GET_VREG %ecx %ecx # ecx <- vCC (requested index)
1957 testl %eax, %eax # null array object?
1958 je common_errNullObject # bail if so
1959 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx
1960 jae common_errArrayIndex # index >= length, bail.
1961 movsbl MIRROR_BYTE_ARRAY_DATA_OFFSET(%eax,%ecx,1), %eax
1962 SET_VREG %eax rINST
1963 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1964
1965
1966/* ------------------------------ */
1967 .balign 128
1968.L_op_aget_char: /* 0x49 */
1969/* File: x86/op_aget_char.S */
1970/* File: x86/op_aget.S */
1971/*
1972 * Array get, 32 bits or less. vAA <- vBB[vCC].
1973 *
1974 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1975 *
1976 */
1977 /* op vAA, vBB, vCC */
1978 movzbl 2(rPC), %eax # eax <- BB
1979 movzbl 3(rPC), %ecx # ecx <- CC
1980 GET_VREG %eax %eax # eax <- vBB (array object)
1981 GET_VREG %ecx %ecx # ecx <- vCC (requested index)
1982 testl %eax, %eax # null array object?
1983 je common_errNullObject # bail if so
1984 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx
1985 jae common_errArrayIndex # index >= length, bail.
1986 movzwl MIRROR_CHAR_ARRAY_DATA_OFFSET(%eax,%ecx,2), %eax
1987 SET_VREG %eax rINST
1988 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
1989
1990
1991/* ------------------------------ */
1992 .balign 128
1993.L_op_aget_short: /* 0x4a */
1994/* File: x86/op_aget_short.S */
1995/* File: x86/op_aget.S */
1996/*
1997 * Array get, 32 bits or less. vAA <- vBB[vCC].
1998 *
1999 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
2000 *
2001 */
2002 /* op vAA, vBB, vCC */
2003 movzbl 2(rPC), %eax # eax <- BB
2004 movzbl 3(rPC), %ecx # ecx <- CC
2005 GET_VREG %eax %eax # eax <- vBB (array object)
2006 GET_VREG %ecx %ecx # ecx <- vCC (requested index)
2007 testl %eax, %eax # null array object?
2008 je common_errNullObject # bail if so
2009 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx
2010 jae common_errArrayIndex # index >= length, bail.
2011 movswl MIRROR_SHORT_ARRAY_DATA_OFFSET(%eax,%ecx,2), %eax
2012 SET_VREG %eax rINST
2013 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2014
2015
2016/* ------------------------------ */
2017 .balign 128
2018.L_op_aput: /* 0x4b */
2019/* File: x86/op_aput.S */
2020/*
2021 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2022 *
2023 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2024 *
2025 */
2026 /* op vAA, vBB, vCC */
2027 movzbl 2(rPC), %eax # eax <- BB
2028 movzbl 3(rPC), %ecx # ecx <- CC
2029 GET_VREG %eax %eax # eax <- vBB (array object)
2030 GET_VREG %ecx %ecx # ecx <- vCC (requested index)
2031 testl %eax, %eax # null array object?
2032 je common_errNullObject # bail if so
2033 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx
2034 jae common_errArrayIndex # index >= length, bail.
2035 leal MIRROR_INT_ARRAY_DATA_OFFSET(%eax,%ecx,4), %eax
2036 GET_VREG rINST rINST
2037 movl rINST, (%eax)
2038 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2039
2040/* ------------------------------ */
2041 .balign 128
2042.L_op_aput_wide: /* 0x4c */
2043/* File: x86/op_aput_wide.S */
2044/*
2045 * Array put, 64 bits. vBB[vCC] <- vAA.
2046 *
2047 */
2048 /* aput-wide vAA, vBB, vCC */
2049 movzbl 2(rPC), %eax # eax <- BB
2050 movzbl 3(rPC), %ecx # ecx <- CC
2051 GET_VREG %eax %eax # eax <- vBB (array object)
2052 GET_VREG %ecx %ecx # ecx <- vCC (requested index)
2053 testl %eax, %eax # null array object?
2054 je common_errNullObject # bail if so
2055 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx
2056 jae common_errArrayIndex # index >= length, bail.
2057 leal MIRROR_WIDE_ARRAY_DATA_OFFSET(%eax,%ecx,8), %eax
2058 GET_WIDE_FP_VREG %xmm0 rINST # xmm0 <- vAA
2059 movq %xmm0, (%eax) # vBB[vCC] <- xmm0
2060 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2061
2062/* ------------------------------ */
2063 .balign 128
2064.L_op_aput_object: /* 0x4d */
2065/* File: x86/op_aput_object.S */
2066/*
2067 * Store an object into an array. vBB[vCC] <- vAA.
2068 */
2069 /* op vAA, vBB, vCC */
2070 EXPORT_PC
2071 leal OFF_FP_SHADOWFRAME(rFP), %eax
2072 movl %eax, OUT_ARG0(%esp)
2073 movl rPC, OUT_ARG1(%esp)
2074 REFRESH_INST 77
2075 movl rINST, OUT_ARG2(%esp)
2076 call MterpAputObject # (array, index)
2077 REFRESH_IBASE
2078 testl %eax, %eax
2079 jz MterpPossibleException
2080 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2081
2082/* ------------------------------ */
2083 .balign 128
2084.L_op_aput_boolean: /* 0x4e */
2085/* File: x86/op_aput_boolean.S */
2086/* File: x86/op_aput.S */
2087/*
2088 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2089 *
2090 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2091 *
2092 */
2093 /* op vAA, vBB, vCC */
2094 movzbl 2(rPC), %eax # eax <- BB
2095 movzbl 3(rPC), %ecx # ecx <- CC
2096 GET_VREG %eax %eax # eax <- vBB (array object)
2097 GET_VREG %ecx %ecx # ecx <- vCC (requested index)
2098 testl %eax, %eax # null array object?
2099 je common_errNullObject # bail if so
2100 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx
2101 jae common_errArrayIndex # index >= length, bail.
2102 leal MIRROR_BOOLEAN_ARRAY_DATA_OFFSET(%eax,%ecx,1), %eax
2103 GET_VREG rINST rINST
2104 movb rINSTbl, (%eax)
2105 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2106
2107
2108/* ------------------------------ */
2109 .balign 128
2110.L_op_aput_byte: /* 0x4f */
2111/* File: x86/op_aput_byte.S */
2112/* File: x86/op_aput.S */
2113/*
2114 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2115 *
2116 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2117 *
2118 */
2119 /* op vAA, vBB, vCC */
2120 movzbl 2(rPC), %eax # eax <- BB
2121 movzbl 3(rPC), %ecx # ecx <- CC
2122 GET_VREG %eax %eax # eax <- vBB (array object)
2123 GET_VREG %ecx %ecx # ecx <- vCC (requested index)
2124 testl %eax, %eax # null array object?
2125 je common_errNullObject # bail if so
2126 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx
2127 jae common_errArrayIndex # index >= length, bail.
2128 leal MIRROR_BYTE_ARRAY_DATA_OFFSET(%eax,%ecx,1), %eax
2129 GET_VREG rINST rINST
2130 movb rINSTbl, (%eax)
2131 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2132
2133
2134/* ------------------------------ */
2135 .balign 128
2136.L_op_aput_char: /* 0x50 */
2137/* File: x86/op_aput_char.S */
2138/* File: x86/op_aput.S */
2139/*
2140 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2141 *
2142 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2143 *
2144 */
2145 /* op vAA, vBB, vCC */
2146 movzbl 2(rPC), %eax # eax <- BB
2147 movzbl 3(rPC), %ecx # ecx <- CC
2148 GET_VREG %eax %eax # eax <- vBB (array object)
2149 GET_VREG %ecx %ecx # ecx <- vCC (requested index)
2150 testl %eax, %eax # null array object?
2151 je common_errNullObject # bail if so
2152 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx
2153 jae common_errArrayIndex # index >= length, bail.
2154 leal MIRROR_CHAR_ARRAY_DATA_OFFSET(%eax,%ecx,2), %eax
2155 GET_VREG rINST rINST
2156 movw rINSTw, (%eax)
2157 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2158
2159
2160/* ------------------------------ */
2161 .balign 128
2162.L_op_aput_short: /* 0x51 */
2163/* File: x86/op_aput_short.S */
2164/* File: x86/op_aput.S */
2165/*
2166 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2167 *
2168 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2169 *
2170 */
2171 /* op vAA, vBB, vCC */
2172 movzbl 2(rPC), %eax # eax <- BB
2173 movzbl 3(rPC), %ecx # ecx <- CC
2174 GET_VREG %eax %eax # eax <- vBB (array object)
2175 GET_VREG %ecx %ecx # ecx <- vCC (requested index)
2176 testl %eax, %eax # null array object?
2177 je common_errNullObject # bail if so
2178 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx
2179 jae common_errArrayIndex # index >= length, bail.
2180 leal MIRROR_SHORT_ARRAY_DATA_OFFSET(%eax,%ecx,2), %eax
2181 GET_VREG rINST rINST
2182 movw rINSTw, (%eax)
2183 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2184
2185
2186/* ------------------------------ */
2187 .balign 128
2188.L_op_iget: /* 0x52 */
2189/* File: x86/op_iget.S */
2190/*
2191 * General instance field get.
2192 *
2193 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2194 */
2195 EXPORT_PC
2196 movzwl 2(rPC), %eax # eax <- 0000CCCC
2197 movl %eax, OUT_ARG0(%esp) # field ref CCCC
2198 movzbl rINSTbl, %ecx # ecx <- BA
2199 sarl $4, %ecx # ecx <- B
2200 GET_VREG %ecx, %ecx
2201 movl %ecx, OUT_ARG1(%esp) # the object pointer
2202 movl OFF_FP_METHOD(rFP), %eax
2203 movl %eax, OUT_ARG2(%esp) # referrer
2204 mov rSELF, %ecx
2205 movl %ecx, OUT_ARG3(%esp) # self
2206 call artGet32InstanceFromCode
2207 movl rSELF, %ecx
2208 REFRESH_IBASE_FROM_SELF %ecx
2209 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx)
2210 jnz MterpException # bail out
2211 andb $0xf, rINSTbl # rINST <- A
2212 .if 0
2213 SET_VREG_OBJECT %eax rINST # fp[A] <-value
2214 .else
2215 SET_VREG %eax rINST # fp[A] <-value
2216 .endif
2217 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2218
2219/* ------------------------------ */
2220 .balign 128
2221.L_op_iget_wide: /* 0x53 */
2222/* File: x86/op_iget_wide.S */
2223/*
2224 * 64-bit instance field get.
2225 *
2226 * for: iget-wide
2227 */
2228 EXPORT_PC
2229 movzwl 2(rPC), %eax # eax <- 0000CCCC
2230 movl %eax, OUT_ARG0(%esp) # field ref CCCC
2231 movzbl rINSTbl, %ecx # ecx <- BA
2232 sarl $4, %ecx # ecx <- B
2233 GET_VREG %ecx, %ecx
2234 movl %ecx, OUT_ARG1(%esp) # the object pointer
2235 movl OFF_FP_METHOD(rFP), %eax
2236 movl %eax, OUT_ARG2(%esp) # referrer
2237 mov rSELF, %ecx
2238 movl %ecx, OUT_ARG3(%esp) # self
2239 call artGet64InstanceFromCode
2240 mov rSELF, %ecx
2241 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx)
2242 jnz MterpException # bail out
2243 andb $0xf, rINSTbl # rINST <- A
2244 SET_VREG %eax rINST
2245 SET_VREG_HIGH %edx rINST
2246 REFRESH_IBASE_FROM_SELF %ecx
2247 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2248
2249/* ------------------------------ */
2250 .balign 128
2251.L_op_iget_object: /* 0x54 */
2252/* File: x86/op_iget_object.S */
2253/* File: x86/op_iget.S */
2254/*
2255 * General instance field get.
2256 *
2257 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2258 */
2259 EXPORT_PC
2260 movzwl 2(rPC), %eax # eax <- 0000CCCC
2261 movl %eax, OUT_ARG0(%esp) # field ref CCCC
2262 movzbl rINSTbl, %ecx # ecx <- BA
2263 sarl $4, %ecx # ecx <- B
2264 GET_VREG %ecx, %ecx
2265 movl %ecx, OUT_ARG1(%esp) # the object pointer
2266 movl OFF_FP_METHOD(rFP), %eax
2267 movl %eax, OUT_ARG2(%esp) # referrer
2268 mov rSELF, %ecx
2269 movl %ecx, OUT_ARG3(%esp) # self
2270 call artGetObjInstanceFromCode
2271 movl rSELF, %ecx
2272 REFRESH_IBASE_FROM_SELF %ecx
2273 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx)
2274 jnz MterpException # bail out
2275 andb $0xf, rINSTbl # rINST <- A
2276 .if 1
2277 SET_VREG_OBJECT %eax rINST # fp[A] <-value
2278 .else
2279 SET_VREG %eax rINST # fp[A] <-value
2280 .endif
2281 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2282
2283
2284/* ------------------------------ */
2285 .balign 128
2286.L_op_iget_boolean: /* 0x55 */
2287/* File: x86/op_iget_boolean.S */
2288/* File: x86/op_iget.S */
2289/*
2290 * General instance field get.
2291 *
2292 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2293 */
2294 EXPORT_PC
2295 movzwl 2(rPC), %eax # eax <- 0000CCCC
2296 movl %eax, OUT_ARG0(%esp) # field ref CCCC
2297 movzbl rINSTbl, %ecx # ecx <- BA
2298 sarl $4, %ecx # ecx <- B
2299 GET_VREG %ecx, %ecx
2300 movl %ecx, OUT_ARG1(%esp) # the object pointer
2301 movl OFF_FP_METHOD(rFP), %eax
2302 movl %eax, OUT_ARG2(%esp) # referrer
2303 mov rSELF, %ecx
2304 movl %ecx, OUT_ARG3(%esp) # self
2305 call artGetBooleanInstanceFromCode
2306 movl rSELF, %ecx
2307 REFRESH_IBASE_FROM_SELF %ecx
2308 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx)
2309 jnz MterpException # bail out
2310 andb $0xf, rINSTbl # rINST <- A
2311 .if 0
2312 SET_VREG_OBJECT %eax rINST # fp[A] <-value
2313 .else
2314 SET_VREG %eax rINST # fp[A] <-value
2315 .endif
2316 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2317
2318
2319/* ------------------------------ */
2320 .balign 128
2321.L_op_iget_byte: /* 0x56 */
2322/* File: x86/op_iget_byte.S */
2323/* File: x86/op_iget.S */
2324/*
2325 * General instance field get.
2326 *
2327 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2328 */
2329 EXPORT_PC
2330 movzwl 2(rPC), %eax # eax <- 0000CCCC
2331 movl %eax, OUT_ARG0(%esp) # field ref CCCC
2332 movzbl rINSTbl, %ecx # ecx <- BA
2333 sarl $4, %ecx # ecx <- B
2334 GET_VREG %ecx, %ecx
2335 movl %ecx, OUT_ARG1(%esp) # the object pointer
2336 movl OFF_FP_METHOD(rFP), %eax
2337 movl %eax, OUT_ARG2(%esp) # referrer
2338 mov rSELF, %ecx
2339 movl %ecx, OUT_ARG3(%esp) # self
2340 call artGetByteInstanceFromCode
2341 movl rSELF, %ecx
2342 REFRESH_IBASE_FROM_SELF %ecx
2343 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx)
2344 jnz MterpException # bail out
2345 andb $0xf, rINSTbl # rINST <- A
2346 .if 0
2347 SET_VREG_OBJECT %eax rINST # fp[A] <-value
2348 .else
2349 SET_VREG %eax rINST # fp[A] <-value
2350 .endif
2351 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2352
2353
2354/* ------------------------------ */
2355 .balign 128
2356.L_op_iget_char: /* 0x57 */
2357/* File: x86/op_iget_char.S */
2358/* File: x86/op_iget.S */
2359/*
2360 * General instance field get.
2361 *
2362 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2363 */
2364 EXPORT_PC
2365 movzwl 2(rPC), %eax # eax <- 0000CCCC
2366 movl %eax, OUT_ARG0(%esp) # field ref CCCC
2367 movzbl rINSTbl, %ecx # ecx <- BA
2368 sarl $4, %ecx # ecx <- B
2369 GET_VREG %ecx, %ecx
2370 movl %ecx, OUT_ARG1(%esp) # the object pointer
2371 movl OFF_FP_METHOD(rFP), %eax
2372 movl %eax, OUT_ARG2(%esp) # referrer
2373 mov rSELF, %ecx
2374 movl %ecx, OUT_ARG3(%esp) # self
2375 call artGetCharInstanceFromCode
2376 movl rSELF, %ecx
2377 REFRESH_IBASE_FROM_SELF %ecx
2378 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx)
2379 jnz MterpException # bail out
2380 andb $0xf, rINSTbl # rINST <- A
2381 .if 0
2382 SET_VREG_OBJECT %eax rINST # fp[A] <-value
2383 .else
2384 SET_VREG %eax rINST # fp[A] <-value
2385 .endif
2386 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2387
2388
2389/* ------------------------------ */
2390 .balign 128
2391.L_op_iget_short: /* 0x58 */
2392/* File: x86/op_iget_short.S */
2393/* File: x86/op_iget.S */
2394/*
2395 * General instance field get.
2396 *
2397 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2398 */
2399 EXPORT_PC
2400 movzwl 2(rPC), %eax # eax <- 0000CCCC
2401 movl %eax, OUT_ARG0(%esp) # field ref CCCC
2402 movzbl rINSTbl, %ecx # ecx <- BA
2403 sarl $4, %ecx # ecx <- B
2404 GET_VREG %ecx, %ecx
2405 movl %ecx, OUT_ARG1(%esp) # the object pointer
2406 movl OFF_FP_METHOD(rFP), %eax
2407 movl %eax, OUT_ARG2(%esp) # referrer
2408 mov rSELF, %ecx
2409 movl %ecx, OUT_ARG3(%esp) # self
2410 call artGetShortInstanceFromCode
2411 movl rSELF, %ecx
2412 REFRESH_IBASE_FROM_SELF %ecx
2413 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx)
2414 jnz MterpException # bail out
2415 andb $0xf, rINSTbl # rINST <- A
2416 .if 0
2417 SET_VREG_OBJECT %eax rINST # fp[A] <-value
2418 .else
2419 SET_VREG %eax rINST # fp[A] <-value
2420 .endif
2421 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2422
2423
2424/* ------------------------------ */
2425 .balign 128
2426.L_op_iput: /* 0x59 */
2427/* File: x86/op_iput.S */
2428/*
2429 * General 32-bit instance field put.
2430 *
2431 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2432 */
2433 /* op vA, vB, field@CCCC */
2434 .extern artSet32InstanceFromMterp
2435 EXPORT_PC
2436 movzwl 2(rPC), %eax # eax<- 0000CCCC
2437 movl %eax, OUT_ARG0(%esp) # field ref CCCC
2438 movzbl rINSTbl, %ecx # ecx<- BA
2439 sarl $4, %ecx # ecx<- B
2440 GET_VREG %ecx, %ecx
2441 movl %ecx, OUT_ARG1(%esp) # the object pointer
2442 andb $0xf, rINSTbl # rINST<- A
2443 GET_VREG %eax, rINST
2444 movl %eax, OUT_ARG2(%esp) # fp[A]
2445 movl OFF_FP_METHOD(rFP), %eax
2446 movl %eax, OUT_ARG3(%esp) # referrer
2447 call artSet32InstanceFromMterp
2448 testl %eax, %eax
2449 jnz MterpPossibleException
2450 REFRESH_IBASE
2451 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2452
2453/* ------------------------------ */
2454 .balign 128
2455.L_op_iput_wide: /* 0x5a */
2456/* File: x86/op_iput_wide.S */
2457 /* iput-wide vA, vB, field@CCCC */
2458 .extern artSet64InstanceFromMterp
2459 EXPORT_PC
2460 movzwl 2(rPC), %eax # eax <- 0000CCCC
2461 movl %eax, OUT_ARG0(%esp) # field ref CCCC
2462 movzbl rINSTbl,%ecx # ecx <- BA
2463 sarl $4,%ecx # ecx <- B
2464 GET_VREG %ecx, %ecx
2465 movl %ecx, OUT_ARG1(%esp) # the object pointer
2466 andb $0xf,rINSTbl # rINST <- A
2467 leal VREG_ADDRESS(rINST), %eax
2468 movl %eax, OUT_ARG2(%esp) # &fp[A]
2469 movl OFF_FP_METHOD(rFP), %eax
2470 movl %eax, OUT_ARG3(%esp) # referrer
2471 call artSet64InstanceFromMterp
2472 testl %eax, %eax
2473 jnz MterpPossibleException
2474 REFRESH_IBASE
2475 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2476
2477/* ------------------------------ */
2478 .balign 128
2479.L_op_iput_object: /* 0x5b */
2480/* File: x86/op_iput_object.S */
2481 EXPORT_PC
2482 leal OFF_FP_SHADOWFRAME(rFP), %eax
2483 movl %eax, OUT_ARG0(%esp)
2484 movl rPC, OUT_ARG1(%esp)
2485 REFRESH_INST 91
2486 movl rINST, OUT_ARG2(%esp)
2487 movl rSELF, %eax
2488 movl %eax, OUT_ARG3(%esp)
2489 call MterpIputObject
2490 testl %eax, %eax
2491 jz MterpException
2492 REFRESH_IBASE
2493 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2494
2495/* ------------------------------ */
2496 .balign 128
2497.L_op_iput_boolean: /* 0x5c */
2498/* File: x86/op_iput_boolean.S */
2499/* File: x86/op_iput.S */
2500/*
2501 * General 32-bit instance field put.
2502 *
2503 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2504 */
2505 /* op vA, vB, field@CCCC */
2506 .extern artSet8InstanceFromMterp
2507 EXPORT_PC
2508 movzwl 2(rPC), %eax # eax<- 0000CCCC
2509 movl %eax, OUT_ARG0(%esp) # field ref CCCC
2510 movzbl rINSTbl, %ecx # ecx<- BA
2511 sarl $4, %ecx # ecx<- B
2512 GET_VREG %ecx, %ecx
2513 movl %ecx, OUT_ARG1(%esp) # the object pointer
2514 andb $0xf, rINSTbl # rINST<- A
2515 GET_VREG %eax, rINST
2516 movl %eax, OUT_ARG2(%esp) # fp[A]
2517 movl OFF_FP_METHOD(rFP), %eax
2518 movl %eax, OUT_ARG3(%esp) # referrer
2519 call artSet8InstanceFromMterp
2520 testl %eax, %eax
2521 jnz MterpPossibleException
2522 REFRESH_IBASE
2523 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2524
2525
2526/* ------------------------------ */
2527 .balign 128
2528.L_op_iput_byte: /* 0x5d */
2529/* File: x86/op_iput_byte.S */
2530/* File: x86/op_iput.S */
2531/*
2532 * General 32-bit instance field put.
2533 *
2534 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2535 */
2536 /* op vA, vB, field@CCCC */
2537 .extern artSet8InstanceFromMterp
2538 EXPORT_PC
2539 movzwl 2(rPC), %eax # eax<- 0000CCCC
2540 movl %eax, OUT_ARG0(%esp) # field ref CCCC
2541 movzbl rINSTbl, %ecx # ecx<- BA
2542 sarl $4, %ecx # ecx<- B
2543 GET_VREG %ecx, %ecx
2544 movl %ecx, OUT_ARG1(%esp) # the object pointer
2545 andb $0xf, rINSTbl # rINST<- A
2546 GET_VREG %eax, rINST
2547 movl %eax, OUT_ARG2(%esp) # fp[A]
2548 movl OFF_FP_METHOD(rFP), %eax
2549 movl %eax, OUT_ARG3(%esp) # referrer
2550 call artSet8InstanceFromMterp
2551 testl %eax, %eax
2552 jnz MterpPossibleException
2553 REFRESH_IBASE
2554 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2555
2556
2557/* ------------------------------ */
2558 .balign 128
2559.L_op_iput_char: /* 0x5e */
2560/* File: x86/op_iput_char.S */
2561/* File: x86/op_iput.S */
2562/*
2563 * General 32-bit instance field put.
2564 *
2565 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2566 */
2567 /* op vA, vB, field@CCCC */
2568 .extern artSet16InstanceFromMterp
2569 EXPORT_PC
2570 movzwl 2(rPC), %eax # eax<- 0000CCCC
2571 movl %eax, OUT_ARG0(%esp) # field ref CCCC
2572 movzbl rINSTbl, %ecx # ecx<- BA
2573 sarl $4, %ecx # ecx<- B
2574 GET_VREG %ecx, %ecx
2575 movl %ecx, OUT_ARG1(%esp) # the object pointer
2576 andb $0xf, rINSTbl # rINST<- A
2577 GET_VREG %eax, rINST
2578 movl %eax, OUT_ARG2(%esp) # fp[A]
2579 movl OFF_FP_METHOD(rFP), %eax
2580 movl %eax, OUT_ARG3(%esp) # referrer
2581 call artSet16InstanceFromMterp
2582 testl %eax, %eax
2583 jnz MterpPossibleException
2584 REFRESH_IBASE
2585 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2586
2587
2588/* ------------------------------ */
2589 .balign 128
2590.L_op_iput_short: /* 0x5f */
2591/* File: x86/op_iput_short.S */
2592/* File: x86/op_iput.S */
2593/*
2594 * General 32-bit instance field put.
2595 *
2596 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2597 */
2598 /* op vA, vB, field@CCCC */
2599 .extern artSet16InstanceFromMterp
2600 EXPORT_PC
2601 movzwl 2(rPC), %eax # eax<- 0000CCCC
2602 movl %eax, OUT_ARG0(%esp) # field ref CCCC
2603 movzbl rINSTbl, %ecx # ecx<- BA
2604 sarl $4, %ecx # ecx<- B
2605 GET_VREG %ecx, %ecx
2606 movl %ecx, OUT_ARG1(%esp) # the object pointer
2607 andb $0xf, rINSTbl # rINST<- A
2608 GET_VREG %eax, rINST
2609 movl %eax, OUT_ARG2(%esp) # fp[A]
2610 movl OFF_FP_METHOD(rFP), %eax
2611 movl %eax, OUT_ARG3(%esp) # referrer
2612 call artSet16InstanceFromMterp
2613 testl %eax, %eax
2614 jnz MterpPossibleException
2615 REFRESH_IBASE
2616 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2617
2618
2619/* ------------------------------ */
2620 .balign 128
2621.L_op_sget: /* 0x60 */
2622/* File: x86/op_sget.S */
2623/*
2624 * General SGET handler wrapper.
2625 *
2626 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2627 */
2628 /* op vAA, field@BBBB */
2629 .extern artGet32StaticFromCode
2630 EXPORT_PC
2631 movzwl 2(rPC), %eax
2632 movl %eax, OUT_ARG0(%esp) # field ref CCCC
2633 movl OFF_FP_METHOD(rFP), %eax
2634 movl %eax, OUT_ARG1(%esp) # referrer
2635 movl rSELF, %ecx
2636 movl %ecx, OUT_ARG2(%esp) # self
2637 call artGet32StaticFromCode
2638 movl rSELF, %ecx
2639 REFRESH_IBASE_FROM_SELF %ecx
2640 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx)
2641 jnz MterpException
2642 .if 0
2643 SET_VREG_OBJECT %eax rINST # fp[A] <- value
2644 .else
2645 SET_VREG %eax rINST # fp[A] <- value
2646 .endif
2647 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2648
2649/* ------------------------------ */
2650 .balign 128
2651.L_op_sget_wide: /* 0x61 */
2652/* File: x86/op_sget_wide.S */
2653/*
2654 * SGET_WIDE handler wrapper.
2655 *
2656 */
2657 /* sget-wide vAA, field@BBBB */
2658 .extern artGet64StaticFromCode
2659 EXPORT_PC
2660 movzwl 2(rPC), %eax
2661 movl %eax, OUT_ARG0(%esp) # field ref CCCC
2662 movl OFF_FP_METHOD(rFP), %eax
2663 movl %eax, OUT_ARG1(%esp) # referrer
2664 movl rSELF, %ecx
2665 movl %ecx, OUT_ARG2(%esp) # self
2666 call artGet64StaticFromCode
2667 movl rSELF, %ecx
2668 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx)
2669 jnz MterpException
2670 SET_VREG %eax rINST # fp[A]<- low part
2671 SET_VREG_HIGH %edx rINST # fp[A+1]<- high part
2672 REFRESH_IBASE_FROM_SELF %ecx
2673 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2674
2675/* ------------------------------ */
2676 .balign 128
2677.L_op_sget_object: /* 0x62 */
2678/* File: x86/op_sget_object.S */
2679/* File: x86/op_sget.S */
2680/*
2681 * General SGET handler wrapper.
2682 *
2683 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2684 */
2685 /* op vAA, field@BBBB */
2686 .extern artGetObjStaticFromCode
2687 EXPORT_PC
2688 movzwl 2(rPC), %eax
2689 movl %eax, OUT_ARG0(%esp) # field ref CCCC
2690 movl OFF_FP_METHOD(rFP), %eax
2691 movl %eax, OUT_ARG1(%esp) # referrer
2692 movl rSELF, %ecx
2693 movl %ecx, OUT_ARG2(%esp) # self
2694 call artGetObjStaticFromCode
2695 movl rSELF, %ecx
2696 REFRESH_IBASE_FROM_SELF %ecx
2697 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx)
2698 jnz MterpException
2699 .if 1
2700 SET_VREG_OBJECT %eax rINST # fp[A] <- value
2701 .else
2702 SET_VREG %eax rINST # fp[A] <- value
2703 .endif
2704 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2705
2706
2707/* ------------------------------ */
2708 .balign 128
2709.L_op_sget_boolean: /* 0x63 */
2710/* File: x86/op_sget_boolean.S */
2711/* File: x86/op_sget.S */
2712/*
2713 * General SGET handler wrapper.
2714 *
2715 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2716 */
2717 /* op vAA, field@BBBB */
2718 .extern artGetBooleanStaticFromCode
2719 EXPORT_PC
2720 movzwl 2(rPC), %eax
2721 movl %eax, OUT_ARG0(%esp) # field ref CCCC
2722 movl OFF_FP_METHOD(rFP), %eax
2723 movl %eax, OUT_ARG1(%esp) # referrer
2724 movl rSELF, %ecx
2725 movl %ecx, OUT_ARG2(%esp) # self
2726 call artGetBooleanStaticFromCode
2727 movl rSELF, %ecx
2728 REFRESH_IBASE_FROM_SELF %ecx
2729 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx)
2730 jnz MterpException
2731 .if 0
2732 SET_VREG_OBJECT %eax rINST # fp[A] <- value
2733 .else
2734 SET_VREG %eax rINST # fp[A] <- value
2735 .endif
2736 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2737
2738
2739/* ------------------------------ */
2740 .balign 128
2741.L_op_sget_byte: /* 0x64 */
2742/* File: x86/op_sget_byte.S */
2743/* File: x86/op_sget.S */
2744/*
2745 * General SGET handler wrapper.
2746 *
2747 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2748 */
2749 /* op vAA, field@BBBB */
2750 .extern artGetByteStaticFromCode
2751 EXPORT_PC
2752 movzwl 2(rPC), %eax
2753 movl %eax, OUT_ARG0(%esp) # field ref CCCC
2754 movl OFF_FP_METHOD(rFP), %eax
2755 movl %eax, OUT_ARG1(%esp) # referrer
2756 movl rSELF, %ecx
2757 movl %ecx, OUT_ARG2(%esp) # self
2758 call artGetByteStaticFromCode
2759 movl rSELF, %ecx
2760 REFRESH_IBASE_FROM_SELF %ecx
2761 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx)
2762 jnz MterpException
2763 .if 0
2764 SET_VREG_OBJECT %eax rINST # fp[A] <- value
2765 .else
2766 SET_VREG %eax rINST # fp[A] <- value
2767 .endif
2768 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2769
2770
2771/* ------------------------------ */
2772 .balign 128
2773.L_op_sget_char: /* 0x65 */
2774/* File: x86/op_sget_char.S */
2775/* File: x86/op_sget.S */
2776/*
2777 * General SGET handler wrapper.
2778 *
2779 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2780 */
2781 /* op vAA, field@BBBB */
2782 .extern artGetCharStaticFromCode
2783 EXPORT_PC
2784 movzwl 2(rPC), %eax
2785 movl %eax, OUT_ARG0(%esp) # field ref CCCC
2786 movl OFF_FP_METHOD(rFP), %eax
2787 movl %eax, OUT_ARG1(%esp) # referrer
2788 movl rSELF, %ecx
2789 movl %ecx, OUT_ARG2(%esp) # self
2790 call artGetCharStaticFromCode
2791 movl rSELF, %ecx
2792 REFRESH_IBASE_FROM_SELF %ecx
2793 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx)
2794 jnz MterpException
2795 .if 0
2796 SET_VREG_OBJECT %eax rINST # fp[A] <- value
2797 .else
2798 SET_VREG %eax rINST # fp[A] <- value
2799 .endif
2800 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2801
2802
2803/* ------------------------------ */
2804 .balign 128
2805.L_op_sget_short: /* 0x66 */
2806/* File: x86/op_sget_short.S */
2807/* File: x86/op_sget.S */
2808/*
2809 * General SGET handler wrapper.
2810 *
2811 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2812 */
2813 /* op vAA, field@BBBB */
2814 .extern artGetShortStaticFromCode
2815 EXPORT_PC
2816 movzwl 2(rPC), %eax
2817 movl %eax, OUT_ARG0(%esp) # field ref CCCC
2818 movl OFF_FP_METHOD(rFP), %eax
2819 movl %eax, OUT_ARG1(%esp) # referrer
2820 movl rSELF, %ecx
2821 movl %ecx, OUT_ARG2(%esp) # self
2822 call artGetShortStaticFromCode
2823 movl rSELF, %ecx
2824 REFRESH_IBASE_FROM_SELF %ecx
2825 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx)
2826 jnz MterpException
2827 .if 0
2828 SET_VREG_OBJECT %eax rINST # fp[A] <- value
2829 .else
2830 SET_VREG %eax rINST # fp[A] <- value
2831 .endif
2832 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2833
2834
2835/* ------------------------------ */
2836 .balign 128
2837.L_op_sput: /* 0x67 */
2838/* File: x86/op_sput.S */
2839/*
2840 * General SPUT handler wrapper.
2841 *
2842 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2843 */
2844 /* op vAA, field@BBBB */
2845 .extern artSet32StaticFromCode
2846 EXPORT_PC
2847 movzwl 2(rPC), %eax
2848 movl %eax, OUT_ARG0(%esp) # field ref BBBB
2849 GET_VREG rINST rINST
2850 movl rINST, OUT_ARG1(%esp) # fp[AA]
2851 movl OFF_FP_METHOD(rFP), %eax
2852 movl %eax, OUT_ARG2(%esp) # referrer
2853 movl rSELF, %ecx
2854 movl %ecx, OUT_ARG3(%esp) # self
2855 call artSet32StaticFromCode
2856 testl %eax, %eax
2857 jnz MterpException
2858 REFRESH_IBASE
2859 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2860
2861/* ------------------------------ */
2862 .balign 128
2863.L_op_sput_wide: /* 0x68 */
2864/* File: x86/op_sput_wide.S */
2865/*
2866 * SPUT_WIDE handler wrapper.
2867 *
2868 */
2869 /* sput-wide vAA, field@BBBB */
2870 .extern artSet64IndirectStaticFromMterp
2871 EXPORT_PC
2872 movzwl 2(rPC), %eax
2873 movl %eax, OUT_ARG0(%esp) # field ref BBBB
2874 movl OFF_FP_METHOD(rFP), %eax
2875 movl %eax, OUT_ARG1(%esp) # referrer
2876 leal VREG_ADDRESS(rINST), %eax
2877 movl %eax, OUT_ARG2(%esp) # &fp[AA]
2878 movl rSELF, %ecx
2879 movl %ecx, OUT_ARG3(%esp) # self
2880 call artSet64IndirectStaticFromMterp
2881 testl %eax, %eax
2882 jnz MterpException
2883 REFRESH_IBASE
2884 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2885
2886/* ------------------------------ */
2887 .balign 128
2888.L_op_sput_object: /* 0x69 */
2889/* File: x86/op_sput_object.S */
2890 EXPORT_PC
2891 leal OFF_FP_SHADOWFRAME(rFP), %eax
2892 movl %eax, OUT_ARG0(%esp)
2893 movl rPC, OUT_ARG1(%esp)
2894 REFRESH_INST 105
2895 movl rINST, OUT_ARG2(%esp)
2896 movl rSELF, %ecx
2897 movl %ecx, OUT_ARG3(%esp)
2898 call MterpSputObject
2899 testl %eax, %eax
2900 jz MterpException
2901 REFRESH_IBASE
2902 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2903
2904/* ------------------------------ */
2905 .balign 128
2906.L_op_sput_boolean: /* 0x6a */
2907/* File: x86/op_sput_boolean.S */
2908/* File: x86/op_sput.S */
2909/*
2910 * General SPUT handler wrapper.
2911 *
2912 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2913 */
2914 /* op vAA, field@BBBB */
2915 .extern artSet8StaticFromCode
2916 EXPORT_PC
2917 movzwl 2(rPC), %eax
2918 movl %eax, OUT_ARG0(%esp) # field ref BBBB
2919 GET_VREG rINST rINST
2920 movl rINST, OUT_ARG1(%esp) # fp[AA]
2921 movl OFF_FP_METHOD(rFP), %eax
2922 movl %eax, OUT_ARG2(%esp) # referrer
2923 movl rSELF, %ecx
2924 movl %ecx, OUT_ARG3(%esp) # self
2925 call artSet8StaticFromCode
2926 testl %eax, %eax
2927 jnz MterpException
2928 REFRESH_IBASE
2929 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2930
2931
2932/* ------------------------------ */
2933 .balign 128
2934.L_op_sput_byte: /* 0x6b */
2935/* File: x86/op_sput_byte.S */
2936/* File: x86/op_sput.S */
2937/*
2938 * General SPUT handler wrapper.
2939 *
2940 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2941 */
2942 /* op vAA, field@BBBB */
2943 .extern artSet8StaticFromCode
2944 EXPORT_PC
2945 movzwl 2(rPC), %eax
2946 movl %eax, OUT_ARG0(%esp) # field ref BBBB
2947 GET_VREG rINST rINST
2948 movl rINST, OUT_ARG1(%esp) # fp[AA]
2949 movl OFF_FP_METHOD(rFP), %eax
2950 movl %eax, OUT_ARG2(%esp) # referrer
2951 movl rSELF, %ecx
2952 movl %ecx, OUT_ARG3(%esp) # self
2953 call artSet8StaticFromCode
2954 testl %eax, %eax
2955 jnz MterpException
2956 REFRESH_IBASE
2957 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2958
2959
2960/* ------------------------------ */
2961 .balign 128
2962.L_op_sput_char: /* 0x6c */
2963/* File: x86/op_sput_char.S */
2964/* File: x86/op_sput.S */
2965/*
2966 * General SPUT handler wrapper.
2967 *
2968 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2969 */
2970 /* op vAA, field@BBBB */
2971 .extern artSet16StaticFromCode
2972 EXPORT_PC
2973 movzwl 2(rPC), %eax
2974 movl %eax, OUT_ARG0(%esp) # field ref BBBB
2975 GET_VREG rINST rINST
2976 movl rINST, OUT_ARG1(%esp) # fp[AA]
2977 movl OFF_FP_METHOD(rFP), %eax
2978 movl %eax, OUT_ARG2(%esp) # referrer
2979 movl rSELF, %ecx
2980 movl %ecx, OUT_ARG3(%esp) # self
2981 call artSet16StaticFromCode
2982 testl %eax, %eax
2983 jnz MterpException
2984 REFRESH_IBASE
2985 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2986
2987
2988/* ------------------------------ */
2989 .balign 128
2990.L_op_sput_short: /* 0x6d */
2991/* File: x86/op_sput_short.S */
2992/* File: x86/op_sput.S */
2993/*
2994 * General SPUT handler wrapper.
2995 *
2996 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2997 */
2998 /* op vAA, field@BBBB */
2999 .extern artSet16StaticFromCode
3000 EXPORT_PC
3001 movzwl 2(rPC), %eax
3002 movl %eax, OUT_ARG0(%esp) # field ref BBBB
3003 GET_VREG rINST rINST
3004 movl rINST, OUT_ARG1(%esp) # fp[AA]
3005 movl OFF_FP_METHOD(rFP), %eax
3006 movl %eax, OUT_ARG2(%esp) # referrer
3007 movl rSELF, %ecx
3008 movl %ecx, OUT_ARG3(%esp) # self
3009 call artSet16StaticFromCode
3010 testl %eax, %eax
3011 jnz MterpException
3012 REFRESH_IBASE
3013 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
3014
3015
3016/* ------------------------------ */
3017 .balign 128
3018.L_op_invoke_virtual: /* 0x6e */
3019/* File: x86/op_invoke_virtual.S */
3020/* File: x86/invoke.S */
3021/*
3022 * Generic invoke handler wrapper.
3023 */
3024 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3025 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3026 .extern MterpInvokeVirtual
3027 EXPORT_PC
3028 movl rSELF, %ecx
3029 movl %ecx, OUT_ARG0(%esp)
3030 leal OFF_FP_SHADOWFRAME(rFP), %eax
3031 movl %eax, OUT_ARG1(%esp)
3032 movl rPC, OUT_ARG2(%esp)
3033 REFRESH_INST 110
3034 movl rINST, OUT_ARG3(%esp)
3035 call MterpInvokeVirtual
3036 testl %eax, %eax
3037 jz MterpException
3038 REFRESH_IBASE
3039 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
3040
3041/*
3042 * Handle a virtual method call.
3043 *
3044 * for: invoke-virtual, invoke-virtual/range
3045 */
3046 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3047 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3048
3049/* ------------------------------ */
3050 .balign 128
3051.L_op_invoke_super: /* 0x6f */
3052/* File: x86/op_invoke_super.S */
3053/* File: x86/invoke.S */
3054/*
3055 * Generic invoke handler wrapper.
3056 */
3057 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3058 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3059 .extern MterpInvokeSuper
3060 EXPORT_PC
3061 movl rSELF, %ecx
3062 movl %ecx, OUT_ARG0(%esp)
3063 leal OFF_FP_SHADOWFRAME(rFP), %eax
3064 movl %eax, OUT_ARG1(%esp)
3065 movl rPC, OUT_ARG2(%esp)
3066 REFRESH_INST 111
3067 movl rINST, OUT_ARG3(%esp)
3068 call MterpInvokeSuper
3069 testl %eax, %eax
3070 jz MterpException
3071 REFRESH_IBASE
3072 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
3073
3074/*
3075 * Handle a "super" method call.
3076 *
3077 * for: invoke-super, invoke-super/range
3078 */
3079 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3080 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3081
3082/* ------------------------------ */
3083 .balign 128
3084.L_op_invoke_direct: /* 0x70 */
3085/* File: x86/op_invoke_direct.S */
3086/* File: x86/invoke.S */
3087/*
3088 * Generic invoke handler wrapper.
3089 */
3090 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3091 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3092 .extern MterpInvokeDirect
3093 EXPORT_PC
3094 movl rSELF, %ecx
3095 movl %ecx, OUT_ARG0(%esp)
3096 leal OFF_FP_SHADOWFRAME(rFP), %eax
3097 movl %eax, OUT_ARG1(%esp)
3098 movl rPC, OUT_ARG2(%esp)
3099 REFRESH_INST 112
3100 movl rINST, OUT_ARG3(%esp)
3101 call MterpInvokeDirect
3102 testl %eax, %eax
3103 jz MterpException
3104 REFRESH_IBASE
3105 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
3106
3107
3108/* ------------------------------ */
3109 .balign 128
3110.L_op_invoke_static: /* 0x71 */
3111/* File: x86/op_invoke_static.S */
3112/* File: x86/invoke.S */
3113/*
3114 * Generic invoke handler wrapper.
3115 */
3116 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3117 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3118 .extern MterpInvokeStatic
3119 EXPORT_PC
3120 movl rSELF, %ecx
3121 movl %ecx, OUT_ARG0(%esp)
3122 leal OFF_FP_SHADOWFRAME(rFP), %eax
3123 movl %eax, OUT_ARG1(%esp)
3124 movl rPC, OUT_ARG2(%esp)
3125 REFRESH_INST 113
3126 movl rINST, OUT_ARG3(%esp)
3127 call MterpInvokeStatic
3128 testl %eax, %eax
3129 jz MterpException
3130 REFRESH_IBASE
3131 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
3132
3133
3134
3135/* ------------------------------ */
3136 .balign 128
3137.L_op_invoke_interface: /* 0x72 */
3138/* File: x86/op_invoke_interface.S */
3139/* File: x86/invoke.S */
3140/*
3141 * Generic invoke handler wrapper.
3142 */
3143 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3144 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3145 .extern MterpInvokeInterface
3146 EXPORT_PC
3147 movl rSELF, %ecx
3148 movl %ecx, OUT_ARG0(%esp)
3149 leal OFF_FP_SHADOWFRAME(rFP), %eax
3150 movl %eax, OUT_ARG1(%esp)
3151 movl rPC, OUT_ARG2(%esp)
3152 REFRESH_INST 114
3153 movl rINST, OUT_ARG3(%esp)
3154 call MterpInvokeInterface
3155 testl %eax, %eax
3156 jz MterpException
3157 REFRESH_IBASE
3158 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
3159
3160/*
3161 * Handle an interface method call.
3162 *
3163 * for: invoke-interface, invoke-interface/range
3164 */
3165 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3166 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3167
3168/* ------------------------------ */
3169 .balign 128
3170.L_op_return_void_no_barrier: /* 0x73 */
3171/* File: x86/op_return_void_no_barrier.S */
buzbeea2c97a92016-01-25 15:41:24 -08003172 movl rSELF, %eax
3173 testl $(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST), THREAD_FLAGS_OFFSET(%eax)
3174 jz 1f
3175 movl %eax, OUT_ARG0(%esp)
3176 call MterpSuspendCheck
31771:
Bill Buzbee7c58bd42016-01-20 20:46:01 +00003178 xorl %eax, %eax
3179 xorl %ecx, %ecx
3180 jmp MterpReturn
3181
3182/* ------------------------------ */
3183 .balign 128
3184.L_op_invoke_virtual_range: /* 0x74 */
3185/* File: x86/op_invoke_virtual_range.S */
3186/* File: x86/invoke.S */
3187/*
3188 * Generic invoke handler wrapper.
3189 */
3190 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3191 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3192 .extern MterpInvokeVirtualRange
3193 EXPORT_PC
3194 movl rSELF, %ecx
3195 movl %ecx, OUT_ARG0(%esp)
3196 leal OFF_FP_SHADOWFRAME(rFP), %eax
3197 movl %eax, OUT_ARG1(%esp)
3198 movl rPC, OUT_ARG2(%esp)
3199 REFRESH_INST 116
3200 movl rINST, OUT_ARG3(%esp)
3201 call MterpInvokeVirtualRange
3202 testl %eax, %eax
3203 jz MterpException
3204 REFRESH_IBASE
3205 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
3206
3207
3208/* ------------------------------ */
3209 .balign 128
3210.L_op_invoke_super_range: /* 0x75 */
3211/* File: x86/op_invoke_super_range.S */
3212/* File: x86/invoke.S */
3213/*
3214 * Generic invoke handler wrapper.
3215 */
3216 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3217 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3218 .extern MterpInvokeSuperRange
3219 EXPORT_PC
3220 movl rSELF, %ecx
3221 movl %ecx, OUT_ARG0(%esp)
3222 leal OFF_FP_SHADOWFRAME(rFP), %eax
3223 movl %eax, OUT_ARG1(%esp)
3224 movl rPC, OUT_ARG2(%esp)
3225 REFRESH_INST 117
3226 movl rINST, OUT_ARG3(%esp)
3227 call MterpInvokeSuperRange
3228 testl %eax, %eax
3229 jz MterpException
3230 REFRESH_IBASE
3231 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
3232
3233
3234/* ------------------------------ */
3235 .balign 128
3236.L_op_invoke_direct_range: /* 0x76 */
3237/* File: x86/op_invoke_direct_range.S */
3238/* File: x86/invoke.S */
3239/*
3240 * Generic invoke handler wrapper.
3241 */
3242 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3243 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3244 .extern MterpInvokeDirectRange
3245 EXPORT_PC
3246 movl rSELF, %ecx
3247 movl %ecx, OUT_ARG0(%esp)
3248 leal OFF_FP_SHADOWFRAME(rFP), %eax
3249 movl %eax, OUT_ARG1(%esp)
3250 movl rPC, OUT_ARG2(%esp)
3251 REFRESH_INST 118
3252 movl rINST, OUT_ARG3(%esp)
3253 call MterpInvokeDirectRange
3254 testl %eax, %eax
3255 jz MterpException
3256 REFRESH_IBASE
3257 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
3258
3259
3260/* ------------------------------ */
3261 .balign 128
3262.L_op_invoke_static_range: /* 0x77 */
3263/* File: x86/op_invoke_static_range.S */
3264/* File: x86/invoke.S */
3265/*
3266 * Generic invoke handler wrapper.
3267 */
3268 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3269 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3270 .extern MterpInvokeStaticRange
3271 EXPORT_PC
3272 movl rSELF, %ecx
3273 movl %ecx, OUT_ARG0(%esp)
3274 leal OFF_FP_SHADOWFRAME(rFP), %eax
3275 movl %eax, OUT_ARG1(%esp)
3276 movl rPC, OUT_ARG2(%esp)
3277 REFRESH_INST 119
3278 movl rINST, OUT_ARG3(%esp)
3279 call MterpInvokeStaticRange
3280 testl %eax, %eax
3281 jz MterpException
3282 REFRESH_IBASE
3283 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
3284
3285
3286/* ------------------------------ */
3287 .balign 128
3288.L_op_invoke_interface_range: /* 0x78 */
3289/* File: x86/op_invoke_interface_range.S */
3290/* File: x86/invoke.S */
3291/*
3292 * Generic invoke handler wrapper.
3293 */
3294 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3295 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3296 .extern MterpInvokeInterfaceRange
3297 EXPORT_PC
3298 movl rSELF, %ecx
3299 movl %ecx, OUT_ARG0(%esp)
3300 leal OFF_FP_SHADOWFRAME(rFP), %eax
3301 movl %eax, OUT_ARG1(%esp)
3302 movl rPC, OUT_ARG2(%esp)
3303 REFRESH_INST 120
3304 movl rINST, OUT_ARG3(%esp)
3305 call MterpInvokeInterfaceRange
3306 testl %eax, %eax
3307 jz MterpException
3308 REFRESH_IBASE
3309 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
3310
3311
3312/* ------------------------------ */
3313 .balign 128
3314.L_op_unused_79: /* 0x79 */
3315/* File: x86/op_unused_79.S */
3316/* File: x86/unused.S */
3317/*
3318 * Bail to reference interpreter to throw.
3319 */
3320 jmp MterpFallback
3321
3322
3323/* ------------------------------ */
3324 .balign 128
3325.L_op_unused_7a: /* 0x7a */
3326/* File: x86/op_unused_7a.S */
3327/* File: x86/unused.S */
3328/*
3329 * Bail to reference interpreter to throw.
3330 */
3331 jmp MterpFallback
3332
3333
3334/* ------------------------------ */
3335 .balign 128
3336.L_op_neg_int: /* 0x7b */
3337/* File: x86/op_neg_int.S */
3338/* File: x86/unop.S */
3339/*
3340 * Generic 32-bit unary operation. Provide an "instr" line that
3341 * specifies an instruction that performs "result = op eax".
3342 */
3343 /* unop vA, vB */
3344 movzbl rINSTbl,%ecx # ecx <- A+
3345 sarl $4,rINST # rINST <- B
3346 GET_VREG %eax rINST # eax <- vB
3347 andb $0xf,%cl # ecx <- A
3348 negl %eax
3349 SET_VREG %eax %ecx
3350 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3351
3352
3353/* ------------------------------ */
3354 .balign 128
3355.L_op_not_int: /* 0x7c */
3356/* File: x86/op_not_int.S */
3357/* File: x86/unop.S */
3358/*
3359 * Generic 32-bit unary operation. Provide an "instr" line that
3360 * specifies an instruction that performs "result = op eax".
3361 */
3362 /* unop vA, vB */
3363 movzbl rINSTbl,%ecx # ecx <- A+
3364 sarl $4,rINST # rINST <- B
3365 GET_VREG %eax rINST # eax <- vB
3366 andb $0xf,%cl # ecx <- A
3367 notl %eax
3368 SET_VREG %eax %ecx
3369 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3370
3371
3372/* ------------------------------ */
3373 .balign 128
3374.L_op_neg_long: /* 0x7d */
3375/* File: x86/op_neg_long.S */
3376 /* unop vA, vB */
3377 movzbl rINSTbl, %ecx # ecx <- BA
3378 sarl $4, %ecx # ecx <- B
3379 andb $0xf, rINSTbl # rINST <- A
3380 GET_VREG %eax %ecx # eax <- v[B+0]
3381 GET_VREG_HIGH %ecx %ecx # ecx <- v[B+1]
3382 negl %eax
3383 adcl $0, %ecx
3384 negl %ecx
3385 SET_VREG %eax rINST # v[A+0] <- eax
3386 SET_VREG_HIGH %ecx rINST # v[A+1] <- ecx
3387 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3388
3389
3390/* ------------------------------ */
3391 .balign 128
3392.L_op_not_long: /* 0x7e */
3393/* File: x86/op_not_long.S */
3394 /* unop vA, vB */
3395 movzbl rINSTbl, %ecx # ecx <- BA
3396 sarl $4, %ecx # ecx <- B
3397 andb $0xf, rINSTbl # rINST <- A
3398 GET_VREG %eax %ecx # eax <- v[B+0]
3399 GET_VREG_HIGH %ecx %ecx # ecx <- v[B+1]
3400 notl %eax
3401 notl %ecx
3402 SET_VREG %eax rINST # v[A+0] <- eax
3403 SET_VREG_HIGH %ecx rINST # v[A+1] <- ecx
3404 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3405
3406/* ------------------------------ */
3407 .balign 128
3408.L_op_neg_float: /* 0x7f */
3409/* File: x86/op_neg_float.S */
3410/* File: x86/fpcvt.S */
3411/*
3412 * Generic 32-bit FP conversion operation.
3413 */
3414 /* unop vA, vB */
3415 movzbl rINSTbl, %ecx # ecx <- A+
3416 sarl $4, rINST # rINST <- B
3417 flds VREG_ADDRESS(rINST) # %st0 <- vB
3418 andb $0xf, %cl # ecx <- A
3419 fchs
3420 fstps VREG_ADDRESS(%ecx) # vA <- %st0
3421 .if 0
3422 CLEAR_WIDE_REF %ecx
3423 .else
3424 CLEAR_REF %ecx
3425 .endif
3426 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3427
3428
3429/* ------------------------------ */
3430 .balign 128
3431.L_op_neg_double: /* 0x80 */
3432/* File: x86/op_neg_double.S */
3433/* File: x86/fpcvt.S */
3434/*
3435 * Generic 32-bit FP conversion operation.
3436 */
3437 /* unop vA, vB */
3438 movzbl rINSTbl, %ecx # ecx <- A+
3439 sarl $4, rINST # rINST <- B
3440 fldl VREG_ADDRESS(rINST) # %st0 <- vB
3441 andb $0xf, %cl # ecx <- A
3442 fchs
3443 fstpl VREG_ADDRESS(%ecx) # vA <- %st0
3444 .if 1
3445 CLEAR_WIDE_REF %ecx
3446 .else
3447 CLEAR_REF %ecx
3448 .endif
3449 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3450
3451
3452/* ------------------------------ */
3453 .balign 128
3454.L_op_int_to_long: /* 0x81 */
3455/* File: x86/op_int_to_long.S */
3456 /* int to long vA, vB */
3457 movzbl rINSTbl, %eax # eax <- +A
3458 sarl $4, %eax # eax <- B
3459 GET_VREG %eax %eax # eax <- vB
3460 andb $0xf, rINSTbl # rINST <- A
3461 movl rIBASE, %ecx # cltd trashes rIBASE/edx
3462 cltd # rINST:eax<- sssssssBBBBBBBB
3463 SET_VREG_HIGH rIBASE rINST # v[A+1] <- rIBASE
3464 SET_VREG %eax rINST # v[A+0] <- %eax
3465 movl %ecx, rIBASE
3466 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3467
3468
3469/* ------------------------------ */
3470 .balign 128
3471.L_op_int_to_float: /* 0x82 */
3472/* File: x86/op_int_to_float.S */
3473/* File: x86/fpcvt.S */
3474/*
3475 * Generic 32-bit FP conversion operation.
3476 */
3477 /* unop vA, vB */
3478 movzbl rINSTbl, %ecx # ecx <- A+
3479 sarl $4, rINST # rINST <- B
3480 fildl VREG_ADDRESS(rINST) # %st0 <- vB
3481 andb $0xf, %cl # ecx <- A
3482
3483 fstps VREG_ADDRESS(%ecx) # vA <- %st0
3484 .if 0
3485 CLEAR_WIDE_REF %ecx
3486 .else
3487 CLEAR_REF %ecx
3488 .endif
3489 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3490
3491
3492/* ------------------------------ */
3493 .balign 128
3494.L_op_int_to_double: /* 0x83 */
3495/* File: x86/op_int_to_double.S */
3496/* File: x86/fpcvt.S */
3497/*
3498 * Generic 32-bit FP conversion operation.
3499 */
3500 /* unop vA, vB */
3501 movzbl rINSTbl, %ecx # ecx <- A+
3502 sarl $4, rINST # rINST <- B
3503 fildl VREG_ADDRESS(rINST) # %st0 <- vB
3504 andb $0xf, %cl # ecx <- A
3505
3506 fstpl VREG_ADDRESS(%ecx) # vA <- %st0
3507 .if 1
3508 CLEAR_WIDE_REF %ecx
3509 .else
3510 CLEAR_REF %ecx
3511 .endif
3512 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3513
3514
3515/* ------------------------------ */
3516 .balign 128
3517.L_op_long_to_int: /* 0x84 */
3518/* File: x86/op_long_to_int.S */
3519/* we ignore the high word, making this equivalent to a 32-bit reg move */
3520/* File: x86/op_move.S */
3521 /* for move, move-object, long-to-int */
3522 /* op vA, vB */
3523 movzbl rINSTbl, %eax # eax <- BA
3524 andb $0xf, %al # eax <- A
3525 shrl $4, rINST # rINST <- B
3526 GET_VREG rINST rINST
3527 .if 0
3528 SET_VREG_OBJECT rINST %eax # fp[A] <- fp[B]
3529 .else
3530 SET_VREG rINST %eax # fp[A] <- fp[B]
3531 .endif
3532 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3533
3534
3535/* ------------------------------ */
3536 .balign 128
3537.L_op_long_to_float: /* 0x85 */
3538/* File: x86/op_long_to_float.S */
3539/* File: x86/fpcvt.S */
3540/*
3541 * Generic 32-bit FP conversion operation.
3542 */
3543 /* unop vA, vB */
3544 movzbl rINSTbl, %ecx # ecx <- A+
3545 sarl $4, rINST # rINST <- B
3546 fildll VREG_ADDRESS(rINST) # %st0 <- vB
3547 andb $0xf, %cl # ecx <- A
3548
3549 fstps VREG_ADDRESS(%ecx) # vA <- %st0
3550 .if 0
3551 CLEAR_WIDE_REF %ecx
3552 .else
3553 CLEAR_REF %ecx
3554 .endif
3555 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3556
3557
3558/* ------------------------------ */
3559 .balign 128
3560.L_op_long_to_double: /* 0x86 */
3561/* File: x86/op_long_to_double.S */
3562/* File: x86/fpcvt.S */
3563/*
3564 * Generic 32-bit FP conversion operation.
3565 */
3566 /* unop vA, vB */
3567 movzbl rINSTbl, %ecx # ecx <- A+
3568 sarl $4, rINST # rINST <- B
3569 fildll VREG_ADDRESS(rINST) # %st0 <- vB
3570 andb $0xf, %cl # ecx <- A
3571
3572 fstpl VREG_ADDRESS(%ecx) # vA <- %st0
3573 .if 1
3574 CLEAR_WIDE_REF %ecx
3575 .else
3576 CLEAR_REF %ecx
3577 .endif
3578 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3579
3580
3581/* ------------------------------ */
3582 .balign 128
3583.L_op_float_to_int: /* 0x87 */
3584/* File: x86/op_float_to_int.S */
3585/* File: x86/cvtfp_int.S */
3586/* On fp to int conversions, Java requires that
3587 * if the result > maxint, it should be clamped to maxint. If it is less
3588 * than minint, it should be clamped to minint. If it is a nan, the result
3589 * should be zero. Further, the rounding mode is to truncate. This model
3590 * differs from what is delivered normally via the x86 fpu, so we have
3591 * to play some games.
3592 */
3593 /* float/double to int/long vA, vB */
3594 movzbl rINSTbl, %ecx # ecx <- A+
3595 sarl $4, rINST # rINST <- B
3596 .if 0
3597 fldl VREG_ADDRESS(rINST) # %st0 <- vB
3598 .else
3599 flds VREG_ADDRESS(rINST) # %st0 <- vB
3600 .endif
3601 ftst
3602 fnstcw LOCAL0(%esp) # remember original rounding mode
3603 movzwl LOCAL0(%esp), %eax
3604 movb $0xc, %ah
3605 movw %ax, LOCAL0+2(%esp)
3606 fldcw LOCAL0+2(%esp) # set "to zero" rounding mode
3607 andb $0xf, %cl # ecx <- A
3608 .if 0
3609 fistpll VREG_ADDRESS(%ecx) # convert and store
3610 .else
3611 fistpl VREG_ADDRESS(%ecx) # convert and store
3612 .endif
3613 fldcw LOCAL0(%esp) # restore previous rounding mode
3614 .if 0
3615 movl $0x80000000, %eax
3616 xorl VREG_HIGH_ADDRESS(%ecx), %eax
3617 orl VREG_ADDRESS(%ecx), %eax
3618 .else
3619 cmpl $0x80000000, VREG_ADDRESS(%ecx)
3620 .endif
3621 je .Lop_float_to_int_special_case # fix up result
3622
3623.Lop_float_to_int_finish:
3624 xor %eax, %eax
3625 mov %eax, VREG_REF_ADDRESS(%ecx)
3626 .if 0
3627 mov %eax, VREG_REF_HIGH_ADDRESS(%ecx)
3628 .endif
3629 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3630
3631.Lop_float_to_int_special_case:
3632 fnstsw %ax
3633 sahf
3634 jp .Lop_float_to_int_isNaN
3635 adcl $-1, VREG_ADDRESS(%ecx)
3636 .if 0
3637 adcl $-1, VREG_HIGH_ADDRESS(%ecx)
3638 .endif
3639 jmp .Lop_float_to_int_finish
3640.Lop_float_to_int_isNaN:
3641 movl $0, VREG_ADDRESS(%ecx)
3642 .if 0
3643 movl $0, VREG_HIGH_ADDRESS(%ecx)
3644 .endif
3645 jmp .Lop_float_to_int_finish
3646
3647
3648/* ------------------------------ */
3649 .balign 128
3650.L_op_float_to_long: /* 0x88 */
3651/* File: x86/op_float_to_long.S */
3652/* File: x86/cvtfp_int.S */
3653/* On fp to int conversions, Java requires that
3654 * if the result > maxint, it should be clamped to maxint. If it is less
3655 * than minint, it should be clamped to minint. If it is a nan, the result
3656 * should be zero. Further, the rounding mode is to truncate. This model
3657 * differs from what is delivered normally via the x86 fpu, so we have
3658 * to play some games.
3659 */
3660 /* float/double to int/long vA, vB */
3661 movzbl rINSTbl, %ecx # ecx <- A+
3662 sarl $4, rINST # rINST <- B
3663 .if 0
3664 fldl VREG_ADDRESS(rINST) # %st0 <- vB
3665 .else
3666 flds VREG_ADDRESS(rINST) # %st0 <- vB
3667 .endif
3668 ftst
3669 fnstcw LOCAL0(%esp) # remember original rounding mode
3670 movzwl LOCAL0(%esp), %eax
3671 movb $0xc, %ah
3672 movw %ax, LOCAL0+2(%esp)
3673 fldcw LOCAL0+2(%esp) # set "to zero" rounding mode
3674 andb $0xf, %cl # ecx <- A
3675 .if 1
3676 fistpll VREG_ADDRESS(%ecx) # convert and store
3677 .else
3678 fistpl VREG_ADDRESS(%ecx) # convert and store
3679 .endif
3680 fldcw LOCAL0(%esp) # restore previous rounding mode
3681 .if 1
3682 movl $0x80000000, %eax
3683 xorl VREG_HIGH_ADDRESS(%ecx), %eax
3684 orl VREG_ADDRESS(%ecx), %eax
3685 .else
3686 cmpl $0x80000000, VREG_ADDRESS(%ecx)
3687 .endif
3688 je .Lop_float_to_long_special_case # fix up result
3689
3690.Lop_float_to_long_finish:
3691 xor %eax, %eax
3692 mov %eax, VREG_REF_ADDRESS(%ecx)
3693 .if 1
3694 mov %eax, VREG_REF_HIGH_ADDRESS(%ecx)
3695 .endif
3696 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3697
3698.Lop_float_to_long_special_case:
3699 fnstsw %ax
3700 sahf
3701 jp .Lop_float_to_long_isNaN
3702 adcl $-1, VREG_ADDRESS(%ecx)
3703 .if 1
3704 adcl $-1, VREG_HIGH_ADDRESS(%ecx)
3705 .endif
3706 jmp .Lop_float_to_long_finish
3707.Lop_float_to_long_isNaN:
3708 movl $0, VREG_ADDRESS(%ecx)
3709 .if 1
3710 movl $0, VREG_HIGH_ADDRESS(%ecx)
3711 .endif
3712 jmp .Lop_float_to_long_finish
3713
3714
3715/* ------------------------------ */
3716 .balign 128
3717.L_op_float_to_double: /* 0x89 */
3718/* File: x86/op_float_to_double.S */
3719/* File: x86/fpcvt.S */
3720/*
3721 * Generic 32-bit FP conversion operation.
3722 */
3723 /* unop vA, vB */
3724 movzbl rINSTbl, %ecx # ecx <- A+
3725 sarl $4, rINST # rINST <- B
3726 flds VREG_ADDRESS(rINST) # %st0 <- vB
3727 andb $0xf, %cl # ecx <- A
3728
3729 fstpl VREG_ADDRESS(%ecx) # vA <- %st0
3730 .if 1
3731 CLEAR_WIDE_REF %ecx
3732 .else
3733 CLEAR_REF %ecx
3734 .endif
3735 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3736
3737
3738/* ------------------------------ */
3739 .balign 128
3740.L_op_double_to_int: /* 0x8a */
3741/* File: x86/op_double_to_int.S */
3742/* File: x86/cvtfp_int.S */
3743/* On fp to int conversions, Java requires that
3744 * if the result > maxint, it should be clamped to maxint. If it is less
3745 * than minint, it should be clamped to minint. If it is a nan, the result
3746 * should be zero. Further, the rounding mode is to truncate. This model
3747 * differs from what is delivered normally via the x86 fpu, so we have
3748 * to play some games.
3749 */
3750 /* float/double to int/long vA, vB */
3751 movzbl rINSTbl, %ecx # ecx <- A+
3752 sarl $4, rINST # rINST <- B
3753 .if 1
3754 fldl VREG_ADDRESS(rINST) # %st0 <- vB
3755 .else
3756 flds VREG_ADDRESS(rINST) # %st0 <- vB
3757 .endif
3758 ftst
3759 fnstcw LOCAL0(%esp) # remember original rounding mode
3760 movzwl LOCAL0(%esp), %eax
3761 movb $0xc, %ah
3762 movw %ax, LOCAL0+2(%esp)
3763 fldcw LOCAL0+2(%esp) # set "to zero" rounding mode
3764 andb $0xf, %cl # ecx <- A
3765 .if 0
3766 fistpll VREG_ADDRESS(%ecx) # convert and store
3767 .else
3768 fistpl VREG_ADDRESS(%ecx) # convert and store
3769 .endif
3770 fldcw LOCAL0(%esp) # restore previous rounding mode
3771 .if 0
3772 movl $0x80000000, %eax
3773 xorl VREG_HIGH_ADDRESS(%ecx), %eax
3774 orl VREG_ADDRESS(%ecx), %eax
3775 .else
3776 cmpl $0x80000000, VREG_ADDRESS(%ecx)
3777 .endif
3778 je .Lop_double_to_int_special_case # fix up result
3779
3780.Lop_double_to_int_finish:
3781 xor %eax, %eax
3782 mov %eax, VREG_REF_ADDRESS(%ecx)
3783 .if 0
3784 mov %eax, VREG_REF_HIGH_ADDRESS(%ecx)
3785 .endif
3786 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3787
3788.Lop_double_to_int_special_case:
3789 fnstsw %ax
3790 sahf
3791 jp .Lop_double_to_int_isNaN
3792 adcl $-1, VREG_ADDRESS(%ecx)
3793 .if 0
3794 adcl $-1, VREG_HIGH_ADDRESS(%ecx)
3795 .endif
3796 jmp .Lop_double_to_int_finish
3797.Lop_double_to_int_isNaN:
3798 movl $0, VREG_ADDRESS(%ecx)
3799 .if 0
3800 movl $0, VREG_HIGH_ADDRESS(%ecx)
3801 .endif
3802 jmp .Lop_double_to_int_finish
3803
3804
3805/* ------------------------------ */
3806 .balign 128
3807.L_op_double_to_long: /* 0x8b */
3808/* File: x86/op_double_to_long.S */
3809/* File: x86/cvtfp_int.S */
3810/* On fp to int conversions, Java requires that
3811 * if the result > maxint, it should be clamped to maxint. If it is less
3812 * than minint, it should be clamped to minint. If it is a nan, the result
3813 * should be zero. Further, the rounding mode is to truncate. This model
3814 * differs from what is delivered normally via the x86 fpu, so we have
3815 * to play some games.
3816 */
3817 /* float/double to int/long vA, vB */
3818 movzbl rINSTbl, %ecx # ecx <- A+
3819 sarl $4, rINST # rINST <- B
3820 .if 1
3821 fldl VREG_ADDRESS(rINST) # %st0 <- vB
3822 .else
3823 flds VREG_ADDRESS(rINST) # %st0 <- vB
3824 .endif
3825 ftst
3826 fnstcw LOCAL0(%esp) # remember original rounding mode
3827 movzwl LOCAL0(%esp), %eax
3828 movb $0xc, %ah
3829 movw %ax, LOCAL0+2(%esp)
3830 fldcw LOCAL0+2(%esp) # set "to zero" rounding mode
3831 andb $0xf, %cl # ecx <- A
3832 .if 1
3833 fistpll VREG_ADDRESS(%ecx) # convert and store
3834 .else
3835 fistpl VREG_ADDRESS(%ecx) # convert and store
3836 .endif
3837 fldcw LOCAL0(%esp) # restore previous rounding mode
3838 .if 1
3839 movl $0x80000000, %eax
3840 xorl VREG_HIGH_ADDRESS(%ecx), %eax
3841 orl VREG_ADDRESS(%ecx), %eax
3842 .else
3843 cmpl $0x80000000, VREG_ADDRESS(%ecx)
3844 .endif
3845 je .Lop_double_to_long_special_case # fix up result
3846
3847.Lop_double_to_long_finish:
3848 xor %eax, %eax
3849 mov %eax, VREG_REF_ADDRESS(%ecx)
3850 .if 1
3851 mov %eax, VREG_REF_HIGH_ADDRESS(%ecx)
3852 .endif
3853 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3854
3855.Lop_double_to_long_special_case:
3856 fnstsw %ax
3857 sahf
3858 jp .Lop_double_to_long_isNaN
3859 adcl $-1, VREG_ADDRESS(%ecx)
3860 .if 1
3861 adcl $-1, VREG_HIGH_ADDRESS(%ecx)
3862 .endif
3863 jmp .Lop_double_to_long_finish
3864.Lop_double_to_long_isNaN:
3865 movl $0, VREG_ADDRESS(%ecx)
3866 .if 1
3867 movl $0, VREG_HIGH_ADDRESS(%ecx)
3868 .endif
3869 jmp .Lop_double_to_long_finish
3870
3871
3872/* ------------------------------ */
3873 .balign 128
3874.L_op_double_to_float: /* 0x8c */
3875/* File: x86/op_double_to_float.S */
3876/* File: x86/fpcvt.S */
3877/*
3878 * Generic 32-bit FP conversion operation.
3879 */
3880 /* unop vA, vB */
3881 movzbl rINSTbl, %ecx # ecx <- A+
3882 sarl $4, rINST # rINST <- B
3883 fldl VREG_ADDRESS(rINST) # %st0 <- vB
3884 andb $0xf, %cl # ecx <- A
3885
3886 fstps VREG_ADDRESS(%ecx) # vA <- %st0
3887 .if 0
3888 CLEAR_WIDE_REF %ecx
3889 .else
3890 CLEAR_REF %ecx
3891 .endif
3892 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3893
3894
3895/* ------------------------------ */
3896 .balign 128
3897.L_op_int_to_byte: /* 0x8d */
3898/* File: x86/op_int_to_byte.S */
3899/* File: x86/unop.S */
3900/*
3901 * Generic 32-bit unary operation. Provide an "instr" line that
3902 * specifies an instruction that performs "result = op eax".
3903 */
3904 /* unop vA, vB */
3905 movzbl rINSTbl,%ecx # ecx <- A+
3906 sarl $4,rINST # rINST <- B
3907 GET_VREG %eax rINST # eax <- vB
3908 andb $0xf,%cl # ecx <- A
3909 movsbl %al, %eax
3910 SET_VREG %eax %ecx
3911 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3912
3913
3914/* ------------------------------ */
3915 .balign 128
3916.L_op_int_to_char: /* 0x8e */
3917/* File: x86/op_int_to_char.S */
3918/* File: x86/unop.S */
3919/*
3920 * Generic 32-bit unary operation. Provide an "instr" line that
3921 * specifies an instruction that performs "result = op eax".
3922 */
3923 /* unop vA, vB */
3924 movzbl rINSTbl,%ecx # ecx <- A+
3925 sarl $4,rINST # rINST <- B
3926 GET_VREG %eax rINST # eax <- vB
3927 andb $0xf,%cl # ecx <- A
3928 movzwl %ax,%eax
3929 SET_VREG %eax %ecx
3930 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3931
3932
3933/* ------------------------------ */
3934 .balign 128
3935.L_op_int_to_short: /* 0x8f */
3936/* File: x86/op_int_to_short.S */
3937/* File: x86/unop.S */
3938/*
3939 * Generic 32-bit unary operation. Provide an "instr" line that
3940 * specifies an instruction that performs "result = op eax".
3941 */
3942 /* unop vA, vB */
3943 movzbl rINSTbl,%ecx # ecx <- A+
3944 sarl $4,rINST # rINST <- B
3945 GET_VREG %eax rINST # eax <- vB
3946 andb $0xf,%cl # ecx <- A
3947 movswl %ax, %eax
3948 SET_VREG %eax %ecx
3949 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
3950
3951
3952/* ------------------------------ */
3953 .balign 128
3954.L_op_add_int: /* 0x90 */
3955/* File: x86/op_add_int.S */
3956/* File: x86/binop.S */
3957/*
3958 * Generic 32-bit binary operation. Provide an "instr" line that
3959 * specifies an instruction that performs "result = eax op (rFP,%ecx,4)".
3960 * This could be an x86 instruction or a function call. (If the result
3961 * comes back in a register other than eax, you can override "result".)
3962 *
3963 * For: add-int, sub-int, and-int, or-int,
3964 * xor-int, shl-int, shr-int, ushr-int
3965 */
3966 /* binop vAA, vBB, vCC */
3967 movzbl 2(rPC), %eax # eax <- BB
3968 movzbl 3(rPC), %ecx # ecx <- CC
3969 GET_VREG %eax %eax # eax <- vBB
3970 addl (rFP,%ecx,4), %eax # ex: addl (rFP,%ecx,4),%eax
3971 SET_VREG %eax rINST
3972 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
3973
3974
3975/* ------------------------------ */
3976 .balign 128
3977.L_op_sub_int: /* 0x91 */
3978/* File: x86/op_sub_int.S */
3979/* File: x86/binop.S */
3980/*
3981 * Generic 32-bit binary operation. Provide an "instr" line that
3982 * specifies an instruction that performs "result = eax op (rFP,%ecx,4)".
3983 * This could be an x86 instruction or a function call. (If the result
3984 * comes back in a register other than eax, you can override "result".)
3985 *
3986 * For: add-int, sub-int, and-int, or-int,
3987 * xor-int, shl-int, shr-int, ushr-int
3988 */
3989 /* binop vAA, vBB, vCC */
3990 movzbl 2(rPC), %eax # eax <- BB
3991 movzbl 3(rPC), %ecx # ecx <- CC
3992 GET_VREG %eax %eax # eax <- vBB
3993 subl (rFP,%ecx,4), %eax # ex: addl (rFP,%ecx,4),%eax
3994 SET_VREG %eax rINST
3995 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
3996
3997
3998/* ------------------------------ */
3999 .balign 128
4000.L_op_mul_int: /* 0x92 */
4001/* File: x86/op_mul_int.S */
4002 /*
4003 * 32-bit binary multiplication.
4004 */
4005 /* mul vAA, vBB, vCC */
4006 movzbl 2(rPC), %eax # eax <- BB
4007 movzbl 3(rPC), %ecx # ecx <- CC
4008 GET_VREG %eax %eax # eax <- vBB
4009 mov rIBASE, LOCAL0(%esp)
4010 imull (rFP,%ecx,4), %eax # trashes rIBASE/edx
4011 mov LOCAL0(%esp), rIBASE
4012 SET_VREG %eax rINST
4013 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4014
4015/* ------------------------------ */
4016 .balign 128
4017.L_op_div_int: /* 0x93 */
4018/* File: x86/op_div_int.S */
4019/* File: x86/bindiv.S */
4020/*
4021 * 32-bit binary div/rem operation. Handles special case of op0=minint and
4022 * op1=-1.
4023 */
4024 /* div/rem vAA, vBB, vCC */
4025 movzbl 2(rPC), %eax # eax <- BB
4026 movzbl 3(rPC), %ecx # ecx <- CC
4027 GET_VREG %eax %eax # eax <- vBB
4028 GET_VREG %ecx %ecx # ecx <- vCC
4029 mov rIBASE, LOCAL0(%esp)
4030 testl %ecx, %ecx
4031 je common_errDivideByZero
4032 movl %eax, %edx
4033 orl %ecx, %edx
4034 test $0xFFFFFF00, %edx # If both arguments are less
4035 # than 8-bit and +ve
4036 jz .Lop_div_int_8 # Do 8-bit divide
4037 test $0xFFFF0000, %edx # If both arguments are less
4038 # than 16-bit and +ve
4039 jz .Lop_div_int_16 # Do 16-bit divide
4040 cmpl $-1, %ecx
4041 jne .Lop_div_int_32
4042 cmpl $0x80000000, %eax
4043 jne .Lop_div_int_32
4044 movl $0x80000000, %eax
4045 jmp .Lop_div_int_finish
4046.Lop_div_int_32:
4047 cltd
4048 idivl %ecx
4049 jmp .Lop_div_int_finish
4050.Lop_div_int_8:
4051 div %cl # 8-bit divide otherwise.
4052 # Remainder in %ah, quotient in %al
4053 .if 0
4054 movl %eax, %edx
4055 shr $8, %edx
4056 .else
4057 andl $0x000000FF, %eax
4058 .endif
4059 jmp .Lop_div_int_finish
4060.Lop_div_int_16:
4061 xorl %edx, %edx # Clear %edx before divide
4062 div %cx
4063.Lop_div_int_finish:
4064 SET_VREG %eax rINST
4065 mov LOCAL0(%esp), rIBASE
4066 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4067
4068
4069/* ------------------------------ */
4070 .balign 128
4071.L_op_rem_int: /* 0x94 */
4072/* File: x86/op_rem_int.S */
4073/* File: x86/bindiv.S */
4074/*
4075 * 32-bit binary div/rem operation. Handles special case of op0=minint and
4076 * op1=-1.
4077 */
4078 /* div/rem vAA, vBB, vCC */
4079 movzbl 2(rPC), %eax # eax <- BB
4080 movzbl 3(rPC), %ecx # ecx <- CC
4081 GET_VREG %eax %eax # eax <- vBB
4082 GET_VREG %ecx %ecx # ecx <- vCC
4083 mov rIBASE, LOCAL0(%esp)
4084 testl %ecx, %ecx
4085 je common_errDivideByZero
4086 movl %eax, %edx
4087 orl %ecx, %edx
4088 test $0xFFFFFF00, %edx # If both arguments are less
4089 # than 8-bit and +ve
4090 jz .Lop_rem_int_8 # Do 8-bit divide
4091 test $0xFFFF0000, %edx # If both arguments are less
4092 # than 16-bit and +ve
4093 jz .Lop_rem_int_16 # Do 16-bit divide
4094 cmpl $-1, %ecx
4095 jne .Lop_rem_int_32
4096 cmpl $0x80000000, %eax
4097 jne .Lop_rem_int_32
4098 movl $0, rIBASE
4099 jmp .Lop_rem_int_finish
4100.Lop_rem_int_32:
4101 cltd
4102 idivl %ecx
4103 jmp .Lop_rem_int_finish
4104.Lop_rem_int_8:
4105 div %cl # 8-bit divide otherwise.
4106 # Remainder in %ah, quotient in %al
4107 .if 1
4108 movl %eax, %edx
4109 shr $8, %edx
4110 .else
4111 andl $0x000000FF, %eax
4112 .endif
4113 jmp .Lop_rem_int_finish
4114.Lop_rem_int_16:
4115 xorl %edx, %edx # Clear %edx before divide
4116 div %cx
4117.Lop_rem_int_finish:
4118 SET_VREG rIBASE rINST
4119 mov LOCAL0(%esp), rIBASE
4120 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4121
4122
4123/* ------------------------------ */
4124 .balign 128
4125.L_op_and_int: /* 0x95 */
4126/* File: x86/op_and_int.S */
4127/* File: x86/binop.S */
4128/*
4129 * Generic 32-bit binary operation. Provide an "instr" line that
4130 * specifies an instruction that performs "result = eax op (rFP,%ecx,4)".
4131 * This could be an x86 instruction or a function call. (If the result
4132 * comes back in a register other than eax, you can override "result".)
4133 *
4134 * For: add-int, sub-int, and-int, or-int,
4135 * xor-int, shl-int, shr-int, ushr-int
4136 */
4137 /* binop vAA, vBB, vCC */
4138 movzbl 2(rPC), %eax # eax <- BB
4139 movzbl 3(rPC), %ecx # ecx <- CC
4140 GET_VREG %eax %eax # eax <- vBB
4141 andl (rFP,%ecx,4), %eax # ex: addl (rFP,%ecx,4),%eax
4142 SET_VREG %eax rINST
4143 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4144
4145
4146/* ------------------------------ */
4147 .balign 128
4148.L_op_or_int: /* 0x96 */
4149/* File: x86/op_or_int.S */
4150/* File: x86/binop.S */
4151/*
4152 * Generic 32-bit binary operation. Provide an "instr" line that
4153 * specifies an instruction that performs "result = eax op (rFP,%ecx,4)".
4154 * This could be an x86 instruction or a function call. (If the result
4155 * comes back in a register other than eax, you can override "result".)
4156 *
4157 * For: add-int, sub-int, and-int, or-int,
4158 * xor-int, shl-int, shr-int, ushr-int
4159 */
4160 /* binop vAA, vBB, vCC */
4161 movzbl 2(rPC), %eax # eax <- BB
4162 movzbl 3(rPC), %ecx # ecx <- CC
4163 GET_VREG %eax %eax # eax <- vBB
4164 orl (rFP,%ecx,4), %eax # ex: addl (rFP,%ecx,4),%eax
4165 SET_VREG %eax rINST
4166 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4167
4168
4169/* ------------------------------ */
4170 .balign 128
4171.L_op_xor_int: /* 0x97 */
4172/* File: x86/op_xor_int.S */
4173/* File: x86/binop.S */
4174/*
4175 * Generic 32-bit binary operation. Provide an "instr" line that
4176 * specifies an instruction that performs "result = eax op (rFP,%ecx,4)".
4177 * This could be an x86 instruction or a function call. (If the result
4178 * comes back in a register other than eax, you can override "result".)
4179 *
4180 * For: add-int, sub-int, and-int, or-int,
4181 * xor-int, shl-int, shr-int, ushr-int
4182 */
4183 /* binop vAA, vBB, vCC */
4184 movzbl 2(rPC), %eax # eax <- BB
4185 movzbl 3(rPC), %ecx # ecx <- CC
4186 GET_VREG %eax %eax # eax <- vBB
4187 xorl (rFP,%ecx,4), %eax # ex: addl (rFP,%ecx,4),%eax
4188 SET_VREG %eax rINST
4189 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4190
4191
4192/* ------------------------------ */
4193 .balign 128
4194.L_op_shl_int: /* 0x98 */
4195/* File: x86/op_shl_int.S */
4196/* File: x86/binop1.S */
4197/*
4198 * Generic 32-bit binary operation in which both operands loaded to
4199 * registers (op0 in eax, op1 in ecx).
4200 */
4201 /* binop vAA, vBB, vCC */
4202 movzbl 2(rPC),%eax # eax <- BB
4203 movzbl 3(rPC),%ecx # ecx <- CC
4204 GET_VREG %eax %eax # eax <- vBB
4205 GET_VREG %ecx %ecx # eax <- vBB
4206 sall %cl, %eax # ex: addl %ecx,%eax
4207 SET_VREG %eax rINST
4208 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4209
4210
4211/* ------------------------------ */
4212 .balign 128
4213.L_op_shr_int: /* 0x99 */
4214/* File: x86/op_shr_int.S */
4215/* File: x86/binop1.S */
4216/*
4217 * Generic 32-bit binary operation in which both operands loaded to
4218 * registers (op0 in eax, op1 in ecx).
4219 */
4220 /* binop vAA, vBB, vCC */
4221 movzbl 2(rPC),%eax # eax <- BB
4222 movzbl 3(rPC),%ecx # ecx <- CC
4223 GET_VREG %eax %eax # eax <- vBB
4224 GET_VREG %ecx %ecx # eax <- vBB
4225 sarl %cl, %eax # ex: addl %ecx,%eax
4226 SET_VREG %eax rINST
4227 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4228
4229
4230/* ------------------------------ */
4231 .balign 128
4232.L_op_ushr_int: /* 0x9a */
4233/* File: x86/op_ushr_int.S */
4234/* File: x86/binop1.S */
4235/*
4236 * Generic 32-bit binary operation in which both operands loaded to
4237 * registers (op0 in eax, op1 in ecx).
4238 */
4239 /* binop vAA, vBB, vCC */
4240 movzbl 2(rPC),%eax # eax <- BB
4241 movzbl 3(rPC),%ecx # ecx <- CC
4242 GET_VREG %eax %eax # eax <- vBB
4243 GET_VREG %ecx %ecx # eax <- vBB
4244 shrl %cl, %eax # ex: addl %ecx,%eax
4245 SET_VREG %eax rINST
4246 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4247
4248
4249/* ------------------------------ */
4250 .balign 128
4251.L_op_add_long: /* 0x9b */
4252/* File: x86/op_add_long.S */
4253/* File: x86/binopWide.S */
4254/*
4255 * Generic 64-bit binary operation.
4256 */
4257 /* binop vAA, vBB, vCC */
4258 movzbl 2(rPC),%eax # eax <- BB
4259 movzbl 3(rPC),%ecx # ecx <- CC
4260 movl rIBASE,LOCAL0(%esp) # save rIBASE
4261 GET_VREG rIBASE %eax # rIBASE <- v[BB+0]
4262 GET_VREG_HIGH %eax %eax # eax <- v[BB+1]
4263 addl (rFP,%ecx,4), rIBASE # ex: addl (rFP,%ecx,4),rIBASE
4264 adcl 4(rFP,%ecx,4), %eax # ex: adcl 4(rFP,%ecx,4),%eax
4265 SET_VREG rIBASE rINST # v[AA+0] <- rIBASE
4266 movl LOCAL0(%esp),rIBASE # restore rIBASE
4267 SET_VREG_HIGH %eax rINST # v[AA+1] <- eax
4268 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4269
4270
4271/* ------------------------------ */
4272 .balign 128
4273.L_op_sub_long: /* 0x9c */
4274/* File: x86/op_sub_long.S */
4275/* File: x86/binopWide.S */
4276/*
4277 * Generic 64-bit binary operation.
4278 */
4279 /* binop vAA, vBB, vCC */
4280 movzbl 2(rPC),%eax # eax <- BB
4281 movzbl 3(rPC),%ecx # ecx <- CC
4282 movl rIBASE,LOCAL0(%esp) # save rIBASE
4283 GET_VREG rIBASE %eax # rIBASE <- v[BB+0]
4284 GET_VREG_HIGH %eax %eax # eax <- v[BB+1]
4285 subl (rFP,%ecx,4), rIBASE # ex: addl (rFP,%ecx,4),rIBASE
4286 sbbl 4(rFP,%ecx,4), %eax # ex: adcl 4(rFP,%ecx,4),%eax
4287 SET_VREG rIBASE rINST # v[AA+0] <- rIBASE
4288 movl LOCAL0(%esp),rIBASE # restore rIBASE
4289 SET_VREG_HIGH %eax rINST # v[AA+1] <- eax
4290 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4291
4292
4293/* ------------------------------ */
4294 .balign 128
4295.L_op_mul_long: /* 0x9d */
4296/* File: x86/op_mul_long.S */
4297/*
4298 * Signed 64-bit integer multiply.
4299 *
4300 * We could definately use more free registers for
4301 * this code. We spill rINSTw (ebx),
4302 * giving us eax, ebc, ecx and edx as computational
4303 * temps. On top of that, we'll spill edi (rFP)
4304 * for use as the vB pointer and esi (rPC) for use
4305 * as the vC pointer. Yuck.
4306 *
4307 */
4308 /* mul-long vAA, vBB, vCC */
4309 movzbl 2(rPC), %eax # eax <- B
4310 movzbl 3(rPC), %ecx # ecx <- C
4311 mov rPC, LOCAL0(%esp) # save Interpreter PC
4312 mov rFP, LOCAL1(%esp) # save FP
4313 mov rIBASE, LOCAL2(%esp) # save rIBASE
4314 leal (rFP,%eax,4), %esi # esi <- &v[B]
4315 leal (rFP,%ecx,4), rFP # rFP <- &v[C]
4316 movl 4(%esi), %ecx # ecx <- Bmsw
4317 imull (rFP), %ecx # ecx <- (Bmsw*Clsw)
4318 movl 4(rFP), %eax # eax <- Cmsw
4319 imull (%esi), %eax # eax <- (Cmsw*Blsw)
4320 addl %eax, %ecx # ecx <- (Bmsw*Clsw)+(Cmsw*Blsw)
4321 movl (rFP), %eax # eax <- Clsw
4322 mull (%esi) # eax <- (Clsw*Alsw)
4323 mov LOCAL0(%esp), rPC # restore Interpreter PC
4324 mov LOCAL1(%esp), rFP # restore FP
4325 leal (%ecx,rIBASE), rIBASE # full result now in rIBASE:%eax
4326 SET_VREG_HIGH rIBASE rINST # v[B+1] <- rIBASE
4327 mov LOCAL2(%esp), rIBASE # restore IBASE
4328 SET_VREG %eax rINST # v[B] <- eax
4329 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4330
4331/* ------------------------------ */
4332 .balign 128
4333.L_op_div_long: /* 0x9e */
4334/* File: x86/op_div_long.S */
4335/* art_quick_* methods has quick abi,
4336 * so use eax, ecx, edx, ebx for args
4337 */
4338 /* div vAA, vBB, vCC */
4339 .extern art_quick_ldiv
4340 mov rIBASE, LOCAL0(%esp) # save rIBASE/%edx
4341 mov rINST, LOCAL1(%esp) # save rINST/%ebx
4342 movzbl 3(rPC), %eax # eax <- CC
4343 GET_VREG %ecx %eax
4344 GET_VREG_HIGH %ebx %eax
4345 movl %ecx, %edx
4346 orl %ebx, %ecx
4347 jz common_errDivideByZero
4348 movzbl 2(rPC), %eax # eax <- BB
4349 GET_VREG_HIGH %ecx %eax
4350 GET_VREG %eax %eax
4351 call art_quick_ldiv
4352 mov LOCAL1(%esp), rINST # restore rINST/%ebx
4353 SET_VREG_HIGH rIBASE rINST
4354 SET_VREG %eax rINST
4355 mov LOCAL0(%esp), rIBASE # restore rIBASE/%edx
4356 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4357
4358/* ------------------------------ */
4359 .balign 128
4360.L_op_rem_long: /* 0x9f */
4361/* File: x86/op_rem_long.S */
4362/* File: x86/op_div_long.S */
4363/* art_quick_* methods has quick abi,
4364 * so use eax, ecx, edx, ebx for args
4365 */
4366 /* div vAA, vBB, vCC */
4367 .extern art_quick_lmod
4368 mov rIBASE, LOCAL0(%esp) # save rIBASE/%edx
4369 mov rINST, LOCAL1(%esp) # save rINST/%ebx
4370 movzbl 3(rPC), %eax # eax <- CC
4371 GET_VREG %ecx %eax
4372 GET_VREG_HIGH %ebx %eax
4373 movl %ecx, %edx
4374 orl %ebx, %ecx
4375 jz common_errDivideByZero
4376 movzbl 2(rPC), %eax # eax <- BB
4377 GET_VREG_HIGH %ecx %eax
4378 GET_VREG %eax %eax
4379 call art_quick_lmod
4380 mov LOCAL1(%esp), rINST # restore rINST/%ebx
4381 SET_VREG_HIGH rIBASE rINST
4382 SET_VREG %eax rINST
4383 mov LOCAL0(%esp), rIBASE # restore rIBASE/%edx
4384 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4385
4386
4387/* ------------------------------ */
4388 .balign 128
4389.L_op_and_long: /* 0xa0 */
4390/* File: x86/op_and_long.S */
4391/* File: x86/binopWide.S */
4392/*
4393 * Generic 64-bit binary operation.
4394 */
4395 /* binop vAA, vBB, vCC */
4396 movzbl 2(rPC),%eax # eax <- BB
4397 movzbl 3(rPC),%ecx # ecx <- CC
4398 movl rIBASE,LOCAL0(%esp) # save rIBASE
4399 GET_VREG rIBASE %eax # rIBASE <- v[BB+0]
4400 GET_VREG_HIGH %eax %eax # eax <- v[BB+1]
4401 andl (rFP,%ecx,4), rIBASE # ex: addl (rFP,%ecx,4),rIBASE
4402 andl 4(rFP,%ecx,4), %eax # ex: adcl 4(rFP,%ecx,4),%eax
4403 SET_VREG rIBASE rINST # v[AA+0] <- rIBASE
4404 movl LOCAL0(%esp),rIBASE # restore rIBASE
4405 SET_VREG_HIGH %eax rINST # v[AA+1] <- eax
4406 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4407
4408
4409/* ------------------------------ */
4410 .balign 128
4411.L_op_or_long: /* 0xa1 */
4412/* File: x86/op_or_long.S */
4413/* File: x86/binopWide.S */
4414/*
4415 * Generic 64-bit binary operation.
4416 */
4417 /* binop vAA, vBB, vCC */
4418 movzbl 2(rPC),%eax # eax <- BB
4419 movzbl 3(rPC),%ecx # ecx <- CC
4420 movl rIBASE,LOCAL0(%esp) # save rIBASE
4421 GET_VREG rIBASE %eax # rIBASE <- v[BB+0]
4422 GET_VREG_HIGH %eax %eax # eax <- v[BB+1]
4423 orl (rFP,%ecx,4), rIBASE # ex: addl (rFP,%ecx,4),rIBASE
4424 orl 4(rFP,%ecx,4), %eax # ex: adcl 4(rFP,%ecx,4),%eax
4425 SET_VREG rIBASE rINST # v[AA+0] <- rIBASE
4426 movl LOCAL0(%esp),rIBASE # restore rIBASE
4427 SET_VREG_HIGH %eax rINST # v[AA+1] <- eax
4428 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4429
4430
4431/* ------------------------------ */
4432 .balign 128
4433.L_op_xor_long: /* 0xa2 */
4434/* File: x86/op_xor_long.S */
4435/* File: x86/binopWide.S */
4436/*
4437 * Generic 64-bit binary operation.
4438 */
4439 /* binop vAA, vBB, vCC */
4440 movzbl 2(rPC),%eax # eax <- BB
4441 movzbl 3(rPC),%ecx # ecx <- CC
4442 movl rIBASE,LOCAL0(%esp) # save rIBASE
4443 GET_VREG rIBASE %eax # rIBASE <- v[BB+0]
4444 GET_VREG_HIGH %eax %eax # eax <- v[BB+1]
4445 xorl (rFP,%ecx,4), rIBASE # ex: addl (rFP,%ecx,4),rIBASE
4446 xorl 4(rFP,%ecx,4), %eax # ex: adcl 4(rFP,%ecx,4),%eax
4447 SET_VREG rIBASE rINST # v[AA+0] <- rIBASE
4448 movl LOCAL0(%esp),rIBASE # restore rIBASE
4449 SET_VREG_HIGH %eax rINST # v[AA+1] <- eax
4450 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4451
4452
4453/* ------------------------------ */
4454 .balign 128
4455.L_op_shl_long: /* 0xa3 */
4456/* File: x86/op_shl_long.S */
4457/*
4458 * Long integer shift. This is different from the generic 32/64-bit
4459 * binary operations because vAA/vBB are 64-bit but vCC (the shift
4460 * distance) is 32-bit. Also, Dalvik requires us to mask off the low
4461 * 6 bits of the shift distance. x86 shifts automatically mask off
4462 * the low 5 bits of %cl, so have to handle the 64 > shiftcount > 31
4463 * case specially.
4464 */
4465 /* shl-long vAA, vBB, vCC */
4466 /* ecx gets shift count */
4467 /* Need to spill rINST */
4468 /* rINSTw gets AA */
4469 movzbl 2(rPC), %eax # eax <- BB
4470 movzbl 3(rPC), %ecx # ecx <- CC
4471 movl rIBASE, LOCAL0(%esp)
4472 GET_VREG_HIGH rIBASE %eax # ecx <- v[BB+1]
4473 GET_VREG %ecx %ecx # ecx <- vCC
4474 GET_VREG %eax %eax # eax <- v[BB+0]
4475 shldl %eax,rIBASE
4476 sall %cl, %eax
4477 testb $32, %cl
4478 je 2f
4479 movl %eax, rIBASE
4480 xorl %eax, %eax
44812:
4482 SET_VREG_HIGH rIBASE rINST # v[AA+1] <- rIBASE
4483 movl LOCAL0(%esp), rIBASE
4484 SET_VREG %eax rINST # v[AA+0] <- %eax
4485 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4486
4487/* ------------------------------ */
4488 .balign 128
4489.L_op_shr_long: /* 0xa4 */
4490/* File: x86/op_shr_long.S */
4491/*
4492 * Long integer shift. This is different from the generic 32/64-bit
4493 * binary operations because vAA/vBB are 64-bit but vCC (the shift
4494 * distance) is 32-bit. Also, Dalvik requires us to mask off the low
4495 * 6 bits of the shift distance. x86 shifts automatically mask off
4496 * the low 5 bits of %cl, so have to handle the 64 > shiftcount > 31
4497 * case specially.
4498 */
4499 /* shr-long vAA, vBB, vCC */
4500 /* ecx gets shift count */
4501 /* Need to spill rIBASE */
4502 /* rINSTw gets AA */
4503 movzbl 2(rPC), %eax # eax <- BB
4504 movzbl 3(rPC), %ecx # ecx <- CC
4505 movl rIBASE, LOCAL0(%esp)
4506 GET_VREG_HIGH rIBASE %eax # rIBASE<- v[BB+1]
4507 GET_VREG %ecx %ecx # ecx <- vCC
4508 GET_VREG %eax %eax # eax <- v[BB+0]
4509 shrdl rIBASE, %eax
4510 sarl %cl, rIBASE
4511 testb $32, %cl
4512 je 2f
4513 movl rIBASE, %eax
4514 sarl $31, rIBASE
45152:
4516 SET_VREG_HIGH rIBASE rINST # v[AA+1] <- rIBASE
4517 movl LOCAL0(%esp), rIBASE
4518 SET_VREG %eax rINST # v[AA+0] <- eax
4519 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4520
4521/* ------------------------------ */
4522 .balign 128
4523.L_op_ushr_long: /* 0xa5 */
4524/* File: x86/op_ushr_long.S */
4525/*
4526 * Long integer shift. This is different from the generic 32/64-bit
4527 * binary operations because vAA/vBB are 64-bit but vCC (the shift
4528 * distance) is 32-bit. Also, Dalvik requires us to mask off the low
4529 * 6 bits of the shift distance. x86 shifts automatically mask off
4530 * the low 5 bits of %cl, so have to handle the 64 > shiftcount > 31
4531 * case specially.
4532 */
4533 /* shr-long vAA, vBB, vCC */
4534 /* ecx gets shift count */
4535 /* Need to spill rIBASE */
4536 /* rINSTw gets AA */
4537 movzbl 2(rPC), %eax # eax <- BB
4538 movzbl 3(rPC), %ecx # ecx <- CC
4539 movl rIBASE, LOCAL0(%esp)
4540 GET_VREG_HIGH rIBASE %eax # rIBASE <- v[BB+1]
4541 GET_VREG %ecx %ecx # ecx <- vCC
4542 GET_VREG %eax %eax # eax <- v[BB+0]
4543 shrdl rIBASE, %eax
4544 shrl %cl, rIBASE
4545 testb $32, %cl
4546 je 2f
4547 movl rIBASE, %eax
4548 xorl rIBASE, rIBASE
45492:
4550 SET_VREG_HIGH rIBASE rINST # v[AA+1] <- rIBASE
4551 movl LOCAL0(%esp), rIBASE
4552 SET_VREG %eax rINST # v[BB+0] <- eax
4553 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4554
4555/* ------------------------------ */
4556 .balign 128
4557.L_op_add_float: /* 0xa6 */
4558/* File: x86/op_add_float.S */
4559/* File: x86/sseBinop.S */
4560 movzbl 2(rPC), %ecx # ecx <- BB
4561 movzbl 3(rPC), %eax # eax <- CC
4562 movss VREG_ADDRESS(%ecx), %xmm0 # %xmm0 <- 1st src
4563 addss VREG_ADDRESS(%eax), %xmm0
4564 movss %xmm0, VREG_ADDRESS(rINST) # vAA <- %xmm0
4565 pxor %xmm0, %xmm0
4566 movss %xmm0, VREG_REF_ADDRESS(rINST) # clear ref
4567 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4568
4569
4570/* ------------------------------ */
4571 .balign 128
4572.L_op_sub_float: /* 0xa7 */
4573/* File: x86/op_sub_float.S */
4574/* File: x86/sseBinop.S */
4575 movzbl 2(rPC), %ecx # ecx <- BB
4576 movzbl 3(rPC), %eax # eax <- CC
4577 movss VREG_ADDRESS(%ecx), %xmm0 # %xmm0 <- 1st src
4578 subss VREG_ADDRESS(%eax), %xmm0
4579 movss %xmm0, VREG_ADDRESS(rINST) # vAA <- %xmm0
4580 pxor %xmm0, %xmm0
4581 movss %xmm0, VREG_REF_ADDRESS(rINST) # clear ref
4582 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4583
4584
4585/* ------------------------------ */
4586 .balign 128
4587.L_op_mul_float: /* 0xa8 */
4588/* File: x86/op_mul_float.S */
4589/* File: x86/sseBinop.S */
4590 movzbl 2(rPC), %ecx # ecx <- BB
4591 movzbl 3(rPC), %eax # eax <- CC
4592 movss VREG_ADDRESS(%ecx), %xmm0 # %xmm0 <- 1st src
4593 mulss VREG_ADDRESS(%eax), %xmm0
4594 movss %xmm0, VREG_ADDRESS(rINST) # vAA <- %xmm0
4595 pxor %xmm0, %xmm0
4596 movss %xmm0, VREG_REF_ADDRESS(rINST) # clear ref
4597 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4598
4599
4600/* ------------------------------ */
4601 .balign 128
4602.L_op_div_float: /* 0xa9 */
4603/* File: x86/op_div_float.S */
4604/* File: x86/sseBinop.S */
4605 movzbl 2(rPC), %ecx # ecx <- BB
4606 movzbl 3(rPC), %eax # eax <- CC
4607 movss VREG_ADDRESS(%ecx), %xmm0 # %xmm0 <- 1st src
4608 divss VREG_ADDRESS(%eax), %xmm0
4609 movss %xmm0, VREG_ADDRESS(rINST) # vAA <- %xmm0
4610 pxor %xmm0, %xmm0
4611 movss %xmm0, VREG_REF_ADDRESS(rINST) # clear ref
4612 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4613
4614
4615/* ------------------------------ */
4616 .balign 128
4617.L_op_rem_float: /* 0xaa */
4618/* File: x86/op_rem_float.S */
4619 /* rem_float vAA, vBB, vCC */
4620 movzbl 3(rPC), %ecx # ecx <- BB
4621 movzbl 2(rPC), %eax # eax <- CC
4622 flds VREG_ADDRESS(%ecx) # vBB to fp stack
4623 flds VREG_ADDRESS(%eax) # vCC to fp stack
46241:
4625 fprem
4626 fstsw %ax
4627 sahf
4628 jp 1b
4629 fstp %st(1)
4630 fstps VREG_ADDRESS(rINST) # %st to vAA
4631 CLEAR_REF rINST
4632 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4633
4634/* ------------------------------ */
4635 .balign 128
4636.L_op_add_double: /* 0xab */
4637/* File: x86/op_add_double.S */
4638/* File: x86/sseBinop.S */
4639 movzbl 2(rPC), %ecx # ecx <- BB
4640 movzbl 3(rPC), %eax # eax <- CC
4641 movsd VREG_ADDRESS(%ecx), %xmm0 # %xmm0 <- 1st src
4642 addsd VREG_ADDRESS(%eax), %xmm0
4643 movsd %xmm0, VREG_ADDRESS(rINST) # vAA <- %xmm0
4644 pxor %xmm0, %xmm0
4645 movsd %xmm0, VREG_REF_ADDRESS(rINST) # clear ref
4646 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4647
4648
4649/* ------------------------------ */
4650 .balign 128
4651.L_op_sub_double: /* 0xac */
4652/* File: x86/op_sub_double.S */
4653/* File: x86/sseBinop.S */
4654 movzbl 2(rPC), %ecx # ecx <- BB
4655 movzbl 3(rPC), %eax # eax <- CC
4656 movsd VREG_ADDRESS(%ecx), %xmm0 # %xmm0 <- 1st src
4657 subsd VREG_ADDRESS(%eax), %xmm0
4658 movsd %xmm0, VREG_ADDRESS(rINST) # vAA <- %xmm0
4659 pxor %xmm0, %xmm0
4660 movsd %xmm0, VREG_REF_ADDRESS(rINST) # clear ref
4661 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4662
4663
4664/* ------------------------------ */
4665 .balign 128
4666.L_op_mul_double: /* 0xad */
4667/* File: x86/op_mul_double.S */
4668/* File: x86/sseBinop.S */
4669 movzbl 2(rPC), %ecx # ecx <- BB
4670 movzbl 3(rPC), %eax # eax <- CC
4671 movsd VREG_ADDRESS(%ecx), %xmm0 # %xmm0 <- 1st src
4672 mulsd VREG_ADDRESS(%eax), %xmm0
4673 movsd %xmm0, VREG_ADDRESS(rINST) # vAA <- %xmm0
4674 pxor %xmm0, %xmm0
4675 movsd %xmm0, VREG_REF_ADDRESS(rINST) # clear ref
4676 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4677
4678
4679/* ------------------------------ */
4680 .balign 128
4681.L_op_div_double: /* 0xae */
4682/* File: x86/op_div_double.S */
4683/* File: x86/sseBinop.S */
4684 movzbl 2(rPC), %ecx # ecx <- BB
4685 movzbl 3(rPC), %eax # eax <- CC
4686 movsd VREG_ADDRESS(%ecx), %xmm0 # %xmm0 <- 1st src
4687 divsd VREG_ADDRESS(%eax), %xmm0
4688 movsd %xmm0, VREG_ADDRESS(rINST) # vAA <- %xmm0
4689 pxor %xmm0, %xmm0
4690 movsd %xmm0, VREG_REF_ADDRESS(rINST) # clear ref
4691 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4692
4693
4694/* ------------------------------ */
4695 .balign 128
4696.L_op_rem_double: /* 0xaf */
4697/* File: x86/op_rem_double.S */
4698 /* rem_double vAA, vBB, vCC */
4699 movzbl 3(rPC), %ecx # ecx <- BB
4700 movzbl 2(rPC), %eax # eax <- CC
4701 fldl VREG_ADDRESS(%ecx) # %st1 <- fp[vBB]
4702 fldl VREG_ADDRESS(%eax) # %st0 <- fp[vCC]
47031:
4704 fprem
4705 fstsw %ax
4706 sahf
4707 jp 1b
4708 fstp %st(1)
4709 fstpl VREG_ADDRESS(rINST) # fp[vAA] <- %st
4710 CLEAR_WIDE_REF rINST
4711 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
4712
4713/* ------------------------------ */
4714 .balign 128
4715.L_op_add_int_2addr: /* 0xb0 */
4716/* File: x86/op_add_int_2addr.S */
4717/* File: x86/binop2addr.S */
4718/*
4719 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4720 * that specifies an instruction that performs "result = r0 op r1".
4721 * This could be an instruction or a function call.
4722 *
4723 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4724 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4725 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4726 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4727 */
4728 /* binop/2addr vA, vB */
4729 movzx rINSTbl, %ecx # ecx <- A+
4730 sarl $4, rINST # rINST <- B
4731 GET_VREG %eax rINST # eax <- vB
4732 andb $0xf, %cl # ecx <- A
4733 addl %eax, (rFP,%ecx,4) # for ex: addl %eax,(rFP,%ecx,4)
4734 CLEAR_REF %ecx
4735 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4736
4737
4738/* ------------------------------ */
4739 .balign 128
4740.L_op_sub_int_2addr: /* 0xb1 */
4741/* File: x86/op_sub_int_2addr.S */
4742/* File: x86/binop2addr.S */
4743/*
4744 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4745 * that specifies an instruction that performs "result = r0 op r1".
4746 * This could be an instruction or a function call.
4747 *
4748 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4749 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4750 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4751 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4752 */
4753 /* binop/2addr vA, vB */
4754 movzx rINSTbl, %ecx # ecx <- A+
4755 sarl $4, rINST # rINST <- B
4756 GET_VREG %eax rINST # eax <- vB
4757 andb $0xf, %cl # ecx <- A
4758 subl %eax, (rFP,%ecx,4) # for ex: addl %eax,(rFP,%ecx,4)
4759 CLEAR_REF %ecx
4760 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4761
4762
4763/* ------------------------------ */
4764 .balign 128
4765.L_op_mul_int_2addr: /* 0xb2 */
4766/* File: x86/op_mul_int_2addr.S */
4767 /* mul vA, vB */
4768 movzx rINSTbl, %ecx # ecx <- A+
4769 sarl $4, rINST # rINST <- B
4770 GET_VREG %eax rINST # eax <- vB
4771 andb $0xf, %cl # ecx <- A
4772 mov rIBASE, LOCAL0(%esp)
4773 imull (rFP,%ecx,4), %eax # trashes rIBASE/edx
4774 mov LOCAL0(%esp), rIBASE
4775 SET_VREG %eax %ecx
4776 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4777
4778/* ------------------------------ */
4779 .balign 128
4780.L_op_div_int_2addr: /* 0xb3 */
4781/* File: x86/op_div_int_2addr.S */
4782/* File: x86/bindiv2addr.S */
4783/*
4784 * 32-bit binary div/rem operation. Handles special case of op0=minint and
4785 * op1=-1.
4786 */
4787 /* div/rem/2addr vA, vB */
4788 movzx rINSTbl, %ecx # eax <- BA
4789 mov rIBASE, LOCAL0(%esp)
4790 sarl $4, %ecx # ecx <- B
4791 GET_VREG %ecx %ecx # eax <- vBB
4792 andb $0xf, rINSTbl # rINST <- A
4793 GET_VREG %eax rINST # eax <- vBB
4794 testl %ecx, %ecx
4795 je common_errDivideByZero
4796 cmpl $-1, %ecx
4797 jne .Lop_div_int_2addr_continue_div2addr
4798 cmpl $0x80000000, %eax
4799 jne .Lop_div_int_2addr_continue_div2addr
4800 movl $0x80000000, %eax
4801 SET_VREG %eax rINST
4802 mov LOCAL0(%esp), rIBASE
4803 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4804
4805.Lop_div_int_2addr_continue_div2addr:
4806 cltd
4807 idivl %ecx
4808 SET_VREG %eax rINST
4809 mov LOCAL0(%esp), rIBASE
4810 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4811
4812
4813/* ------------------------------ */
4814 .balign 128
4815.L_op_rem_int_2addr: /* 0xb4 */
4816/* File: x86/op_rem_int_2addr.S */
4817/* File: x86/bindiv2addr.S */
4818/*
4819 * 32-bit binary div/rem operation. Handles special case of op0=minint and
4820 * op1=-1.
4821 */
4822 /* div/rem/2addr vA, vB */
4823 movzx rINSTbl, %ecx # eax <- BA
4824 mov rIBASE, LOCAL0(%esp)
4825 sarl $4, %ecx # ecx <- B
4826 GET_VREG %ecx %ecx # eax <- vBB
4827 andb $0xf, rINSTbl # rINST <- A
4828 GET_VREG %eax rINST # eax <- vBB
4829 testl %ecx, %ecx
4830 je common_errDivideByZero
4831 cmpl $-1, %ecx
4832 jne .Lop_rem_int_2addr_continue_div2addr
4833 cmpl $0x80000000, %eax
4834 jne .Lop_rem_int_2addr_continue_div2addr
4835 movl $0, rIBASE
4836 SET_VREG rIBASE rINST
4837 mov LOCAL0(%esp), rIBASE
4838 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4839
4840.Lop_rem_int_2addr_continue_div2addr:
4841 cltd
4842 idivl %ecx
4843 SET_VREG rIBASE rINST
4844 mov LOCAL0(%esp), rIBASE
4845 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4846
4847
4848/* ------------------------------ */
4849 .balign 128
4850.L_op_and_int_2addr: /* 0xb5 */
4851/* File: x86/op_and_int_2addr.S */
4852/* File: x86/binop2addr.S */
4853/*
4854 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4855 * that specifies an instruction that performs "result = r0 op r1".
4856 * This could be an instruction or a function call.
4857 *
4858 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4859 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4860 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4861 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4862 */
4863 /* binop/2addr vA, vB */
4864 movzx rINSTbl, %ecx # ecx <- A+
4865 sarl $4, rINST # rINST <- B
4866 GET_VREG %eax rINST # eax <- vB
4867 andb $0xf, %cl # ecx <- A
4868 andl %eax, (rFP,%ecx,4) # for ex: addl %eax,(rFP,%ecx,4)
4869 CLEAR_REF %ecx
4870 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4871
4872
4873/* ------------------------------ */
4874 .balign 128
4875.L_op_or_int_2addr: /* 0xb6 */
4876/* File: x86/op_or_int_2addr.S */
4877/* File: x86/binop2addr.S */
4878/*
4879 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4880 * that specifies an instruction that performs "result = r0 op r1".
4881 * This could be an instruction or a function call.
4882 *
4883 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4884 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4885 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4886 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4887 */
4888 /* binop/2addr vA, vB */
4889 movzx rINSTbl, %ecx # ecx <- A+
4890 sarl $4, rINST # rINST <- B
4891 GET_VREG %eax rINST # eax <- vB
4892 andb $0xf, %cl # ecx <- A
4893 orl %eax, (rFP,%ecx,4) # for ex: addl %eax,(rFP,%ecx,4)
4894 CLEAR_REF %ecx
4895 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4896
4897
4898/* ------------------------------ */
4899 .balign 128
4900.L_op_xor_int_2addr: /* 0xb7 */
4901/* File: x86/op_xor_int_2addr.S */
4902/* File: x86/binop2addr.S */
4903/*
4904 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4905 * that specifies an instruction that performs "result = r0 op r1".
4906 * This could be an instruction or a function call.
4907 *
4908 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4909 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4910 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4911 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4912 */
4913 /* binop/2addr vA, vB */
4914 movzx rINSTbl, %ecx # ecx <- A+
4915 sarl $4, rINST # rINST <- B
4916 GET_VREG %eax rINST # eax <- vB
4917 andb $0xf, %cl # ecx <- A
4918 xorl %eax, (rFP,%ecx,4) # for ex: addl %eax,(rFP,%ecx,4)
4919 CLEAR_REF %ecx
4920 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4921
4922
4923/* ------------------------------ */
4924 .balign 128
4925.L_op_shl_int_2addr: /* 0xb8 */
4926/* File: x86/op_shl_int_2addr.S */
4927/* File: x86/shop2addr.S */
4928/*
4929 * Generic 32-bit "shift/2addr" operation.
4930 */
4931 /* shift/2addr vA, vB */
4932 movzx rINSTbl, %ecx # eax <- BA
4933 sarl $4, %ecx # ecx <- B
4934 GET_VREG %ecx %ecx # eax <- vBB
4935 andb $0xf, rINSTbl # rINST <- A
4936 GET_VREG %eax rINST # eax <- vAA
4937 sall %cl, %eax # ex: sarl %cl, %eax
4938 SET_VREG %eax rINST
4939 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4940
4941
4942/* ------------------------------ */
4943 .balign 128
4944.L_op_shr_int_2addr: /* 0xb9 */
4945/* File: x86/op_shr_int_2addr.S */
4946/* File: x86/shop2addr.S */
4947/*
4948 * Generic 32-bit "shift/2addr" operation.
4949 */
4950 /* shift/2addr vA, vB */
4951 movzx rINSTbl, %ecx # eax <- BA
4952 sarl $4, %ecx # ecx <- B
4953 GET_VREG %ecx %ecx # eax <- vBB
4954 andb $0xf, rINSTbl # rINST <- A
4955 GET_VREG %eax rINST # eax <- vAA
4956 sarl %cl, %eax # ex: sarl %cl, %eax
4957 SET_VREG %eax rINST
4958 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4959
4960
4961/* ------------------------------ */
4962 .balign 128
4963.L_op_ushr_int_2addr: /* 0xba */
4964/* File: x86/op_ushr_int_2addr.S */
4965/* File: x86/shop2addr.S */
4966/*
4967 * Generic 32-bit "shift/2addr" operation.
4968 */
4969 /* shift/2addr vA, vB */
4970 movzx rINSTbl, %ecx # eax <- BA
4971 sarl $4, %ecx # ecx <- B
4972 GET_VREG %ecx %ecx # eax <- vBB
4973 andb $0xf, rINSTbl # rINST <- A
4974 GET_VREG %eax rINST # eax <- vAA
4975 shrl %cl, %eax # ex: sarl %cl, %eax
4976 SET_VREG %eax rINST
4977 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4978
4979
4980/* ------------------------------ */
4981 .balign 128
4982.L_op_add_long_2addr: /* 0xbb */
4983/* File: x86/op_add_long_2addr.S */
4984/* File: x86/binopWide2addr.S */
4985/*
4986 * Generic 64-bit binary operation.
4987 */
4988 /* binop/2addr vA, vB */
4989 movzbl rINSTbl,%ecx # ecx<- BA
4990 sarl $4,%ecx # ecx<- B
4991 GET_VREG %eax %ecx # eax<- v[B+0]
4992 GET_VREG_HIGH %ecx %ecx # eax<- v[B+1]
4993 andb $0xF,rINSTbl # rINST<- A
4994 addl %eax, (rFP,rINST,4) # ex: addl %eax,(rFP,rINST,4)
4995 adcl %ecx, 4(rFP,rINST,4) # ex: adcl %ecx,4(rFP,rINST,4)
4996 CLEAR_WIDE_REF rINST
4997 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
4998
4999
5000/* ------------------------------ */
5001 .balign 128
5002.L_op_sub_long_2addr: /* 0xbc */
5003/* File: x86/op_sub_long_2addr.S */
5004/* File: x86/binopWide2addr.S */
5005/*
5006 * Generic 64-bit binary operation.
5007 */
5008 /* binop/2addr vA, vB */
5009 movzbl rINSTbl,%ecx # ecx<- BA
5010 sarl $4,%ecx # ecx<- B
5011 GET_VREG %eax %ecx # eax<- v[B+0]
5012 GET_VREG_HIGH %ecx %ecx # eax<- v[B+1]
5013 andb $0xF,rINSTbl # rINST<- A
5014 subl %eax, (rFP,rINST,4) # ex: addl %eax,(rFP,rINST,4)
5015 sbbl %ecx, 4(rFP,rINST,4) # ex: adcl %ecx,4(rFP,rINST,4)
5016 CLEAR_WIDE_REF rINST
5017 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
5018
5019
5020/* ------------------------------ */
5021 .balign 128
5022.L_op_mul_long_2addr: /* 0xbd */
5023/* File: x86/op_mul_long_2addr.S */
5024/*
5025 * Signed 64-bit integer multiply, 2-addr version
5026 *
5027 * We could definately use more free registers for
5028 * this code. We must spill %edx (rIBASE) because it
5029 * is used by imul. We'll also spill rINST (ebx),
5030 * giving us eax, ebc, ecx and rIBASE as computational
5031 * temps. On top of that, we'll spill %esi (edi)
5032 * for use as the vA pointer and rFP (esi) for use
5033 * as the vB pointer. Yuck.
5034 */
5035 /* mul-long/2addr vA, vB */
5036 movzbl rINSTbl, %eax # eax <- BA
5037 andb $0xf, %al # eax <- A
5038 CLEAR_WIDE_REF %eax # clear refs in advance
5039 sarl $4, rINST # rINST <- B
5040 mov rPC, LOCAL0(%esp) # save Interpreter PC
5041 mov rFP, LOCAL1(%esp) # save FP
5042 mov rIBASE, LOCAL2(%esp) # save rIBASE
5043 leal (rFP,%eax,4), %esi # esi <- &v[A]
5044 leal (rFP,rINST,4), rFP # rFP <- &v[B]
5045 movl 4(%esi), %ecx # ecx <- Amsw
5046 imull (rFP), %ecx # ecx <- (Amsw*Blsw)
5047 movl 4(rFP), %eax # eax <- Bmsw
5048 imull (%esi), %eax # eax <- (Bmsw*Alsw)
5049 addl %eax, %ecx # ecx <- (Amsw*Blsw)+(Bmsw*Alsw)
5050 movl (rFP), %eax # eax <- Blsw
5051 mull (%esi) # eax <- (Blsw*Alsw)
5052 leal (%ecx,rIBASE), rIBASE # full result now in %edx:%eax
5053 movl rIBASE, 4(%esi) # v[A+1] <- rIBASE
5054 movl %eax, (%esi) # v[A] <- %eax
5055 mov LOCAL0(%esp), rPC # restore Interpreter PC
5056 mov LOCAL2(%esp), rIBASE # restore IBASE
5057 mov LOCAL1(%esp), rFP # restore FP
5058 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
5059
5060/* ------------------------------ */
5061 .balign 128
5062.L_op_div_long_2addr: /* 0xbe */
5063/* File: x86/op_div_long_2addr.S */
5064/* art_quick_* methods has quick abi,
5065 * so use eax, ecx, edx, ebx for args
5066 */
5067 /* div/2addr vA, vB */
5068 .extern art_quick_ldiv
5069 mov rIBASE, LOCAL0(%esp) # save rIBASE/%edx
5070 movzbl rINSTbl, %eax
5071 shrl $4, %eax # eax <- B
5072 andb $0xf, rINSTbl # rINST <- A
5073 mov rINST, LOCAL1(%esp) # save rINST/%ebx
5074 movl %ebx, %ecx
5075 GET_VREG %edx %eax
5076 GET_VREG_HIGH %ebx %eax
5077 movl %edx, %eax
5078 orl %ebx, %eax
5079 jz common_errDivideByZero
5080 GET_VREG %eax %ecx
5081 GET_VREG_HIGH %ecx %ecx
5082 call art_quick_ldiv
5083 mov LOCAL1(%esp), rINST # restore rINST/%ebx
5084 SET_VREG_HIGH rIBASE rINST
5085 SET_VREG %eax rINST
5086 mov LOCAL0(%esp), rIBASE # restore rIBASE/%edx
5087 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
5088
5089/* ------------------------------ */
5090 .balign 128
5091.L_op_rem_long_2addr: /* 0xbf */
5092/* File: x86/op_rem_long_2addr.S */
5093/* File: x86/op_div_long_2addr.S */
5094/* art_quick_* methods has quick abi,
5095 * so use eax, ecx, edx, ebx for args
5096 */
5097 /* div/2addr vA, vB */
5098 .extern art_quick_lmod
5099 mov rIBASE, LOCAL0(%esp) # save rIBASE/%edx
5100 movzbl rINSTbl, %eax
5101 shrl $4, %eax # eax <- B
5102 andb $0xf, rINSTbl # rINST <- A
5103 mov rINST, LOCAL1(%esp) # save rINST/%ebx
5104 movl %ebx, %ecx
5105 GET_VREG %edx %eax
5106 GET_VREG_HIGH %ebx %eax
5107 movl %edx, %eax
5108 orl %ebx, %eax
5109 jz common_errDivideByZero
5110 GET_VREG %eax %ecx
5111 GET_VREG_HIGH %ecx %ecx
5112 call art_quick_lmod
5113 mov LOCAL1(%esp), rINST # restore rINST/%ebx
5114 SET_VREG_HIGH rIBASE rINST
5115 SET_VREG %eax rINST
5116 mov LOCAL0(%esp), rIBASE # restore rIBASE/%edx
5117 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
5118
5119
5120/* ------------------------------ */
5121 .balign 128
5122.L_op_and_long_2addr: /* 0xc0 */
5123/* File: x86/op_and_long_2addr.S */
5124/* File: x86/binopWide2addr.S */
5125/*
5126 * Generic 64-bit binary operation.
5127 */
5128 /* binop/2addr vA, vB */
5129 movzbl rINSTbl,%ecx # ecx<- BA
5130 sarl $4,%ecx # ecx<- B
5131 GET_VREG %eax %ecx # eax<- v[B+0]
5132 GET_VREG_HIGH %ecx %ecx # eax<- v[B+1]
5133 andb $0xF,rINSTbl # rINST<- A
5134 andl %eax, (rFP,rINST,4) # ex: addl %eax,(rFP,rINST,4)
5135 andl %ecx, 4(rFP,rINST,4) # ex: adcl %ecx,4(rFP,rINST,4)
5136 CLEAR_WIDE_REF rINST
5137 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
5138
5139
5140/* ------------------------------ */
5141 .balign 128
5142.L_op_or_long_2addr: /* 0xc1 */
5143/* File: x86/op_or_long_2addr.S */
5144/* File: x86/binopWide2addr.S */
5145/*
5146 * Generic 64-bit binary operation.
5147 */
5148 /* binop/2addr vA, vB */
5149 movzbl rINSTbl,%ecx # ecx<- BA
5150 sarl $4,%ecx # ecx<- B
5151 GET_VREG %eax %ecx # eax<- v[B+0]
5152 GET_VREG_HIGH %ecx %ecx # eax<- v[B+1]
5153 andb $0xF,rINSTbl # rINST<- A
5154 orl %eax, (rFP,rINST,4) # ex: addl %eax,(rFP,rINST,4)
5155 orl %ecx, 4(rFP,rINST,4) # ex: adcl %ecx,4(rFP,rINST,4)
5156 CLEAR_WIDE_REF rINST
5157 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
5158
5159
5160/* ------------------------------ */
5161 .balign 128
5162.L_op_xor_long_2addr: /* 0xc2 */
5163/* File: x86/op_xor_long_2addr.S */
5164/* File: x86/binopWide2addr.S */
5165/*
5166 * Generic 64-bit binary operation.
5167 */
5168 /* binop/2addr vA, vB */
5169 movzbl rINSTbl,%ecx # ecx<- BA
5170 sarl $4,%ecx # ecx<- B
5171 GET_VREG %eax %ecx # eax<- v[B+0]
5172 GET_VREG_HIGH %ecx %ecx # eax<- v[B+1]
5173 andb $0xF,rINSTbl # rINST<- A
5174 xorl %eax, (rFP,rINST,4) # ex: addl %eax,(rFP,rINST,4)
5175 xorl %ecx, 4(rFP,rINST,4) # ex: adcl %ecx,4(rFP,rINST,4)
5176 CLEAR_WIDE_REF rINST
5177 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
5178
5179
5180/* ------------------------------ */
5181 .balign 128
5182.L_op_shl_long_2addr: /* 0xc3 */
5183/* File: x86/op_shl_long_2addr.S */
5184/*
5185 * Long integer shift, 2addr version. vA is 64-bit value/result, vB is
5186 * 32-bit shift distance.
5187 */
5188 /* shl-long/2addr vA, vB */
5189 /* ecx gets shift count */
5190 /* Need to spill rIBASE */
5191 /* rINSTw gets AA */
5192 movzbl rINSTbl, %ecx # ecx <- BA
5193 andb $0xf, rINSTbl # rINST <- A
5194 GET_VREG %eax rINST # eax <- v[AA+0]
5195 sarl $4, %ecx # ecx <- B
5196 movl rIBASE, LOCAL0(%esp)
5197 GET_VREG_HIGH rIBASE rINST # rIBASE <- v[AA+1]
5198 GET_VREG %ecx %ecx # ecx <- vBB
5199 shldl %eax, rIBASE
5200 sall %cl, %eax
5201 testb $32, %cl
5202 je 2f
5203 movl %eax, rIBASE
5204 xorl %eax, %eax
52052:
5206 SET_VREG_HIGH rIBASE rINST # v[AA+1] <- rIBASE
5207 movl LOCAL0(%esp), rIBASE
5208 SET_VREG %eax rINST # v[AA+0] <- eax
5209 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
5210
5211/* ------------------------------ */
5212 .balign 128
5213.L_op_shr_long_2addr: /* 0xc4 */
5214/* File: x86/op_shr_long_2addr.S */
5215/*
5216 * Long integer shift, 2addr version. vA is 64-bit value/result, vB is
5217 * 32-bit shift distance.
5218 */
5219 /* shl-long/2addr vA, vB */
5220 /* ecx gets shift count */
5221 /* Need to spill rIBASE */
5222 /* rINSTw gets AA */
5223 movzbl rINSTbl, %ecx # ecx <- BA
5224 andb $0xf, rINSTbl # rINST <- A
5225 GET_VREG %eax rINST # eax <- v[AA+0]
5226 sarl $4, %ecx # ecx <- B
5227 movl rIBASE, LOCAL0(%esp)
5228 GET_VREG_HIGH rIBASE rINST # rIBASE <- v[AA+1]
5229 GET_VREG %ecx %ecx # ecx <- vBB
5230 shrdl rIBASE, %eax
5231 sarl %cl, rIBASE
5232 testb $32, %cl
5233 je 2f
5234 movl rIBASE, %eax
5235 sarl $31, rIBASE
52362:
5237 SET_VREG_HIGH rIBASE rINST # v[AA+1] <- rIBASE
5238 movl LOCAL0(%esp), rIBASE
5239 SET_VREG %eax rINST # v[AA+0] <- eax
5240 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
5241
5242/* ------------------------------ */
5243 .balign 128
5244.L_op_ushr_long_2addr: /* 0xc5 */
5245/* File: x86/op_ushr_long_2addr.S */
5246/*
5247 * Long integer shift, 2addr version. vA is 64-bit value/result, vB is
5248 * 32-bit shift distance.
5249 */
5250 /* shl-long/2addr vA, vB */
5251 /* ecx gets shift count */
5252 /* Need to spill rIBASE */
5253 /* rINSTw gets AA */
5254 movzbl rINSTbl, %ecx # ecx <- BA
5255 andb $0xf, rINSTbl # rINST <- A
5256 GET_VREG %eax rINST # eax <- v[AA+0]
5257 sarl $4, %ecx # ecx <- B
5258 movl rIBASE, LOCAL0(%esp)
5259 GET_VREG_HIGH rIBASE rINST # rIBASE <- v[AA+1]
5260 GET_VREG %ecx %ecx # ecx <- vBB
5261 shrdl rIBASE, %eax
5262 shrl %cl, rIBASE
5263 testb $32, %cl
5264 je 2f
5265 movl rIBASE, %eax
5266 xorl rIBASE, rIBASE
52672:
5268 SET_VREG_HIGH rIBASE rINST # v[AA+1] <- rIBASE
5269 movl LOCAL0(%esp), rIBASE
5270 SET_VREG %eax rINST # v[AA+0] <- eax
5271 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
5272
5273/* ------------------------------ */
5274 .balign 128
5275.L_op_add_float_2addr: /* 0xc6 */
5276/* File: x86/op_add_float_2addr.S */
5277/* File: x86/sseBinop2Addr.S */
5278 movzx rINSTbl, %ecx # ecx <- A+
5279 andl $0xf, %ecx # ecx <- A
5280 movss VREG_ADDRESS(%ecx), %xmm0 # %xmm0 <- 1st src
5281 sarl $4, rINST # rINST<- B
5282 addss VREG_ADDRESS(rINST), %xmm0
5283 movss %xmm0, VREG_ADDRESS(%ecx) # vAA<- %xmm0
5284 pxor %xmm0, %xmm0
5285 movss %xmm0, VREG_REF_ADDRESS(rINST) # clear ref
5286 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
5287
5288
5289/* ------------------------------ */
5290 .balign 128
5291.L_op_sub_float_2addr: /* 0xc7 */
5292/* File: x86/op_sub_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 subss 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_mul_float_2addr: /* 0xc8 */
5308/* File: x86/op_mul_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 mulss 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_div_float_2addr: /* 0xc9 */
5324/* File: x86/op_div_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 divss 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_rem_float_2addr: /* 0xca */
5340/* File: x86/op_rem_float_2addr.S */
5341 /* rem_float/2addr vA, vB */
5342 movzx rINSTbl, %ecx # ecx <- A+
5343 sarl $4, rINST # rINST <- B
5344 flds VREG_ADDRESS(rINST) # vB to fp stack
5345 andb $0xf, %cl # ecx <- A
5346 flds VREG_ADDRESS(%ecx) # vA to fp stack
53471:
5348 fprem
5349 fstsw %ax
5350 sahf
5351 jp 1b
5352 fstp %st(1)
5353 fstps VREG_ADDRESS(%ecx) # %st to vA
5354 CLEAR_REF %ecx
5355 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
5356
5357/* ------------------------------ */
5358 .balign 128
5359.L_op_add_double_2addr: /* 0xcb */
5360/* File: x86/op_add_double_2addr.S */
5361/* File: x86/sseBinop2Addr.S */
5362 movzx rINSTbl, %ecx # ecx <- A+
5363 andl $0xf, %ecx # ecx <- A
5364 movsd VREG_ADDRESS(%ecx), %xmm0 # %xmm0 <- 1st src
5365 sarl $4, rINST # rINST<- B
5366 addsd VREG_ADDRESS(rINST), %xmm0
5367 movsd %xmm0, VREG_ADDRESS(%ecx) # vAA<- %xmm0
5368 pxor %xmm0, %xmm0
5369 movsd %xmm0, VREG_REF_ADDRESS(rINST) # clear ref
5370 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
5371
5372
5373/* ------------------------------ */
5374 .balign 128
5375.L_op_sub_double_2addr: /* 0xcc */
5376/* File: x86/op_sub_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 subsd 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_mul_double_2addr: /* 0xcd */
5392/* File: x86/op_mul_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 mulsd 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_div_double_2addr: /* 0xce */
5408/* File: x86/op_div_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 divsd 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_rem_double_2addr: /* 0xcf */
5424/* File: x86/op_rem_double_2addr.S */
5425 /* rem_double/2addr vA, vB */
5426 movzx rINSTbl, %ecx # ecx <- A+
5427 sarl $4, rINST # rINST <- B
5428 fldl VREG_ADDRESS(rINST) # vB to fp stack
5429 andb $0xf, %cl # ecx <- A
5430 fldl VREG_ADDRESS(%ecx) # vA to fp stack
54311:
5432 fprem
5433 fstsw %ax
5434 sahf
5435 jp 1b
5436 fstp %st(1)
5437 fstpl VREG_ADDRESS(%ecx) # %st to vA
5438 CLEAR_WIDE_REF %ecx
5439 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
5440
5441/* ------------------------------ */
5442 .balign 128
5443.L_op_add_int_lit16: /* 0xd0 */
5444/* File: x86/op_add_int_lit16.S */
5445/* File: x86/binopLit16.S */
5446/*
5447 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5448 * that specifies an instruction that performs "result = eax op ecx".
5449 * This could be an x86 instruction or a function call. (If the result
5450 * comes back in a register other than eax, you can override "result".)
5451 *
5452 * For: add-int/lit16, rsub-int,
5453 * and-int/lit16, or-int/lit16, xor-int/lit16
5454 */
5455 /* binop/lit16 vA, vB, #+CCCC */
5456 movzbl rINSTbl, %eax # eax <- 000000BA
5457 sarl $4, %eax # eax <- B
5458 GET_VREG %eax %eax # eax <- vB
5459 movswl 2(rPC), %ecx # ecx <- ssssCCCC
5460 andb $0xf, rINSTbl # rINST <- A
5461 addl %ecx, %eax # for example: addl %ecx, %eax
5462 SET_VREG %eax rINST
5463 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5464
5465
5466/* ------------------------------ */
5467 .balign 128
5468.L_op_rsub_int: /* 0xd1 */
5469/* File: x86/op_rsub_int.S */
5470/* this op is "rsub-int", but can be thought of as "rsub-int/lit16" */
5471/* File: x86/binopLit16.S */
5472/*
5473 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5474 * that specifies an instruction that performs "result = eax op ecx".
5475 * This could be an x86 instruction or a function call. (If the result
5476 * comes back in a register other than eax, you can override "result".)
5477 *
5478 * For: add-int/lit16, rsub-int,
5479 * and-int/lit16, or-int/lit16, xor-int/lit16
5480 */
5481 /* binop/lit16 vA, vB, #+CCCC */
5482 movzbl rINSTbl, %eax # eax <- 000000BA
5483 sarl $4, %eax # eax <- B
5484 GET_VREG %eax %eax # eax <- vB
5485 movswl 2(rPC), %ecx # ecx <- ssssCCCC
5486 andb $0xf, rINSTbl # rINST <- A
5487 subl %eax, %ecx # for example: addl %ecx, %eax
5488 SET_VREG %ecx rINST
5489 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5490
5491
5492/* ------------------------------ */
5493 .balign 128
5494.L_op_mul_int_lit16: /* 0xd2 */
5495/* File: x86/op_mul_int_lit16.S */
5496 /* mul/lit16 vA, vB, #+CCCC */
5497 /* Need A in rINST, ssssCCCC in ecx, vB in eax */
5498 movzbl rINSTbl, %eax # eax <- 000000BA
5499 sarl $4, %eax # eax <- B
5500 GET_VREG %eax %eax # eax <- vB
5501 movswl 2(rPC), %ecx # ecx <- ssssCCCC
5502 andb $0xf, rINSTbl # rINST <- A
5503 mov rIBASE, LOCAL0(%esp)
5504 imull %ecx, %eax # trashes rIBASE/edx
5505 mov LOCAL0(%esp), rIBASE
5506 SET_VREG %eax rINST
5507 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5508
5509/* ------------------------------ */
5510 .balign 128
5511.L_op_div_int_lit16: /* 0xd3 */
5512/* File: x86/op_div_int_lit16.S */
5513/* File: x86/bindivLit16.S */
5514/*
5515 * 32-bit binary div/rem operation. Handles special case of op0=minint and
5516 * op1=-1.
5517 */
5518 /* div/rem/lit16 vA, vB, #+CCCC */
5519 /* Need A in rINST, ssssCCCC in ecx, vB in eax */
5520 movzbl rINSTbl, %eax # eax <- 000000BA
5521 sarl $4, %eax # eax <- B
5522 GET_VREG %eax %eax # eax <- vB
5523 movswl 2(rPC), %ecx # ecx <- ssssCCCC
5524 andb $0xf, rINSTbl # rINST <- A
5525 testl %ecx, %ecx
5526 je common_errDivideByZero
5527 cmpl $-1, %ecx
5528 jne .Lop_div_int_lit16_continue_div
5529 cmpl $0x80000000, %eax
5530 jne .Lop_div_int_lit16_continue_div
5531 movl $0x80000000, %eax
5532 SET_VREG %eax rINST
5533 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5534
5535.Lop_div_int_lit16_continue_div:
5536 mov rIBASE, LOCAL0(%esp)
5537 cltd
5538 idivl %ecx
5539 SET_VREG %eax rINST
5540 mov LOCAL0(%esp), rIBASE
5541 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5542
5543
5544/* ------------------------------ */
5545 .balign 128
5546.L_op_rem_int_lit16: /* 0xd4 */
5547/* File: x86/op_rem_int_lit16.S */
5548/* File: x86/bindivLit16.S */
5549/*
5550 * 32-bit binary div/rem operation. Handles special case of op0=minint and
5551 * op1=-1.
5552 */
5553 /* div/rem/lit16 vA, vB, #+CCCC */
5554 /* Need A in rINST, ssssCCCC in ecx, vB in eax */
5555 movzbl rINSTbl, %eax # eax <- 000000BA
5556 sarl $4, %eax # eax <- B
5557 GET_VREG %eax %eax # eax <- vB
5558 movswl 2(rPC), %ecx # ecx <- ssssCCCC
5559 andb $0xf, rINSTbl # rINST <- A
5560 testl %ecx, %ecx
5561 je common_errDivideByZero
5562 cmpl $-1, %ecx
5563 jne .Lop_rem_int_lit16_continue_div
5564 cmpl $0x80000000, %eax
5565 jne .Lop_rem_int_lit16_continue_div
5566 movl $0, %eax
5567 SET_VREG %eax rINST
5568 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5569
5570.Lop_rem_int_lit16_continue_div:
5571 mov rIBASE, LOCAL0(%esp)
5572 cltd
5573 idivl %ecx
5574 SET_VREG rIBASE rINST
5575 mov LOCAL0(%esp), rIBASE
5576 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5577
5578
5579/* ------------------------------ */
5580 .balign 128
5581.L_op_and_int_lit16: /* 0xd5 */
5582/* File: x86/op_and_int_lit16.S */
5583/* File: x86/binopLit16.S */
5584/*
5585 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5586 * that specifies an instruction that performs "result = eax op ecx".
5587 * This could be an x86 instruction or a function call. (If the result
5588 * comes back in a register other than eax, you can override "result".)
5589 *
5590 * For: add-int/lit16, rsub-int,
5591 * and-int/lit16, or-int/lit16, xor-int/lit16
5592 */
5593 /* binop/lit16 vA, vB, #+CCCC */
5594 movzbl rINSTbl, %eax # eax <- 000000BA
5595 sarl $4, %eax # eax <- B
5596 GET_VREG %eax %eax # eax <- vB
5597 movswl 2(rPC), %ecx # ecx <- ssssCCCC
5598 andb $0xf, rINSTbl # rINST <- A
5599 andl %ecx, %eax # for example: addl %ecx, %eax
5600 SET_VREG %eax rINST
5601 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5602
5603
5604/* ------------------------------ */
5605 .balign 128
5606.L_op_or_int_lit16: /* 0xd6 */
5607/* File: x86/op_or_int_lit16.S */
5608/* File: x86/binopLit16.S */
5609/*
5610 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5611 * that specifies an instruction that performs "result = eax op ecx".
5612 * This could be an x86 instruction or a function call. (If the result
5613 * comes back in a register other than eax, you can override "result".)
5614 *
5615 * For: add-int/lit16, rsub-int,
5616 * and-int/lit16, or-int/lit16, xor-int/lit16
5617 */
5618 /* binop/lit16 vA, vB, #+CCCC */
5619 movzbl rINSTbl, %eax # eax <- 000000BA
5620 sarl $4, %eax # eax <- B
5621 GET_VREG %eax %eax # eax <- vB
5622 movswl 2(rPC), %ecx # ecx <- ssssCCCC
5623 andb $0xf, rINSTbl # rINST <- A
5624 orl %ecx, %eax # for example: addl %ecx, %eax
5625 SET_VREG %eax rINST
5626 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5627
5628
5629/* ------------------------------ */
5630 .balign 128
5631.L_op_xor_int_lit16: /* 0xd7 */
5632/* File: x86/op_xor_int_lit16.S */
5633/* File: x86/binopLit16.S */
5634/*
5635 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5636 * that specifies an instruction that performs "result = eax op ecx".
5637 * This could be an x86 instruction or a function call. (If the result
5638 * comes back in a register other than eax, you can override "result".)
5639 *
5640 * For: add-int/lit16, rsub-int,
5641 * and-int/lit16, or-int/lit16, xor-int/lit16
5642 */
5643 /* binop/lit16 vA, vB, #+CCCC */
5644 movzbl rINSTbl, %eax # eax <- 000000BA
5645 sarl $4, %eax # eax <- B
5646 GET_VREG %eax %eax # eax <- vB
5647 movswl 2(rPC), %ecx # ecx <- ssssCCCC
5648 andb $0xf, rINSTbl # rINST <- A
5649 xorl %ecx, %eax # for example: addl %ecx, %eax
5650 SET_VREG %eax rINST
5651 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5652
5653
5654/* ------------------------------ */
5655 .balign 128
5656.L_op_add_int_lit8: /* 0xd8 */
5657/* File: x86/op_add_int_lit8.S */
5658/* File: x86/binopLit8.S */
5659/*
5660 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
5661 * that specifies an instruction that performs "result = eax op ecx".
5662 * This could be an x86 instruction or a function call. (If the result
5663 * comes back in a register other than r0, you can override "result".)
5664 *
5665 * For: add-int/lit8, rsub-int/lit8
5666 * and-int/lit8, or-int/lit8, xor-int/lit8,
5667 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
5668 */
5669 /* binop/lit8 vAA, vBB, #+CC */
5670 movzbl 2(rPC), %eax # eax <- BB
5671 movsbl 3(rPC), %ecx # ecx <- ssssssCC
5672 GET_VREG %eax %eax # eax <- rBB
5673 addl %ecx, %eax # ex: addl %ecx,%eax
5674 SET_VREG %eax rINST
5675 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5676
5677
5678/* ------------------------------ */
5679 .balign 128
5680.L_op_rsub_int_lit8: /* 0xd9 */
5681/* File: x86/op_rsub_int_lit8.S */
5682/* File: x86/binopLit8.S */
5683/*
5684 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
5685 * that specifies an instruction that performs "result = eax op ecx".
5686 * This could be an x86 instruction or a function call. (If the result
5687 * comes back in a register other than r0, you can override "result".)
5688 *
5689 * For: add-int/lit8, rsub-int/lit8
5690 * and-int/lit8, or-int/lit8, xor-int/lit8,
5691 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
5692 */
5693 /* binop/lit8 vAA, vBB, #+CC */
5694 movzbl 2(rPC), %eax # eax <- BB
5695 movsbl 3(rPC), %ecx # ecx <- ssssssCC
5696 GET_VREG %eax %eax # eax <- rBB
5697 subl %eax, %ecx # ex: addl %ecx,%eax
5698 SET_VREG %ecx rINST
5699 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5700
5701
5702/* ------------------------------ */
5703 .balign 128
5704.L_op_mul_int_lit8: /* 0xda */
5705/* File: x86/op_mul_int_lit8.S */
5706 /* mul/lit8 vAA, vBB, #+CC */
5707 movzbl 2(rPC), %eax # eax <- BB
5708 movsbl 3(rPC), %ecx # ecx <- ssssssCC
5709 GET_VREG %eax %eax # eax <- rBB
5710 mov rIBASE, LOCAL0(%esp)
5711 imull %ecx, %eax # trashes rIBASE/edx
5712 mov LOCAL0(%esp), rIBASE
5713 SET_VREG %eax rINST
5714 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5715
5716/* ------------------------------ */
5717 .balign 128
5718.L_op_div_int_lit8: /* 0xdb */
5719/* File: x86/op_div_int_lit8.S */
5720/* File: x86/bindivLit8.S */
5721/*
5722 * 32-bit div/rem "lit8" binary operation. Handles special case of
5723 * op0=minint & op1=-1
5724 */
5725 /* div/rem/lit8 vAA, vBB, #+CC */
5726 movzbl 2(rPC), %eax # eax <- BB
5727 movsbl 3(rPC), %ecx # ecx <- ssssssCC
5728 GET_VREG %eax %eax # eax <- rBB
5729 testl %ecx, %ecx
5730 je common_errDivideByZero
5731 cmpl $0x80000000, %eax
5732 jne .Lop_div_int_lit8_continue_div
5733 cmpl $-1, %ecx
5734 jne .Lop_div_int_lit8_continue_div
5735 movl $0x80000000, %eax
5736 SET_VREG %eax rINST
5737 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5738
5739.Lop_div_int_lit8_continue_div:
5740 mov rIBASE, LOCAL0(%esp)
5741 cltd
5742 idivl %ecx
5743 SET_VREG %eax rINST
5744 mov LOCAL0(%esp), rIBASE
5745 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5746
5747
5748/* ------------------------------ */
5749 .balign 128
5750.L_op_rem_int_lit8: /* 0xdc */
5751/* File: x86/op_rem_int_lit8.S */
5752/* File: x86/bindivLit8.S */
5753/*
5754 * 32-bit div/rem "lit8" binary operation. Handles special case of
5755 * op0=minint & op1=-1
5756 */
5757 /* div/rem/lit8 vAA, vBB, #+CC */
5758 movzbl 2(rPC), %eax # eax <- BB
5759 movsbl 3(rPC), %ecx # ecx <- ssssssCC
5760 GET_VREG %eax %eax # eax <- rBB
5761 testl %ecx, %ecx
5762 je common_errDivideByZero
5763 cmpl $0x80000000, %eax
5764 jne .Lop_rem_int_lit8_continue_div
5765 cmpl $-1, %ecx
5766 jne .Lop_rem_int_lit8_continue_div
5767 movl $0, %eax
5768 SET_VREG %eax rINST
5769 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5770
5771.Lop_rem_int_lit8_continue_div:
5772 mov rIBASE, LOCAL0(%esp)
5773 cltd
5774 idivl %ecx
5775 SET_VREG rIBASE rINST
5776 mov LOCAL0(%esp), rIBASE
5777 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5778
5779
5780/* ------------------------------ */
5781 .balign 128
5782.L_op_and_int_lit8: /* 0xdd */
5783/* File: x86/op_and_int_lit8.S */
5784/* File: x86/binopLit8.S */
5785/*
5786 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
5787 * that specifies an instruction that performs "result = eax op ecx".
5788 * This could be an x86 instruction or a function call. (If the result
5789 * comes back in a register other than r0, you can override "result".)
5790 *
5791 * For: add-int/lit8, rsub-int/lit8
5792 * and-int/lit8, or-int/lit8, xor-int/lit8,
5793 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
5794 */
5795 /* binop/lit8 vAA, vBB, #+CC */
5796 movzbl 2(rPC), %eax # eax <- BB
5797 movsbl 3(rPC), %ecx # ecx <- ssssssCC
5798 GET_VREG %eax %eax # eax <- rBB
5799 andl %ecx, %eax # ex: addl %ecx,%eax
5800 SET_VREG %eax rINST
5801 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5802
5803
5804/* ------------------------------ */
5805 .balign 128
5806.L_op_or_int_lit8: /* 0xde */
5807/* File: x86/op_or_int_lit8.S */
5808/* File: x86/binopLit8.S */
5809/*
5810 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
5811 * that specifies an instruction that performs "result = eax op ecx".
5812 * This could be an x86 instruction or a function call. (If the result
5813 * comes back in a register other than r0, you can override "result".)
5814 *
5815 * For: add-int/lit8, rsub-int/lit8
5816 * and-int/lit8, or-int/lit8, xor-int/lit8,
5817 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
5818 */
5819 /* binop/lit8 vAA, vBB, #+CC */
5820 movzbl 2(rPC), %eax # eax <- BB
5821 movsbl 3(rPC), %ecx # ecx <- ssssssCC
5822 GET_VREG %eax %eax # eax <- rBB
5823 orl %ecx, %eax # ex: addl %ecx,%eax
5824 SET_VREG %eax rINST
5825 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5826
5827
5828/* ------------------------------ */
5829 .balign 128
5830.L_op_xor_int_lit8: /* 0xdf */
5831/* File: x86/op_xor_int_lit8.S */
5832/* File: x86/binopLit8.S */
5833/*
5834 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
5835 * that specifies an instruction that performs "result = eax op ecx".
5836 * This could be an x86 instruction or a function call. (If the result
5837 * comes back in a register other than r0, you can override "result".)
5838 *
5839 * For: add-int/lit8, rsub-int/lit8
5840 * and-int/lit8, or-int/lit8, xor-int/lit8,
5841 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
5842 */
5843 /* binop/lit8 vAA, vBB, #+CC */
5844 movzbl 2(rPC), %eax # eax <- BB
5845 movsbl 3(rPC), %ecx # ecx <- ssssssCC
5846 GET_VREG %eax %eax # eax <- rBB
5847 xorl %ecx, %eax # ex: addl %ecx,%eax
5848 SET_VREG %eax rINST
5849 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5850
5851
5852/* ------------------------------ */
5853 .balign 128
5854.L_op_shl_int_lit8: /* 0xe0 */
5855/* File: x86/op_shl_int_lit8.S */
5856/* File: x86/binopLit8.S */
5857/*
5858 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
5859 * that specifies an instruction that performs "result = eax op ecx".
5860 * This could be an x86 instruction or a function call. (If the result
5861 * comes back in a register other than r0, you can override "result".)
5862 *
5863 * For: add-int/lit8, rsub-int/lit8
5864 * and-int/lit8, or-int/lit8, xor-int/lit8,
5865 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
5866 */
5867 /* binop/lit8 vAA, vBB, #+CC */
5868 movzbl 2(rPC), %eax # eax <- BB
5869 movsbl 3(rPC), %ecx # ecx <- ssssssCC
5870 GET_VREG %eax %eax # eax <- rBB
5871 sall %cl, %eax # ex: addl %ecx,%eax
5872 SET_VREG %eax rINST
5873 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5874
5875
5876/* ------------------------------ */
5877 .balign 128
5878.L_op_shr_int_lit8: /* 0xe1 */
5879/* File: x86/op_shr_int_lit8.S */
5880/* File: x86/binopLit8.S */
5881/*
5882 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
5883 * that specifies an instruction that performs "result = eax op ecx".
5884 * This could be an x86 instruction or a function call. (If the result
5885 * comes back in a register other than r0, you can override "result".)
5886 *
5887 * For: add-int/lit8, rsub-int/lit8
5888 * and-int/lit8, or-int/lit8, xor-int/lit8,
5889 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
5890 */
5891 /* binop/lit8 vAA, vBB, #+CC */
5892 movzbl 2(rPC), %eax # eax <- BB
5893 movsbl 3(rPC), %ecx # ecx <- ssssssCC
5894 GET_VREG %eax %eax # eax <- rBB
5895 sarl %cl, %eax # ex: addl %ecx,%eax
5896 SET_VREG %eax rINST
5897 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5898
5899
5900/* ------------------------------ */
5901 .balign 128
5902.L_op_ushr_int_lit8: /* 0xe2 */
5903/* File: x86/op_ushr_int_lit8.S */
5904/* File: x86/binopLit8.S */
5905/*
5906 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
5907 * that specifies an instruction that performs "result = eax op ecx".
5908 * This could be an x86 instruction or a function call. (If the result
5909 * comes back in a register other than r0, you can override "result".)
5910 *
5911 * For: add-int/lit8, rsub-int/lit8
5912 * and-int/lit8, or-int/lit8, xor-int/lit8,
5913 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
5914 */
5915 /* binop/lit8 vAA, vBB, #+CC */
5916 movzbl 2(rPC), %eax # eax <- BB
5917 movsbl 3(rPC), %ecx # ecx <- ssssssCC
5918 GET_VREG %eax %eax # eax <- rBB
5919 shrl %cl, %eax # ex: addl %ecx,%eax
5920 SET_VREG %eax rINST
5921 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5922
5923
5924/* ------------------------------ */
5925 .balign 128
5926.L_op_iget_quick: /* 0xe3 */
5927/* File: x86/op_iget_quick.S */
5928 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
5929 /* op vA, vB, offset@CCCC */
5930 movzbl rINSTbl, %ecx # ecx <- BA
5931 sarl $4, %ecx # ecx <- B
5932 GET_VREG %ecx %ecx # vB (object we're operating on)
5933 movzwl 2(rPC), %eax # eax <- field byte offset
5934 testl %ecx, %ecx # is object null?
5935 je common_errNullObject
5936 movl (%ecx,%eax,1), %eax
5937 andb $0xf,rINSTbl # rINST <- A
5938 SET_VREG %eax rINST # fp[A] <- value
5939 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5940
5941/* ------------------------------ */
5942 .balign 128
5943.L_op_iget_wide_quick: /* 0xe4 */
5944/* File: x86/op_iget_wide_quick.S */
5945 /* iget-wide-quick vA, vB, offset@CCCC */
5946 movzbl rINSTbl, %ecx # ecx <- BA
5947 sarl $4, %ecx # ecx <- B
5948 GET_VREG %ecx %ecx # vB (object we're operating on)
5949 movzwl 2(rPC), %eax # eax <- field byte offset
5950 testl %ecx, %ecx # is object null?
5951 je common_errNullObject
5952 movq (%ecx,%eax,1), %xmm0
5953 andb $0xf, rINSTbl # rINST <- A
5954 SET_WIDE_FP_VREG %xmm0 rINST
5955 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5956
5957/* ------------------------------ */
5958 .balign 128
5959.L_op_iget_object_quick: /* 0xe5 */
5960/* File: x86/op_iget_object_quick.S */
5961 /* For: iget-object-quick */
5962 /* op vA, vB, offset@CCCC */
5963 movzbl rINSTbl, %ecx # ecx <- BA
5964 sarl $4, %ecx # ecx <- B
5965 GET_VREG %ecx %ecx # vB (object we're operating on)
5966 movzwl 2(rPC), %eax # eax <- field byte offset
5967 movl %ecx, OUT_ARG0(%esp)
5968 movl %eax, OUT_ARG1(%esp)
5969 EXPORT_PC
5970 call artIGetObjectFromMterp # (obj, offset)
5971 movl rSELF, %ecx
5972 REFRESH_IBASE_FROM_SELF %ecx
5973 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx)
5974 jnz MterpException # bail out
5975 andb $0xf,rINSTbl # rINST <- A
5976 SET_VREG_OBJECT %eax rINST # fp[A] <- value
5977 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5978
5979/* ------------------------------ */
5980 .balign 128
5981.L_op_iput_quick: /* 0xe6 */
5982/* File: x86/op_iput_quick.S */
5983 /* For: iput-quick, iput-object-quick */
5984 /* op vA, vB, offset@CCCC */
5985 movzbl rINSTbl, %ecx # ecx <- BA
5986 sarl $4, %ecx # ecx <- B
5987 GET_VREG %ecx %ecx # vB (object we're operating on)
5988 testl %ecx, %ecx # is object null?
5989 je common_errNullObject
5990 andb $0xf, rINSTbl # rINST <- A
5991 GET_VREG rINST rINST # rINST <- v[A]
5992 movzwl 2(rPC), %eax # eax <- field byte offset
5993 movl rINST, (%ecx,%eax,1)
5994 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
5995
5996/* ------------------------------ */
5997 .balign 128
5998.L_op_iput_wide_quick: /* 0xe7 */
5999/* File: x86/op_iput_wide_quick.S */
6000 /* iput-wide-quick vA, vB, offset@CCCC */
6001 movzbl rINSTbl, %ecx # ecx<- BA
6002 sarl $4, %ecx # ecx<- B
6003 GET_VREG %ecx %ecx # vB (object we're operating on)
6004 testl %ecx, %ecx # is object null?
6005 je common_errNullObject
6006 movzwl 2(rPC), %eax # eax<- field byte offset
6007 leal (%ecx,%eax,1), %ecx # ecx<- Address of 64-bit target
6008 andb $0xf, rINSTbl # rINST<- A
6009 GET_WIDE_FP_VREG %xmm0 rINST # xmm0<- fp[A]/fp[A+1]
6010 movq %xmm0, (%ecx) # obj.field<- r0/r1
6011 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
6012
6013/* ------------------------------ */
6014 .balign 128
6015.L_op_iput_object_quick: /* 0xe8 */
6016/* File: x86/op_iput_object_quick.S */
6017 EXPORT_PC
6018 leal OFF_FP_SHADOWFRAME(rFP), %eax
6019 movl %eax, OUT_ARG0(%esp)
6020 movl rPC, OUT_ARG1(%esp)
6021 REFRESH_INST 232
6022 movl rINST, OUT_ARG2(%esp)
6023 call MterpIputObjectQuick
6024 testl %eax, %eax
6025 jz MterpException
6026 REFRESH_IBASE
6027 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
6028
6029/* ------------------------------ */
6030 .balign 128
6031.L_op_invoke_virtual_quick: /* 0xe9 */
6032/* File: x86/op_invoke_virtual_quick.S */
6033/* File: x86/invoke.S */
6034/*
6035 * Generic invoke handler wrapper.
6036 */
6037 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
6038 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
6039 .extern MterpInvokeVirtualQuick
6040 EXPORT_PC
6041 movl rSELF, %ecx
6042 movl %ecx, OUT_ARG0(%esp)
6043 leal OFF_FP_SHADOWFRAME(rFP), %eax
6044 movl %eax, OUT_ARG1(%esp)
6045 movl rPC, OUT_ARG2(%esp)
6046 REFRESH_INST 233
6047 movl rINST, OUT_ARG3(%esp)
6048 call MterpInvokeVirtualQuick
6049 testl %eax, %eax
6050 jz MterpException
6051 REFRESH_IBASE
6052 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
6053
6054
6055/* ------------------------------ */
6056 .balign 128
6057.L_op_invoke_virtual_range_quick: /* 0xea */
6058/* File: x86/op_invoke_virtual_range_quick.S */
6059/* File: x86/invoke.S */
6060/*
6061 * Generic invoke handler wrapper.
6062 */
6063 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
6064 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
6065 .extern MterpInvokeVirtualQuickRange
6066 EXPORT_PC
6067 movl rSELF, %ecx
6068 movl %ecx, OUT_ARG0(%esp)
6069 leal OFF_FP_SHADOWFRAME(rFP), %eax
6070 movl %eax, OUT_ARG1(%esp)
6071 movl rPC, OUT_ARG2(%esp)
6072 REFRESH_INST 234
6073 movl rINST, OUT_ARG3(%esp)
6074 call MterpInvokeVirtualQuickRange
6075 testl %eax, %eax
6076 jz MterpException
6077 REFRESH_IBASE
6078 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
6079
6080
6081/* ------------------------------ */
6082 .balign 128
6083.L_op_iput_boolean_quick: /* 0xeb */
6084/* File: x86/op_iput_boolean_quick.S */
6085/* File: x86/op_iput_quick.S */
6086 /* For: iput-quick, iput-object-quick */
6087 /* op vA, vB, offset@CCCC */
6088 movzbl rINSTbl, %ecx # ecx <- BA
6089 sarl $4, %ecx # ecx <- B
6090 GET_VREG %ecx %ecx # vB (object we're operating on)
6091 testl %ecx, %ecx # is object null?
6092 je common_errNullObject
6093 andb $0xf, rINSTbl # rINST <- A
6094 GET_VREG rINST rINST # rINST <- v[A]
6095 movzwl 2(rPC), %eax # eax <- field byte offset
6096 movb rINSTbl, (%ecx,%eax,1)
6097 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
6098
6099
6100/* ------------------------------ */
6101 .balign 128
6102.L_op_iput_byte_quick: /* 0xec */
6103/* File: x86/op_iput_byte_quick.S */
6104/* File: x86/op_iput_quick.S */
6105 /* For: iput-quick, iput-object-quick */
6106 /* op vA, vB, offset@CCCC */
6107 movzbl rINSTbl, %ecx # ecx <- BA
6108 sarl $4, %ecx # ecx <- B
6109 GET_VREG %ecx %ecx # vB (object we're operating on)
6110 testl %ecx, %ecx # is object null?
6111 je common_errNullObject
6112 andb $0xf, rINSTbl # rINST <- A
6113 GET_VREG rINST rINST # rINST <- v[A]
6114 movzwl 2(rPC), %eax # eax <- field byte offset
6115 movb rINSTbl, (%ecx,%eax,1)
6116 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
6117
6118
6119/* ------------------------------ */
6120 .balign 128
6121.L_op_iput_char_quick: /* 0xed */
6122/* File: x86/op_iput_char_quick.S */
6123/* File: x86/op_iput_quick.S */
6124 /* For: iput-quick, iput-object-quick */
6125 /* op vA, vB, offset@CCCC */
6126 movzbl rINSTbl, %ecx # ecx <- BA
6127 sarl $4, %ecx # ecx <- B
6128 GET_VREG %ecx %ecx # vB (object we're operating on)
6129 testl %ecx, %ecx # is object null?
6130 je common_errNullObject
6131 andb $0xf, rINSTbl # rINST <- A
6132 GET_VREG rINST rINST # rINST <- v[A]
6133 movzwl 2(rPC), %eax # eax <- field byte offset
6134 movw rINSTw, (%ecx,%eax,1)
6135 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
6136
6137
6138/* ------------------------------ */
6139 .balign 128
6140.L_op_iput_short_quick: /* 0xee */
6141/* File: x86/op_iput_short_quick.S */
6142/* File: x86/op_iput_quick.S */
6143 /* For: iput-quick, iput-object-quick */
6144 /* op vA, vB, offset@CCCC */
6145 movzbl rINSTbl, %ecx # ecx <- BA
6146 sarl $4, %ecx # ecx <- B
6147 GET_VREG %ecx %ecx # vB (object we're operating on)
6148 testl %ecx, %ecx # is object null?
6149 je common_errNullObject
6150 andb $0xf, rINSTbl # rINST <- A
6151 GET_VREG rINST rINST # rINST <- v[A]
6152 movzwl 2(rPC), %eax # eax <- field byte offset
6153 movw rINSTw, (%ecx,%eax,1)
6154 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
6155
6156
6157/* ------------------------------ */
6158 .balign 128
6159.L_op_iget_boolean_quick: /* 0xef */
6160/* File: x86/op_iget_boolean_quick.S */
6161/* File: x86/op_iget_quick.S */
6162 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6163 /* op vA, vB, offset@CCCC */
6164 movzbl rINSTbl, %ecx # ecx <- BA
6165 sarl $4, %ecx # ecx <- B
6166 GET_VREG %ecx %ecx # vB (object we're operating on)
6167 movzwl 2(rPC), %eax # eax <- field byte offset
6168 testl %ecx, %ecx # is object null?
6169 je common_errNullObject
6170 movsbl (%ecx,%eax,1), %eax
6171 andb $0xf,rINSTbl # rINST <- A
6172 SET_VREG %eax rINST # fp[A] <- value
6173 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
6174
6175
6176/* ------------------------------ */
6177 .balign 128
6178.L_op_iget_byte_quick: /* 0xf0 */
6179/* File: x86/op_iget_byte_quick.S */
6180/* File: x86/op_iget_quick.S */
6181 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6182 /* op vA, vB, offset@CCCC */
6183 movzbl rINSTbl, %ecx # ecx <- BA
6184 sarl $4, %ecx # ecx <- B
6185 GET_VREG %ecx %ecx # vB (object we're operating on)
6186 movzwl 2(rPC), %eax # eax <- field byte offset
6187 testl %ecx, %ecx # is object null?
6188 je common_errNullObject
6189 movsbl (%ecx,%eax,1), %eax
6190 andb $0xf,rINSTbl # rINST <- A
6191 SET_VREG %eax rINST # fp[A] <- value
6192 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
6193
6194
6195/* ------------------------------ */
6196 .balign 128
6197.L_op_iget_char_quick: /* 0xf1 */
6198/* File: x86/op_iget_char_quick.S */
6199/* File: x86/op_iget_quick.S */
6200 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6201 /* op vA, vB, offset@CCCC */
6202 movzbl rINSTbl, %ecx # ecx <- BA
6203 sarl $4, %ecx # ecx <- B
6204 GET_VREG %ecx %ecx # vB (object we're operating on)
6205 movzwl 2(rPC), %eax # eax <- field byte offset
6206 testl %ecx, %ecx # is object null?
6207 je common_errNullObject
6208 movzwl (%ecx,%eax,1), %eax
6209 andb $0xf,rINSTbl # rINST <- A
6210 SET_VREG %eax rINST # fp[A] <- value
6211 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
6212
6213
6214/* ------------------------------ */
6215 .balign 128
6216.L_op_iget_short_quick: /* 0xf2 */
6217/* File: x86/op_iget_short_quick.S */
6218/* File: x86/op_iget_quick.S */
6219 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6220 /* op vA, vB, offset@CCCC */
6221 movzbl rINSTbl, %ecx # ecx <- BA
6222 sarl $4, %ecx # ecx <- B
6223 GET_VREG %ecx %ecx # vB (object we're operating on)
6224 movzwl 2(rPC), %eax # eax <- field byte offset
6225 testl %ecx, %ecx # is object null?
6226 je common_errNullObject
6227 movswl (%ecx,%eax,1), %eax
6228 andb $0xf,rINSTbl # rINST <- A
6229 SET_VREG %eax rINST # fp[A] <- value
6230 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
6231
6232
6233/* ------------------------------ */
6234 .balign 128
6235.L_op_invoke_lambda: /* 0xf3 */
6236/* Transfer stub to alternate interpreter */
6237 jmp MterpFallback
6238
6239
6240/* ------------------------------ */
6241 .balign 128
6242.L_op_unused_f4: /* 0xf4 */
6243/* File: x86/op_unused_f4.S */
6244/* File: x86/unused.S */
6245/*
6246 * Bail to reference interpreter to throw.
6247 */
6248 jmp MterpFallback
6249
6250
6251/* ------------------------------ */
6252 .balign 128
6253.L_op_capture_variable: /* 0xf5 */
6254/* Transfer stub to alternate interpreter */
6255 jmp MterpFallback
6256
6257
6258/* ------------------------------ */
6259 .balign 128
6260.L_op_create_lambda: /* 0xf6 */
6261/* Transfer stub to alternate interpreter */
6262 jmp MterpFallback
6263
6264
6265/* ------------------------------ */
6266 .balign 128
6267.L_op_liberate_variable: /* 0xf7 */
6268/* Transfer stub to alternate interpreter */
6269 jmp MterpFallback
6270
6271
6272/* ------------------------------ */
6273 .balign 128
6274.L_op_box_lambda: /* 0xf8 */
6275/* Transfer stub to alternate interpreter */
6276 jmp MterpFallback
6277
6278
6279/* ------------------------------ */
6280 .balign 128
6281.L_op_unbox_lambda: /* 0xf9 */
6282/* Transfer stub to alternate interpreter */
6283 jmp MterpFallback
6284
6285
6286/* ------------------------------ */
6287 .balign 128
6288.L_op_unused_fa: /* 0xfa */
6289/* File: x86/op_unused_fa.S */
6290/* File: x86/unused.S */
6291/*
6292 * Bail to reference interpreter to throw.
6293 */
6294 jmp MterpFallback
6295
6296
6297/* ------------------------------ */
6298 .balign 128
6299.L_op_unused_fb: /* 0xfb */
6300/* File: x86/op_unused_fb.S */
6301/* File: x86/unused.S */
6302/*
6303 * Bail to reference interpreter to throw.
6304 */
6305 jmp MterpFallback
6306
6307
6308/* ------------------------------ */
6309 .balign 128
6310.L_op_unused_fc: /* 0xfc */
6311/* File: x86/op_unused_fc.S */
6312/* File: x86/unused.S */
6313/*
6314 * Bail to reference interpreter to throw.
6315 */
6316 jmp MterpFallback
6317
6318
6319/* ------------------------------ */
6320 .balign 128
6321.L_op_unused_fd: /* 0xfd */
6322/* File: x86/op_unused_fd.S */
6323/* File: x86/unused.S */
6324/*
6325 * Bail to reference interpreter to throw.
6326 */
6327 jmp MterpFallback
6328
6329
6330/* ------------------------------ */
6331 .balign 128
6332.L_op_unused_fe: /* 0xfe */
6333/* File: x86/op_unused_fe.S */
6334/* File: x86/unused.S */
6335/*
6336 * Bail to reference interpreter to throw.
6337 */
6338 jmp MterpFallback
6339
6340
6341/* ------------------------------ */
6342 .balign 128
6343.L_op_unused_ff: /* 0xff */
6344/* File: x86/op_unused_ff.S */
6345/* File: x86/unused.S */
6346/*
6347 * Bail to reference interpreter to throw.
6348 */
6349 jmp MterpFallback
6350
6351
6352 .balign 128
6353 .size artMterpAsmInstructionStart, .-artMterpAsmInstructionStart
6354 .global artMterpAsmInstructionEnd
6355artMterpAsmInstructionEnd:
6356
6357/*
6358 * ===========================================================================
6359 * Sister implementations
6360 * ===========================================================================
6361 */
6362 .global artMterpAsmSisterStart
6363 .type artMterpAsmSisterStart, %function
6364 .text
6365 .balign 4
6366artMterpAsmSisterStart:
6367
6368 .size artMterpAsmSisterStart, .-artMterpAsmSisterStart
6369 .global artMterpAsmSisterEnd
6370artMterpAsmSisterEnd:
6371
6372
6373 .global artMterpAsmAltInstructionStart
6374 .type artMterpAsmAltInstructionStart, %function
6375 .text
6376
6377artMterpAsmAltInstructionStart = .L_ALT_op_nop
6378/* ------------------------------ */
6379 .balign 128
6380.L_ALT_op_nop: /* 0x00 */
6381/* File: x86/alt_stub.S */
6382/*
6383 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6384 * any interesting requests and then jump to the real instruction
6385 * handler. Unlike the Arm handler, we can't do this as a tail call
6386 * because rIBASE is caller save and we need to reload it.
6387 *
6388 * Note that unlike in the Arm implementation, we should never arrive
6389 * here with a zero breakFlag because we always refresh rIBASE on
6390 * return.
6391 */
6392 .extern MterpCheckBefore
6393 EXPORT_PC
6394
6395 movl rSELF, %ecx
6396 movl %ecx, OUT_ARG0(%esp)
6397 leal OFF_FP_SHADOWFRAME(rFP), %eax
6398 movl %eax, OUT_ARG1(%esp)
6399 call MterpCheckBefore # (self, shadow_frame)
6400 REFRESH_IBASE
6401 jmp .L_op_nop+(0*128)
6402
6403/* ------------------------------ */
6404 .balign 128
6405.L_ALT_op_move: /* 0x01 */
6406/* File: x86/alt_stub.S */
6407/*
6408 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6409 * any interesting requests and then jump to the real instruction
6410 * handler. Unlike the Arm handler, we can't do this as a tail call
6411 * because rIBASE is caller save and we need to reload it.
6412 *
6413 * Note that unlike in the Arm implementation, we should never arrive
6414 * here with a zero breakFlag because we always refresh rIBASE on
6415 * return.
6416 */
6417 .extern MterpCheckBefore
6418 EXPORT_PC
6419
6420 movl rSELF, %ecx
6421 movl %ecx, OUT_ARG0(%esp)
6422 leal OFF_FP_SHADOWFRAME(rFP), %eax
6423 movl %eax, OUT_ARG1(%esp)
6424 call MterpCheckBefore # (self, shadow_frame)
6425 REFRESH_IBASE
6426 jmp .L_op_nop+(1*128)
6427
6428/* ------------------------------ */
6429 .balign 128
6430.L_ALT_op_move_from16: /* 0x02 */
6431/* File: x86/alt_stub.S */
6432/*
6433 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6434 * any interesting requests and then jump to the real instruction
6435 * handler. Unlike the Arm handler, we can't do this as a tail call
6436 * because rIBASE is caller save and we need to reload it.
6437 *
6438 * Note that unlike in the Arm implementation, we should never arrive
6439 * here with a zero breakFlag because we always refresh rIBASE on
6440 * return.
6441 */
6442 .extern MterpCheckBefore
6443 EXPORT_PC
6444
6445 movl rSELF, %ecx
6446 movl %ecx, OUT_ARG0(%esp)
6447 leal OFF_FP_SHADOWFRAME(rFP), %eax
6448 movl %eax, OUT_ARG1(%esp)
6449 call MterpCheckBefore # (self, shadow_frame)
6450 REFRESH_IBASE
6451 jmp .L_op_nop+(2*128)
6452
6453/* ------------------------------ */
6454 .balign 128
6455.L_ALT_op_move_16: /* 0x03 */
6456/* File: x86/alt_stub.S */
6457/*
6458 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6459 * any interesting requests and then jump to the real instruction
6460 * handler. Unlike the Arm handler, we can't do this as a tail call
6461 * because rIBASE is caller save and we need to reload it.
6462 *
6463 * Note that unlike in the Arm implementation, we should never arrive
6464 * here with a zero breakFlag because we always refresh rIBASE on
6465 * return.
6466 */
6467 .extern MterpCheckBefore
6468 EXPORT_PC
6469
6470 movl rSELF, %ecx
6471 movl %ecx, OUT_ARG0(%esp)
6472 leal OFF_FP_SHADOWFRAME(rFP), %eax
6473 movl %eax, OUT_ARG1(%esp)
6474 call MterpCheckBefore # (self, shadow_frame)
6475 REFRESH_IBASE
6476 jmp .L_op_nop+(3*128)
6477
6478/* ------------------------------ */
6479 .balign 128
6480.L_ALT_op_move_wide: /* 0x04 */
6481/* File: x86/alt_stub.S */
6482/*
6483 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6484 * any interesting requests and then jump to the real instruction
6485 * handler. Unlike the Arm handler, we can't do this as a tail call
6486 * because rIBASE is caller save and we need to reload it.
6487 *
6488 * Note that unlike in the Arm implementation, we should never arrive
6489 * here with a zero breakFlag because we always refresh rIBASE on
6490 * return.
6491 */
6492 .extern MterpCheckBefore
6493 EXPORT_PC
6494
6495 movl rSELF, %ecx
6496 movl %ecx, OUT_ARG0(%esp)
6497 leal OFF_FP_SHADOWFRAME(rFP), %eax
6498 movl %eax, OUT_ARG1(%esp)
6499 call MterpCheckBefore # (self, shadow_frame)
6500 REFRESH_IBASE
6501 jmp .L_op_nop+(4*128)
6502
6503/* ------------------------------ */
6504 .balign 128
6505.L_ALT_op_move_wide_from16: /* 0x05 */
6506/* File: x86/alt_stub.S */
6507/*
6508 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6509 * any interesting requests and then jump to the real instruction
6510 * handler. Unlike the Arm handler, we can't do this as a tail call
6511 * because rIBASE is caller save and we need to reload it.
6512 *
6513 * Note that unlike in the Arm implementation, we should never arrive
6514 * here with a zero breakFlag because we always refresh rIBASE on
6515 * return.
6516 */
6517 .extern MterpCheckBefore
6518 EXPORT_PC
6519
6520 movl rSELF, %ecx
6521 movl %ecx, OUT_ARG0(%esp)
6522 leal OFF_FP_SHADOWFRAME(rFP), %eax
6523 movl %eax, OUT_ARG1(%esp)
6524 call MterpCheckBefore # (self, shadow_frame)
6525 REFRESH_IBASE
6526 jmp .L_op_nop+(5*128)
6527
6528/* ------------------------------ */
6529 .balign 128
6530.L_ALT_op_move_wide_16: /* 0x06 */
6531/* File: x86/alt_stub.S */
6532/*
6533 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6534 * any interesting requests and then jump to the real instruction
6535 * handler. Unlike the Arm handler, we can't do this as a tail call
6536 * because rIBASE is caller save and we need to reload it.
6537 *
6538 * Note that unlike in the Arm implementation, we should never arrive
6539 * here with a zero breakFlag because we always refresh rIBASE on
6540 * return.
6541 */
6542 .extern MterpCheckBefore
6543 EXPORT_PC
6544
6545 movl rSELF, %ecx
6546 movl %ecx, OUT_ARG0(%esp)
6547 leal OFF_FP_SHADOWFRAME(rFP), %eax
6548 movl %eax, OUT_ARG1(%esp)
6549 call MterpCheckBefore # (self, shadow_frame)
6550 REFRESH_IBASE
6551 jmp .L_op_nop+(6*128)
6552
6553/* ------------------------------ */
6554 .balign 128
6555.L_ALT_op_move_object: /* 0x07 */
6556/* File: x86/alt_stub.S */
6557/*
6558 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6559 * any interesting requests and then jump to the real instruction
6560 * handler. Unlike the Arm handler, we can't do this as a tail call
6561 * because rIBASE is caller save and we need to reload it.
6562 *
6563 * Note that unlike in the Arm implementation, we should never arrive
6564 * here with a zero breakFlag because we always refresh rIBASE on
6565 * return.
6566 */
6567 .extern MterpCheckBefore
6568 EXPORT_PC
6569
6570 movl rSELF, %ecx
6571 movl %ecx, OUT_ARG0(%esp)
6572 leal OFF_FP_SHADOWFRAME(rFP), %eax
6573 movl %eax, OUT_ARG1(%esp)
6574 call MterpCheckBefore # (self, shadow_frame)
6575 REFRESH_IBASE
6576 jmp .L_op_nop+(7*128)
6577
6578/* ------------------------------ */
6579 .balign 128
6580.L_ALT_op_move_object_from16: /* 0x08 */
6581/* File: x86/alt_stub.S */
6582/*
6583 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6584 * any interesting requests and then jump to the real instruction
6585 * handler. Unlike the Arm handler, we can't do this as a tail call
6586 * because rIBASE is caller save and we need to reload it.
6587 *
6588 * Note that unlike in the Arm implementation, we should never arrive
6589 * here with a zero breakFlag because we always refresh rIBASE on
6590 * return.
6591 */
6592 .extern MterpCheckBefore
6593 EXPORT_PC
6594
6595 movl rSELF, %ecx
6596 movl %ecx, OUT_ARG0(%esp)
6597 leal OFF_FP_SHADOWFRAME(rFP), %eax
6598 movl %eax, OUT_ARG1(%esp)
6599 call MterpCheckBefore # (self, shadow_frame)
6600 REFRESH_IBASE
6601 jmp .L_op_nop+(8*128)
6602
6603/* ------------------------------ */
6604 .balign 128
6605.L_ALT_op_move_object_16: /* 0x09 */
6606/* File: x86/alt_stub.S */
6607/*
6608 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6609 * any interesting requests and then jump to the real instruction
6610 * handler. Unlike the Arm handler, we can't do this as a tail call
6611 * because rIBASE is caller save and we need to reload it.
6612 *
6613 * Note that unlike in the Arm implementation, we should never arrive
6614 * here with a zero breakFlag because we always refresh rIBASE on
6615 * return.
6616 */
6617 .extern MterpCheckBefore
6618 EXPORT_PC
6619
6620 movl rSELF, %ecx
6621 movl %ecx, OUT_ARG0(%esp)
6622 leal OFF_FP_SHADOWFRAME(rFP), %eax
6623 movl %eax, OUT_ARG1(%esp)
6624 call MterpCheckBefore # (self, shadow_frame)
6625 REFRESH_IBASE
6626 jmp .L_op_nop+(9*128)
6627
6628/* ------------------------------ */
6629 .balign 128
6630.L_ALT_op_move_result: /* 0x0a */
6631/* File: x86/alt_stub.S */
6632/*
6633 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6634 * any interesting requests and then jump to the real instruction
6635 * handler. Unlike the Arm handler, we can't do this as a tail call
6636 * because rIBASE is caller save and we need to reload it.
6637 *
6638 * Note that unlike in the Arm implementation, we should never arrive
6639 * here with a zero breakFlag because we always refresh rIBASE on
6640 * return.
6641 */
6642 .extern MterpCheckBefore
6643 EXPORT_PC
6644
6645 movl rSELF, %ecx
6646 movl %ecx, OUT_ARG0(%esp)
6647 leal OFF_FP_SHADOWFRAME(rFP), %eax
6648 movl %eax, OUT_ARG1(%esp)
6649 call MterpCheckBefore # (self, shadow_frame)
6650 REFRESH_IBASE
6651 jmp .L_op_nop+(10*128)
6652
6653/* ------------------------------ */
6654 .balign 128
6655.L_ALT_op_move_result_wide: /* 0x0b */
6656/* File: x86/alt_stub.S */
6657/*
6658 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6659 * any interesting requests and then jump to the real instruction
6660 * handler. Unlike the Arm handler, we can't do this as a tail call
6661 * because rIBASE is caller save and we need to reload it.
6662 *
6663 * Note that unlike in the Arm implementation, we should never arrive
6664 * here with a zero breakFlag because we always refresh rIBASE on
6665 * return.
6666 */
6667 .extern MterpCheckBefore
6668 EXPORT_PC
6669
6670 movl rSELF, %ecx
6671 movl %ecx, OUT_ARG0(%esp)
6672 leal OFF_FP_SHADOWFRAME(rFP), %eax
6673 movl %eax, OUT_ARG1(%esp)
6674 call MterpCheckBefore # (self, shadow_frame)
6675 REFRESH_IBASE
6676 jmp .L_op_nop+(11*128)
6677
6678/* ------------------------------ */
6679 .balign 128
6680.L_ALT_op_move_result_object: /* 0x0c */
6681/* File: x86/alt_stub.S */
6682/*
6683 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6684 * any interesting requests and then jump to the real instruction
6685 * handler. Unlike the Arm handler, we can't do this as a tail call
6686 * because rIBASE is caller save and we need to reload it.
6687 *
6688 * Note that unlike in the Arm implementation, we should never arrive
6689 * here with a zero breakFlag because we always refresh rIBASE on
6690 * return.
6691 */
6692 .extern MterpCheckBefore
6693 EXPORT_PC
6694
6695 movl rSELF, %ecx
6696 movl %ecx, OUT_ARG0(%esp)
6697 leal OFF_FP_SHADOWFRAME(rFP), %eax
6698 movl %eax, OUT_ARG1(%esp)
6699 call MterpCheckBefore # (self, shadow_frame)
6700 REFRESH_IBASE
6701 jmp .L_op_nop+(12*128)
6702
6703/* ------------------------------ */
6704 .balign 128
6705.L_ALT_op_move_exception: /* 0x0d */
6706/* File: x86/alt_stub.S */
6707/*
6708 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6709 * any interesting requests and then jump to the real instruction
6710 * handler. Unlike the Arm handler, we can't do this as a tail call
6711 * because rIBASE is caller save and we need to reload it.
6712 *
6713 * Note that unlike in the Arm implementation, we should never arrive
6714 * here with a zero breakFlag because we always refresh rIBASE on
6715 * return.
6716 */
6717 .extern MterpCheckBefore
6718 EXPORT_PC
6719
6720 movl rSELF, %ecx
6721 movl %ecx, OUT_ARG0(%esp)
6722 leal OFF_FP_SHADOWFRAME(rFP), %eax
6723 movl %eax, OUT_ARG1(%esp)
6724 call MterpCheckBefore # (self, shadow_frame)
6725 REFRESH_IBASE
6726 jmp .L_op_nop+(13*128)
6727
6728/* ------------------------------ */
6729 .balign 128
6730.L_ALT_op_return_void: /* 0x0e */
6731/* File: x86/alt_stub.S */
6732/*
6733 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6734 * any interesting requests and then jump to the real instruction
6735 * handler. Unlike the Arm handler, we can't do this as a tail call
6736 * because rIBASE is caller save and we need to reload it.
6737 *
6738 * Note that unlike in the Arm implementation, we should never arrive
6739 * here with a zero breakFlag because we always refresh rIBASE on
6740 * return.
6741 */
6742 .extern MterpCheckBefore
6743 EXPORT_PC
6744
6745 movl rSELF, %ecx
6746 movl %ecx, OUT_ARG0(%esp)
6747 leal OFF_FP_SHADOWFRAME(rFP), %eax
6748 movl %eax, OUT_ARG1(%esp)
6749 call MterpCheckBefore # (self, shadow_frame)
6750 REFRESH_IBASE
6751 jmp .L_op_nop+(14*128)
6752
6753/* ------------------------------ */
6754 .balign 128
6755.L_ALT_op_return: /* 0x0f */
6756/* File: x86/alt_stub.S */
6757/*
6758 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6759 * any interesting requests and then jump to the real instruction
6760 * handler. Unlike the Arm handler, we can't do this as a tail call
6761 * because rIBASE is caller save and we need to reload it.
6762 *
6763 * Note that unlike in the Arm implementation, we should never arrive
6764 * here with a zero breakFlag because we always refresh rIBASE on
6765 * return.
6766 */
6767 .extern MterpCheckBefore
6768 EXPORT_PC
6769
6770 movl rSELF, %ecx
6771 movl %ecx, OUT_ARG0(%esp)
6772 leal OFF_FP_SHADOWFRAME(rFP), %eax
6773 movl %eax, OUT_ARG1(%esp)
6774 call MterpCheckBefore # (self, shadow_frame)
6775 REFRESH_IBASE
6776 jmp .L_op_nop+(15*128)
6777
6778/* ------------------------------ */
6779 .balign 128
6780.L_ALT_op_return_wide: /* 0x10 */
6781/* File: x86/alt_stub.S */
6782/*
6783 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6784 * any interesting requests and then jump to the real instruction
6785 * handler. Unlike the Arm handler, we can't do this as a tail call
6786 * because rIBASE is caller save and we need to reload it.
6787 *
6788 * Note that unlike in the Arm implementation, we should never arrive
6789 * here with a zero breakFlag because we always refresh rIBASE on
6790 * return.
6791 */
6792 .extern MterpCheckBefore
6793 EXPORT_PC
6794
6795 movl rSELF, %ecx
6796 movl %ecx, OUT_ARG0(%esp)
6797 leal OFF_FP_SHADOWFRAME(rFP), %eax
6798 movl %eax, OUT_ARG1(%esp)
6799 call MterpCheckBefore # (self, shadow_frame)
6800 REFRESH_IBASE
6801 jmp .L_op_nop+(16*128)
6802
6803/* ------------------------------ */
6804 .balign 128
6805.L_ALT_op_return_object: /* 0x11 */
6806/* File: x86/alt_stub.S */
6807/*
6808 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6809 * any interesting requests and then jump to the real instruction
6810 * handler. Unlike the Arm handler, we can't do this as a tail call
6811 * because rIBASE is caller save and we need to reload it.
6812 *
6813 * Note that unlike in the Arm implementation, we should never arrive
6814 * here with a zero breakFlag because we always refresh rIBASE on
6815 * return.
6816 */
6817 .extern MterpCheckBefore
6818 EXPORT_PC
6819
6820 movl rSELF, %ecx
6821 movl %ecx, OUT_ARG0(%esp)
6822 leal OFF_FP_SHADOWFRAME(rFP), %eax
6823 movl %eax, OUT_ARG1(%esp)
6824 call MterpCheckBefore # (self, shadow_frame)
6825 REFRESH_IBASE
6826 jmp .L_op_nop+(17*128)
6827
6828/* ------------------------------ */
6829 .balign 128
6830.L_ALT_op_const_4: /* 0x12 */
6831/* File: x86/alt_stub.S */
6832/*
6833 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6834 * any interesting requests and then jump to the real instruction
6835 * handler. Unlike the Arm handler, we can't do this as a tail call
6836 * because rIBASE is caller save and we need to reload it.
6837 *
6838 * Note that unlike in the Arm implementation, we should never arrive
6839 * here with a zero breakFlag because we always refresh rIBASE on
6840 * return.
6841 */
6842 .extern MterpCheckBefore
6843 EXPORT_PC
6844
6845 movl rSELF, %ecx
6846 movl %ecx, OUT_ARG0(%esp)
6847 leal OFF_FP_SHADOWFRAME(rFP), %eax
6848 movl %eax, OUT_ARG1(%esp)
6849 call MterpCheckBefore # (self, shadow_frame)
6850 REFRESH_IBASE
6851 jmp .L_op_nop+(18*128)
6852
6853/* ------------------------------ */
6854 .balign 128
6855.L_ALT_op_const_16: /* 0x13 */
6856/* File: x86/alt_stub.S */
6857/*
6858 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6859 * any interesting requests and then jump to the real instruction
6860 * handler. Unlike the Arm handler, we can't do this as a tail call
6861 * because rIBASE is caller save and we need to reload it.
6862 *
6863 * Note that unlike in the Arm implementation, we should never arrive
6864 * here with a zero breakFlag because we always refresh rIBASE on
6865 * return.
6866 */
6867 .extern MterpCheckBefore
6868 EXPORT_PC
6869
6870 movl rSELF, %ecx
6871 movl %ecx, OUT_ARG0(%esp)
6872 leal OFF_FP_SHADOWFRAME(rFP), %eax
6873 movl %eax, OUT_ARG1(%esp)
6874 call MterpCheckBefore # (self, shadow_frame)
6875 REFRESH_IBASE
6876 jmp .L_op_nop+(19*128)
6877
6878/* ------------------------------ */
6879 .balign 128
6880.L_ALT_op_const: /* 0x14 */
6881/* File: x86/alt_stub.S */
6882/*
6883 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6884 * any interesting requests and then jump to the real instruction
6885 * handler. Unlike the Arm handler, we can't do this as a tail call
6886 * because rIBASE is caller save and we need to reload it.
6887 *
6888 * Note that unlike in the Arm implementation, we should never arrive
6889 * here with a zero breakFlag because we always refresh rIBASE on
6890 * return.
6891 */
6892 .extern MterpCheckBefore
6893 EXPORT_PC
6894
6895 movl rSELF, %ecx
6896 movl %ecx, OUT_ARG0(%esp)
6897 leal OFF_FP_SHADOWFRAME(rFP), %eax
6898 movl %eax, OUT_ARG1(%esp)
6899 call MterpCheckBefore # (self, shadow_frame)
6900 REFRESH_IBASE
6901 jmp .L_op_nop+(20*128)
6902
6903/* ------------------------------ */
6904 .balign 128
6905.L_ALT_op_const_high16: /* 0x15 */
6906/* File: x86/alt_stub.S */
6907/*
6908 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6909 * any interesting requests and then jump to the real instruction
6910 * handler. Unlike the Arm handler, we can't do this as a tail call
6911 * because rIBASE is caller save and we need to reload it.
6912 *
6913 * Note that unlike in the Arm implementation, we should never arrive
6914 * here with a zero breakFlag because we always refresh rIBASE on
6915 * return.
6916 */
6917 .extern MterpCheckBefore
6918 EXPORT_PC
6919
6920 movl rSELF, %ecx
6921 movl %ecx, OUT_ARG0(%esp)
6922 leal OFF_FP_SHADOWFRAME(rFP), %eax
6923 movl %eax, OUT_ARG1(%esp)
6924 call MterpCheckBefore # (self, shadow_frame)
6925 REFRESH_IBASE
6926 jmp .L_op_nop+(21*128)
6927
6928/* ------------------------------ */
6929 .balign 128
6930.L_ALT_op_const_wide_16: /* 0x16 */
6931/* File: x86/alt_stub.S */
6932/*
6933 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6934 * any interesting requests and then jump to the real instruction
6935 * handler. Unlike the Arm handler, we can't do this as a tail call
6936 * because rIBASE is caller save and we need to reload it.
6937 *
6938 * Note that unlike in the Arm implementation, we should never arrive
6939 * here with a zero breakFlag because we always refresh rIBASE on
6940 * return.
6941 */
6942 .extern MterpCheckBefore
6943 EXPORT_PC
6944
6945 movl rSELF, %ecx
6946 movl %ecx, OUT_ARG0(%esp)
6947 leal OFF_FP_SHADOWFRAME(rFP), %eax
6948 movl %eax, OUT_ARG1(%esp)
6949 call MterpCheckBefore # (self, shadow_frame)
6950 REFRESH_IBASE
6951 jmp .L_op_nop+(22*128)
6952
6953/* ------------------------------ */
6954 .balign 128
6955.L_ALT_op_const_wide_32: /* 0x17 */
6956/* File: x86/alt_stub.S */
6957/*
6958 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6959 * any interesting requests and then jump to the real instruction
6960 * handler. Unlike the Arm handler, we can't do this as a tail call
6961 * because rIBASE is caller save and we need to reload it.
6962 *
6963 * Note that unlike in the Arm implementation, we should never arrive
6964 * here with a zero breakFlag because we always refresh rIBASE on
6965 * return.
6966 */
6967 .extern MterpCheckBefore
6968 EXPORT_PC
6969
6970 movl rSELF, %ecx
6971 movl %ecx, OUT_ARG0(%esp)
6972 leal OFF_FP_SHADOWFRAME(rFP), %eax
6973 movl %eax, OUT_ARG1(%esp)
6974 call MterpCheckBefore # (self, shadow_frame)
6975 REFRESH_IBASE
6976 jmp .L_op_nop+(23*128)
6977
6978/* ------------------------------ */
6979 .balign 128
6980.L_ALT_op_const_wide: /* 0x18 */
6981/* File: x86/alt_stub.S */
6982/*
6983 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6984 * any interesting requests and then jump to the real instruction
6985 * handler. Unlike the Arm handler, we can't do this as a tail call
6986 * because rIBASE is caller save and we need to reload it.
6987 *
6988 * Note that unlike in the Arm implementation, we should never arrive
6989 * here with a zero breakFlag because we always refresh rIBASE on
6990 * return.
6991 */
6992 .extern MterpCheckBefore
6993 EXPORT_PC
6994
6995 movl rSELF, %ecx
6996 movl %ecx, OUT_ARG0(%esp)
6997 leal OFF_FP_SHADOWFRAME(rFP), %eax
6998 movl %eax, OUT_ARG1(%esp)
6999 call MterpCheckBefore # (self, shadow_frame)
7000 REFRESH_IBASE
7001 jmp .L_op_nop+(24*128)
7002
7003/* ------------------------------ */
7004 .balign 128
7005.L_ALT_op_const_wide_high16: /* 0x19 */
7006/* File: x86/alt_stub.S */
7007/*
7008 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7009 * any interesting requests and then jump to the real instruction
7010 * handler. Unlike the Arm handler, we can't do this as a tail call
7011 * because rIBASE is caller save and we need to reload it.
7012 *
7013 * Note that unlike in the Arm implementation, we should never arrive
7014 * here with a zero breakFlag because we always refresh rIBASE on
7015 * return.
7016 */
7017 .extern MterpCheckBefore
7018 EXPORT_PC
7019
7020 movl rSELF, %ecx
7021 movl %ecx, OUT_ARG0(%esp)
7022 leal OFF_FP_SHADOWFRAME(rFP), %eax
7023 movl %eax, OUT_ARG1(%esp)
7024 call MterpCheckBefore # (self, shadow_frame)
7025 REFRESH_IBASE
7026 jmp .L_op_nop+(25*128)
7027
7028/* ------------------------------ */
7029 .balign 128
7030.L_ALT_op_const_string: /* 0x1a */
7031/* File: x86/alt_stub.S */
7032/*
7033 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7034 * any interesting requests and then jump to the real instruction
7035 * handler. Unlike the Arm handler, we can't do this as a tail call
7036 * because rIBASE is caller save and we need to reload it.
7037 *
7038 * Note that unlike in the Arm implementation, we should never arrive
7039 * here with a zero breakFlag because we always refresh rIBASE on
7040 * return.
7041 */
7042 .extern MterpCheckBefore
7043 EXPORT_PC
7044
7045 movl rSELF, %ecx
7046 movl %ecx, OUT_ARG0(%esp)
7047 leal OFF_FP_SHADOWFRAME(rFP), %eax
7048 movl %eax, OUT_ARG1(%esp)
7049 call MterpCheckBefore # (self, shadow_frame)
7050 REFRESH_IBASE
7051 jmp .L_op_nop+(26*128)
7052
7053/* ------------------------------ */
7054 .balign 128
7055.L_ALT_op_const_string_jumbo: /* 0x1b */
7056/* File: x86/alt_stub.S */
7057/*
7058 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7059 * any interesting requests and then jump to the real instruction
7060 * handler. Unlike the Arm handler, we can't do this as a tail call
7061 * because rIBASE is caller save and we need to reload it.
7062 *
7063 * Note that unlike in the Arm implementation, we should never arrive
7064 * here with a zero breakFlag because we always refresh rIBASE on
7065 * return.
7066 */
7067 .extern MterpCheckBefore
7068 EXPORT_PC
7069
7070 movl rSELF, %ecx
7071 movl %ecx, OUT_ARG0(%esp)
7072 leal OFF_FP_SHADOWFRAME(rFP), %eax
7073 movl %eax, OUT_ARG1(%esp)
7074 call MterpCheckBefore # (self, shadow_frame)
7075 REFRESH_IBASE
7076 jmp .L_op_nop+(27*128)
7077
7078/* ------------------------------ */
7079 .balign 128
7080.L_ALT_op_const_class: /* 0x1c */
7081/* File: x86/alt_stub.S */
7082/*
7083 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7084 * any interesting requests and then jump to the real instruction
7085 * handler. Unlike the Arm handler, we can't do this as a tail call
7086 * because rIBASE is caller save and we need to reload it.
7087 *
7088 * Note that unlike in the Arm implementation, we should never arrive
7089 * here with a zero breakFlag because we always refresh rIBASE on
7090 * return.
7091 */
7092 .extern MterpCheckBefore
7093 EXPORT_PC
7094
7095 movl rSELF, %ecx
7096 movl %ecx, OUT_ARG0(%esp)
7097 leal OFF_FP_SHADOWFRAME(rFP), %eax
7098 movl %eax, OUT_ARG1(%esp)
7099 call MterpCheckBefore # (self, shadow_frame)
7100 REFRESH_IBASE
7101 jmp .L_op_nop+(28*128)
7102
7103/* ------------------------------ */
7104 .balign 128
7105.L_ALT_op_monitor_enter: /* 0x1d */
7106/* File: x86/alt_stub.S */
7107/*
7108 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7109 * any interesting requests and then jump to the real instruction
7110 * handler. Unlike the Arm handler, we can't do this as a tail call
7111 * because rIBASE is caller save and we need to reload it.
7112 *
7113 * Note that unlike in the Arm implementation, we should never arrive
7114 * here with a zero breakFlag because we always refresh rIBASE on
7115 * return.
7116 */
7117 .extern MterpCheckBefore
7118 EXPORT_PC
7119
7120 movl rSELF, %ecx
7121 movl %ecx, OUT_ARG0(%esp)
7122 leal OFF_FP_SHADOWFRAME(rFP), %eax
7123 movl %eax, OUT_ARG1(%esp)
7124 call MterpCheckBefore # (self, shadow_frame)
7125 REFRESH_IBASE
7126 jmp .L_op_nop+(29*128)
7127
7128/* ------------------------------ */
7129 .balign 128
7130.L_ALT_op_monitor_exit: /* 0x1e */
7131/* File: x86/alt_stub.S */
7132/*
7133 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7134 * any interesting requests and then jump to the real instruction
7135 * handler. Unlike the Arm handler, we can't do this as a tail call
7136 * because rIBASE is caller save and we need to reload it.
7137 *
7138 * Note that unlike in the Arm implementation, we should never arrive
7139 * here with a zero breakFlag because we always refresh rIBASE on
7140 * return.
7141 */
7142 .extern MterpCheckBefore
7143 EXPORT_PC
7144
7145 movl rSELF, %ecx
7146 movl %ecx, OUT_ARG0(%esp)
7147 leal OFF_FP_SHADOWFRAME(rFP), %eax
7148 movl %eax, OUT_ARG1(%esp)
7149 call MterpCheckBefore # (self, shadow_frame)
7150 REFRESH_IBASE
7151 jmp .L_op_nop+(30*128)
7152
7153/* ------------------------------ */
7154 .balign 128
7155.L_ALT_op_check_cast: /* 0x1f */
7156/* File: x86/alt_stub.S */
7157/*
7158 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7159 * any interesting requests and then jump to the real instruction
7160 * handler. Unlike the Arm handler, we can't do this as a tail call
7161 * because rIBASE is caller save and we need to reload it.
7162 *
7163 * Note that unlike in the Arm implementation, we should never arrive
7164 * here with a zero breakFlag because we always refresh rIBASE on
7165 * return.
7166 */
7167 .extern MterpCheckBefore
7168 EXPORT_PC
7169
7170 movl rSELF, %ecx
7171 movl %ecx, OUT_ARG0(%esp)
7172 leal OFF_FP_SHADOWFRAME(rFP), %eax
7173 movl %eax, OUT_ARG1(%esp)
7174 call MterpCheckBefore # (self, shadow_frame)
7175 REFRESH_IBASE
7176 jmp .L_op_nop+(31*128)
7177
7178/* ------------------------------ */
7179 .balign 128
7180.L_ALT_op_instance_of: /* 0x20 */
7181/* File: x86/alt_stub.S */
7182/*
7183 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7184 * any interesting requests and then jump to the real instruction
7185 * handler. Unlike the Arm handler, we can't do this as a tail call
7186 * because rIBASE is caller save and we need to reload it.
7187 *
7188 * Note that unlike in the Arm implementation, we should never arrive
7189 * here with a zero breakFlag because we always refresh rIBASE on
7190 * return.
7191 */
7192 .extern MterpCheckBefore
7193 EXPORT_PC
7194
7195 movl rSELF, %ecx
7196 movl %ecx, OUT_ARG0(%esp)
7197 leal OFF_FP_SHADOWFRAME(rFP), %eax
7198 movl %eax, OUT_ARG1(%esp)
7199 call MterpCheckBefore # (self, shadow_frame)
7200 REFRESH_IBASE
7201 jmp .L_op_nop+(32*128)
7202
7203/* ------------------------------ */
7204 .balign 128
7205.L_ALT_op_array_length: /* 0x21 */
7206/* File: x86/alt_stub.S */
7207/*
7208 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7209 * any interesting requests and then jump to the real instruction
7210 * handler. Unlike the Arm handler, we can't do this as a tail call
7211 * because rIBASE is caller save and we need to reload it.
7212 *
7213 * Note that unlike in the Arm implementation, we should never arrive
7214 * here with a zero breakFlag because we always refresh rIBASE on
7215 * return.
7216 */
7217 .extern MterpCheckBefore
7218 EXPORT_PC
7219
7220 movl rSELF, %ecx
7221 movl %ecx, OUT_ARG0(%esp)
7222 leal OFF_FP_SHADOWFRAME(rFP), %eax
7223 movl %eax, OUT_ARG1(%esp)
7224 call MterpCheckBefore # (self, shadow_frame)
7225 REFRESH_IBASE
7226 jmp .L_op_nop+(33*128)
7227
7228/* ------------------------------ */
7229 .balign 128
7230.L_ALT_op_new_instance: /* 0x22 */
7231/* File: x86/alt_stub.S */
7232/*
7233 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7234 * any interesting requests and then jump to the real instruction
7235 * handler. Unlike the Arm handler, we can't do this as a tail call
7236 * because rIBASE is caller save and we need to reload it.
7237 *
7238 * Note that unlike in the Arm implementation, we should never arrive
7239 * here with a zero breakFlag because we always refresh rIBASE on
7240 * return.
7241 */
7242 .extern MterpCheckBefore
7243 EXPORT_PC
7244
7245 movl rSELF, %ecx
7246 movl %ecx, OUT_ARG0(%esp)
7247 leal OFF_FP_SHADOWFRAME(rFP), %eax
7248 movl %eax, OUT_ARG1(%esp)
7249 call MterpCheckBefore # (self, shadow_frame)
7250 REFRESH_IBASE
7251 jmp .L_op_nop+(34*128)
7252
7253/* ------------------------------ */
7254 .balign 128
7255.L_ALT_op_new_array: /* 0x23 */
7256/* File: x86/alt_stub.S */
7257/*
7258 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7259 * any interesting requests and then jump to the real instruction
7260 * handler. Unlike the Arm handler, we can't do this as a tail call
7261 * because rIBASE is caller save and we need to reload it.
7262 *
7263 * Note that unlike in the Arm implementation, we should never arrive
7264 * here with a zero breakFlag because we always refresh rIBASE on
7265 * return.
7266 */
7267 .extern MterpCheckBefore
7268 EXPORT_PC
7269
7270 movl rSELF, %ecx
7271 movl %ecx, OUT_ARG0(%esp)
7272 leal OFF_FP_SHADOWFRAME(rFP), %eax
7273 movl %eax, OUT_ARG1(%esp)
7274 call MterpCheckBefore # (self, shadow_frame)
7275 REFRESH_IBASE
7276 jmp .L_op_nop+(35*128)
7277
7278/* ------------------------------ */
7279 .balign 128
7280.L_ALT_op_filled_new_array: /* 0x24 */
7281/* File: x86/alt_stub.S */
7282/*
7283 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7284 * any interesting requests and then jump to the real instruction
7285 * handler. Unlike the Arm handler, we can't do this as a tail call
7286 * because rIBASE is caller save and we need to reload it.
7287 *
7288 * Note that unlike in the Arm implementation, we should never arrive
7289 * here with a zero breakFlag because we always refresh rIBASE on
7290 * return.
7291 */
7292 .extern MterpCheckBefore
7293 EXPORT_PC
7294
7295 movl rSELF, %ecx
7296 movl %ecx, OUT_ARG0(%esp)
7297 leal OFF_FP_SHADOWFRAME(rFP), %eax
7298 movl %eax, OUT_ARG1(%esp)
7299 call MterpCheckBefore # (self, shadow_frame)
7300 REFRESH_IBASE
7301 jmp .L_op_nop+(36*128)
7302
7303/* ------------------------------ */
7304 .balign 128
7305.L_ALT_op_filled_new_array_range: /* 0x25 */
7306/* File: x86/alt_stub.S */
7307/*
7308 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7309 * any interesting requests and then jump to the real instruction
7310 * handler. Unlike the Arm handler, we can't do this as a tail call
7311 * because rIBASE is caller save and we need to reload it.
7312 *
7313 * Note that unlike in the Arm implementation, we should never arrive
7314 * here with a zero breakFlag because we always refresh rIBASE on
7315 * return.
7316 */
7317 .extern MterpCheckBefore
7318 EXPORT_PC
7319
7320 movl rSELF, %ecx
7321 movl %ecx, OUT_ARG0(%esp)
7322 leal OFF_FP_SHADOWFRAME(rFP), %eax
7323 movl %eax, OUT_ARG1(%esp)
7324 call MterpCheckBefore # (self, shadow_frame)
7325 REFRESH_IBASE
7326 jmp .L_op_nop+(37*128)
7327
7328/* ------------------------------ */
7329 .balign 128
7330.L_ALT_op_fill_array_data: /* 0x26 */
7331/* File: x86/alt_stub.S */
7332/*
7333 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7334 * any interesting requests and then jump to the real instruction
7335 * handler. Unlike the Arm handler, we can't do this as a tail call
7336 * because rIBASE is caller save and we need to reload it.
7337 *
7338 * Note that unlike in the Arm implementation, we should never arrive
7339 * here with a zero breakFlag because we always refresh rIBASE on
7340 * return.
7341 */
7342 .extern MterpCheckBefore
7343 EXPORT_PC
7344
7345 movl rSELF, %ecx
7346 movl %ecx, OUT_ARG0(%esp)
7347 leal OFF_FP_SHADOWFRAME(rFP), %eax
7348 movl %eax, OUT_ARG1(%esp)
7349 call MterpCheckBefore # (self, shadow_frame)
7350 REFRESH_IBASE
7351 jmp .L_op_nop+(38*128)
7352
7353/* ------------------------------ */
7354 .balign 128
7355.L_ALT_op_throw: /* 0x27 */
7356/* File: x86/alt_stub.S */
7357/*
7358 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7359 * any interesting requests and then jump to the real instruction
7360 * handler. Unlike the Arm handler, we can't do this as a tail call
7361 * because rIBASE is caller save and we need to reload it.
7362 *
7363 * Note that unlike in the Arm implementation, we should never arrive
7364 * here with a zero breakFlag because we always refresh rIBASE on
7365 * return.
7366 */
7367 .extern MterpCheckBefore
7368 EXPORT_PC
7369
7370 movl rSELF, %ecx
7371 movl %ecx, OUT_ARG0(%esp)
7372 leal OFF_FP_SHADOWFRAME(rFP), %eax
7373 movl %eax, OUT_ARG1(%esp)
7374 call MterpCheckBefore # (self, shadow_frame)
7375 REFRESH_IBASE
7376 jmp .L_op_nop+(39*128)
7377
7378/* ------------------------------ */
7379 .balign 128
7380.L_ALT_op_goto: /* 0x28 */
7381/* File: x86/alt_stub.S */
7382/*
7383 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7384 * any interesting requests and then jump to the real instruction
7385 * handler. Unlike the Arm handler, we can't do this as a tail call
7386 * because rIBASE is caller save and we need to reload it.
7387 *
7388 * Note that unlike in the Arm implementation, we should never arrive
7389 * here with a zero breakFlag because we always refresh rIBASE on
7390 * return.
7391 */
7392 .extern MterpCheckBefore
7393 EXPORT_PC
7394
7395 movl rSELF, %ecx
7396 movl %ecx, OUT_ARG0(%esp)
7397 leal OFF_FP_SHADOWFRAME(rFP), %eax
7398 movl %eax, OUT_ARG1(%esp)
7399 call MterpCheckBefore # (self, shadow_frame)
7400 REFRESH_IBASE
7401 jmp .L_op_nop+(40*128)
7402
7403/* ------------------------------ */
7404 .balign 128
7405.L_ALT_op_goto_16: /* 0x29 */
7406/* File: x86/alt_stub.S */
7407/*
7408 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7409 * any interesting requests and then jump to the real instruction
7410 * handler. Unlike the Arm handler, we can't do this as a tail call
7411 * because rIBASE is caller save and we need to reload it.
7412 *
7413 * Note that unlike in the Arm implementation, we should never arrive
7414 * here with a zero breakFlag because we always refresh rIBASE on
7415 * return.
7416 */
7417 .extern MterpCheckBefore
7418 EXPORT_PC
7419
7420 movl rSELF, %ecx
7421 movl %ecx, OUT_ARG0(%esp)
7422 leal OFF_FP_SHADOWFRAME(rFP), %eax
7423 movl %eax, OUT_ARG1(%esp)
7424 call MterpCheckBefore # (self, shadow_frame)
7425 REFRESH_IBASE
7426 jmp .L_op_nop+(41*128)
7427
7428/* ------------------------------ */
7429 .balign 128
7430.L_ALT_op_goto_32: /* 0x2a */
7431/* File: x86/alt_stub.S */
7432/*
7433 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7434 * any interesting requests and then jump to the real instruction
7435 * handler. Unlike the Arm handler, we can't do this as a tail call
7436 * because rIBASE is caller save and we need to reload it.
7437 *
7438 * Note that unlike in the Arm implementation, we should never arrive
7439 * here with a zero breakFlag because we always refresh rIBASE on
7440 * return.
7441 */
7442 .extern MterpCheckBefore
7443 EXPORT_PC
7444
7445 movl rSELF, %ecx
7446 movl %ecx, OUT_ARG0(%esp)
7447 leal OFF_FP_SHADOWFRAME(rFP), %eax
7448 movl %eax, OUT_ARG1(%esp)
7449 call MterpCheckBefore # (self, shadow_frame)
7450 REFRESH_IBASE
7451 jmp .L_op_nop+(42*128)
7452
7453/* ------------------------------ */
7454 .balign 128
7455.L_ALT_op_packed_switch: /* 0x2b */
7456/* File: x86/alt_stub.S */
7457/*
7458 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7459 * any interesting requests and then jump to the real instruction
7460 * handler. Unlike the Arm handler, we can't do this as a tail call
7461 * because rIBASE is caller save and we need to reload it.
7462 *
7463 * Note that unlike in the Arm implementation, we should never arrive
7464 * here with a zero breakFlag because we always refresh rIBASE on
7465 * return.
7466 */
7467 .extern MterpCheckBefore
7468 EXPORT_PC
7469
7470 movl rSELF, %ecx
7471 movl %ecx, OUT_ARG0(%esp)
7472 leal OFF_FP_SHADOWFRAME(rFP), %eax
7473 movl %eax, OUT_ARG1(%esp)
7474 call MterpCheckBefore # (self, shadow_frame)
7475 REFRESH_IBASE
7476 jmp .L_op_nop+(43*128)
7477
7478/* ------------------------------ */
7479 .balign 128
7480.L_ALT_op_sparse_switch: /* 0x2c */
7481/* File: x86/alt_stub.S */
7482/*
7483 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7484 * any interesting requests and then jump to the real instruction
7485 * handler. Unlike the Arm handler, we can't do this as a tail call
7486 * because rIBASE is caller save and we need to reload it.
7487 *
7488 * Note that unlike in the Arm implementation, we should never arrive
7489 * here with a zero breakFlag because we always refresh rIBASE on
7490 * return.
7491 */
7492 .extern MterpCheckBefore
7493 EXPORT_PC
7494
7495 movl rSELF, %ecx
7496 movl %ecx, OUT_ARG0(%esp)
7497 leal OFF_FP_SHADOWFRAME(rFP), %eax
7498 movl %eax, OUT_ARG1(%esp)
7499 call MterpCheckBefore # (self, shadow_frame)
7500 REFRESH_IBASE
7501 jmp .L_op_nop+(44*128)
7502
7503/* ------------------------------ */
7504 .balign 128
7505.L_ALT_op_cmpl_float: /* 0x2d */
7506/* File: x86/alt_stub.S */
7507/*
7508 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7509 * any interesting requests and then jump to the real instruction
7510 * handler. Unlike the Arm handler, we can't do this as a tail call
7511 * because rIBASE is caller save and we need to reload it.
7512 *
7513 * Note that unlike in the Arm implementation, we should never arrive
7514 * here with a zero breakFlag because we always refresh rIBASE on
7515 * return.
7516 */
7517 .extern MterpCheckBefore
7518 EXPORT_PC
7519
7520 movl rSELF, %ecx
7521 movl %ecx, OUT_ARG0(%esp)
7522 leal OFF_FP_SHADOWFRAME(rFP), %eax
7523 movl %eax, OUT_ARG1(%esp)
7524 call MterpCheckBefore # (self, shadow_frame)
7525 REFRESH_IBASE
7526 jmp .L_op_nop+(45*128)
7527
7528/* ------------------------------ */
7529 .balign 128
7530.L_ALT_op_cmpg_float: /* 0x2e */
7531/* File: x86/alt_stub.S */
7532/*
7533 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7534 * any interesting requests and then jump to the real instruction
7535 * handler. Unlike the Arm handler, we can't do this as a tail call
7536 * because rIBASE is caller save and we need to reload it.
7537 *
7538 * Note that unlike in the Arm implementation, we should never arrive
7539 * here with a zero breakFlag because we always refresh rIBASE on
7540 * return.
7541 */
7542 .extern MterpCheckBefore
7543 EXPORT_PC
7544
7545 movl rSELF, %ecx
7546 movl %ecx, OUT_ARG0(%esp)
7547 leal OFF_FP_SHADOWFRAME(rFP), %eax
7548 movl %eax, OUT_ARG1(%esp)
7549 call MterpCheckBefore # (self, shadow_frame)
7550 REFRESH_IBASE
7551 jmp .L_op_nop+(46*128)
7552
7553/* ------------------------------ */
7554 .balign 128
7555.L_ALT_op_cmpl_double: /* 0x2f */
7556/* File: x86/alt_stub.S */
7557/*
7558 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7559 * any interesting requests and then jump to the real instruction
7560 * handler. Unlike the Arm handler, we can't do this as a tail call
7561 * because rIBASE is caller save and we need to reload it.
7562 *
7563 * Note that unlike in the Arm implementation, we should never arrive
7564 * here with a zero breakFlag because we always refresh rIBASE on
7565 * return.
7566 */
7567 .extern MterpCheckBefore
7568 EXPORT_PC
7569
7570 movl rSELF, %ecx
7571 movl %ecx, OUT_ARG0(%esp)
7572 leal OFF_FP_SHADOWFRAME(rFP), %eax
7573 movl %eax, OUT_ARG1(%esp)
7574 call MterpCheckBefore # (self, shadow_frame)
7575 REFRESH_IBASE
7576 jmp .L_op_nop+(47*128)
7577
7578/* ------------------------------ */
7579 .balign 128
7580.L_ALT_op_cmpg_double: /* 0x30 */
7581/* File: x86/alt_stub.S */
7582/*
7583 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7584 * any interesting requests and then jump to the real instruction
7585 * handler. Unlike the Arm handler, we can't do this as a tail call
7586 * because rIBASE is caller save and we need to reload it.
7587 *
7588 * Note that unlike in the Arm implementation, we should never arrive
7589 * here with a zero breakFlag because we always refresh rIBASE on
7590 * return.
7591 */
7592 .extern MterpCheckBefore
7593 EXPORT_PC
7594
7595 movl rSELF, %ecx
7596 movl %ecx, OUT_ARG0(%esp)
7597 leal OFF_FP_SHADOWFRAME(rFP), %eax
7598 movl %eax, OUT_ARG1(%esp)
7599 call MterpCheckBefore # (self, shadow_frame)
7600 REFRESH_IBASE
7601 jmp .L_op_nop+(48*128)
7602
7603/* ------------------------------ */
7604 .balign 128
7605.L_ALT_op_cmp_long: /* 0x31 */
7606/* File: x86/alt_stub.S */
7607/*
7608 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7609 * any interesting requests and then jump to the real instruction
7610 * handler. Unlike the Arm handler, we can't do this as a tail call
7611 * because rIBASE is caller save and we need to reload it.
7612 *
7613 * Note that unlike in the Arm implementation, we should never arrive
7614 * here with a zero breakFlag because we always refresh rIBASE on
7615 * return.
7616 */
7617 .extern MterpCheckBefore
7618 EXPORT_PC
7619
7620 movl rSELF, %ecx
7621 movl %ecx, OUT_ARG0(%esp)
7622 leal OFF_FP_SHADOWFRAME(rFP), %eax
7623 movl %eax, OUT_ARG1(%esp)
7624 call MterpCheckBefore # (self, shadow_frame)
7625 REFRESH_IBASE
7626 jmp .L_op_nop+(49*128)
7627
7628/* ------------------------------ */
7629 .balign 128
7630.L_ALT_op_if_eq: /* 0x32 */
7631/* File: x86/alt_stub.S */
7632/*
7633 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7634 * any interesting requests and then jump to the real instruction
7635 * handler. Unlike the Arm handler, we can't do this as a tail call
7636 * because rIBASE is caller save and we need to reload it.
7637 *
7638 * Note that unlike in the Arm implementation, we should never arrive
7639 * here with a zero breakFlag because we always refresh rIBASE on
7640 * return.
7641 */
7642 .extern MterpCheckBefore
7643 EXPORT_PC
7644
7645 movl rSELF, %ecx
7646 movl %ecx, OUT_ARG0(%esp)
7647 leal OFF_FP_SHADOWFRAME(rFP), %eax
7648 movl %eax, OUT_ARG1(%esp)
7649 call MterpCheckBefore # (self, shadow_frame)
7650 REFRESH_IBASE
7651 jmp .L_op_nop+(50*128)
7652
7653/* ------------------------------ */
7654 .balign 128
7655.L_ALT_op_if_ne: /* 0x33 */
7656/* File: x86/alt_stub.S */
7657/*
7658 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7659 * any interesting requests and then jump to the real instruction
7660 * handler. Unlike the Arm handler, we can't do this as a tail call
7661 * because rIBASE is caller save and we need to reload it.
7662 *
7663 * Note that unlike in the Arm implementation, we should never arrive
7664 * here with a zero breakFlag because we always refresh rIBASE on
7665 * return.
7666 */
7667 .extern MterpCheckBefore
7668 EXPORT_PC
7669
7670 movl rSELF, %ecx
7671 movl %ecx, OUT_ARG0(%esp)
7672 leal OFF_FP_SHADOWFRAME(rFP), %eax
7673 movl %eax, OUT_ARG1(%esp)
7674 call MterpCheckBefore # (self, shadow_frame)
7675 REFRESH_IBASE
7676 jmp .L_op_nop+(51*128)
7677
7678/* ------------------------------ */
7679 .balign 128
7680.L_ALT_op_if_lt: /* 0x34 */
7681/* File: x86/alt_stub.S */
7682/*
7683 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7684 * any interesting requests and then jump to the real instruction
7685 * handler. Unlike the Arm handler, we can't do this as a tail call
7686 * because rIBASE is caller save and we need to reload it.
7687 *
7688 * Note that unlike in the Arm implementation, we should never arrive
7689 * here with a zero breakFlag because we always refresh rIBASE on
7690 * return.
7691 */
7692 .extern MterpCheckBefore
7693 EXPORT_PC
7694
7695 movl rSELF, %ecx
7696 movl %ecx, OUT_ARG0(%esp)
7697 leal OFF_FP_SHADOWFRAME(rFP), %eax
7698 movl %eax, OUT_ARG1(%esp)
7699 call MterpCheckBefore # (self, shadow_frame)
7700 REFRESH_IBASE
7701 jmp .L_op_nop+(52*128)
7702
7703/* ------------------------------ */
7704 .balign 128
7705.L_ALT_op_if_ge: /* 0x35 */
7706/* File: x86/alt_stub.S */
7707/*
7708 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7709 * any interesting requests and then jump to the real instruction
7710 * handler. Unlike the Arm handler, we can't do this as a tail call
7711 * because rIBASE is caller save and we need to reload it.
7712 *
7713 * Note that unlike in the Arm implementation, we should never arrive
7714 * here with a zero breakFlag because we always refresh rIBASE on
7715 * return.
7716 */
7717 .extern MterpCheckBefore
7718 EXPORT_PC
7719
7720 movl rSELF, %ecx
7721 movl %ecx, OUT_ARG0(%esp)
7722 leal OFF_FP_SHADOWFRAME(rFP), %eax
7723 movl %eax, OUT_ARG1(%esp)
7724 call MterpCheckBefore # (self, shadow_frame)
7725 REFRESH_IBASE
7726 jmp .L_op_nop+(53*128)
7727
7728/* ------------------------------ */
7729 .balign 128
7730.L_ALT_op_if_gt: /* 0x36 */
7731/* File: x86/alt_stub.S */
7732/*
7733 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7734 * any interesting requests and then jump to the real instruction
7735 * handler. Unlike the Arm handler, we can't do this as a tail call
7736 * because rIBASE is caller save and we need to reload it.
7737 *
7738 * Note that unlike in the Arm implementation, we should never arrive
7739 * here with a zero breakFlag because we always refresh rIBASE on
7740 * return.
7741 */
7742 .extern MterpCheckBefore
7743 EXPORT_PC
7744
7745 movl rSELF, %ecx
7746 movl %ecx, OUT_ARG0(%esp)
7747 leal OFF_FP_SHADOWFRAME(rFP), %eax
7748 movl %eax, OUT_ARG1(%esp)
7749 call MterpCheckBefore # (self, shadow_frame)
7750 REFRESH_IBASE
7751 jmp .L_op_nop+(54*128)
7752
7753/* ------------------------------ */
7754 .balign 128
7755.L_ALT_op_if_le: /* 0x37 */
7756/* File: x86/alt_stub.S */
7757/*
7758 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7759 * any interesting requests and then jump to the real instruction
7760 * handler. Unlike the Arm handler, we can't do this as a tail call
7761 * because rIBASE is caller save and we need to reload it.
7762 *
7763 * Note that unlike in the Arm implementation, we should never arrive
7764 * here with a zero breakFlag because we always refresh rIBASE on
7765 * return.
7766 */
7767 .extern MterpCheckBefore
7768 EXPORT_PC
7769
7770 movl rSELF, %ecx
7771 movl %ecx, OUT_ARG0(%esp)
7772 leal OFF_FP_SHADOWFRAME(rFP), %eax
7773 movl %eax, OUT_ARG1(%esp)
7774 call MterpCheckBefore # (self, shadow_frame)
7775 REFRESH_IBASE
7776 jmp .L_op_nop+(55*128)
7777
7778/* ------------------------------ */
7779 .balign 128
7780.L_ALT_op_if_eqz: /* 0x38 */
7781/* File: x86/alt_stub.S */
7782/*
7783 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7784 * any interesting requests and then jump to the real instruction
7785 * handler. Unlike the Arm handler, we can't do this as a tail call
7786 * because rIBASE is caller save and we need to reload it.
7787 *
7788 * Note that unlike in the Arm implementation, we should never arrive
7789 * here with a zero breakFlag because we always refresh rIBASE on
7790 * return.
7791 */
7792 .extern MterpCheckBefore
7793 EXPORT_PC
7794
7795 movl rSELF, %ecx
7796 movl %ecx, OUT_ARG0(%esp)
7797 leal OFF_FP_SHADOWFRAME(rFP), %eax
7798 movl %eax, OUT_ARG1(%esp)
7799 call MterpCheckBefore # (self, shadow_frame)
7800 REFRESH_IBASE
7801 jmp .L_op_nop+(56*128)
7802
7803/* ------------------------------ */
7804 .balign 128
7805.L_ALT_op_if_nez: /* 0x39 */
7806/* File: x86/alt_stub.S */
7807/*
7808 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7809 * any interesting requests and then jump to the real instruction
7810 * handler. Unlike the Arm handler, we can't do this as a tail call
7811 * because rIBASE is caller save and we need to reload it.
7812 *
7813 * Note that unlike in the Arm implementation, we should never arrive
7814 * here with a zero breakFlag because we always refresh rIBASE on
7815 * return.
7816 */
7817 .extern MterpCheckBefore
7818 EXPORT_PC
7819
7820 movl rSELF, %ecx
7821 movl %ecx, OUT_ARG0(%esp)
7822 leal OFF_FP_SHADOWFRAME(rFP), %eax
7823 movl %eax, OUT_ARG1(%esp)
7824 call MterpCheckBefore # (self, shadow_frame)
7825 REFRESH_IBASE
7826 jmp .L_op_nop+(57*128)
7827
7828/* ------------------------------ */
7829 .balign 128
7830.L_ALT_op_if_ltz: /* 0x3a */
7831/* File: x86/alt_stub.S */
7832/*
7833 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7834 * any interesting requests and then jump to the real instruction
7835 * handler. Unlike the Arm handler, we can't do this as a tail call
7836 * because rIBASE is caller save and we need to reload it.
7837 *
7838 * Note that unlike in the Arm implementation, we should never arrive
7839 * here with a zero breakFlag because we always refresh rIBASE on
7840 * return.
7841 */
7842 .extern MterpCheckBefore
7843 EXPORT_PC
7844
7845 movl rSELF, %ecx
7846 movl %ecx, OUT_ARG0(%esp)
7847 leal OFF_FP_SHADOWFRAME(rFP), %eax
7848 movl %eax, OUT_ARG1(%esp)
7849 call MterpCheckBefore # (self, shadow_frame)
7850 REFRESH_IBASE
7851 jmp .L_op_nop+(58*128)
7852
7853/* ------------------------------ */
7854 .balign 128
7855.L_ALT_op_if_gez: /* 0x3b */
7856/* File: x86/alt_stub.S */
7857/*
7858 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7859 * any interesting requests and then jump to the real instruction
7860 * handler. Unlike the Arm handler, we can't do this as a tail call
7861 * because rIBASE is caller save and we need to reload it.
7862 *
7863 * Note that unlike in the Arm implementation, we should never arrive
7864 * here with a zero breakFlag because we always refresh rIBASE on
7865 * return.
7866 */
7867 .extern MterpCheckBefore
7868 EXPORT_PC
7869
7870 movl rSELF, %ecx
7871 movl %ecx, OUT_ARG0(%esp)
7872 leal OFF_FP_SHADOWFRAME(rFP), %eax
7873 movl %eax, OUT_ARG1(%esp)
7874 call MterpCheckBefore # (self, shadow_frame)
7875 REFRESH_IBASE
7876 jmp .L_op_nop+(59*128)
7877
7878/* ------------------------------ */
7879 .balign 128
7880.L_ALT_op_if_gtz: /* 0x3c */
7881/* File: x86/alt_stub.S */
7882/*
7883 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7884 * any interesting requests and then jump to the real instruction
7885 * handler. Unlike the Arm handler, we can't do this as a tail call
7886 * because rIBASE is caller save and we need to reload it.
7887 *
7888 * Note that unlike in the Arm implementation, we should never arrive
7889 * here with a zero breakFlag because we always refresh rIBASE on
7890 * return.
7891 */
7892 .extern MterpCheckBefore
7893 EXPORT_PC
7894
7895 movl rSELF, %ecx
7896 movl %ecx, OUT_ARG0(%esp)
7897 leal OFF_FP_SHADOWFRAME(rFP), %eax
7898 movl %eax, OUT_ARG1(%esp)
7899 call MterpCheckBefore # (self, shadow_frame)
7900 REFRESH_IBASE
7901 jmp .L_op_nop+(60*128)
7902
7903/* ------------------------------ */
7904 .balign 128
7905.L_ALT_op_if_lez: /* 0x3d */
7906/* File: x86/alt_stub.S */
7907/*
7908 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7909 * any interesting requests and then jump to the real instruction
7910 * handler. Unlike the Arm handler, we can't do this as a tail call
7911 * because rIBASE is caller save and we need to reload it.
7912 *
7913 * Note that unlike in the Arm implementation, we should never arrive
7914 * here with a zero breakFlag because we always refresh rIBASE on
7915 * return.
7916 */
7917 .extern MterpCheckBefore
7918 EXPORT_PC
7919
7920 movl rSELF, %ecx
7921 movl %ecx, OUT_ARG0(%esp)
7922 leal OFF_FP_SHADOWFRAME(rFP), %eax
7923 movl %eax, OUT_ARG1(%esp)
7924 call MterpCheckBefore # (self, shadow_frame)
7925 REFRESH_IBASE
7926 jmp .L_op_nop+(61*128)
7927
7928/* ------------------------------ */
7929 .balign 128
7930.L_ALT_op_unused_3e: /* 0x3e */
7931/* File: x86/alt_stub.S */
7932/*
7933 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7934 * any interesting requests and then jump to the real instruction
7935 * handler. Unlike the Arm handler, we can't do this as a tail call
7936 * because rIBASE is caller save and we need to reload it.
7937 *
7938 * Note that unlike in the Arm implementation, we should never arrive
7939 * here with a zero breakFlag because we always refresh rIBASE on
7940 * return.
7941 */
7942 .extern MterpCheckBefore
7943 EXPORT_PC
7944
7945 movl rSELF, %ecx
7946 movl %ecx, OUT_ARG0(%esp)
7947 leal OFF_FP_SHADOWFRAME(rFP), %eax
7948 movl %eax, OUT_ARG1(%esp)
7949 call MterpCheckBefore # (self, shadow_frame)
7950 REFRESH_IBASE
7951 jmp .L_op_nop+(62*128)
7952
7953/* ------------------------------ */
7954 .balign 128
7955.L_ALT_op_unused_3f: /* 0x3f */
7956/* File: x86/alt_stub.S */
7957/*
7958 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7959 * any interesting requests and then jump to the real instruction
7960 * handler. Unlike the Arm handler, we can't do this as a tail call
7961 * because rIBASE is caller save and we need to reload it.
7962 *
7963 * Note that unlike in the Arm implementation, we should never arrive
7964 * here with a zero breakFlag because we always refresh rIBASE on
7965 * return.
7966 */
7967 .extern MterpCheckBefore
7968 EXPORT_PC
7969
7970 movl rSELF, %ecx
7971 movl %ecx, OUT_ARG0(%esp)
7972 leal OFF_FP_SHADOWFRAME(rFP), %eax
7973 movl %eax, OUT_ARG1(%esp)
7974 call MterpCheckBefore # (self, shadow_frame)
7975 REFRESH_IBASE
7976 jmp .L_op_nop+(63*128)
7977
7978/* ------------------------------ */
7979 .balign 128
7980.L_ALT_op_unused_40: /* 0x40 */
7981/* File: x86/alt_stub.S */
7982/*
7983 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7984 * any interesting requests and then jump to the real instruction
7985 * handler. Unlike the Arm handler, we can't do this as a tail call
7986 * because rIBASE is caller save and we need to reload it.
7987 *
7988 * Note that unlike in the Arm implementation, we should never arrive
7989 * here with a zero breakFlag because we always refresh rIBASE on
7990 * return.
7991 */
7992 .extern MterpCheckBefore
7993 EXPORT_PC
7994
7995 movl rSELF, %ecx
7996 movl %ecx, OUT_ARG0(%esp)
7997 leal OFF_FP_SHADOWFRAME(rFP), %eax
7998 movl %eax, OUT_ARG1(%esp)
7999 call MterpCheckBefore # (self, shadow_frame)
8000 REFRESH_IBASE
8001 jmp .L_op_nop+(64*128)
8002
8003/* ------------------------------ */
8004 .balign 128
8005.L_ALT_op_unused_41: /* 0x41 */
8006/* File: x86/alt_stub.S */
8007/*
8008 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8009 * any interesting requests and then jump to the real instruction
8010 * handler. Unlike the Arm handler, we can't do this as a tail call
8011 * because rIBASE is caller save and we need to reload it.
8012 *
8013 * Note that unlike in the Arm implementation, we should never arrive
8014 * here with a zero breakFlag because we always refresh rIBASE on
8015 * return.
8016 */
8017 .extern MterpCheckBefore
8018 EXPORT_PC
8019
8020 movl rSELF, %ecx
8021 movl %ecx, OUT_ARG0(%esp)
8022 leal OFF_FP_SHADOWFRAME(rFP), %eax
8023 movl %eax, OUT_ARG1(%esp)
8024 call MterpCheckBefore # (self, shadow_frame)
8025 REFRESH_IBASE
8026 jmp .L_op_nop+(65*128)
8027
8028/* ------------------------------ */
8029 .balign 128
8030.L_ALT_op_unused_42: /* 0x42 */
8031/* File: x86/alt_stub.S */
8032/*
8033 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8034 * any interesting requests and then jump to the real instruction
8035 * handler. Unlike the Arm handler, we can't do this as a tail call
8036 * because rIBASE is caller save and we need to reload it.
8037 *
8038 * Note that unlike in the Arm implementation, we should never arrive
8039 * here with a zero breakFlag because we always refresh rIBASE on
8040 * return.
8041 */
8042 .extern MterpCheckBefore
8043 EXPORT_PC
8044
8045 movl rSELF, %ecx
8046 movl %ecx, OUT_ARG0(%esp)
8047 leal OFF_FP_SHADOWFRAME(rFP), %eax
8048 movl %eax, OUT_ARG1(%esp)
8049 call MterpCheckBefore # (self, shadow_frame)
8050 REFRESH_IBASE
8051 jmp .L_op_nop+(66*128)
8052
8053/* ------------------------------ */
8054 .balign 128
8055.L_ALT_op_unused_43: /* 0x43 */
8056/* File: x86/alt_stub.S */
8057/*
8058 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8059 * any interesting requests and then jump to the real instruction
8060 * handler. Unlike the Arm handler, we can't do this as a tail call
8061 * because rIBASE is caller save and we need to reload it.
8062 *
8063 * Note that unlike in the Arm implementation, we should never arrive
8064 * here with a zero breakFlag because we always refresh rIBASE on
8065 * return.
8066 */
8067 .extern MterpCheckBefore
8068 EXPORT_PC
8069
8070 movl rSELF, %ecx
8071 movl %ecx, OUT_ARG0(%esp)
8072 leal OFF_FP_SHADOWFRAME(rFP), %eax
8073 movl %eax, OUT_ARG1(%esp)
8074 call MterpCheckBefore # (self, shadow_frame)
8075 REFRESH_IBASE
8076 jmp .L_op_nop+(67*128)
8077
8078/* ------------------------------ */
8079 .balign 128
8080.L_ALT_op_aget: /* 0x44 */
8081/* File: x86/alt_stub.S */
8082/*
8083 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8084 * any interesting requests and then jump to the real instruction
8085 * handler. Unlike the Arm handler, we can't do this as a tail call
8086 * because rIBASE is caller save and we need to reload it.
8087 *
8088 * Note that unlike in the Arm implementation, we should never arrive
8089 * here with a zero breakFlag because we always refresh rIBASE on
8090 * return.
8091 */
8092 .extern MterpCheckBefore
8093 EXPORT_PC
8094
8095 movl rSELF, %ecx
8096 movl %ecx, OUT_ARG0(%esp)
8097 leal OFF_FP_SHADOWFRAME(rFP), %eax
8098 movl %eax, OUT_ARG1(%esp)
8099 call MterpCheckBefore # (self, shadow_frame)
8100 REFRESH_IBASE
8101 jmp .L_op_nop+(68*128)
8102
8103/* ------------------------------ */
8104 .balign 128
8105.L_ALT_op_aget_wide: /* 0x45 */
8106/* File: x86/alt_stub.S */
8107/*
8108 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8109 * any interesting requests and then jump to the real instruction
8110 * handler. Unlike the Arm handler, we can't do this as a tail call
8111 * because rIBASE is caller save and we need to reload it.
8112 *
8113 * Note that unlike in the Arm implementation, we should never arrive
8114 * here with a zero breakFlag because we always refresh rIBASE on
8115 * return.
8116 */
8117 .extern MterpCheckBefore
8118 EXPORT_PC
8119
8120 movl rSELF, %ecx
8121 movl %ecx, OUT_ARG0(%esp)
8122 leal OFF_FP_SHADOWFRAME(rFP), %eax
8123 movl %eax, OUT_ARG1(%esp)
8124 call MterpCheckBefore # (self, shadow_frame)
8125 REFRESH_IBASE
8126 jmp .L_op_nop+(69*128)
8127
8128/* ------------------------------ */
8129 .balign 128
8130.L_ALT_op_aget_object: /* 0x46 */
8131/* File: x86/alt_stub.S */
8132/*
8133 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8134 * any interesting requests and then jump to the real instruction
8135 * handler. Unlike the Arm handler, we can't do this as a tail call
8136 * because rIBASE is caller save and we need to reload it.
8137 *
8138 * Note that unlike in the Arm implementation, we should never arrive
8139 * here with a zero breakFlag because we always refresh rIBASE on
8140 * return.
8141 */
8142 .extern MterpCheckBefore
8143 EXPORT_PC
8144
8145 movl rSELF, %ecx
8146 movl %ecx, OUT_ARG0(%esp)
8147 leal OFF_FP_SHADOWFRAME(rFP), %eax
8148 movl %eax, OUT_ARG1(%esp)
8149 call MterpCheckBefore # (self, shadow_frame)
8150 REFRESH_IBASE
8151 jmp .L_op_nop+(70*128)
8152
8153/* ------------------------------ */
8154 .balign 128
8155.L_ALT_op_aget_boolean: /* 0x47 */
8156/* File: x86/alt_stub.S */
8157/*
8158 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8159 * any interesting requests and then jump to the real instruction
8160 * handler. Unlike the Arm handler, we can't do this as a tail call
8161 * because rIBASE is caller save and we need to reload it.
8162 *
8163 * Note that unlike in the Arm implementation, we should never arrive
8164 * here with a zero breakFlag because we always refresh rIBASE on
8165 * return.
8166 */
8167 .extern MterpCheckBefore
8168 EXPORT_PC
8169
8170 movl rSELF, %ecx
8171 movl %ecx, OUT_ARG0(%esp)
8172 leal OFF_FP_SHADOWFRAME(rFP), %eax
8173 movl %eax, OUT_ARG1(%esp)
8174 call MterpCheckBefore # (self, shadow_frame)
8175 REFRESH_IBASE
8176 jmp .L_op_nop+(71*128)
8177
8178/* ------------------------------ */
8179 .balign 128
8180.L_ALT_op_aget_byte: /* 0x48 */
8181/* File: x86/alt_stub.S */
8182/*
8183 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8184 * any interesting requests and then jump to the real instruction
8185 * handler. Unlike the Arm handler, we can't do this as a tail call
8186 * because rIBASE is caller save and we need to reload it.
8187 *
8188 * Note that unlike in the Arm implementation, we should never arrive
8189 * here with a zero breakFlag because we always refresh rIBASE on
8190 * return.
8191 */
8192 .extern MterpCheckBefore
8193 EXPORT_PC
8194
8195 movl rSELF, %ecx
8196 movl %ecx, OUT_ARG0(%esp)
8197 leal OFF_FP_SHADOWFRAME(rFP), %eax
8198 movl %eax, OUT_ARG1(%esp)
8199 call MterpCheckBefore # (self, shadow_frame)
8200 REFRESH_IBASE
8201 jmp .L_op_nop+(72*128)
8202
8203/* ------------------------------ */
8204 .balign 128
8205.L_ALT_op_aget_char: /* 0x49 */
8206/* File: x86/alt_stub.S */
8207/*
8208 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8209 * any interesting requests and then jump to the real instruction
8210 * handler. Unlike the Arm handler, we can't do this as a tail call
8211 * because rIBASE is caller save and we need to reload it.
8212 *
8213 * Note that unlike in the Arm implementation, we should never arrive
8214 * here with a zero breakFlag because we always refresh rIBASE on
8215 * return.
8216 */
8217 .extern MterpCheckBefore
8218 EXPORT_PC
8219
8220 movl rSELF, %ecx
8221 movl %ecx, OUT_ARG0(%esp)
8222 leal OFF_FP_SHADOWFRAME(rFP), %eax
8223 movl %eax, OUT_ARG1(%esp)
8224 call MterpCheckBefore # (self, shadow_frame)
8225 REFRESH_IBASE
8226 jmp .L_op_nop+(73*128)
8227
8228/* ------------------------------ */
8229 .balign 128
8230.L_ALT_op_aget_short: /* 0x4a */
8231/* File: x86/alt_stub.S */
8232/*
8233 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8234 * any interesting requests and then jump to the real instruction
8235 * handler. Unlike the Arm handler, we can't do this as a tail call
8236 * because rIBASE is caller save and we need to reload it.
8237 *
8238 * Note that unlike in the Arm implementation, we should never arrive
8239 * here with a zero breakFlag because we always refresh rIBASE on
8240 * return.
8241 */
8242 .extern MterpCheckBefore
8243 EXPORT_PC
8244
8245 movl rSELF, %ecx
8246 movl %ecx, OUT_ARG0(%esp)
8247 leal OFF_FP_SHADOWFRAME(rFP), %eax
8248 movl %eax, OUT_ARG1(%esp)
8249 call MterpCheckBefore # (self, shadow_frame)
8250 REFRESH_IBASE
8251 jmp .L_op_nop+(74*128)
8252
8253/* ------------------------------ */
8254 .balign 128
8255.L_ALT_op_aput: /* 0x4b */
8256/* File: x86/alt_stub.S */
8257/*
8258 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8259 * any interesting requests and then jump to the real instruction
8260 * handler. Unlike the Arm handler, we can't do this as a tail call
8261 * because rIBASE is caller save and we need to reload it.
8262 *
8263 * Note that unlike in the Arm implementation, we should never arrive
8264 * here with a zero breakFlag because we always refresh rIBASE on
8265 * return.
8266 */
8267 .extern MterpCheckBefore
8268 EXPORT_PC
8269
8270 movl rSELF, %ecx
8271 movl %ecx, OUT_ARG0(%esp)
8272 leal OFF_FP_SHADOWFRAME(rFP), %eax
8273 movl %eax, OUT_ARG1(%esp)
8274 call MterpCheckBefore # (self, shadow_frame)
8275 REFRESH_IBASE
8276 jmp .L_op_nop+(75*128)
8277
8278/* ------------------------------ */
8279 .balign 128
8280.L_ALT_op_aput_wide: /* 0x4c */
8281/* File: x86/alt_stub.S */
8282/*
8283 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8284 * any interesting requests and then jump to the real instruction
8285 * handler. Unlike the Arm handler, we can't do this as a tail call
8286 * because rIBASE is caller save and we need to reload it.
8287 *
8288 * Note that unlike in the Arm implementation, we should never arrive
8289 * here with a zero breakFlag because we always refresh rIBASE on
8290 * return.
8291 */
8292 .extern MterpCheckBefore
8293 EXPORT_PC
8294
8295 movl rSELF, %ecx
8296 movl %ecx, OUT_ARG0(%esp)
8297 leal OFF_FP_SHADOWFRAME(rFP), %eax
8298 movl %eax, OUT_ARG1(%esp)
8299 call MterpCheckBefore # (self, shadow_frame)
8300 REFRESH_IBASE
8301 jmp .L_op_nop+(76*128)
8302
8303/* ------------------------------ */
8304 .balign 128
8305.L_ALT_op_aput_object: /* 0x4d */
8306/* File: x86/alt_stub.S */
8307/*
8308 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8309 * any interesting requests and then jump to the real instruction
8310 * handler. Unlike the Arm handler, we can't do this as a tail call
8311 * because rIBASE is caller save and we need to reload it.
8312 *
8313 * Note that unlike in the Arm implementation, we should never arrive
8314 * here with a zero breakFlag because we always refresh rIBASE on
8315 * return.
8316 */
8317 .extern MterpCheckBefore
8318 EXPORT_PC
8319
8320 movl rSELF, %ecx
8321 movl %ecx, OUT_ARG0(%esp)
8322 leal OFF_FP_SHADOWFRAME(rFP), %eax
8323 movl %eax, OUT_ARG1(%esp)
8324 call MterpCheckBefore # (self, shadow_frame)
8325 REFRESH_IBASE
8326 jmp .L_op_nop+(77*128)
8327
8328/* ------------------------------ */
8329 .balign 128
8330.L_ALT_op_aput_boolean: /* 0x4e */
8331/* File: x86/alt_stub.S */
8332/*
8333 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8334 * any interesting requests and then jump to the real instruction
8335 * handler. Unlike the Arm handler, we can't do this as a tail call
8336 * because rIBASE is caller save and we need to reload it.
8337 *
8338 * Note that unlike in the Arm implementation, we should never arrive
8339 * here with a zero breakFlag because we always refresh rIBASE on
8340 * return.
8341 */
8342 .extern MterpCheckBefore
8343 EXPORT_PC
8344
8345 movl rSELF, %ecx
8346 movl %ecx, OUT_ARG0(%esp)
8347 leal OFF_FP_SHADOWFRAME(rFP), %eax
8348 movl %eax, OUT_ARG1(%esp)
8349 call MterpCheckBefore # (self, shadow_frame)
8350 REFRESH_IBASE
8351 jmp .L_op_nop+(78*128)
8352
8353/* ------------------------------ */
8354 .balign 128
8355.L_ALT_op_aput_byte: /* 0x4f */
8356/* File: x86/alt_stub.S */
8357/*
8358 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8359 * any interesting requests and then jump to the real instruction
8360 * handler. Unlike the Arm handler, we can't do this as a tail call
8361 * because rIBASE is caller save and we need to reload it.
8362 *
8363 * Note that unlike in the Arm implementation, we should never arrive
8364 * here with a zero breakFlag because we always refresh rIBASE on
8365 * return.
8366 */
8367 .extern MterpCheckBefore
8368 EXPORT_PC
8369
8370 movl rSELF, %ecx
8371 movl %ecx, OUT_ARG0(%esp)
8372 leal OFF_FP_SHADOWFRAME(rFP), %eax
8373 movl %eax, OUT_ARG1(%esp)
8374 call MterpCheckBefore # (self, shadow_frame)
8375 REFRESH_IBASE
8376 jmp .L_op_nop+(79*128)
8377
8378/* ------------------------------ */
8379 .balign 128
8380.L_ALT_op_aput_char: /* 0x50 */
8381/* File: x86/alt_stub.S */
8382/*
8383 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8384 * any interesting requests and then jump to the real instruction
8385 * handler. Unlike the Arm handler, we can't do this as a tail call
8386 * because rIBASE is caller save and we need to reload it.
8387 *
8388 * Note that unlike in the Arm implementation, we should never arrive
8389 * here with a zero breakFlag because we always refresh rIBASE on
8390 * return.
8391 */
8392 .extern MterpCheckBefore
8393 EXPORT_PC
8394
8395 movl rSELF, %ecx
8396 movl %ecx, OUT_ARG0(%esp)
8397 leal OFF_FP_SHADOWFRAME(rFP), %eax
8398 movl %eax, OUT_ARG1(%esp)
8399 call MterpCheckBefore # (self, shadow_frame)
8400 REFRESH_IBASE
8401 jmp .L_op_nop+(80*128)
8402
8403/* ------------------------------ */
8404 .balign 128
8405.L_ALT_op_aput_short: /* 0x51 */
8406/* File: x86/alt_stub.S */
8407/*
8408 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8409 * any interesting requests and then jump to the real instruction
8410 * handler. Unlike the Arm handler, we can't do this as a tail call
8411 * because rIBASE is caller save and we need to reload it.
8412 *
8413 * Note that unlike in the Arm implementation, we should never arrive
8414 * here with a zero breakFlag because we always refresh rIBASE on
8415 * return.
8416 */
8417 .extern MterpCheckBefore
8418 EXPORT_PC
8419
8420 movl rSELF, %ecx
8421 movl %ecx, OUT_ARG0(%esp)
8422 leal OFF_FP_SHADOWFRAME(rFP), %eax
8423 movl %eax, OUT_ARG1(%esp)
8424 call MterpCheckBefore # (self, shadow_frame)
8425 REFRESH_IBASE
8426 jmp .L_op_nop+(81*128)
8427
8428/* ------------------------------ */
8429 .balign 128
8430.L_ALT_op_iget: /* 0x52 */
8431/* File: x86/alt_stub.S */
8432/*
8433 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8434 * any interesting requests and then jump to the real instruction
8435 * handler. Unlike the Arm handler, we can't do this as a tail call
8436 * because rIBASE is caller save and we need to reload it.
8437 *
8438 * Note that unlike in the Arm implementation, we should never arrive
8439 * here with a zero breakFlag because we always refresh rIBASE on
8440 * return.
8441 */
8442 .extern MterpCheckBefore
8443 EXPORT_PC
8444
8445 movl rSELF, %ecx
8446 movl %ecx, OUT_ARG0(%esp)
8447 leal OFF_FP_SHADOWFRAME(rFP), %eax
8448 movl %eax, OUT_ARG1(%esp)
8449 call MterpCheckBefore # (self, shadow_frame)
8450 REFRESH_IBASE
8451 jmp .L_op_nop+(82*128)
8452
8453/* ------------------------------ */
8454 .balign 128
8455.L_ALT_op_iget_wide: /* 0x53 */
8456/* File: x86/alt_stub.S */
8457/*
8458 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8459 * any interesting requests and then jump to the real instruction
8460 * handler. Unlike the Arm handler, we can't do this as a tail call
8461 * because rIBASE is caller save and we need to reload it.
8462 *
8463 * Note that unlike in the Arm implementation, we should never arrive
8464 * here with a zero breakFlag because we always refresh rIBASE on
8465 * return.
8466 */
8467 .extern MterpCheckBefore
8468 EXPORT_PC
8469
8470 movl rSELF, %ecx
8471 movl %ecx, OUT_ARG0(%esp)
8472 leal OFF_FP_SHADOWFRAME(rFP), %eax
8473 movl %eax, OUT_ARG1(%esp)
8474 call MterpCheckBefore # (self, shadow_frame)
8475 REFRESH_IBASE
8476 jmp .L_op_nop+(83*128)
8477
8478/* ------------------------------ */
8479 .balign 128
8480.L_ALT_op_iget_object: /* 0x54 */
8481/* File: x86/alt_stub.S */
8482/*
8483 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8484 * any interesting requests and then jump to the real instruction
8485 * handler. Unlike the Arm handler, we can't do this as a tail call
8486 * because rIBASE is caller save and we need to reload it.
8487 *
8488 * Note that unlike in the Arm implementation, we should never arrive
8489 * here with a zero breakFlag because we always refresh rIBASE on
8490 * return.
8491 */
8492 .extern MterpCheckBefore
8493 EXPORT_PC
8494
8495 movl rSELF, %ecx
8496 movl %ecx, OUT_ARG0(%esp)
8497 leal OFF_FP_SHADOWFRAME(rFP), %eax
8498 movl %eax, OUT_ARG1(%esp)
8499 call MterpCheckBefore # (self, shadow_frame)
8500 REFRESH_IBASE
8501 jmp .L_op_nop+(84*128)
8502
8503/* ------------------------------ */
8504 .balign 128
8505.L_ALT_op_iget_boolean: /* 0x55 */
8506/* File: x86/alt_stub.S */
8507/*
8508 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8509 * any interesting requests and then jump to the real instruction
8510 * handler. Unlike the Arm handler, we can't do this as a tail call
8511 * because rIBASE is caller save and we need to reload it.
8512 *
8513 * Note that unlike in the Arm implementation, we should never arrive
8514 * here with a zero breakFlag because we always refresh rIBASE on
8515 * return.
8516 */
8517 .extern MterpCheckBefore
8518 EXPORT_PC
8519
8520 movl rSELF, %ecx
8521 movl %ecx, OUT_ARG0(%esp)
8522 leal OFF_FP_SHADOWFRAME(rFP), %eax
8523 movl %eax, OUT_ARG1(%esp)
8524 call MterpCheckBefore # (self, shadow_frame)
8525 REFRESH_IBASE
8526 jmp .L_op_nop+(85*128)
8527
8528/* ------------------------------ */
8529 .balign 128
8530.L_ALT_op_iget_byte: /* 0x56 */
8531/* File: x86/alt_stub.S */
8532/*
8533 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8534 * any interesting requests and then jump to the real instruction
8535 * handler. Unlike the Arm handler, we can't do this as a tail call
8536 * because rIBASE is caller save and we need to reload it.
8537 *
8538 * Note that unlike in the Arm implementation, we should never arrive
8539 * here with a zero breakFlag because we always refresh rIBASE on
8540 * return.
8541 */
8542 .extern MterpCheckBefore
8543 EXPORT_PC
8544
8545 movl rSELF, %ecx
8546 movl %ecx, OUT_ARG0(%esp)
8547 leal OFF_FP_SHADOWFRAME(rFP), %eax
8548 movl %eax, OUT_ARG1(%esp)
8549 call MterpCheckBefore # (self, shadow_frame)
8550 REFRESH_IBASE
8551 jmp .L_op_nop+(86*128)
8552
8553/* ------------------------------ */
8554 .balign 128
8555.L_ALT_op_iget_char: /* 0x57 */
8556/* File: x86/alt_stub.S */
8557/*
8558 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8559 * any interesting requests and then jump to the real instruction
8560 * handler. Unlike the Arm handler, we can't do this as a tail call
8561 * because rIBASE is caller save and we need to reload it.
8562 *
8563 * Note that unlike in the Arm implementation, we should never arrive
8564 * here with a zero breakFlag because we always refresh rIBASE on
8565 * return.
8566 */
8567 .extern MterpCheckBefore
8568 EXPORT_PC
8569
8570 movl rSELF, %ecx
8571 movl %ecx, OUT_ARG0(%esp)
8572 leal OFF_FP_SHADOWFRAME(rFP), %eax
8573 movl %eax, OUT_ARG1(%esp)
8574 call MterpCheckBefore # (self, shadow_frame)
8575 REFRESH_IBASE
8576 jmp .L_op_nop+(87*128)
8577
8578/* ------------------------------ */
8579 .balign 128
8580.L_ALT_op_iget_short: /* 0x58 */
8581/* File: x86/alt_stub.S */
8582/*
8583 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8584 * any interesting requests and then jump to the real instruction
8585 * handler. Unlike the Arm handler, we can't do this as a tail call
8586 * because rIBASE is caller save and we need to reload it.
8587 *
8588 * Note that unlike in the Arm implementation, we should never arrive
8589 * here with a zero breakFlag because we always refresh rIBASE on
8590 * return.
8591 */
8592 .extern MterpCheckBefore
8593 EXPORT_PC
8594
8595 movl rSELF, %ecx
8596 movl %ecx, OUT_ARG0(%esp)
8597 leal OFF_FP_SHADOWFRAME(rFP), %eax
8598 movl %eax, OUT_ARG1(%esp)
8599 call MterpCheckBefore # (self, shadow_frame)
8600 REFRESH_IBASE
8601 jmp .L_op_nop+(88*128)
8602
8603/* ------------------------------ */
8604 .balign 128
8605.L_ALT_op_iput: /* 0x59 */
8606/* File: x86/alt_stub.S */
8607/*
8608 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8609 * any interesting requests and then jump to the real instruction
8610 * handler. Unlike the Arm handler, we can't do this as a tail call
8611 * because rIBASE is caller save and we need to reload it.
8612 *
8613 * Note that unlike in the Arm implementation, we should never arrive
8614 * here with a zero breakFlag because we always refresh rIBASE on
8615 * return.
8616 */
8617 .extern MterpCheckBefore
8618 EXPORT_PC
8619
8620 movl rSELF, %ecx
8621 movl %ecx, OUT_ARG0(%esp)
8622 leal OFF_FP_SHADOWFRAME(rFP), %eax
8623 movl %eax, OUT_ARG1(%esp)
8624 call MterpCheckBefore # (self, shadow_frame)
8625 REFRESH_IBASE
8626 jmp .L_op_nop+(89*128)
8627
8628/* ------------------------------ */
8629 .balign 128
8630.L_ALT_op_iput_wide: /* 0x5a */
8631/* File: x86/alt_stub.S */
8632/*
8633 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8634 * any interesting requests and then jump to the real instruction
8635 * handler. Unlike the Arm handler, we can't do this as a tail call
8636 * because rIBASE is caller save and we need to reload it.
8637 *
8638 * Note that unlike in the Arm implementation, we should never arrive
8639 * here with a zero breakFlag because we always refresh rIBASE on
8640 * return.
8641 */
8642 .extern MterpCheckBefore
8643 EXPORT_PC
8644
8645 movl rSELF, %ecx
8646 movl %ecx, OUT_ARG0(%esp)
8647 leal OFF_FP_SHADOWFRAME(rFP), %eax
8648 movl %eax, OUT_ARG1(%esp)
8649 call MterpCheckBefore # (self, shadow_frame)
8650 REFRESH_IBASE
8651 jmp .L_op_nop+(90*128)
8652
8653/* ------------------------------ */
8654 .balign 128
8655.L_ALT_op_iput_object: /* 0x5b */
8656/* File: x86/alt_stub.S */
8657/*
8658 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8659 * any interesting requests and then jump to the real instruction
8660 * handler. Unlike the Arm handler, we can't do this as a tail call
8661 * because rIBASE is caller save and we need to reload it.
8662 *
8663 * Note that unlike in the Arm implementation, we should never arrive
8664 * here with a zero breakFlag because we always refresh rIBASE on
8665 * return.
8666 */
8667 .extern MterpCheckBefore
8668 EXPORT_PC
8669
8670 movl rSELF, %ecx
8671 movl %ecx, OUT_ARG0(%esp)
8672 leal OFF_FP_SHADOWFRAME(rFP), %eax
8673 movl %eax, OUT_ARG1(%esp)
8674 call MterpCheckBefore # (self, shadow_frame)
8675 REFRESH_IBASE
8676 jmp .L_op_nop+(91*128)
8677
8678/* ------------------------------ */
8679 .balign 128
8680.L_ALT_op_iput_boolean: /* 0x5c */
8681/* File: x86/alt_stub.S */
8682/*
8683 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8684 * any interesting requests and then jump to the real instruction
8685 * handler. Unlike the Arm handler, we can't do this as a tail call
8686 * because rIBASE is caller save and we need to reload it.
8687 *
8688 * Note that unlike in the Arm implementation, we should never arrive
8689 * here with a zero breakFlag because we always refresh rIBASE on
8690 * return.
8691 */
8692 .extern MterpCheckBefore
8693 EXPORT_PC
8694
8695 movl rSELF, %ecx
8696 movl %ecx, OUT_ARG0(%esp)
8697 leal OFF_FP_SHADOWFRAME(rFP), %eax
8698 movl %eax, OUT_ARG1(%esp)
8699 call MterpCheckBefore # (self, shadow_frame)
8700 REFRESH_IBASE
8701 jmp .L_op_nop+(92*128)
8702
8703/* ------------------------------ */
8704 .balign 128
8705.L_ALT_op_iput_byte: /* 0x5d */
8706/* File: x86/alt_stub.S */
8707/*
8708 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8709 * any interesting requests and then jump to the real instruction
8710 * handler. Unlike the Arm handler, we can't do this as a tail call
8711 * because rIBASE is caller save and we need to reload it.
8712 *
8713 * Note that unlike in the Arm implementation, we should never arrive
8714 * here with a zero breakFlag because we always refresh rIBASE on
8715 * return.
8716 */
8717 .extern MterpCheckBefore
8718 EXPORT_PC
8719
8720 movl rSELF, %ecx
8721 movl %ecx, OUT_ARG0(%esp)
8722 leal OFF_FP_SHADOWFRAME(rFP), %eax
8723 movl %eax, OUT_ARG1(%esp)
8724 call MterpCheckBefore # (self, shadow_frame)
8725 REFRESH_IBASE
8726 jmp .L_op_nop+(93*128)
8727
8728/* ------------------------------ */
8729 .balign 128
8730.L_ALT_op_iput_char: /* 0x5e */
8731/* File: x86/alt_stub.S */
8732/*
8733 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8734 * any interesting requests and then jump to the real instruction
8735 * handler. Unlike the Arm handler, we can't do this as a tail call
8736 * because rIBASE is caller save and we need to reload it.
8737 *
8738 * Note that unlike in the Arm implementation, we should never arrive
8739 * here with a zero breakFlag because we always refresh rIBASE on
8740 * return.
8741 */
8742 .extern MterpCheckBefore
8743 EXPORT_PC
8744
8745 movl rSELF, %ecx
8746 movl %ecx, OUT_ARG0(%esp)
8747 leal OFF_FP_SHADOWFRAME(rFP), %eax
8748 movl %eax, OUT_ARG1(%esp)
8749 call MterpCheckBefore # (self, shadow_frame)
8750 REFRESH_IBASE
8751 jmp .L_op_nop+(94*128)
8752
8753/* ------------------------------ */
8754 .balign 128
8755.L_ALT_op_iput_short: /* 0x5f */
8756/* File: x86/alt_stub.S */
8757/*
8758 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8759 * any interesting requests and then jump to the real instruction
8760 * handler. Unlike the Arm handler, we can't do this as a tail call
8761 * because rIBASE is caller save and we need to reload it.
8762 *
8763 * Note that unlike in the Arm implementation, we should never arrive
8764 * here with a zero breakFlag because we always refresh rIBASE on
8765 * return.
8766 */
8767 .extern MterpCheckBefore
8768 EXPORT_PC
8769
8770 movl rSELF, %ecx
8771 movl %ecx, OUT_ARG0(%esp)
8772 leal OFF_FP_SHADOWFRAME(rFP), %eax
8773 movl %eax, OUT_ARG1(%esp)
8774 call MterpCheckBefore # (self, shadow_frame)
8775 REFRESH_IBASE
8776 jmp .L_op_nop+(95*128)
8777
8778/* ------------------------------ */
8779 .balign 128
8780.L_ALT_op_sget: /* 0x60 */
8781/* File: x86/alt_stub.S */
8782/*
8783 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8784 * any interesting requests and then jump to the real instruction
8785 * handler. Unlike the Arm handler, we can't do this as a tail call
8786 * because rIBASE is caller save and we need to reload it.
8787 *
8788 * Note that unlike in the Arm implementation, we should never arrive
8789 * here with a zero breakFlag because we always refresh rIBASE on
8790 * return.
8791 */
8792 .extern MterpCheckBefore
8793 EXPORT_PC
8794
8795 movl rSELF, %ecx
8796 movl %ecx, OUT_ARG0(%esp)
8797 leal OFF_FP_SHADOWFRAME(rFP), %eax
8798 movl %eax, OUT_ARG1(%esp)
8799 call MterpCheckBefore # (self, shadow_frame)
8800 REFRESH_IBASE
8801 jmp .L_op_nop+(96*128)
8802
8803/* ------------------------------ */
8804 .balign 128
8805.L_ALT_op_sget_wide: /* 0x61 */
8806/* File: x86/alt_stub.S */
8807/*
8808 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8809 * any interesting requests and then jump to the real instruction
8810 * handler. Unlike the Arm handler, we can't do this as a tail call
8811 * because rIBASE is caller save and we need to reload it.
8812 *
8813 * Note that unlike in the Arm implementation, we should never arrive
8814 * here with a zero breakFlag because we always refresh rIBASE on
8815 * return.
8816 */
8817 .extern MterpCheckBefore
8818 EXPORT_PC
8819
8820 movl rSELF, %ecx
8821 movl %ecx, OUT_ARG0(%esp)
8822 leal OFF_FP_SHADOWFRAME(rFP), %eax
8823 movl %eax, OUT_ARG1(%esp)
8824 call MterpCheckBefore # (self, shadow_frame)
8825 REFRESH_IBASE
8826 jmp .L_op_nop+(97*128)
8827
8828/* ------------------------------ */
8829 .balign 128
8830.L_ALT_op_sget_object: /* 0x62 */
8831/* File: x86/alt_stub.S */
8832/*
8833 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8834 * any interesting requests and then jump to the real instruction
8835 * handler. Unlike the Arm handler, we can't do this as a tail call
8836 * because rIBASE is caller save and we need to reload it.
8837 *
8838 * Note that unlike in the Arm implementation, we should never arrive
8839 * here with a zero breakFlag because we always refresh rIBASE on
8840 * return.
8841 */
8842 .extern MterpCheckBefore
8843 EXPORT_PC
8844
8845 movl rSELF, %ecx
8846 movl %ecx, OUT_ARG0(%esp)
8847 leal OFF_FP_SHADOWFRAME(rFP), %eax
8848 movl %eax, OUT_ARG1(%esp)
8849 call MterpCheckBefore # (self, shadow_frame)
8850 REFRESH_IBASE
8851 jmp .L_op_nop+(98*128)
8852
8853/* ------------------------------ */
8854 .balign 128
8855.L_ALT_op_sget_boolean: /* 0x63 */
8856/* File: x86/alt_stub.S */
8857/*
8858 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8859 * any interesting requests and then jump to the real instruction
8860 * handler. Unlike the Arm handler, we can't do this as a tail call
8861 * because rIBASE is caller save and we need to reload it.
8862 *
8863 * Note that unlike in the Arm implementation, we should never arrive
8864 * here with a zero breakFlag because we always refresh rIBASE on
8865 * return.
8866 */
8867 .extern MterpCheckBefore
8868 EXPORT_PC
8869
8870 movl rSELF, %ecx
8871 movl %ecx, OUT_ARG0(%esp)
8872 leal OFF_FP_SHADOWFRAME(rFP), %eax
8873 movl %eax, OUT_ARG1(%esp)
8874 call MterpCheckBefore # (self, shadow_frame)
8875 REFRESH_IBASE
8876 jmp .L_op_nop+(99*128)
8877
8878/* ------------------------------ */
8879 .balign 128
8880.L_ALT_op_sget_byte: /* 0x64 */
8881/* File: x86/alt_stub.S */
8882/*
8883 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8884 * any interesting requests and then jump to the real instruction
8885 * handler. Unlike the Arm handler, we can't do this as a tail call
8886 * because rIBASE is caller save and we need to reload it.
8887 *
8888 * Note that unlike in the Arm implementation, we should never arrive
8889 * here with a zero breakFlag because we always refresh rIBASE on
8890 * return.
8891 */
8892 .extern MterpCheckBefore
8893 EXPORT_PC
8894
8895 movl rSELF, %ecx
8896 movl %ecx, OUT_ARG0(%esp)
8897 leal OFF_FP_SHADOWFRAME(rFP), %eax
8898 movl %eax, OUT_ARG1(%esp)
8899 call MterpCheckBefore # (self, shadow_frame)
8900 REFRESH_IBASE
8901 jmp .L_op_nop+(100*128)
8902
8903/* ------------------------------ */
8904 .balign 128
8905.L_ALT_op_sget_char: /* 0x65 */
8906/* File: x86/alt_stub.S */
8907/*
8908 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8909 * any interesting requests and then jump to the real instruction
8910 * handler. Unlike the Arm handler, we can't do this as a tail call
8911 * because rIBASE is caller save and we need to reload it.
8912 *
8913 * Note that unlike in the Arm implementation, we should never arrive
8914 * here with a zero breakFlag because we always refresh rIBASE on
8915 * return.
8916 */
8917 .extern MterpCheckBefore
8918 EXPORT_PC
8919
8920 movl rSELF, %ecx
8921 movl %ecx, OUT_ARG0(%esp)
8922 leal OFF_FP_SHADOWFRAME(rFP), %eax
8923 movl %eax, OUT_ARG1(%esp)
8924 call MterpCheckBefore # (self, shadow_frame)
8925 REFRESH_IBASE
8926 jmp .L_op_nop+(101*128)
8927
8928/* ------------------------------ */
8929 .balign 128
8930.L_ALT_op_sget_short: /* 0x66 */
8931/* File: x86/alt_stub.S */
8932/*
8933 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8934 * any interesting requests and then jump to the real instruction
8935 * handler. Unlike the Arm handler, we can't do this as a tail call
8936 * because rIBASE is caller save and we need to reload it.
8937 *
8938 * Note that unlike in the Arm implementation, we should never arrive
8939 * here with a zero breakFlag because we always refresh rIBASE on
8940 * return.
8941 */
8942 .extern MterpCheckBefore
8943 EXPORT_PC
8944
8945 movl rSELF, %ecx
8946 movl %ecx, OUT_ARG0(%esp)
8947 leal OFF_FP_SHADOWFRAME(rFP), %eax
8948 movl %eax, OUT_ARG1(%esp)
8949 call MterpCheckBefore # (self, shadow_frame)
8950 REFRESH_IBASE
8951 jmp .L_op_nop+(102*128)
8952
8953/* ------------------------------ */
8954 .balign 128
8955.L_ALT_op_sput: /* 0x67 */
8956/* File: x86/alt_stub.S */
8957/*
8958 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8959 * any interesting requests and then jump to the real instruction
8960 * handler. Unlike the Arm handler, we can't do this as a tail call
8961 * because rIBASE is caller save and we need to reload it.
8962 *
8963 * Note that unlike in the Arm implementation, we should never arrive
8964 * here with a zero breakFlag because we always refresh rIBASE on
8965 * return.
8966 */
8967 .extern MterpCheckBefore
8968 EXPORT_PC
8969
8970 movl rSELF, %ecx
8971 movl %ecx, OUT_ARG0(%esp)
8972 leal OFF_FP_SHADOWFRAME(rFP), %eax
8973 movl %eax, OUT_ARG1(%esp)
8974 call MterpCheckBefore # (self, shadow_frame)
8975 REFRESH_IBASE
8976 jmp .L_op_nop+(103*128)
8977
8978/* ------------------------------ */
8979 .balign 128
8980.L_ALT_op_sput_wide: /* 0x68 */
8981/* File: x86/alt_stub.S */
8982/*
8983 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8984 * any interesting requests and then jump to the real instruction
8985 * handler. Unlike the Arm handler, we can't do this as a tail call
8986 * because rIBASE is caller save and we need to reload it.
8987 *
8988 * Note that unlike in the Arm implementation, we should never arrive
8989 * here with a zero breakFlag because we always refresh rIBASE on
8990 * return.
8991 */
8992 .extern MterpCheckBefore
8993 EXPORT_PC
8994
8995 movl rSELF, %ecx
8996 movl %ecx, OUT_ARG0(%esp)
8997 leal OFF_FP_SHADOWFRAME(rFP), %eax
8998 movl %eax, OUT_ARG1(%esp)
8999 call MterpCheckBefore # (self, shadow_frame)
9000 REFRESH_IBASE
9001 jmp .L_op_nop+(104*128)
9002
9003/* ------------------------------ */
9004 .balign 128
9005.L_ALT_op_sput_object: /* 0x69 */
9006/* File: x86/alt_stub.S */
9007/*
9008 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9009 * any interesting requests and then jump to the real instruction
9010 * handler. Unlike the Arm handler, we can't do this as a tail call
9011 * because rIBASE is caller save and we need to reload it.
9012 *
9013 * Note that unlike in the Arm implementation, we should never arrive
9014 * here with a zero breakFlag because we always refresh rIBASE on
9015 * return.
9016 */
9017 .extern MterpCheckBefore
9018 EXPORT_PC
9019
9020 movl rSELF, %ecx
9021 movl %ecx, OUT_ARG0(%esp)
9022 leal OFF_FP_SHADOWFRAME(rFP), %eax
9023 movl %eax, OUT_ARG1(%esp)
9024 call MterpCheckBefore # (self, shadow_frame)
9025 REFRESH_IBASE
9026 jmp .L_op_nop+(105*128)
9027
9028/* ------------------------------ */
9029 .balign 128
9030.L_ALT_op_sput_boolean: /* 0x6a */
9031/* File: x86/alt_stub.S */
9032/*
9033 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9034 * any interesting requests and then jump to the real instruction
9035 * handler. Unlike the Arm handler, we can't do this as a tail call
9036 * because rIBASE is caller save and we need to reload it.
9037 *
9038 * Note that unlike in the Arm implementation, we should never arrive
9039 * here with a zero breakFlag because we always refresh rIBASE on
9040 * return.
9041 */
9042 .extern MterpCheckBefore
9043 EXPORT_PC
9044
9045 movl rSELF, %ecx
9046 movl %ecx, OUT_ARG0(%esp)
9047 leal OFF_FP_SHADOWFRAME(rFP), %eax
9048 movl %eax, OUT_ARG1(%esp)
9049 call MterpCheckBefore # (self, shadow_frame)
9050 REFRESH_IBASE
9051 jmp .L_op_nop+(106*128)
9052
9053/* ------------------------------ */
9054 .balign 128
9055.L_ALT_op_sput_byte: /* 0x6b */
9056/* File: x86/alt_stub.S */
9057/*
9058 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9059 * any interesting requests and then jump to the real instruction
9060 * handler. Unlike the Arm handler, we can't do this as a tail call
9061 * because rIBASE is caller save and we need to reload it.
9062 *
9063 * Note that unlike in the Arm implementation, we should never arrive
9064 * here with a zero breakFlag because we always refresh rIBASE on
9065 * return.
9066 */
9067 .extern MterpCheckBefore
9068 EXPORT_PC
9069
9070 movl rSELF, %ecx
9071 movl %ecx, OUT_ARG0(%esp)
9072 leal OFF_FP_SHADOWFRAME(rFP), %eax
9073 movl %eax, OUT_ARG1(%esp)
9074 call MterpCheckBefore # (self, shadow_frame)
9075 REFRESH_IBASE
9076 jmp .L_op_nop+(107*128)
9077
9078/* ------------------------------ */
9079 .balign 128
9080.L_ALT_op_sput_char: /* 0x6c */
9081/* File: x86/alt_stub.S */
9082/*
9083 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9084 * any interesting requests and then jump to the real instruction
9085 * handler. Unlike the Arm handler, we can't do this as a tail call
9086 * because rIBASE is caller save and we need to reload it.
9087 *
9088 * Note that unlike in the Arm implementation, we should never arrive
9089 * here with a zero breakFlag because we always refresh rIBASE on
9090 * return.
9091 */
9092 .extern MterpCheckBefore
9093 EXPORT_PC
9094
9095 movl rSELF, %ecx
9096 movl %ecx, OUT_ARG0(%esp)
9097 leal OFF_FP_SHADOWFRAME(rFP), %eax
9098 movl %eax, OUT_ARG1(%esp)
9099 call MterpCheckBefore # (self, shadow_frame)
9100 REFRESH_IBASE
9101 jmp .L_op_nop+(108*128)
9102
9103/* ------------------------------ */
9104 .balign 128
9105.L_ALT_op_sput_short: /* 0x6d */
9106/* File: x86/alt_stub.S */
9107/*
9108 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9109 * any interesting requests and then jump to the real instruction
9110 * handler. Unlike the Arm handler, we can't do this as a tail call
9111 * because rIBASE is caller save and we need to reload it.
9112 *
9113 * Note that unlike in the Arm implementation, we should never arrive
9114 * here with a zero breakFlag because we always refresh rIBASE on
9115 * return.
9116 */
9117 .extern MterpCheckBefore
9118 EXPORT_PC
9119
9120 movl rSELF, %ecx
9121 movl %ecx, OUT_ARG0(%esp)
9122 leal OFF_FP_SHADOWFRAME(rFP), %eax
9123 movl %eax, OUT_ARG1(%esp)
9124 call MterpCheckBefore # (self, shadow_frame)
9125 REFRESH_IBASE
9126 jmp .L_op_nop+(109*128)
9127
9128/* ------------------------------ */
9129 .balign 128
9130.L_ALT_op_invoke_virtual: /* 0x6e */
9131/* File: x86/alt_stub.S */
9132/*
9133 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9134 * any interesting requests and then jump to the real instruction
9135 * handler. Unlike the Arm handler, we can't do this as a tail call
9136 * because rIBASE is caller save and we need to reload it.
9137 *
9138 * Note that unlike in the Arm implementation, we should never arrive
9139 * here with a zero breakFlag because we always refresh rIBASE on
9140 * return.
9141 */
9142 .extern MterpCheckBefore
9143 EXPORT_PC
9144
9145 movl rSELF, %ecx
9146 movl %ecx, OUT_ARG0(%esp)
9147 leal OFF_FP_SHADOWFRAME(rFP), %eax
9148 movl %eax, OUT_ARG1(%esp)
9149 call MterpCheckBefore # (self, shadow_frame)
9150 REFRESH_IBASE
9151 jmp .L_op_nop+(110*128)
9152
9153/* ------------------------------ */
9154 .balign 128
9155.L_ALT_op_invoke_super: /* 0x6f */
9156/* File: x86/alt_stub.S */
9157/*
9158 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9159 * any interesting requests and then jump to the real instruction
9160 * handler. Unlike the Arm handler, we can't do this as a tail call
9161 * because rIBASE is caller save and we need to reload it.
9162 *
9163 * Note that unlike in the Arm implementation, we should never arrive
9164 * here with a zero breakFlag because we always refresh rIBASE on
9165 * return.
9166 */
9167 .extern MterpCheckBefore
9168 EXPORT_PC
9169
9170 movl rSELF, %ecx
9171 movl %ecx, OUT_ARG0(%esp)
9172 leal OFF_FP_SHADOWFRAME(rFP), %eax
9173 movl %eax, OUT_ARG1(%esp)
9174 call MterpCheckBefore # (self, shadow_frame)
9175 REFRESH_IBASE
9176 jmp .L_op_nop+(111*128)
9177
9178/* ------------------------------ */
9179 .balign 128
9180.L_ALT_op_invoke_direct: /* 0x70 */
9181/* File: x86/alt_stub.S */
9182/*
9183 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9184 * any interesting requests and then jump to the real instruction
9185 * handler. Unlike the Arm handler, we can't do this as a tail call
9186 * because rIBASE is caller save and we need to reload it.
9187 *
9188 * Note that unlike in the Arm implementation, we should never arrive
9189 * here with a zero breakFlag because we always refresh rIBASE on
9190 * return.
9191 */
9192 .extern MterpCheckBefore
9193 EXPORT_PC
9194
9195 movl rSELF, %ecx
9196 movl %ecx, OUT_ARG0(%esp)
9197 leal OFF_FP_SHADOWFRAME(rFP), %eax
9198 movl %eax, OUT_ARG1(%esp)
9199 call MterpCheckBefore # (self, shadow_frame)
9200 REFRESH_IBASE
9201 jmp .L_op_nop+(112*128)
9202
9203/* ------------------------------ */
9204 .balign 128
9205.L_ALT_op_invoke_static: /* 0x71 */
9206/* File: x86/alt_stub.S */
9207/*
9208 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9209 * any interesting requests and then jump to the real instruction
9210 * handler. Unlike the Arm handler, we can't do this as a tail call
9211 * because rIBASE is caller save and we need to reload it.
9212 *
9213 * Note that unlike in the Arm implementation, we should never arrive
9214 * here with a zero breakFlag because we always refresh rIBASE on
9215 * return.
9216 */
9217 .extern MterpCheckBefore
9218 EXPORT_PC
9219
9220 movl rSELF, %ecx
9221 movl %ecx, OUT_ARG0(%esp)
9222 leal OFF_FP_SHADOWFRAME(rFP), %eax
9223 movl %eax, OUT_ARG1(%esp)
9224 call MterpCheckBefore # (self, shadow_frame)
9225 REFRESH_IBASE
9226 jmp .L_op_nop+(113*128)
9227
9228/* ------------------------------ */
9229 .balign 128
9230.L_ALT_op_invoke_interface: /* 0x72 */
9231/* File: x86/alt_stub.S */
9232/*
9233 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9234 * any interesting requests and then jump to the real instruction
9235 * handler. Unlike the Arm handler, we can't do this as a tail call
9236 * because rIBASE is caller save and we need to reload it.
9237 *
9238 * Note that unlike in the Arm implementation, we should never arrive
9239 * here with a zero breakFlag because we always refresh rIBASE on
9240 * return.
9241 */
9242 .extern MterpCheckBefore
9243 EXPORT_PC
9244
9245 movl rSELF, %ecx
9246 movl %ecx, OUT_ARG0(%esp)
9247 leal OFF_FP_SHADOWFRAME(rFP), %eax
9248 movl %eax, OUT_ARG1(%esp)
9249 call MterpCheckBefore # (self, shadow_frame)
9250 REFRESH_IBASE
9251 jmp .L_op_nop+(114*128)
9252
9253/* ------------------------------ */
9254 .balign 128
9255.L_ALT_op_return_void_no_barrier: /* 0x73 */
9256/* File: x86/alt_stub.S */
9257/*
9258 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9259 * any interesting requests and then jump to the real instruction
9260 * handler. Unlike the Arm handler, we can't do this as a tail call
9261 * because rIBASE is caller save and we need to reload it.
9262 *
9263 * Note that unlike in the Arm implementation, we should never arrive
9264 * here with a zero breakFlag because we always refresh rIBASE on
9265 * return.
9266 */
9267 .extern MterpCheckBefore
9268 EXPORT_PC
9269
9270 movl rSELF, %ecx
9271 movl %ecx, OUT_ARG0(%esp)
9272 leal OFF_FP_SHADOWFRAME(rFP), %eax
9273 movl %eax, OUT_ARG1(%esp)
9274 call MterpCheckBefore # (self, shadow_frame)
9275 REFRESH_IBASE
9276 jmp .L_op_nop+(115*128)
9277
9278/* ------------------------------ */
9279 .balign 128
9280.L_ALT_op_invoke_virtual_range: /* 0x74 */
9281/* File: x86/alt_stub.S */
9282/*
9283 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9284 * any interesting requests and then jump to the real instruction
9285 * handler. Unlike the Arm handler, we can't do this as a tail call
9286 * because rIBASE is caller save and we need to reload it.
9287 *
9288 * Note that unlike in the Arm implementation, we should never arrive
9289 * here with a zero breakFlag because we always refresh rIBASE on
9290 * return.
9291 */
9292 .extern MterpCheckBefore
9293 EXPORT_PC
9294
9295 movl rSELF, %ecx
9296 movl %ecx, OUT_ARG0(%esp)
9297 leal OFF_FP_SHADOWFRAME(rFP), %eax
9298 movl %eax, OUT_ARG1(%esp)
9299 call MterpCheckBefore # (self, shadow_frame)
9300 REFRESH_IBASE
9301 jmp .L_op_nop+(116*128)
9302
9303/* ------------------------------ */
9304 .balign 128
9305.L_ALT_op_invoke_super_range: /* 0x75 */
9306/* File: x86/alt_stub.S */
9307/*
9308 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9309 * any interesting requests and then jump to the real instruction
9310 * handler. Unlike the Arm handler, we can't do this as a tail call
9311 * because rIBASE is caller save and we need to reload it.
9312 *
9313 * Note that unlike in the Arm implementation, we should never arrive
9314 * here with a zero breakFlag because we always refresh rIBASE on
9315 * return.
9316 */
9317 .extern MterpCheckBefore
9318 EXPORT_PC
9319
9320 movl rSELF, %ecx
9321 movl %ecx, OUT_ARG0(%esp)
9322 leal OFF_FP_SHADOWFRAME(rFP), %eax
9323 movl %eax, OUT_ARG1(%esp)
9324 call MterpCheckBefore # (self, shadow_frame)
9325 REFRESH_IBASE
9326 jmp .L_op_nop+(117*128)
9327
9328/* ------------------------------ */
9329 .balign 128
9330.L_ALT_op_invoke_direct_range: /* 0x76 */
9331/* File: x86/alt_stub.S */
9332/*
9333 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9334 * any interesting requests and then jump to the real instruction
9335 * handler. Unlike the Arm handler, we can't do this as a tail call
9336 * because rIBASE is caller save and we need to reload it.
9337 *
9338 * Note that unlike in the Arm implementation, we should never arrive
9339 * here with a zero breakFlag because we always refresh rIBASE on
9340 * return.
9341 */
9342 .extern MterpCheckBefore
9343 EXPORT_PC
9344
9345 movl rSELF, %ecx
9346 movl %ecx, OUT_ARG0(%esp)
9347 leal OFF_FP_SHADOWFRAME(rFP), %eax
9348 movl %eax, OUT_ARG1(%esp)
9349 call MterpCheckBefore # (self, shadow_frame)
9350 REFRESH_IBASE
9351 jmp .L_op_nop+(118*128)
9352
9353/* ------------------------------ */
9354 .balign 128
9355.L_ALT_op_invoke_static_range: /* 0x77 */
9356/* File: x86/alt_stub.S */
9357/*
9358 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9359 * any interesting requests and then jump to the real instruction
9360 * handler. Unlike the Arm handler, we can't do this as a tail call
9361 * because rIBASE is caller save and we need to reload it.
9362 *
9363 * Note that unlike in the Arm implementation, we should never arrive
9364 * here with a zero breakFlag because we always refresh rIBASE on
9365 * return.
9366 */
9367 .extern MterpCheckBefore
9368 EXPORT_PC
9369
9370 movl rSELF, %ecx
9371 movl %ecx, OUT_ARG0(%esp)
9372 leal OFF_FP_SHADOWFRAME(rFP), %eax
9373 movl %eax, OUT_ARG1(%esp)
9374 call MterpCheckBefore # (self, shadow_frame)
9375 REFRESH_IBASE
9376 jmp .L_op_nop+(119*128)
9377
9378/* ------------------------------ */
9379 .balign 128
9380.L_ALT_op_invoke_interface_range: /* 0x78 */
9381/* File: x86/alt_stub.S */
9382/*
9383 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9384 * any interesting requests and then jump to the real instruction
9385 * handler. Unlike the Arm handler, we can't do this as a tail call
9386 * because rIBASE is caller save and we need to reload it.
9387 *
9388 * Note that unlike in the Arm implementation, we should never arrive
9389 * here with a zero breakFlag because we always refresh rIBASE on
9390 * return.
9391 */
9392 .extern MterpCheckBefore
9393 EXPORT_PC
9394
9395 movl rSELF, %ecx
9396 movl %ecx, OUT_ARG0(%esp)
9397 leal OFF_FP_SHADOWFRAME(rFP), %eax
9398 movl %eax, OUT_ARG1(%esp)
9399 call MterpCheckBefore # (self, shadow_frame)
9400 REFRESH_IBASE
9401 jmp .L_op_nop+(120*128)
9402
9403/* ------------------------------ */
9404 .balign 128
9405.L_ALT_op_unused_79: /* 0x79 */
9406/* File: x86/alt_stub.S */
9407/*
9408 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9409 * any interesting requests and then jump to the real instruction
9410 * handler. Unlike the Arm handler, we can't do this as a tail call
9411 * because rIBASE is caller save and we need to reload it.
9412 *
9413 * Note that unlike in the Arm implementation, we should never arrive
9414 * here with a zero breakFlag because we always refresh rIBASE on
9415 * return.
9416 */
9417 .extern MterpCheckBefore
9418 EXPORT_PC
9419
9420 movl rSELF, %ecx
9421 movl %ecx, OUT_ARG0(%esp)
9422 leal OFF_FP_SHADOWFRAME(rFP), %eax
9423 movl %eax, OUT_ARG1(%esp)
9424 call MterpCheckBefore # (self, shadow_frame)
9425 REFRESH_IBASE
9426 jmp .L_op_nop+(121*128)
9427
9428/* ------------------------------ */
9429 .balign 128
9430.L_ALT_op_unused_7a: /* 0x7a */
9431/* File: x86/alt_stub.S */
9432/*
9433 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9434 * any interesting requests and then jump to the real instruction
9435 * handler. Unlike the Arm handler, we can't do this as a tail call
9436 * because rIBASE is caller save and we need to reload it.
9437 *
9438 * Note that unlike in the Arm implementation, we should never arrive
9439 * here with a zero breakFlag because we always refresh rIBASE on
9440 * return.
9441 */
9442 .extern MterpCheckBefore
9443 EXPORT_PC
9444
9445 movl rSELF, %ecx
9446 movl %ecx, OUT_ARG0(%esp)
9447 leal OFF_FP_SHADOWFRAME(rFP), %eax
9448 movl %eax, OUT_ARG1(%esp)
9449 call MterpCheckBefore # (self, shadow_frame)
9450 REFRESH_IBASE
9451 jmp .L_op_nop+(122*128)
9452
9453/* ------------------------------ */
9454 .balign 128
9455.L_ALT_op_neg_int: /* 0x7b */
9456/* File: x86/alt_stub.S */
9457/*
9458 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9459 * any interesting requests and then jump to the real instruction
9460 * handler. Unlike the Arm handler, we can't do this as a tail call
9461 * because rIBASE is caller save and we need to reload it.
9462 *
9463 * Note that unlike in the Arm implementation, we should never arrive
9464 * here with a zero breakFlag because we always refresh rIBASE on
9465 * return.
9466 */
9467 .extern MterpCheckBefore
9468 EXPORT_PC
9469
9470 movl rSELF, %ecx
9471 movl %ecx, OUT_ARG0(%esp)
9472 leal OFF_FP_SHADOWFRAME(rFP), %eax
9473 movl %eax, OUT_ARG1(%esp)
9474 call MterpCheckBefore # (self, shadow_frame)
9475 REFRESH_IBASE
9476 jmp .L_op_nop+(123*128)
9477
9478/* ------------------------------ */
9479 .balign 128
9480.L_ALT_op_not_int: /* 0x7c */
9481/* File: x86/alt_stub.S */
9482/*
9483 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9484 * any interesting requests and then jump to the real instruction
9485 * handler. Unlike the Arm handler, we can't do this as a tail call
9486 * because rIBASE is caller save and we need to reload it.
9487 *
9488 * Note that unlike in the Arm implementation, we should never arrive
9489 * here with a zero breakFlag because we always refresh rIBASE on
9490 * return.
9491 */
9492 .extern MterpCheckBefore
9493 EXPORT_PC
9494
9495 movl rSELF, %ecx
9496 movl %ecx, OUT_ARG0(%esp)
9497 leal OFF_FP_SHADOWFRAME(rFP), %eax
9498 movl %eax, OUT_ARG1(%esp)
9499 call MterpCheckBefore # (self, shadow_frame)
9500 REFRESH_IBASE
9501 jmp .L_op_nop+(124*128)
9502
9503/* ------------------------------ */
9504 .balign 128
9505.L_ALT_op_neg_long: /* 0x7d */
9506/* File: x86/alt_stub.S */
9507/*
9508 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9509 * any interesting requests and then jump to the real instruction
9510 * handler. Unlike the Arm handler, we can't do this as a tail call
9511 * because rIBASE is caller save and we need to reload it.
9512 *
9513 * Note that unlike in the Arm implementation, we should never arrive
9514 * here with a zero breakFlag because we always refresh rIBASE on
9515 * return.
9516 */
9517 .extern MterpCheckBefore
9518 EXPORT_PC
9519
9520 movl rSELF, %ecx
9521 movl %ecx, OUT_ARG0(%esp)
9522 leal OFF_FP_SHADOWFRAME(rFP), %eax
9523 movl %eax, OUT_ARG1(%esp)
9524 call MterpCheckBefore # (self, shadow_frame)
9525 REFRESH_IBASE
9526 jmp .L_op_nop+(125*128)
9527
9528/* ------------------------------ */
9529 .balign 128
9530.L_ALT_op_not_long: /* 0x7e */
9531/* File: x86/alt_stub.S */
9532/*
9533 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9534 * any interesting requests and then jump to the real instruction
9535 * handler. Unlike the Arm handler, we can't do this as a tail call
9536 * because rIBASE is caller save and we need to reload it.
9537 *
9538 * Note that unlike in the Arm implementation, we should never arrive
9539 * here with a zero breakFlag because we always refresh rIBASE on
9540 * return.
9541 */
9542 .extern MterpCheckBefore
9543 EXPORT_PC
9544
9545 movl rSELF, %ecx
9546 movl %ecx, OUT_ARG0(%esp)
9547 leal OFF_FP_SHADOWFRAME(rFP), %eax
9548 movl %eax, OUT_ARG1(%esp)
9549 call MterpCheckBefore # (self, shadow_frame)
9550 REFRESH_IBASE
9551 jmp .L_op_nop+(126*128)
9552
9553/* ------------------------------ */
9554 .balign 128
9555.L_ALT_op_neg_float: /* 0x7f */
9556/* File: x86/alt_stub.S */
9557/*
9558 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9559 * any interesting requests and then jump to the real instruction
9560 * handler. Unlike the Arm handler, we can't do this as a tail call
9561 * because rIBASE is caller save and we need to reload it.
9562 *
9563 * Note that unlike in the Arm implementation, we should never arrive
9564 * here with a zero breakFlag because we always refresh rIBASE on
9565 * return.
9566 */
9567 .extern MterpCheckBefore
9568 EXPORT_PC
9569
9570 movl rSELF, %ecx
9571 movl %ecx, OUT_ARG0(%esp)
9572 leal OFF_FP_SHADOWFRAME(rFP), %eax
9573 movl %eax, OUT_ARG1(%esp)
9574 call MterpCheckBefore # (self, shadow_frame)
9575 REFRESH_IBASE
9576 jmp .L_op_nop+(127*128)
9577
9578/* ------------------------------ */
9579 .balign 128
9580.L_ALT_op_neg_double: /* 0x80 */
9581/* File: x86/alt_stub.S */
9582/*
9583 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9584 * any interesting requests and then jump to the real instruction
9585 * handler. Unlike the Arm handler, we can't do this as a tail call
9586 * because rIBASE is caller save and we need to reload it.
9587 *
9588 * Note that unlike in the Arm implementation, we should never arrive
9589 * here with a zero breakFlag because we always refresh rIBASE on
9590 * return.
9591 */
9592 .extern MterpCheckBefore
9593 EXPORT_PC
9594
9595 movl rSELF, %ecx
9596 movl %ecx, OUT_ARG0(%esp)
9597 leal OFF_FP_SHADOWFRAME(rFP), %eax
9598 movl %eax, OUT_ARG1(%esp)
9599 call MterpCheckBefore # (self, shadow_frame)
9600 REFRESH_IBASE
9601 jmp .L_op_nop+(128*128)
9602
9603/* ------------------------------ */
9604 .balign 128
9605.L_ALT_op_int_to_long: /* 0x81 */
9606/* File: x86/alt_stub.S */
9607/*
9608 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9609 * any interesting requests and then jump to the real instruction
9610 * handler. Unlike the Arm handler, we can't do this as a tail call
9611 * because rIBASE is caller save and we need to reload it.
9612 *
9613 * Note that unlike in the Arm implementation, we should never arrive
9614 * here with a zero breakFlag because we always refresh rIBASE on
9615 * return.
9616 */
9617 .extern MterpCheckBefore
9618 EXPORT_PC
9619
9620 movl rSELF, %ecx
9621 movl %ecx, OUT_ARG0(%esp)
9622 leal OFF_FP_SHADOWFRAME(rFP), %eax
9623 movl %eax, OUT_ARG1(%esp)
9624 call MterpCheckBefore # (self, shadow_frame)
9625 REFRESH_IBASE
9626 jmp .L_op_nop+(129*128)
9627
9628/* ------------------------------ */
9629 .balign 128
9630.L_ALT_op_int_to_float: /* 0x82 */
9631/* File: x86/alt_stub.S */
9632/*
9633 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9634 * any interesting requests and then jump to the real instruction
9635 * handler. Unlike the Arm handler, we can't do this as a tail call
9636 * because rIBASE is caller save and we need to reload it.
9637 *
9638 * Note that unlike in the Arm implementation, we should never arrive
9639 * here with a zero breakFlag because we always refresh rIBASE on
9640 * return.
9641 */
9642 .extern MterpCheckBefore
9643 EXPORT_PC
9644
9645 movl rSELF, %ecx
9646 movl %ecx, OUT_ARG0(%esp)
9647 leal OFF_FP_SHADOWFRAME(rFP), %eax
9648 movl %eax, OUT_ARG1(%esp)
9649 call MterpCheckBefore # (self, shadow_frame)
9650 REFRESH_IBASE
9651 jmp .L_op_nop+(130*128)
9652
9653/* ------------------------------ */
9654 .balign 128
9655.L_ALT_op_int_to_double: /* 0x83 */
9656/* File: x86/alt_stub.S */
9657/*
9658 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9659 * any interesting requests and then jump to the real instruction
9660 * handler. Unlike the Arm handler, we can't do this as a tail call
9661 * because rIBASE is caller save and we need to reload it.
9662 *
9663 * Note that unlike in the Arm implementation, we should never arrive
9664 * here with a zero breakFlag because we always refresh rIBASE on
9665 * return.
9666 */
9667 .extern MterpCheckBefore
9668 EXPORT_PC
9669
9670 movl rSELF, %ecx
9671 movl %ecx, OUT_ARG0(%esp)
9672 leal OFF_FP_SHADOWFRAME(rFP), %eax
9673 movl %eax, OUT_ARG1(%esp)
9674 call MterpCheckBefore # (self, shadow_frame)
9675 REFRESH_IBASE
9676 jmp .L_op_nop+(131*128)
9677
9678/* ------------------------------ */
9679 .balign 128
9680.L_ALT_op_long_to_int: /* 0x84 */
9681/* File: x86/alt_stub.S */
9682/*
9683 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9684 * any interesting requests and then jump to the real instruction
9685 * handler. Unlike the Arm handler, we can't do this as a tail call
9686 * because rIBASE is caller save and we need to reload it.
9687 *
9688 * Note that unlike in the Arm implementation, we should never arrive
9689 * here with a zero breakFlag because we always refresh rIBASE on
9690 * return.
9691 */
9692 .extern MterpCheckBefore
9693 EXPORT_PC
9694
9695 movl rSELF, %ecx
9696 movl %ecx, OUT_ARG0(%esp)
9697 leal OFF_FP_SHADOWFRAME(rFP), %eax
9698 movl %eax, OUT_ARG1(%esp)
9699 call MterpCheckBefore # (self, shadow_frame)
9700 REFRESH_IBASE
9701 jmp .L_op_nop+(132*128)
9702
9703/* ------------------------------ */
9704 .balign 128
9705.L_ALT_op_long_to_float: /* 0x85 */
9706/* File: x86/alt_stub.S */
9707/*
9708 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9709 * any interesting requests and then jump to the real instruction
9710 * handler. Unlike the Arm handler, we can't do this as a tail call
9711 * because rIBASE is caller save and we need to reload it.
9712 *
9713 * Note that unlike in the Arm implementation, we should never arrive
9714 * here with a zero breakFlag because we always refresh rIBASE on
9715 * return.
9716 */
9717 .extern MterpCheckBefore
9718 EXPORT_PC
9719
9720 movl rSELF, %ecx
9721 movl %ecx, OUT_ARG0(%esp)
9722 leal OFF_FP_SHADOWFRAME(rFP), %eax
9723 movl %eax, OUT_ARG1(%esp)
9724 call MterpCheckBefore # (self, shadow_frame)
9725 REFRESH_IBASE
9726 jmp .L_op_nop+(133*128)
9727
9728/* ------------------------------ */
9729 .balign 128
9730.L_ALT_op_long_to_double: /* 0x86 */
9731/* File: x86/alt_stub.S */
9732/*
9733 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9734 * any interesting requests and then jump to the real instruction
9735 * handler. Unlike the Arm handler, we can't do this as a tail call
9736 * because rIBASE is caller save and we need to reload it.
9737 *
9738 * Note that unlike in the Arm implementation, we should never arrive
9739 * here with a zero breakFlag because we always refresh rIBASE on
9740 * return.
9741 */
9742 .extern MterpCheckBefore
9743 EXPORT_PC
9744
9745 movl rSELF, %ecx
9746 movl %ecx, OUT_ARG0(%esp)
9747 leal OFF_FP_SHADOWFRAME(rFP), %eax
9748 movl %eax, OUT_ARG1(%esp)
9749 call MterpCheckBefore # (self, shadow_frame)
9750 REFRESH_IBASE
9751 jmp .L_op_nop+(134*128)
9752
9753/* ------------------------------ */
9754 .balign 128
9755.L_ALT_op_float_to_int: /* 0x87 */
9756/* File: x86/alt_stub.S */
9757/*
9758 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9759 * any interesting requests and then jump to the real instruction
9760 * handler. Unlike the Arm handler, we can't do this as a tail call
9761 * because rIBASE is caller save and we need to reload it.
9762 *
9763 * Note that unlike in the Arm implementation, we should never arrive
9764 * here with a zero breakFlag because we always refresh rIBASE on
9765 * return.
9766 */
9767 .extern MterpCheckBefore
9768 EXPORT_PC
9769
9770 movl rSELF, %ecx
9771 movl %ecx, OUT_ARG0(%esp)
9772 leal OFF_FP_SHADOWFRAME(rFP), %eax
9773 movl %eax, OUT_ARG1(%esp)
9774 call MterpCheckBefore # (self, shadow_frame)
9775 REFRESH_IBASE
9776 jmp .L_op_nop+(135*128)
9777
9778/* ------------------------------ */
9779 .balign 128
9780.L_ALT_op_float_to_long: /* 0x88 */
9781/* File: x86/alt_stub.S */
9782/*
9783 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9784 * any interesting requests and then jump to the real instruction
9785 * handler. Unlike the Arm handler, we can't do this as a tail call
9786 * because rIBASE is caller save and we need to reload it.
9787 *
9788 * Note that unlike in the Arm implementation, we should never arrive
9789 * here with a zero breakFlag because we always refresh rIBASE on
9790 * return.
9791 */
9792 .extern MterpCheckBefore
9793 EXPORT_PC
9794
9795 movl rSELF, %ecx
9796 movl %ecx, OUT_ARG0(%esp)
9797 leal OFF_FP_SHADOWFRAME(rFP), %eax
9798 movl %eax, OUT_ARG1(%esp)
9799 call MterpCheckBefore # (self, shadow_frame)
9800 REFRESH_IBASE
9801 jmp .L_op_nop+(136*128)
9802
9803/* ------------------------------ */
9804 .balign 128
9805.L_ALT_op_float_to_double: /* 0x89 */
9806/* File: x86/alt_stub.S */
9807/*
9808 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9809 * any interesting requests and then jump to the real instruction
9810 * handler. Unlike the Arm handler, we can't do this as a tail call
9811 * because rIBASE is caller save and we need to reload it.
9812 *
9813 * Note that unlike in the Arm implementation, we should never arrive
9814 * here with a zero breakFlag because we always refresh rIBASE on
9815 * return.
9816 */
9817 .extern MterpCheckBefore
9818 EXPORT_PC
9819
9820 movl rSELF, %ecx
9821 movl %ecx, OUT_ARG0(%esp)
9822 leal OFF_FP_SHADOWFRAME(rFP), %eax
9823 movl %eax, OUT_ARG1(%esp)
9824 call MterpCheckBefore # (self, shadow_frame)
9825 REFRESH_IBASE
9826 jmp .L_op_nop+(137*128)
9827
9828/* ------------------------------ */
9829 .balign 128
9830.L_ALT_op_double_to_int: /* 0x8a */
9831/* File: x86/alt_stub.S */
9832/*
9833 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9834 * any interesting requests and then jump to the real instruction
9835 * handler. Unlike the Arm handler, we can't do this as a tail call
9836 * because rIBASE is caller save and we need to reload it.
9837 *
9838 * Note that unlike in the Arm implementation, we should never arrive
9839 * here with a zero breakFlag because we always refresh rIBASE on
9840 * return.
9841 */
9842 .extern MterpCheckBefore
9843 EXPORT_PC
9844
9845 movl rSELF, %ecx
9846 movl %ecx, OUT_ARG0(%esp)
9847 leal OFF_FP_SHADOWFRAME(rFP), %eax
9848 movl %eax, OUT_ARG1(%esp)
9849 call MterpCheckBefore # (self, shadow_frame)
9850 REFRESH_IBASE
9851 jmp .L_op_nop+(138*128)
9852
9853/* ------------------------------ */
9854 .balign 128
9855.L_ALT_op_double_to_long: /* 0x8b */
9856/* File: x86/alt_stub.S */
9857/*
9858 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9859 * any interesting requests and then jump to the real instruction
9860 * handler. Unlike the Arm handler, we can't do this as a tail call
9861 * because rIBASE is caller save and we need to reload it.
9862 *
9863 * Note that unlike in the Arm implementation, we should never arrive
9864 * here with a zero breakFlag because we always refresh rIBASE on
9865 * return.
9866 */
9867 .extern MterpCheckBefore
9868 EXPORT_PC
9869
9870 movl rSELF, %ecx
9871 movl %ecx, OUT_ARG0(%esp)
9872 leal OFF_FP_SHADOWFRAME(rFP), %eax
9873 movl %eax, OUT_ARG1(%esp)
9874 call MterpCheckBefore # (self, shadow_frame)
9875 REFRESH_IBASE
9876 jmp .L_op_nop+(139*128)
9877
9878/* ------------------------------ */
9879 .balign 128
9880.L_ALT_op_double_to_float: /* 0x8c */
9881/* File: x86/alt_stub.S */
9882/*
9883 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9884 * any interesting requests and then jump to the real instruction
9885 * handler. Unlike the Arm handler, we can't do this as a tail call
9886 * because rIBASE is caller save and we need to reload it.
9887 *
9888 * Note that unlike in the Arm implementation, we should never arrive
9889 * here with a zero breakFlag because we always refresh rIBASE on
9890 * return.
9891 */
9892 .extern MterpCheckBefore
9893 EXPORT_PC
9894
9895 movl rSELF, %ecx
9896 movl %ecx, OUT_ARG0(%esp)
9897 leal OFF_FP_SHADOWFRAME(rFP), %eax
9898 movl %eax, OUT_ARG1(%esp)
9899 call MterpCheckBefore # (self, shadow_frame)
9900 REFRESH_IBASE
9901 jmp .L_op_nop+(140*128)
9902
9903/* ------------------------------ */
9904 .balign 128
9905.L_ALT_op_int_to_byte: /* 0x8d */
9906/* File: x86/alt_stub.S */
9907/*
9908 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9909 * any interesting requests and then jump to the real instruction
9910 * handler. Unlike the Arm handler, we can't do this as a tail call
9911 * because rIBASE is caller save and we need to reload it.
9912 *
9913 * Note that unlike in the Arm implementation, we should never arrive
9914 * here with a zero breakFlag because we always refresh rIBASE on
9915 * return.
9916 */
9917 .extern MterpCheckBefore
9918 EXPORT_PC
9919
9920 movl rSELF, %ecx
9921 movl %ecx, OUT_ARG0(%esp)
9922 leal OFF_FP_SHADOWFRAME(rFP), %eax
9923 movl %eax, OUT_ARG1(%esp)
9924 call MterpCheckBefore # (self, shadow_frame)
9925 REFRESH_IBASE
9926 jmp .L_op_nop+(141*128)
9927
9928/* ------------------------------ */
9929 .balign 128
9930.L_ALT_op_int_to_char: /* 0x8e */
9931/* File: x86/alt_stub.S */
9932/*
9933 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9934 * any interesting requests and then jump to the real instruction
9935 * handler. Unlike the Arm handler, we can't do this as a tail call
9936 * because rIBASE is caller save and we need to reload it.
9937 *
9938 * Note that unlike in the Arm implementation, we should never arrive
9939 * here with a zero breakFlag because we always refresh rIBASE on
9940 * return.
9941 */
9942 .extern MterpCheckBefore
9943 EXPORT_PC
9944
9945 movl rSELF, %ecx
9946 movl %ecx, OUT_ARG0(%esp)
9947 leal OFF_FP_SHADOWFRAME(rFP), %eax
9948 movl %eax, OUT_ARG1(%esp)
9949 call MterpCheckBefore # (self, shadow_frame)
9950 REFRESH_IBASE
9951 jmp .L_op_nop+(142*128)
9952
9953/* ------------------------------ */
9954 .balign 128
9955.L_ALT_op_int_to_short: /* 0x8f */
9956/* File: x86/alt_stub.S */
9957/*
9958 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9959 * any interesting requests and then jump to the real instruction
9960 * handler. Unlike the Arm handler, we can't do this as a tail call
9961 * because rIBASE is caller save and we need to reload it.
9962 *
9963 * Note that unlike in the Arm implementation, we should never arrive
9964 * here with a zero breakFlag because we always refresh rIBASE on
9965 * return.
9966 */
9967 .extern MterpCheckBefore
9968 EXPORT_PC
9969
9970 movl rSELF, %ecx
9971 movl %ecx, OUT_ARG0(%esp)
9972 leal OFF_FP_SHADOWFRAME(rFP), %eax
9973 movl %eax, OUT_ARG1(%esp)
9974 call MterpCheckBefore # (self, shadow_frame)
9975 REFRESH_IBASE
9976 jmp .L_op_nop+(143*128)
9977
9978/* ------------------------------ */
9979 .balign 128
9980.L_ALT_op_add_int: /* 0x90 */
9981/* File: x86/alt_stub.S */
9982/*
9983 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9984 * any interesting requests and then jump to the real instruction
9985 * handler. Unlike the Arm handler, we can't do this as a tail call
9986 * because rIBASE is caller save and we need to reload it.
9987 *
9988 * Note that unlike in the Arm implementation, we should never arrive
9989 * here with a zero breakFlag because we always refresh rIBASE on
9990 * return.
9991 */
9992 .extern MterpCheckBefore
9993 EXPORT_PC
9994
9995 movl rSELF, %ecx
9996 movl %ecx, OUT_ARG0(%esp)
9997 leal OFF_FP_SHADOWFRAME(rFP), %eax
9998 movl %eax, OUT_ARG1(%esp)
9999 call MterpCheckBefore # (self, shadow_frame)
10000 REFRESH_IBASE
10001 jmp .L_op_nop+(144*128)
10002
10003/* ------------------------------ */
10004 .balign 128
10005.L_ALT_op_sub_int: /* 0x91 */
10006/* File: x86/alt_stub.S */
10007/*
10008 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10009 * any interesting requests and then jump to the real instruction
10010 * handler. Unlike the Arm handler, we can't do this as a tail call
10011 * because rIBASE is caller save and we need to reload it.
10012 *
10013 * Note that unlike in the Arm implementation, we should never arrive
10014 * here with a zero breakFlag because we always refresh rIBASE on
10015 * return.
10016 */
10017 .extern MterpCheckBefore
10018 EXPORT_PC
10019
10020 movl rSELF, %ecx
10021 movl %ecx, OUT_ARG0(%esp)
10022 leal OFF_FP_SHADOWFRAME(rFP), %eax
10023 movl %eax, OUT_ARG1(%esp)
10024 call MterpCheckBefore # (self, shadow_frame)
10025 REFRESH_IBASE
10026 jmp .L_op_nop+(145*128)
10027
10028/* ------------------------------ */
10029 .balign 128
10030.L_ALT_op_mul_int: /* 0x92 */
10031/* File: x86/alt_stub.S */
10032/*
10033 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10034 * any interesting requests and then jump to the real instruction
10035 * handler. Unlike the Arm handler, we can't do this as a tail call
10036 * because rIBASE is caller save and we need to reload it.
10037 *
10038 * Note that unlike in the Arm implementation, we should never arrive
10039 * here with a zero breakFlag because we always refresh rIBASE on
10040 * return.
10041 */
10042 .extern MterpCheckBefore
10043 EXPORT_PC
10044
10045 movl rSELF, %ecx
10046 movl %ecx, OUT_ARG0(%esp)
10047 leal OFF_FP_SHADOWFRAME(rFP), %eax
10048 movl %eax, OUT_ARG1(%esp)
10049 call MterpCheckBefore # (self, shadow_frame)
10050 REFRESH_IBASE
10051 jmp .L_op_nop+(146*128)
10052
10053/* ------------------------------ */
10054 .balign 128
10055.L_ALT_op_div_int: /* 0x93 */
10056/* File: x86/alt_stub.S */
10057/*
10058 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10059 * any interesting requests and then jump to the real instruction
10060 * handler. Unlike the Arm handler, we can't do this as a tail call
10061 * because rIBASE is caller save and we need to reload it.
10062 *
10063 * Note that unlike in the Arm implementation, we should never arrive
10064 * here with a zero breakFlag because we always refresh rIBASE on
10065 * return.
10066 */
10067 .extern MterpCheckBefore
10068 EXPORT_PC
10069
10070 movl rSELF, %ecx
10071 movl %ecx, OUT_ARG0(%esp)
10072 leal OFF_FP_SHADOWFRAME(rFP), %eax
10073 movl %eax, OUT_ARG1(%esp)
10074 call MterpCheckBefore # (self, shadow_frame)
10075 REFRESH_IBASE
10076 jmp .L_op_nop+(147*128)
10077
10078/* ------------------------------ */
10079 .balign 128
10080.L_ALT_op_rem_int: /* 0x94 */
10081/* File: x86/alt_stub.S */
10082/*
10083 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10084 * any interesting requests and then jump to the real instruction
10085 * handler. Unlike the Arm handler, we can't do this as a tail call
10086 * because rIBASE is caller save and we need to reload it.
10087 *
10088 * Note that unlike in the Arm implementation, we should never arrive
10089 * here with a zero breakFlag because we always refresh rIBASE on
10090 * return.
10091 */
10092 .extern MterpCheckBefore
10093 EXPORT_PC
10094
10095 movl rSELF, %ecx
10096 movl %ecx, OUT_ARG0(%esp)
10097 leal OFF_FP_SHADOWFRAME(rFP), %eax
10098 movl %eax, OUT_ARG1(%esp)
10099 call MterpCheckBefore # (self, shadow_frame)
10100 REFRESH_IBASE
10101 jmp .L_op_nop+(148*128)
10102
10103/* ------------------------------ */
10104 .balign 128
10105.L_ALT_op_and_int: /* 0x95 */
10106/* File: x86/alt_stub.S */
10107/*
10108 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10109 * any interesting requests and then jump to the real instruction
10110 * handler. Unlike the Arm handler, we can't do this as a tail call
10111 * because rIBASE is caller save and we need to reload it.
10112 *
10113 * Note that unlike in the Arm implementation, we should never arrive
10114 * here with a zero breakFlag because we always refresh rIBASE on
10115 * return.
10116 */
10117 .extern MterpCheckBefore
10118 EXPORT_PC
10119
10120 movl rSELF, %ecx
10121 movl %ecx, OUT_ARG0(%esp)
10122 leal OFF_FP_SHADOWFRAME(rFP), %eax
10123 movl %eax, OUT_ARG1(%esp)
10124 call MterpCheckBefore # (self, shadow_frame)
10125 REFRESH_IBASE
10126 jmp .L_op_nop+(149*128)
10127
10128/* ------------------------------ */
10129 .balign 128
10130.L_ALT_op_or_int: /* 0x96 */
10131/* File: x86/alt_stub.S */
10132/*
10133 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10134 * any interesting requests and then jump to the real instruction
10135 * handler. Unlike the Arm handler, we can't do this as a tail call
10136 * because rIBASE is caller save and we need to reload it.
10137 *
10138 * Note that unlike in the Arm implementation, we should never arrive
10139 * here with a zero breakFlag because we always refresh rIBASE on
10140 * return.
10141 */
10142 .extern MterpCheckBefore
10143 EXPORT_PC
10144
10145 movl rSELF, %ecx
10146 movl %ecx, OUT_ARG0(%esp)
10147 leal OFF_FP_SHADOWFRAME(rFP), %eax
10148 movl %eax, OUT_ARG1(%esp)
10149 call MterpCheckBefore # (self, shadow_frame)
10150 REFRESH_IBASE
10151 jmp .L_op_nop+(150*128)
10152
10153/* ------------------------------ */
10154 .balign 128
10155.L_ALT_op_xor_int: /* 0x97 */
10156/* File: x86/alt_stub.S */
10157/*
10158 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10159 * any interesting requests and then jump to the real instruction
10160 * handler. Unlike the Arm handler, we can't do this as a tail call
10161 * because rIBASE is caller save and we need to reload it.
10162 *
10163 * Note that unlike in the Arm implementation, we should never arrive
10164 * here with a zero breakFlag because we always refresh rIBASE on
10165 * return.
10166 */
10167 .extern MterpCheckBefore
10168 EXPORT_PC
10169
10170 movl rSELF, %ecx
10171 movl %ecx, OUT_ARG0(%esp)
10172 leal OFF_FP_SHADOWFRAME(rFP), %eax
10173 movl %eax, OUT_ARG1(%esp)
10174 call MterpCheckBefore # (self, shadow_frame)
10175 REFRESH_IBASE
10176 jmp .L_op_nop+(151*128)
10177
10178/* ------------------------------ */
10179 .balign 128
10180.L_ALT_op_shl_int: /* 0x98 */
10181/* File: x86/alt_stub.S */
10182/*
10183 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10184 * any interesting requests and then jump to the real instruction
10185 * handler. Unlike the Arm handler, we can't do this as a tail call
10186 * because rIBASE is caller save and we need to reload it.
10187 *
10188 * Note that unlike in the Arm implementation, we should never arrive
10189 * here with a zero breakFlag because we always refresh rIBASE on
10190 * return.
10191 */
10192 .extern MterpCheckBefore
10193 EXPORT_PC
10194
10195 movl rSELF, %ecx
10196 movl %ecx, OUT_ARG0(%esp)
10197 leal OFF_FP_SHADOWFRAME(rFP), %eax
10198 movl %eax, OUT_ARG1(%esp)
10199 call MterpCheckBefore # (self, shadow_frame)
10200 REFRESH_IBASE
10201 jmp .L_op_nop+(152*128)
10202
10203/* ------------------------------ */
10204 .balign 128
10205.L_ALT_op_shr_int: /* 0x99 */
10206/* File: x86/alt_stub.S */
10207/*
10208 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10209 * any interesting requests and then jump to the real instruction
10210 * handler. Unlike the Arm handler, we can't do this as a tail call
10211 * because rIBASE is caller save and we need to reload it.
10212 *
10213 * Note that unlike in the Arm implementation, we should never arrive
10214 * here with a zero breakFlag because we always refresh rIBASE on
10215 * return.
10216 */
10217 .extern MterpCheckBefore
10218 EXPORT_PC
10219
10220 movl rSELF, %ecx
10221 movl %ecx, OUT_ARG0(%esp)
10222 leal OFF_FP_SHADOWFRAME(rFP), %eax
10223 movl %eax, OUT_ARG1(%esp)
10224 call MterpCheckBefore # (self, shadow_frame)
10225 REFRESH_IBASE
10226 jmp .L_op_nop+(153*128)
10227
10228/* ------------------------------ */
10229 .balign 128
10230.L_ALT_op_ushr_int: /* 0x9a */
10231/* File: x86/alt_stub.S */
10232/*
10233 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10234 * any interesting requests and then jump to the real instruction
10235 * handler. Unlike the Arm handler, we can't do this as a tail call
10236 * because rIBASE is caller save and we need to reload it.
10237 *
10238 * Note that unlike in the Arm implementation, we should never arrive
10239 * here with a zero breakFlag because we always refresh rIBASE on
10240 * return.
10241 */
10242 .extern MterpCheckBefore
10243 EXPORT_PC
10244
10245 movl rSELF, %ecx
10246 movl %ecx, OUT_ARG0(%esp)
10247 leal OFF_FP_SHADOWFRAME(rFP), %eax
10248 movl %eax, OUT_ARG1(%esp)
10249 call MterpCheckBefore # (self, shadow_frame)
10250 REFRESH_IBASE
10251 jmp .L_op_nop+(154*128)
10252
10253/* ------------------------------ */
10254 .balign 128
10255.L_ALT_op_add_long: /* 0x9b */
10256/* File: x86/alt_stub.S */
10257/*
10258 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10259 * any interesting requests and then jump to the real instruction
10260 * handler. Unlike the Arm handler, we can't do this as a tail call
10261 * because rIBASE is caller save and we need to reload it.
10262 *
10263 * Note that unlike in the Arm implementation, we should never arrive
10264 * here with a zero breakFlag because we always refresh rIBASE on
10265 * return.
10266 */
10267 .extern MterpCheckBefore
10268 EXPORT_PC
10269
10270 movl rSELF, %ecx
10271 movl %ecx, OUT_ARG0(%esp)
10272 leal OFF_FP_SHADOWFRAME(rFP), %eax
10273 movl %eax, OUT_ARG1(%esp)
10274 call MterpCheckBefore # (self, shadow_frame)
10275 REFRESH_IBASE
10276 jmp .L_op_nop+(155*128)
10277
10278/* ------------------------------ */
10279 .balign 128
10280.L_ALT_op_sub_long: /* 0x9c */
10281/* File: x86/alt_stub.S */
10282/*
10283 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10284 * any interesting requests and then jump to the real instruction
10285 * handler. Unlike the Arm handler, we can't do this as a tail call
10286 * because rIBASE is caller save and we need to reload it.
10287 *
10288 * Note that unlike in the Arm implementation, we should never arrive
10289 * here with a zero breakFlag because we always refresh rIBASE on
10290 * return.
10291 */
10292 .extern MterpCheckBefore
10293 EXPORT_PC
10294
10295 movl rSELF, %ecx
10296 movl %ecx, OUT_ARG0(%esp)
10297 leal OFF_FP_SHADOWFRAME(rFP), %eax
10298 movl %eax, OUT_ARG1(%esp)
10299 call MterpCheckBefore # (self, shadow_frame)
10300 REFRESH_IBASE
10301 jmp .L_op_nop+(156*128)
10302
10303/* ------------------------------ */
10304 .balign 128
10305.L_ALT_op_mul_long: /* 0x9d */
10306/* File: x86/alt_stub.S */
10307/*
10308 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10309 * any interesting requests and then jump to the real instruction
10310 * handler. Unlike the Arm handler, we can't do this as a tail call
10311 * because rIBASE is caller save and we need to reload it.
10312 *
10313 * Note that unlike in the Arm implementation, we should never arrive
10314 * here with a zero breakFlag because we always refresh rIBASE on
10315 * return.
10316 */
10317 .extern MterpCheckBefore
10318 EXPORT_PC
10319
10320 movl rSELF, %ecx
10321 movl %ecx, OUT_ARG0(%esp)
10322 leal OFF_FP_SHADOWFRAME(rFP), %eax
10323 movl %eax, OUT_ARG1(%esp)
10324 call MterpCheckBefore # (self, shadow_frame)
10325 REFRESH_IBASE
10326 jmp .L_op_nop+(157*128)
10327
10328/* ------------------------------ */
10329 .balign 128
10330.L_ALT_op_div_long: /* 0x9e */
10331/* File: x86/alt_stub.S */
10332/*
10333 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10334 * any interesting requests and then jump to the real instruction
10335 * handler. Unlike the Arm handler, we can't do this as a tail call
10336 * because rIBASE is caller save and we need to reload it.
10337 *
10338 * Note that unlike in the Arm implementation, we should never arrive
10339 * here with a zero breakFlag because we always refresh rIBASE on
10340 * return.
10341 */
10342 .extern MterpCheckBefore
10343 EXPORT_PC
10344
10345 movl rSELF, %ecx
10346 movl %ecx, OUT_ARG0(%esp)
10347 leal OFF_FP_SHADOWFRAME(rFP), %eax
10348 movl %eax, OUT_ARG1(%esp)
10349 call MterpCheckBefore # (self, shadow_frame)
10350 REFRESH_IBASE
10351 jmp .L_op_nop+(158*128)
10352
10353/* ------------------------------ */
10354 .balign 128
10355.L_ALT_op_rem_long: /* 0x9f */
10356/* File: x86/alt_stub.S */
10357/*
10358 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10359 * any interesting requests and then jump to the real instruction
10360 * handler. Unlike the Arm handler, we can't do this as a tail call
10361 * because rIBASE is caller save and we need to reload it.
10362 *
10363 * Note that unlike in the Arm implementation, we should never arrive
10364 * here with a zero breakFlag because we always refresh rIBASE on
10365 * return.
10366 */
10367 .extern MterpCheckBefore
10368 EXPORT_PC
10369
10370 movl rSELF, %ecx
10371 movl %ecx, OUT_ARG0(%esp)
10372 leal OFF_FP_SHADOWFRAME(rFP), %eax
10373 movl %eax, OUT_ARG1(%esp)
10374 call MterpCheckBefore # (self, shadow_frame)
10375 REFRESH_IBASE
10376 jmp .L_op_nop+(159*128)
10377
10378/* ------------------------------ */
10379 .balign 128
10380.L_ALT_op_and_long: /* 0xa0 */
10381/* File: x86/alt_stub.S */
10382/*
10383 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10384 * any interesting requests and then jump to the real instruction
10385 * handler. Unlike the Arm handler, we can't do this as a tail call
10386 * because rIBASE is caller save and we need to reload it.
10387 *
10388 * Note that unlike in the Arm implementation, we should never arrive
10389 * here with a zero breakFlag because we always refresh rIBASE on
10390 * return.
10391 */
10392 .extern MterpCheckBefore
10393 EXPORT_PC
10394
10395 movl rSELF, %ecx
10396 movl %ecx, OUT_ARG0(%esp)
10397 leal OFF_FP_SHADOWFRAME(rFP), %eax
10398 movl %eax, OUT_ARG1(%esp)
10399 call MterpCheckBefore # (self, shadow_frame)
10400 REFRESH_IBASE
10401 jmp .L_op_nop+(160*128)
10402
10403/* ------------------------------ */
10404 .balign 128
10405.L_ALT_op_or_long: /* 0xa1 */
10406/* File: x86/alt_stub.S */
10407/*
10408 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10409 * any interesting requests and then jump to the real instruction
10410 * handler. Unlike the Arm handler, we can't do this as a tail call
10411 * because rIBASE is caller save and we need to reload it.
10412 *
10413 * Note that unlike in the Arm implementation, we should never arrive
10414 * here with a zero breakFlag because we always refresh rIBASE on
10415 * return.
10416 */
10417 .extern MterpCheckBefore
10418 EXPORT_PC
10419
10420 movl rSELF, %ecx
10421 movl %ecx, OUT_ARG0(%esp)
10422 leal OFF_FP_SHADOWFRAME(rFP), %eax
10423 movl %eax, OUT_ARG1(%esp)
10424 call MterpCheckBefore # (self, shadow_frame)
10425 REFRESH_IBASE
10426 jmp .L_op_nop+(161*128)
10427
10428/* ------------------------------ */
10429 .balign 128
10430.L_ALT_op_xor_long: /* 0xa2 */
10431/* File: x86/alt_stub.S */
10432/*
10433 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10434 * any interesting requests and then jump to the real instruction
10435 * handler. Unlike the Arm handler, we can't do this as a tail call
10436 * because rIBASE is caller save and we need to reload it.
10437 *
10438 * Note that unlike in the Arm implementation, we should never arrive
10439 * here with a zero breakFlag because we always refresh rIBASE on
10440 * return.
10441 */
10442 .extern MterpCheckBefore
10443 EXPORT_PC
10444
10445 movl rSELF, %ecx
10446 movl %ecx, OUT_ARG0(%esp)
10447 leal OFF_FP_SHADOWFRAME(rFP), %eax
10448 movl %eax, OUT_ARG1(%esp)
10449 call MterpCheckBefore # (self, shadow_frame)
10450 REFRESH_IBASE
10451 jmp .L_op_nop+(162*128)
10452
10453/* ------------------------------ */
10454 .balign 128
10455.L_ALT_op_shl_long: /* 0xa3 */
10456/* File: x86/alt_stub.S */
10457/*
10458 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10459 * any interesting requests and then jump to the real instruction
10460 * handler. Unlike the Arm handler, we can't do this as a tail call
10461 * because rIBASE is caller save and we need to reload it.
10462 *
10463 * Note that unlike in the Arm implementation, we should never arrive
10464 * here with a zero breakFlag because we always refresh rIBASE on
10465 * return.
10466 */
10467 .extern MterpCheckBefore
10468 EXPORT_PC
10469
10470 movl rSELF, %ecx
10471 movl %ecx, OUT_ARG0(%esp)
10472 leal OFF_FP_SHADOWFRAME(rFP), %eax
10473 movl %eax, OUT_ARG1(%esp)
10474 call MterpCheckBefore # (self, shadow_frame)
10475 REFRESH_IBASE
10476 jmp .L_op_nop+(163*128)
10477
10478/* ------------------------------ */
10479 .balign 128
10480.L_ALT_op_shr_long: /* 0xa4 */
10481/* File: x86/alt_stub.S */
10482/*
10483 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10484 * any interesting requests and then jump to the real instruction
10485 * handler. Unlike the Arm handler, we can't do this as a tail call
10486 * because rIBASE is caller save and we need to reload it.
10487 *
10488 * Note that unlike in the Arm implementation, we should never arrive
10489 * here with a zero breakFlag because we always refresh rIBASE on
10490 * return.
10491 */
10492 .extern MterpCheckBefore
10493 EXPORT_PC
10494
10495 movl rSELF, %ecx
10496 movl %ecx, OUT_ARG0(%esp)
10497 leal OFF_FP_SHADOWFRAME(rFP), %eax
10498 movl %eax, OUT_ARG1(%esp)
10499 call MterpCheckBefore # (self, shadow_frame)
10500 REFRESH_IBASE
10501 jmp .L_op_nop+(164*128)
10502
10503/* ------------------------------ */
10504 .balign 128
10505.L_ALT_op_ushr_long: /* 0xa5 */
10506/* File: x86/alt_stub.S */
10507/*
10508 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10509 * any interesting requests and then jump to the real instruction
10510 * handler. Unlike the Arm handler, we can't do this as a tail call
10511 * because rIBASE is caller save and we need to reload it.
10512 *
10513 * Note that unlike in the Arm implementation, we should never arrive
10514 * here with a zero breakFlag because we always refresh rIBASE on
10515 * return.
10516 */
10517 .extern MterpCheckBefore
10518 EXPORT_PC
10519
10520 movl rSELF, %ecx
10521 movl %ecx, OUT_ARG0(%esp)
10522 leal OFF_FP_SHADOWFRAME(rFP), %eax
10523 movl %eax, OUT_ARG1(%esp)
10524 call MterpCheckBefore # (self, shadow_frame)
10525 REFRESH_IBASE
10526 jmp .L_op_nop+(165*128)
10527
10528/* ------------------------------ */
10529 .balign 128
10530.L_ALT_op_add_float: /* 0xa6 */
10531/* File: x86/alt_stub.S */
10532/*
10533 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10534 * any interesting requests and then jump to the real instruction
10535 * handler. Unlike the Arm handler, we can't do this as a tail call
10536 * because rIBASE is caller save and we need to reload it.
10537 *
10538 * Note that unlike in the Arm implementation, we should never arrive
10539 * here with a zero breakFlag because we always refresh rIBASE on
10540 * return.
10541 */
10542 .extern MterpCheckBefore
10543 EXPORT_PC
10544
10545 movl rSELF, %ecx
10546 movl %ecx, OUT_ARG0(%esp)
10547 leal OFF_FP_SHADOWFRAME(rFP), %eax
10548 movl %eax, OUT_ARG1(%esp)
10549 call MterpCheckBefore # (self, shadow_frame)
10550 REFRESH_IBASE
10551 jmp .L_op_nop+(166*128)
10552
10553/* ------------------------------ */
10554 .balign 128
10555.L_ALT_op_sub_float: /* 0xa7 */
10556/* File: x86/alt_stub.S */
10557/*
10558 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10559 * any interesting requests and then jump to the real instruction
10560 * handler. Unlike the Arm handler, we can't do this as a tail call
10561 * because rIBASE is caller save and we need to reload it.
10562 *
10563 * Note that unlike in the Arm implementation, we should never arrive
10564 * here with a zero breakFlag because we always refresh rIBASE on
10565 * return.
10566 */
10567 .extern MterpCheckBefore
10568 EXPORT_PC
10569
10570 movl rSELF, %ecx
10571 movl %ecx, OUT_ARG0(%esp)
10572 leal OFF_FP_SHADOWFRAME(rFP), %eax
10573 movl %eax, OUT_ARG1(%esp)
10574 call MterpCheckBefore # (self, shadow_frame)
10575 REFRESH_IBASE
10576 jmp .L_op_nop+(167*128)
10577
10578/* ------------------------------ */
10579 .balign 128
10580.L_ALT_op_mul_float: /* 0xa8 */
10581/* File: x86/alt_stub.S */
10582/*
10583 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10584 * any interesting requests and then jump to the real instruction
10585 * handler. Unlike the Arm handler, we can't do this as a tail call
10586 * because rIBASE is caller save and we need to reload it.
10587 *
10588 * Note that unlike in the Arm implementation, we should never arrive
10589 * here with a zero breakFlag because we always refresh rIBASE on
10590 * return.
10591 */
10592 .extern MterpCheckBefore
10593 EXPORT_PC
10594
10595 movl rSELF, %ecx
10596 movl %ecx, OUT_ARG0(%esp)
10597 leal OFF_FP_SHADOWFRAME(rFP), %eax
10598 movl %eax, OUT_ARG1(%esp)
10599 call MterpCheckBefore # (self, shadow_frame)
10600 REFRESH_IBASE
10601 jmp .L_op_nop+(168*128)
10602
10603/* ------------------------------ */
10604 .balign 128
10605.L_ALT_op_div_float: /* 0xa9 */
10606/* File: x86/alt_stub.S */
10607/*
10608 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10609 * any interesting requests and then jump to the real instruction
10610 * handler. Unlike the Arm handler, we can't do this as a tail call
10611 * because rIBASE is caller save and we need to reload it.
10612 *
10613 * Note that unlike in the Arm implementation, we should never arrive
10614 * here with a zero breakFlag because we always refresh rIBASE on
10615 * return.
10616 */
10617 .extern MterpCheckBefore
10618 EXPORT_PC
10619
10620 movl rSELF, %ecx
10621 movl %ecx, OUT_ARG0(%esp)
10622 leal OFF_FP_SHADOWFRAME(rFP), %eax
10623 movl %eax, OUT_ARG1(%esp)
10624 call MterpCheckBefore # (self, shadow_frame)
10625 REFRESH_IBASE
10626 jmp .L_op_nop+(169*128)
10627
10628/* ------------------------------ */
10629 .balign 128
10630.L_ALT_op_rem_float: /* 0xaa */
10631/* File: x86/alt_stub.S */
10632/*
10633 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10634 * any interesting requests and then jump to the real instruction
10635 * handler. Unlike the Arm handler, we can't do this as a tail call
10636 * because rIBASE is caller save and we need to reload it.
10637 *
10638 * Note that unlike in the Arm implementation, we should never arrive
10639 * here with a zero breakFlag because we always refresh rIBASE on
10640 * return.
10641 */
10642 .extern MterpCheckBefore
10643 EXPORT_PC
10644
10645 movl rSELF, %ecx
10646 movl %ecx, OUT_ARG0(%esp)
10647 leal OFF_FP_SHADOWFRAME(rFP), %eax
10648 movl %eax, OUT_ARG1(%esp)
10649 call MterpCheckBefore # (self, shadow_frame)
10650 REFRESH_IBASE
10651 jmp .L_op_nop+(170*128)
10652
10653/* ------------------------------ */
10654 .balign 128
10655.L_ALT_op_add_double: /* 0xab */
10656/* File: x86/alt_stub.S */
10657/*
10658 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10659 * any interesting requests and then jump to the real instruction
10660 * handler. Unlike the Arm handler, we can't do this as a tail call
10661 * because rIBASE is caller save and we need to reload it.
10662 *
10663 * Note that unlike in the Arm implementation, we should never arrive
10664 * here with a zero breakFlag because we always refresh rIBASE on
10665 * return.
10666 */
10667 .extern MterpCheckBefore
10668 EXPORT_PC
10669
10670 movl rSELF, %ecx
10671 movl %ecx, OUT_ARG0(%esp)
10672 leal OFF_FP_SHADOWFRAME(rFP), %eax
10673 movl %eax, OUT_ARG1(%esp)
10674 call MterpCheckBefore # (self, shadow_frame)
10675 REFRESH_IBASE
10676 jmp .L_op_nop+(171*128)
10677
10678/* ------------------------------ */
10679 .balign 128
10680.L_ALT_op_sub_double: /* 0xac */
10681/* File: x86/alt_stub.S */
10682/*
10683 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10684 * any interesting requests and then jump to the real instruction
10685 * handler. Unlike the Arm handler, we can't do this as a tail call
10686 * because rIBASE is caller save and we need to reload it.
10687 *
10688 * Note that unlike in the Arm implementation, we should never arrive
10689 * here with a zero breakFlag because we always refresh rIBASE on
10690 * return.
10691 */
10692 .extern MterpCheckBefore
10693 EXPORT_PC
10694
10695 movl rSELF, %ecx
10696 movl %ecx, OUT_ARG0(%esp)
10697 leal OFF_FP_SHADOWFRAME(rFP), %eax
10698 movl %eax, OUT_ARG1(%esp)
10699 call MterpCheckBefore # (self, shadow_frame)
10700 REFRESH_IBASE
10701 jmp .L_op_nop+(172*128)
10702
10703/* ------------------------------ */
10704 .balign 128
10705.L_ALT_op_mul_double: /* 0xad */
10706/* File: x86/alt_stub.S */
10707/*
10708 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10709 * any interesting requests and then jump to the real instruction
10710 * handler. Unlike the Arm handler, we can't do this as a tail call
10711 * because rIBASE is caller save and we need to reload it.
10712 *
10713 * Note that unlike in the Arm implementation, we should never arrive
10714 * here with a zero breakFlag because we always refresh rIBASE on
10715 * return.
10716 */
10717 .extern MterpCheckBefore
10718 EXPORT_PC
10719
10720 movl rSELF, %ecx
10721 movl %ecx, OUT_ARG0(%esp)
10722 leal OFF_FP_SHADOWFRAME(rFP), %eax
10723 movl %eax, OUT_ARG1(%esp)
10724 call MterpCheckBefore # (self, shadow_frame)
10725 REFRESH_IBASE
10726 jmp .L_op_nop+(173*128)
10727
10728/* ------------------------------ */
10729 .balign 128
10730.L_ALT_op_div_double: /* 0xae */
10731/* File: x86/alt_stub.S */
10732/*
10733 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10734 * any interesting requests and then jump to the real instruction
10735 * handler. Unlike the Arm handler, we can't do this as a tail call
10736 * because rIBASE is caller save and we need to reload it.
10737 *
10738 * Note that unlike in the Arm implementation, we should never arrive
10739 * here with a zero breakFlag because we always refresh rIBASE on
10740 * return.
10741 */
10742 .extern MterpCheckBefore
10743 EXPORT_PC
10744
10745 movl rSELF, %ecx
10746 movl %ecx, OUT_ARG0(%esp)
10747 leal OFF_FP_SHADOWFRAME(rFP), %eax
10748 movl %eax, OUT_ARG1(%esp)
10749 call MterpCheckBefore # (self, shadow_frame)
10750 REFRESH_IBASE
10751 jmp .L_op_nop+(174*128)
10752
10753/* ------------------------------ */
10754 .balign 128
10755.L_ALT_op_rem_double: /* 0xaf */
10756/* File: x86/alt_stub.S */
10757/*
10758 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10759 * any interesting requests and then jump to the real instruction
10760 * handler. Unlike the Arm handler, we can't do this as a tail call
10761 * because rIBASE is caller save and we need to reload it.
10762 *
10763 * Note that unlike in the Arm implementation, we should never arrive
10764 * here with a zero breakFlag because we always refresh rIBASE on
10765 * return.
10766 */
10767 .extern MterpCheckBefore
10768 EXPORT_PC
10769
10770 movl rSELF, %ecx
10771 movl %ecx, OUT_ARG0(%esp)
10772 leal OFF_FP_SHADOWFRAME(rFP), %eax
10773 movl %eax, OUT_ARG1(%esp)
10774 call MterpCheckBefore # (self, shadow_frame)
10775 REFRESH_IBASE
10776 jmp .L_op_nop+(175*128)
10777
10778/* ------------------------------ */
10779 .balign 128
10780.L_ALT_op_add_int_2addr: /* 0xb0 */
10781/* File: x86/alt_stub.S */
10782/*
10783 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10784 * any interesting requests and then jump to the real instruction
10785 * handler. Unlike the Arm handler, we can't do this as a tail call
10786 * because rIBASE is caller save and we need to reload it.
10787 *
10788 * Note that unlike in the Arm implementation, we should never arrive
10789 * here with a zero breakFlag because we always refresh rIBASE on
10790 * return.
10791 */
10792 .extern MterpCheckBefore
10793 EXPORT_PC
10794
10795 movl rSELF, %ecx
10796 movl %ecx, OUT_ARG0(%esp)
10797 leal OFF_FP_SHADOWFRAME(rFP), %eax
10798 movl %eax, OUT_ARG1(%esp)
10799 call MterpCheckBefore # (self, shadow_frame)
10800 REFRESH_IBASE
10801 jmp .L_op_nop+(176*128)
10802
10803/* ------------------------------ */
10804 .balign 128
10805.L_ALT_op_sub_int_2addr: /* 0xb1 */
10806/* File: x86/alt_stub.S */
10807/*
10808 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10809 * any interesting requests and then jump to the real instruction
10810 * handler. Unlike the Arm handler, we can't do this as a tail call
10811 * because rIBASE is caller save and we need to reload it.
10812 *
10813 * Note that unlike in the Arm implementation, we should never arrive
10814 * here with a zero breakFlag because we always refresh rIBASE on
10815 * return.
10816 */
10817 .extern MterpCheckBefore
10818 EXPORT_PC
10819
10820 movl rSELF, %ecx
10821 movl %ecx, OUT_ARG0(%esp)
10822 leal OFF_FP_SHADOWFRAME(rFP), %eax
10823 movl %eax, OUT_ARG1(%esp)
10824 call MterpCheckBefore # (self, shadow_frame)
10825 REFRESH_IBASE
10826 jmp .L_op_nop+(177*128)
10827
10828/* ------------------------------ */
10829 .balign 128
10830.L_ALT_op_mul_int_2addr: /* 0xb2 */
10831/* File: x86/alt_stub.S */
10832/*
10833 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10834 * any interesting requests and then jump to the real instruction
10835 * handler. Unlike the Arm handler, we can't do this as a tail call
10836 * because rIBASE is caller save and we need to reload it.
10837 *
10838 * Note that unlike in the Arm implementation, we should never arrive
10839 * here with a zero breakFlag because we always refresh rIBASE on
10840 * return.
10841 */
10842 .extern MterpCheckBefore
10843 EXPORT_PC
10844
10845 movl rSELF, %ecx
10846 movl %ecx, OUT_ARG0(%esp)
10847 leal OFF_FP_SHADOWFRAME(rFP), %eax
10848 movl %eax, OUT_ARG1(%esp)
10849 call MterpCheckBefore # (self, shadow_frame)
10850 REFRESH_IBASE
10851 jmp .L_op_nop+(178*128)
10852
10853/* ------------------------------ */
10854 .balign 128
10855.L_ALT_op_div_int_2addr: /* 0xb3 */
10856/* File: x86/alt_stub.S */
10857/*
10858 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10859 * any interesting requests and then jump to the real instruction
10860 * handler. Unlike the Arm handler, we can't do this as a tail call
10861 * because rIBASE is caller save and we need to reload it.
10862 *
10863 * Note that unlike in the Arm implementation, we should never arrive
10864 * here with a zero breakFlag because we always refresh rIBASE on
10865 * return.
10866 */
10867 .extern MterpCheckBefore
10868 EXPORT_PC
10869
10870 movl rSELF, %ecx
10871 movl %ecx, OUT_ARG0(%esp)
10872 leal OFF_FP_SHADOWFRAME(rFP), %eax
10873 movl %eax, OUT_ARG1(%esp)
10874 call MterpCheckBefore # (self, shadow_frame)
10875 REFRESH_IBASE
10876 jmp .L_op_nop+(179*128)
10877
10878/* ------------------------------ */
10879 .balign 128
10880.L_ALT_op_rem_int_2addr: /* 0xb4 */
10881/* File: x86/alt_stub.S */
10882/*
10883 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10884 * any interesting requests and then jump to the real instruction
10885 * handler. Unlike the Arm handler, we can't do this as a tail call
10886 * because rIBASE is caller save and we need to reload it.
10887 *
10888 * Note that unlike in the Arm implementation, we should never arrive
10889 * here with a zero breakFlag because we always refresh rIBASE on
10890 * return.
10891 */
10892 .extern MterpCheckBefore
10893 EXPORT_PC
10894
10895 movl rSELF, %ecx
10896 movl %ecx, OUT_ARG0(%esp)
10897 leal OFF_FP_SHADOWFRAME(rFP), %eax
10898 movl %eax, OUT_ARG1(%esp)
10899 call MterpCheckBefore # (self, shadow_frame)
10900 REFRESH_IBASE
10901 jmp .L_op_nop+(180*128)
10902
10903/* ------------------------------ */
10904 .balign 128
10905.L_ALT_op_and_int_2addr: /* 0xb5 */
10906/* File: x86/alt_stub.S */
10907/*
10908 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10909 * any interesting requests and then jump to the real instruction
10910 * handler. Unlike the Arm handler, we can't do this as a tail call
10911 * because rIBASE is caller save and we need to reload it.
10912 *
10913 * Note that unlike in the Arm implementation, we should never arrive
10914 * here with a zero breakFlag because we always refresh rIBASE on
10915 * return.
10916 */
10917 .extern MterpCheckBefore
10918 EXPORT_PC
10919
10920 movl rSELF, %ecx
10921 movl %ecx, OUT_ARG0(%esp)
10922 leal OFF_FP_SHADOWFRAME(rFP), %eax
10923 movl %eax, OUT_ARG1(%esp)
10924 call MterpCheckBefore # (self, shadow_frame)
10925 REFRESH_IBASE
10926 jmp .L_op_nop+(181*128)
10927
10928/* ------------------------------ */
10929 .balign 128
10930.L_ALT_op_or_int_2addr: /* 0xb6 */
10931/* File: x86/alt_stub.S */
10932/*
10933 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10934 * any interesting requests and then jump to the real instruction
10935 * handler. Unlike the Arm handler, we can't do this as a tail call
10936 * because rIBASE is caller save and we need to reload it.
10937 *
10938 * Note that unlike in the Arm implementation, we should never arrive
10939 * here with a zero breakFlag because we always refresh rIBASE on
10940 * return.
10941 */
10942 .extern MterpCheckBefore
10943 EXPORT_PC
10944
10945 movl rSELF, %ecx
10946 movl %ecx, OUT_ARG0(%esp)
10947 leal OFF_FP_SHADOWFRAME(rFP), %eax
10948 movl %eax, OUT_ARG1(%esp)
10949 call MterpCheckBefore # (self, shadow_frame)
10950 REFRESH_IBASE
10951 jmp .L_op_nop+(182*128)
10952
10953/* ------------------------------ */
10954 .balign 128
10955.L_ALT_op_xor_int_2addr: /* 0xb7 */
10956/* File: x86/alt_stub.S */
10957/*
10958 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10959 * any interesting requests and then jump to the real instruction
10960 * handler. Unlike the Arm handler, we can't do this as a tail call
10961 * because rIBASE is caller save and we need to reload it.
10962 *
10963 * Note that unlike in the Arm implementation, we should never arrive
10964 * here with a zero breakFlag because we always refresh rIBASE on
10965 * return.
10966 */
10967 .extern MterpCheckBefore
10968 EXPORT_PC
10969
10970 movl rSELF, %ecx
10971 movl %ecx, OUT_ARG0(%esp)
10972 leal OFF_FP_SHADOWFRAME(rFP), %eax
10973 movl %eax, OUT_ARG1(%esp)
10974 call MterpCheckBefore # (self, shadow_frame)
10975 REFRESH_IBASE
10976 jmp .L_op_nop+(183*128)
10977
10978/* ------------------------------ */
10979 .balign 128
10980.L_ALT_op_shl_int_2addr: /* 0xb8 */
10981/* File: x86/alt_stub.S */
10982/*
10983 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10984 * any interesting requests and then jump to the real instruction
10985 * handler. Unlike the Arm handler, we can't do this as a tail call
10986 * because rIBASE is caller save and we need to reload it.
10987 *
10988 * Note that unlike in the Arm implementation, we should never arrive
10989 * here with a zero breakFlag because we always refresh rIBASE on
10990 * return.
10991 */
10992 .extern MterpCheckBefore
10993 EXPORT_PC
10994
10995 movl rSELF, %ecx
10996 movl %ecx, OUT_ARG0(%esp)
10997 leal OFF_FP_SHADOWFRAME(rFP), %eax
10998 movl %eax, OUT_ARG1(%esp)
10999 call MterpCheckBefore # (self, shadow_frame)
11000 REFRESH_IBASE
11001 jmp .L_op_nop+(184*128)
11002
11003/* ------------------------------ */
11004 .balign 128
11005.L_ALT_op_shr_int_2addr: /* 0xb9 */
11006/* File: x86/alt_stub.S */
11007/*
11008 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11009 * any interesting requests and then jump to the real instruction
11010 * handler. Unlike the Arm handler, we can't do this as a tail call
11011 * because rIBASE is caller save and we need to reload it.
11012 *
11013 * Note that unlike in the Arm implementation, we should never arrive
11014 * here with a zero breakFlag because we always refresh rIBASE on
11015 * return.
11016 */
11017 .extern MterpCheckBefore
11018 EXPORT_PC
11019
11020 movl rSELF, %ecx
11021 movl %ecx, OUT_ARG0(%esp)
11022 leal OFF_FP_SHADOWFRAME(rFP), %eax
11023 movl %eax, OUT_ARG1(%esp)
11024 call MterpCheckBefore # (self, shadow_frame)
11025 REFRESH_IBASE
11026 jmp .L_op_nop+(185*128)
11027
11028/* ------------------------------ */
11029 .balign 128
11030.L_ALT_op_ushr_int_2addr: /* 0xba */
11031/* File: x86/alt_stub.S */
11032/*
11033 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11034 * any interesting requests and then jump to the real instruction
11035 * handler. Unlike the Arm handler, we can't do this as a tail call
11036 * because rIBASE is caller save and we need to reload it.
11037 *
11038 * Note that unlike in the Arm implementation, we should never arrive
11039 * here with a zero breakFlag because we always refresh rIBASE on
11040 * return.
11041 */
11042 .extern MterpCheckBefore
11043 EXPORT_PC
11044
11045 movl rSELF, %ecx
11046 movl %ecx, OUT_ARG0(%esp)
11047 leal OFF_FP_SHADOWFRAME(rFP), %eax
11048 movl %eax, OUT_ARG1(%esp)
11049 call MterpCheckBefore # (self, shadow_frame)
11050 REFRESH_IBASE
11051 jmp .L_op_nop+(186*128)
11052
11053/* ------------------------------ */
11054 .balign 128
11055.L_ALT_op_add_long_2addr: /* 0xbb */
11056/* File: x86/alt_stub.S */
11057/*
11058 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11059 * any interesting requests and then jump to the real instruction
11060 * handler. Unlike the Arm handler, we can't do this as a tail call
11061 * because rIBASE is caller save and we need to reload it.
11062 *
11063 * Note that unlike in the Arm implementation, we should never arrive
11064 * here with a zero breakFlag because we always refresh rIBASE on
11065 * return.
11066 */
11067 .extern MterpCheckBefore
11068 EXPORT_PC
11069
11070 movl rSELF, %ecx
11071 movl %ecx, OUT_ARG0(%esp)
11072 leal OFF_FP_SHADOWFRAME(rFP), %eax
11073 movl %eax, OUT_ARG1(%esp)
11074 call MterpCheckBefore # (self, shadow_frame)
11075 REFRESH_IBASE
11076 jmp .L_op_nop+(187*128)
11077
11078/* ------------------------------ */
11079 .balign 128
11080.L_ALT_op_sub_long_2addr: /* 0xbc */
11081/* File: x86/alt_stub.S */
11082/*
11083 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11084 * any interesting requests and then jump to the real instruction
11085 * handler. Unlike the Arm handler, we can't do this as a tail call
11086 * because rIBASE is caller save and we need to reload it.
11087 *
11088 * Note that unlike in the Arm implementation, we should never arrive
11089 * here with a zero breakFlag because we always refresh rIBASE on
11090 * return.
11091 */
11092 .extern MterpCheckBefore
11093 EXPORT_PC
11094
11095 movl rSELF, %ecx
11096 movl %ecx, OUT_ARG0(%esp)
11097 leal OFF_FP_SHADOWFRAME(rFP), %eax
11098 movl %eax, OUT_ARG1(%esp)
11099 call MterpCheckBefore # (self, shadow_frame)
11100 REFRESH_IBASE
11101 jmp .L_op_nop+(188*128)
11102
11103/* ------------------------------ */
11104 .balign 128
11105.L_ALT_op_mul_long_2addr: /* 0xbd */
11106/* File: x86/alt_stub.S */
11107/*
11108 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11109 * any interesting requests and then jump to the real instruction
11110 * handler. Unlike the Arm handler, we can't do this as a tail call
11111 * because rIBASE is caller save and we need to reload it.
11112 *
11113 * Note that unlike in the Arm implementation, we should never arrive
11114 * here with a zero breakFlag because we always refresh rIBASE on
11115 * return.
11116 */
11117 .extern MterpCheckBefore
11118 EXPORT_PC
11119
11120 movl rSELF, %ecx
11121 movl %ecx, OUT_ARG0(%esp)
11122 leal OFF_FP_SHADOWFRAME(rFP), %eax
11123 movl %eax, OUT_ARG1(%esp)
11124 call MterpCheckBefore # (self, shadow_frame)
11125 REFRESH_IBASE
11126 jmp .L_op_nop+(189*128)
11127
11128/* ------------------------------ */
11129 .balign 128
11130.L_ALT_op_div_long_2addr: /* 0xbe */
11131/* File: x86/alt_stub.S */
11132/*
11133 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11134 * any interesting requests and then jump to the real instruction
11135 * handler. Unlike the Arm handler, we can't do this as a tail call
11136 * because rIBASE is caller save and we need to reload it.
11137 *
11138 * Note that unlike in the Arm implementation, we should never arrive
11139 * here with a zero breakFlag because we always refresh rIBASE on
11140 * return.
11141 */
11142 .extern MterpCheckBefore
11143 EXPORT_PC
11144
11145 movl rSELF, %ecx
11146 movl %ecx, OUT_ARG0(%esp)
11147 leal OFF_FP_SHADOWFRAME(rFP), %eax
11148 movl %eax, OUT_ARG1(%esp)
11149 call MterpCheckBefore # (self, shadow_frame)
11150 REFRESH_IBASE
11151 jmp .L_op_nop+(190*128)
11152
11153/* ------------------------------ */
11154 .balign 128
11155.L_ALT_op_rem_long_2addr: /* 0xbf */
11156/* File: x86/alt_stub.S */
11157/*
11158 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11159 * any interesting requests and then jump to the real instruction
11160 * handler. Unlike the Arm handler, we can't do this as a tail call
11161 * because rIBASE is caller save and we need to reload it.
11162 *
11163 * Note that unlike in the Arm implementation, we should never arrive
11164 * here with a zero breakFlag because we always refresh rIBASE on
11165 * return.
11166 */
11167 .extern MterpCheckBefore
11168 EXPORT_PC
11169
11170 movl rSELF, %ecx
11171 movl %ecx, OUT_ARG0(%esp)
11172 leal OFF_FP_SHADOWFRAME(rFP), %eax
11173 movl %eax, OUT_ARG1(%esp)
11174 call MterpCheckBefore # (self, shadow_frame)
11175 REFRESH_IBASE
11176 jmp .L_op_nop+(191*128)
11177
11178/* ------------------------------ */
11179 .balign 128
11180.L_ALT_op_and_long_2addr: /* 0xc0 */
11181/* File: x86/alt_stub.S */
11182/*
11183 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11184 * any interesting requests and then jump to the real instruction
11185 * handler. Unlike the Arm handler, we can't do this as a tail call
11186 * because rIBASE is caller save and we need to reload it.
11187 *
11188 * Note that unlike in the Arm implementation, we should never arrive
11189 * here with a zero breakFlag because we always refresh rIBASE on
11190 * return.
11191 */
11192 .extern MterpCheckBefore
11193 EXPORT_PC
11194
11195 movl rSELF, %ecx
11196 movl %ecx, OUT_ARG0(%esp)
11197 leal OFF_FP_SHADOWFRAME(rFP), %eax
11198 movl %eax, OUT_ARG1(%esp)
11199 call MterpCheckBefore # (self, shadow_frame)
11200 REFRESH_IBASE
11201 jmp .L_op_nop+(192*128)
11202
11203/* ------------------------------ */
11204 .balign 128
11205.L_ALT_op_or_long_2addr: /* 0xc1 */
11206/* File: x86/alt_stub.S */
11207/*
11208 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11209 * any interesting requests and then jump to the real instruction
11210 * handler. Unlike the Arm handler, we can't do this as a tail call
11211 * because rIBASE is caller save and we need to reload it.
11212 *
11213 * Note that unlike in the Arm implementation, we should never arrive
11214 * here with a zero breakFlag because we always refresh rIBASE on
11215 * return.
11216 */
11217 .extern MterpCheckBefore
11218 EXPORT_PC
11219
11220 movl rSELF, %ecx
11221 movl %ecx, OUT_ARG0(%esp)
11222 leal OFF_FP_SHADOWFRAME(rFP), %eax
11223 movl %eax, OUT_ARG1(%esp)
11224 call MterpCheckBefore # (self, shadow_frame)
11225 REFRESH_IBASE
11226 jmp .L_op_nop+(193*128)
11227
11228/* ------------------------------ */
11229 .balign 128
11230.L_ALT_op_xor_long_2addr: /* 0xc2 */
11231/* File: x86/alt_stub.S */
11232/*
11233 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11234 * any interesting requests and then jump to the real instruction
11235 * handler. Unlike the Arm handler, we can't do this as a tail call
11236 * because rIBASE is caller save and we need to reload it.
11237 *
11238 * Note that unlike in the Arm implementation, we should never arrive
11239 * here with a zero breakFlag because we always refresh rIBASE on
11240 * return.
11241 */
11242 .extern MterpCheckBefore
11243 EXPORT_PC
11244
11245 movl rSELF, %ecx
11246 movl %ecx, OUT_ARG0(%esp)
11247 leal OFF_FP_SHADOWFRAME(rFP), %eax
11248 movl %eax, OUT_ARG1(%esp)
11249 call MterpCheckBefore # (self, shadow_frame)
11250 REFRESH_IBASE
11251 jmp .L_op_nop+(194*128)
11252
11253/* ------------------------------ */
11254 .balign 128
11255.L_ALT_op_shl_long_2addr: /* 0xc3 */
11256/* File: x86/alt_stub.S */
11257/*
11258 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11259 * any interesting requests and then jump to the real instruction
11260 * handler. Unlike the Arm handler, we can't do this as a tail call
11261 * because rIBASE is caller save and we need to reload it.
11262 *
11263 * Note that unlike in the Arm implementation, we should never arrive
11264 * here with a zero breakFlag because we always refresh rIBASE on
11265 * return.
11266 */
11267 .extern MterpCheckBefore
11268 EXPORT_PC
11269
11270 movl rSELF, %ecx
11271 movl %ecx, OUT_ARG0(%esp)
11272 leal OFF_FP_SHADOWFRAME(rFP), %eax
11273 movl %eax, OUT_ARG1(%esp)
11274 call MterpCheckBefore # (self, shadow_frame)
11275 REFRESH_IBASE
11276 jmp .L_op_nop+(195*128)
11277
11278/* ------------------------------ */
11279 .balign 128
11280.L_ALT_op_shr_long_2addr: /* 0xc4 */
11281/* File: x86/alt_stub.S */
11282/*
11283 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11284 * any interesting requests and then jump to the real instruction
11285 * handler. Unlike the Arm handler, we can't do this as a tail call
11286 * because rIBASE is caller save and we need to reload it.
11287 *
11288 * Note that unlike in the Arm implementation, we should never arrive
11289 * here with a zero breakFlag because we always refresh rIBASE on
11290 * return.
11291 */
11292 .extern MterpCheckBefore
11293 EXPORT_PC
11294
11295 movl rSELF, %ecx
11296 movl %ecx, OUT_ARG0(%esp)
11297 leal OFF_FP_SHADOWFRAME(rFP), %eax
11298 movl %eax, OUT_ARG1(%esp)
11299 call MterpCheckBefore # (self, shadow_frame)
11300 REFRESH_IBASE
11301 jmp .L_op_nop+(196*128)
11302
11303/* ------------------------------ */
11304 .balign 128
11305.L_ALT_op_ushr_long_2addr: /* 0xc5 */
11306/* File: x86/alt_stub.S */
11307/*
11308 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11309 * any interesting requests and then jump to the real instruction
11310 * handler. Unlike the Arm handler, we can't do this as a tail call
11311 * because rIBASE is caller save and we need to reload it.
11312 *
11313 * Note that unlike in the Arm implementation, we should never arrive
11314 * here with a zero breakFlag because we always refresh rIBASE on
11315 * return.
11316 */
11317 .extern MterpCheckBefore
11318 EXPORT_PC
11319
11320 movl rSELF, %ecx
11321 movl %ecx, OUT_ARG0(%esp)
11322 leal OFF_FP_SHADOWFRAME(rFP), %eax
11323 movl %eax, OUT_ARG1(%esp)
11324 call MterpCheckBefore # (self, shadow_frame)
11325 REFRESH_IBASE
11326 jmp .L_op_nop+(197*128)
11327
11328/* ------------------------------ */
11329 .balign 128
11330.L_ALT_op_add_float_2addr: /* 0xc6 */
11331/* File: x86/alt_stub.S */
11332/*
11333 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11334 * any interesting requests and then jump to the real instruction
11335 * handler. Unlike the Arm handler, we can't do this as a tail call
11336 * because rIBASE is caller save and we need to reload it.
11337 *
11338 * Note that unlike in the Arm implementation, we should never arrive
11339 * here with a zero breakFlag because we always refresh rIBASE on
11340 * return.
11341 */
11342 .extern MterpCheckBefore
11343 EXPORT_PC
11344
11345 movl rSELF, %ecx
11346 movl %ecx, OUT_ARG0(%esp)
11347 leal OFF_FP_SHADOWFRAME(rFP), %eax
11348 movl %eax, OUT_ARG1(%esp)
11349 call MterpCheckBefore # (self, shadow_frame)
11350 REFRESH_IBASE
11351 jmp .L_op_nop+(198*128)
11352
11353/* ------------------------------ */
11354 .balign 128
11355.L_ALT_op_sub_float_2addr: /* 0xc7 */
11356/* File: x86/alt_stub.S */
11357/*
11358 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11359 * any interesting requests and then jump to the real instruction
11360 * handler. Unlike the Arm handler, we can't do this as a tail call
11361 * because rIBASE is caller save and we need to reload it.
11362 *
11363 * Note that unlike in the Arm implementation, we should never arrive
11364 * here with a zero breakFlag because we always refresh rIBASE on
11365 * return.
11366 */
11367 .extern MterpCheckBefore
11368 EXPORT_PC
11369
11370 movl rSELF, %ecx
11371 movl %ecx, OUT_ARG0(%esp)
11372 leal OFF_FP_SHADOWFRAME(rFP), %eax
11373 movl %eax, OUT_ARG1(%esp)
11374 call MterpCheckBefore # (self, shadow_frame)
11375 REFRESH_IBASE
11376 jmp .L_op_nop+(199*128)
11377
11378/* ------------------------------ */
11379 .balign 128
11380.L_ALT_op_mul_float_2addr: /* 0xc8 */
11381/* File: x86/alt_stub.S */
11382/*
11383 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11384 * any interesting requests and then jump to the real instruction
11385 * handler. Unlike the Arm handler, we can't do this as a tail call
11386 * because rIBASE is caller save and we need to reload it.
11387 *
11388 * Note that unlike in the Arm implementation, we should never arrive
11389 * here with a zero breakFlag because we always refresh rIBASE on
11390 * return.
11391 */
11392 .extern MterpCheckBefore
11393 EXPORT_PC
11394
11395 movl rSELF, %ecx
11396 movl %ecx, OUT_ARG0(%esp)
11397 leal OFF_FP_SHADOWFRAME(rFP), %eax
11398 movl %eax, OUT_ARG1(%esp)
11399 call MterpCheckBefore # (self, shadow_frame)
11400 REFRESH_IBASE
11401 jmp .L_op_nop+(200*128)
11402
11403/* ------------------------------ */
11404 .balign 128
11405.L_ALT_op_div_float_2addr: /* 0xc9 */
11406/* File: x86/alt_stub.S */
11407/*
11408 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11409 * any interesting requests and then jump to the real instruction
11410 * handler. Unlike the Arm handler, we can't do this as a tail call
11411 * because rIBASE is caller save and we need to reload it.
11412 *
11413 * Note that unlike in the Arm implementation, we should never arrive
11414 * here with a zero breakFlag because we always refresh rIBASE on
11415 * return.
11416 */
11417 .extern MterpCheckBefore
11418 EXPORT_PC
11419
11420 movl rSELF, %ecx
11421 movl %ecx, OUT_ARG0(%esp)
11422 leal OFF_FP_SHADOWFRAME(rFP), %eax
11423 movl %eax, OUT_ARG1(%esp)
11424 call MterpCheckBefore # (self, shadow_frame)
11425 REFRESH_IBASE
11426 jmp .L_op_nop+(201*128)
11427
11428/* ------------------------------ */
11429 .balign 128
11430.L_ALT_op_rem_float_2addr: /* 0xca */
11431/* File: x86/alt_stub.S */
11432/*
11433 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11434 * any interesting requests and then jump to the real instruction
11435 * handler. Unlike the Arm handler, we can't do this as a tail call
11436 * because rIBASE is caller save and we need to reload it.
11437 *
11438 * Note that unlike in the Arm implementation, we should never arrive
11439 * here with a zero breakFlag because we always refresh rIBASE on
11440 * return.
11441 */
11442 .extern MterpCheckBefore
11443 EXPORT_PC
11444
11445 movl rSELF, %ecx
11446 movl %ecx, OUT_ARG0(%esp)
11447 leal OFF_FP_SHADOWFRAME(rFP), %eax
11448 movl %eax, OUT_ARG1(%esp)
11449 call MterpCheckBefore # (self, shadow_frame)
11450 REFRESH_IBASE
11451 jmp .L_op_nop+(202*128)
11452
11453/* ------------------------------ */
11454 .balign 128
11455.L_ALT_op_add_double_2addr: /* 0xcb */
11456/* File: x86/alt_stub.S */
11457/*
11458 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11459 * any interesting requests and then jump to the real instruction
11460 * handler. Unlike the Arm handler, we can't do this as a tail call
11461 * because rIBASE is caller save and we need to reload it.
11462 *
11463 * Note that unlike in the Arm implementation, we should never arrive
11464 * here with a zero breakFlag because we always refresh rIBASE on
11465 * return.
11466 */
11467 .extern MterpCheckBefore
11468 EXPORT_PC
11469
11470 movl rSELF, %ecx
11471 movl %ecx, OUT_ARG0(%esp)
11472 leal OFF_FP_SHADOWFRAME(rFP), %eax
11473 movl %eax, OUT_ARG1(%esp)
11474 call MterpCheckBefore # (self, shadow_frame)
11475 REFRESH_IBASE
11476 jmp .L_op_nop+(203*128)
11477
11478/* ------------------------------ */
11479 .balign 128
11480.L_ALT_op_sub_double_2addr: /* 0xcc */
11481/* File: x86/alt_stub.S */
11482/*
11483 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11484 * any interesting requests and then jump to the real instruction
11485 * handler. Unlike the Arm handler, we can't do this as a tail call
11486 * because rIBASE is caller save and we need to reload it.
11487 *
11488 * Note that unlike in the Arm implementation, we should never arrive
11489 * here with a zero breakFlag because we always refresh rIBASE on
11490 * return.
11491 */
11492 .extern MterpCheckBefore
11493 EXPORT_PC
11494
11495 movl rSELF, %ecx
11496 movl %ecx, OUT_ARG0(%esp)
11497 leal OFF_FP_SHADOWFRAME(rFP), %eax
11498 movl %eax, OUT_ARG1(%esp)
11499 call MterpCheckBefore # (self, shadow_frame)
11500 REFRESH_IBASE
11501 jmp .L_op_nop+(204*128)
11502
11503/* ------------------------------ */
11504 .balign 128
11505.L_ALT_op_mul_double_2addr: /* 0xcd */
11506/* File: x86/alt_stub.S */
11507/*
11508 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11509 * any interesting requests and then jump to the real instruction
11510 * handler. Unlike the Arm handler, we can't do this as a tail call
11511 * because rIBASE is caller save and we need to reload it.
11512 *
11513 * Note that unlike in the Arm implementation, we should never arrive
11514 * here with a zero breakFlag because we always refresh rIBASE on
11515 * return.
11516 */
11517 .extern MterpCheckBefore
11518 EXPORT_PC
11519
11520 movl rSELF, %ecx
11521 movl %ecx, OUT_ARG0(%esp)
11522 leal OFF_FP_SHADOWFRAME(rFP), %eax
11523 movl %eax, OUT_ARG1(%esp)
11524 call MterpCheckBefore # (self, shadow_frame)
11525 REFRESH_IBASE
11526 jmp .L_op_nop+(205*128)
11527
11528/* ------------------------------ */
11529 .balign 128
11530.L_ALT_op_div_double_2addr: /* 0xce */
11531/* File: x86/alt_stub.S */
11532/*
11533 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11534 * any interesting requests and then jump to the real instruction
11535 * handler. Unlike the Arm handler, we can't do this as a tail call
11536 * because rIBASE is caller save and we need to reload it.
11537 *
11538 * Note that unlike in the Arm implementation, we should never arrive
11539 * here with a zero breakFlag because we always refresh rIBASE on
11540 * return.
11541 */
11542 .extern MterpCheckBefore
11543 EXPORT_PC
11544
11545 movl rSELF, %ecx
11546 movl %ecx, OUT_ARG0(%esp)
11547 leal OFF_FP_SHADOWFRAME(rFP), %eax
11548 movl %eax, OUT_ARG1(%esp)
11549 call MterpCheckBefore # (self, shadow_frame)
11550 REFRESH_IBASE
11551 jmp .L_op_nop+(206*128)
11552
11553/* ------------------------------ */
11554 .balign 128
11555.L_ALT_op_rem_double_2addr: /* 0xcf */
11556/* File: x86/alt_stub.S */
11557/*
11558 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11559 * any interesting requests and then jump to the real instruction
11560 * handler. Unlike the Arm handler, we can't do this as a tail call
11561 * because rIBASE is caller save and we need to reload it.
11562 *
11563 * Note that unlike in the Arm implementation, we should never arrive
11564 * here with a zero breakFlag because we always refresh rIBASE on
11565 * return.
11566 */
11567 .extern MterpCheckBefore
11568 EXPORT_PC
11569
11570 movl rSELF, %ecx
11571 movl %ecx, OUT_ARG0(%esp)
11572 leal OFF_FP_SHADOWFRAME(rFP), %eax
11573 movl %eax, OUT_ARG1(%esp)
11574 call MterpCheckBefore # (self, shadow_frame)
11575 REFRESH_IBASE
11576 jmp .L_op_nop+(207*128)
11577
11578/* ------------------------------ */
11579 .balign 128
11580.L_ALT_op_add_int_lit16: /* 0xd0 */
11581/* File: x86/alt_stub.S */
11582/*
11583 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11584 * any interesting requests and then jump to the real instruction
11585 * handler. Unlike the Arm handler, we can't do this as a tail call
11586 * because rIBASE is caller save and we need to reload it.
11587 *
11588 * Note that unlike in the Arm implementation, we should never arrive
11589 * here with a zero breakFlag because we always refresh rIBASE on
11590 * return.
11591 */
11592 .extern MterpCheckBefore
11593 EXPORT_PC
11594
11595 movl rSELF, %ecx
11596 movl %ecx, OUT_ARG0(%esp)
11597 leal OFF_FP_SHADOWFRAME(rFP), %eax
11598 movl %eax, OUT_ARG1(%esp)
11599 call MterpCheckBefore # (self, shadow_frame)
11600 REFRESH_IBASE
11601 jmp .L_op_nop+(208*128)
11602
11603/* ------------------------------ */
11604 .balign 128
11605.L_ALT_op_rsub_int: /* 0xd1 */
11606/* File: x86/alt_stub.S */
11607/*
11608 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11609 * any interesting requests and then jump to the real instruction
11610 * handler. Unlike the Arm handler, we can't do this as a tail call
11611 * because rIBASE is caller save and we need to reload it.
11612 *
11613 * Note that unlike in the Arm implementation, we should never arrive
11614 * here with a zero breakFlag because we always refresh rIBASE on
11615 * return.
11616 */
11617 .extern MterpCheckBefore
11618 EXPORT_PC
11619
11620 movl rSELF, %ecx
11621 movl %ecx, OUT_ARG0(%esp)
11622 leal OFF_FP_SHADOWFRAME(rFP), %eax
11623 movl %eax, OUT_ARG1(%esp)
11624 call MterpCheckBefore # (self, shadow_frame)
11625 REFRESH_IBASE
11626 jmp .L_op_nop+(209*128)
11627
11628/* ------------------------------ */
11629 .balign 128
11630.L_ALT_op_mul_int_lit16: /* 0xd2 */
11631/* File: x86/alt_stub.S */
11632/*
11633 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11634 * any interesting requests and then jump to the real instruction
11635 * handler. Unlike the Arm handler, we can't do this as a tail call
11636 * because rIBASE is caller save and we need to reload it.
11637 *
11638 * Note that unlike in the Arm implementation, we should never arrive
11639 * here with a zero breakFlag because we always refresh rIBASE on
11640 * return.
11641 */
11642 .extern MterpCheckBefore
11643 EXPORT_PC
11644
11645 movl rSELF, %ecx
11646 movl %ecx, OUT_ARG0(%esp)
11647 leal OFF_FP_SHADOWFRAME(rFP), %eax
11648 movl %eax, OUT_ARG1(%esp)
11649 call MterpCheckBefore # (self, shadow_frame)
11650 REFRESH_IBASE
11651 jmp .L_op_nop+(210*128)
11652
11653/* ------------------------------ */
11654 .balign 128
11655.L_ALT_op_div_int_lit16: /* 0xd3 */
11656/* File: x86/alt_stub.S */
11657/*
11658 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11659 * any interesting requests and then jump to the real instruction
11660 * handler. Unlike the Arm handler, we can't do this as a tail call
11661 * because rIBASE is caller save and we need to reload it.
11662 *
11663 * Note that unlike in the Arm implementation, we should never arrive
11664 * here with a zero breakFlag because we always refresh rIBASE on
11665 * return.
11666 */
11667 .extern MterpCheckBefore
11668 EXPORT_PC
11669
11670 movl rSELF, %ecx
11671 movl %ecx, OUT_ARG0(%esp)
11672 leal OFF_FP_SHADOWFRAME(rFP), %eax
11673 movl %eax, OUT_ARG1(%esp)
11674 call MterpCheckBefore # (self, shadow_frame)
11675 REFRESH_IBASE
11676 jmp .L_op_nop+(211*128)
11677
11678/* ------------------------------ */
11679 .balign 128
11680.L_ALT_op_rem_int_lit16: /* 0xd4 */
11681/* File: x86/alt_stub.S */
11682/*
11683 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11684 * any interesting requests and then jump to the real instruction
11685 * handler. Unlike the Arm handler, we can't do this as a tail call
11686 * because rIBASE is caller save and we need to reload it.
11687 *
11688 * Note that unlike in the Arm implementation, we should never arrive
11689 * here with a zero breakFlag because we always refresh rIBASE on
11690 * return.
11691 */
11692 .extern MterpCheckBefore
11693 EXPORT_PC
11694
11695 movl rSELF, %ecx
11696 movl %ecx, OUT_ARG0(%esp)
11697 leal OFF_FP_SHADOWFRAME(rFP), %eax
11698 movl %eax, OUT_ARG1(%esp)
11699 call MterpCheckBefore # (self, shadow_frame)
11700 REFRESH_IBASE
11701 jmp .L_op_nop+(212*128)
11702
11703/* ------------------------------ */
11704 .balign 128
11705.L_ALT_op_and_int_lit16: /* 0xd5 */
11706/* File: x86/alt_stub.S */
11707/*
11708 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11709 * any interesting requests and then jump to the real instruction
11710 * handler. Unlike the Arm handler, we can't do this as a tail call
11711 * because rIBASE is caller save and we need to reload it.
11712 *
11713 * Note that unlike in the Arm implementation, we should never arrive
11714 * here with a zero breakFlag because we always refresh rIBASE on
11715 * return.
11716 */
11717 .extern MterpCheckBefore
11718 EXPORT_PC
11719
11720 movl rSELF, %ecx
11721 movl %ecx, OUT_ARG0(%esp)
11722 leal OFF_FP_SHADOWFRAME(rFP), %eax
11723 movl %eax, OUT_ARG1(%esp)
11724 call MterpCheckBefore # (self, shadow_frame)
11725 REFRESH_IBASE
11726 jmp .L_op_nop+(213*128)
11727
11728/* ------------------------------ */
11729 .balign 128
11730.L_ALT_op_or_int_lit16: /* 0xd6 */
11731/* File: x86/alt_stub.S */
11732/*
11733 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11734 * any interesting requests and then jump to the real instruction
11735 * handler. Unlike the Arm handler, we can't do this as a tail call
11736 * because rIBASE is caller save and we need to reload it.
11737 *
11738 * Note that unlike in the Arm implementation, we should never arrive
11739 * here with a zero breakFlag because we always refresh rIBASE on
11740 * return.
11741 */
11742 .extern MterpCheckBefore
11743 EXPORT_PC
11744
11745 movl rSELF, %ecx
11746 movl %ecx, OUT_ARG0(%esp)
11747 leal OFF_FP_SHADOWFRAME(rFP), %eax
11748 movl %eax, OUT_ARG1(%esp)
11749 call MterpCheckBefore # (self, shadow_frame)
11750 REFRESH_IBASE
11751 jmp .L_op_nop+(214*128)
11752
11753/* ------------------------------ */
11754 .balign 128
11755.L_ALT_op_xor_int_lit16: /* 0xd7 */
11756/* File: x86/alt_stub.S */
11757/*
11758 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11759 * any interesting requests and then jump to the real instruction
11760 * handler. Unlike the Arm handler, we can't do this as a tail call
11761 * because rIBASE is caller save and we need to reload it.
11762 *
11763 * Note that unlike in the Arm implementation, we should never arrive
11764 * here with a zero breakFlag because we always refresh rIBASE on
11765 * return.
11766 */
11767 .extern MterpCheckBefore
11768 EXPORT_PC
11769
11770 movl rSELF, %ecx
11771 movl %ecx, OUT_ARG0(%esp)
11772 leal OFF_FP_SHADOWFRAME(rFP), %eax
11773 movl %eax, OUT_ARG1(%esp)
11774 call MterpCheckBefore # (self, shadow_frame)
11775 REFRESH_IBASE
11776 jmp .L_op_nop+(215*128)
11777
11778/* ------------------------------ */
11779 .balign 128
11780.L_ALT_op_add_int_lit8: /* 0xd8 */
11781/* File: x86/alt_stub.S */
11782/*
11783 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11784 * any interesting requests and then jump to the real instruction
11785 * handler. Unlike the Arm handler, we can't do this as a tail call
11786 * because rIBASE is caller save and we need to reload it.
11787 *
11788 * Note that unlike in the Arm implementation, we should never arrive
11789 * here with a zero breakFlag because we always refresh rIBASE on
11790 * return.
11791 */
11792 .extern MterpCheckBefore
11793 EXPORT_PC
11794
11795 movl rSELF, %ecx
11796 movl %ecx, OUT_ARG0(%esp)
11797 leal OFF_FP_SHADOWFRAME(rFP), %eax
11798 movl %eax, OUT_ARG1(%esp)
11799 call MterpCheckBefore # (self, shadow_frame)
11800 REFRESH_IBASE
11801 jmp .L_op_nop+(216*128)
11802
11803/* ------------------------------ */
11804 .balign 128
11805.L_ALT_op_rsub_int_lit8: /* 0xd9 */
11806/* File: x86/alt_stub.S */
11807/*
11808 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11809 * any interesting requests and then jump to the real instruction
11810 * handler. Unlike the Arm handler, we can't do this as a tail call
11811 * because rIBASE is caller save and we need to reload it.
11812 *
11813 * Note that unlike in the Arm implementation, we should never arrive
11814 * here with a zero breakFlag because we always refresh rIBASE on
11815 * return.
11816 */
11817 .extern MterpCheckBefore
11818 EXPORT_PC
11819
11820 movl rSELF, %ecx
11821 movl %ecx, OUT_ARG0(%esp)
11822 leal OFF_FP_SHADOWFRAME(rFP), %eax
11823 movl %eax, OUT_ARG1(%esp)
11824 call MterpCheckBefore # (self, shadow_frame)
11825 REFRESH_IBASE
11826 jmp .L_op_nop+(217*128)
11827
11828/* ------------------------------ */
11829 .balign 128
11830.L_ALT_op_mul_int_lit8: /* 0xda */
11831/* File: x86/alt_stub.S */
11832/*
11833 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11834 * any interesting requests and then jump to the real instruction
11835 * handler. Unlike the Arm handler, we can't do this as a tail call
11836 * because rIBASE is caller save and we need to reload it.
11837 *
11838 * Note that unlike in the Arm implementation, we should never arrive
11839 * here with a zero breakFlag because we always refresh rIBASE on
11840 * return.
11841 */
11842 .extern MterpCheckBefore
11843 EXPORT_PC
11844
11845 movl rSELF, %ecx
11846 movl %ecx, OUT_ARG0(%esp)
11847 leal OFF_FP_SHADOWFRAME(rFP), %eax
11848 movl %eax, OUT_ARG1(%esp)
11849 call MterpCheckBefore # (self, shadow_frame)
11850 REFRESH_IBASE
11851 jmp .L_op_nop+(218*128)
11852
11853/* ------------------------------ */
11854 .balign 128
11855.L_ALT_op_div_int_lit8: /* 0xdb */
11856/* File: x86/alt_stub.S */
11857/*
11858 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11859 * any interesting requests and then jump to the real instruction
11860 * handler. Unlike the Arm handler, we can't do this as a tail call
11861 * because rIBASE is caller save and we need to reload it.
11862 *
11863 * Note that unlike in the Arm implementation, we should never arrive
11864 * here with a zero breakFlag because we always refresh rIBASE on
11865 * return.
11866 */
11867 .extern MterpCheckBefore
11868 EXPORT_PC
11869
11870 movl rSELF, %ecx
11871 movl %ecx, OUT_ARG0(%esp)
11872 leal OFF_FP_SHADOWFRAME(rFP), %eax
11873 movl %eax, OUT_ARG1(%esp)
11874 call MterpCheckBefore # (self, shadow_frame)
11875 REFRESH_IBASE
11876 jmp .L_op_nop+(219*128)
11877
11878/* ------------------------------ */
11879 .balign 128
11880.L_ALT_op_rem_int_lit8: /* 0xdc */
11881/* File: x86/alt_stub.S */
11882/*
11883 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11884 * any interesting requests and then jump to the real instruction
11885 * handler. Unlike the Arm handler, we can't do this as a tail call
11886 * because rIBASE is caller save and we need to reload it.
11887 *
11888 * Note that unlike in the Arm implementation, we should never arrive
11889 * here with a zero breakFlag because we always refresh rIBASE on
11890 * return.
11891 */
11892 .extern MterpCheckBefore
11893 EXPORT_PC
11894
11895 movl rSELF, %ecx
11896 movl %ecx, OUT_ARG0(%esp)
11897 leal OFF_FP_SHADOWFRAME(rFP), %eax
11898 movl %eax, OUT_ARG1(%esp)
11899 call MterpCheckBefore # (self, shadow_frame)
11900 REFRESH_IBASE
11901 jmp .L_op_nop+(220*128)
11902
11903/* ------------------------------ */
11904 .balign 128
11905.L_ALT_op_and_int_lit8: /* 0xdd */
11906/* File: x86/alt_stub.S */
11907/*
11908 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11909 * any interesting requests and then jump to the real instruction
11910 * handler. Unlike the Arm handler, we can't do this as a tail call
11911 * because rIBASE is caller save and we need to reload it.
11912 *
11913 * Note that unlike in the Arm implementation, we should never arrive
11914 * here with a zero breakFlag because we always refresh rIBASE on
11915 * return.
11916 */
11917 .extern MterpCheckBefore
11918 EXPORT_PC
11919
11920 movl rSELF, %ecx
11921 movl %ecx, OUT_ARG0(%esp)
11922 leal OFF_FP_SHADOWFRAME(rFP), %eax
11923 movl %eax, OUT_ARG1(%esp)
11924 call MterpCheckBefore # (self, shadow_frame)
11925 REFRESH_IBASE
11926 jmp .L_op_nop+(221*128)
11927
11928/* ------------------------------ */
11929 .balign 128
11930.L_ALT_op_or_int_lit8: /* 0xde */
11931/* File: x86/alt_stub.S */
11932/*
11933 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11934 * any interesting requests and then jump to the real instruction
11935 * handler. Unlike the Arm handler, we can't do this as a tail call
11936 * because rIBASE is caller save and we need to reload it.
11937 *
11938 * Note that unlike in the Arm implementation, we should never arrive
11939 * here with a zero breakFlag because we always refresh rIBASE on
11940 * return.
11941 */
11942 .extern MterpCheckBefore
11943 EXPORT_PC
11944
11945 movl rSELF, %ecx
11946 movl %ecx, OUT_ARG0(%esp)
11947 leal OFF_FP_SHADOWFRAME(rFP), %eax
11948 movl %eax, OUT_ARG1(%esp)
11949 call MterpCheckBefore # (self, shadow_frame)
11950 REFRESH_IBASE
11951 jmp .L_op_nop+(222*128)
11952
11953/* ------------------------------ */
11954 .balign 128
11955.L_ALT_op_xor_int_lit8: /* 0xdf */
11956/* File: x86/alt_stub.S */
11957/*
11958 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11959 * any interesting requests and then jump to the real instruction
11960 * handler. Unlike the Arm handler, we can't do this as a tail call
11961 * because rIBASE is caller save and we need to reload it.
11962 *
11963 * Note that unlike in the Arm implementation, we should never arrive
11964 * here with a zero breakFlag because we always refresh rIBASE on
11965 * return.
11966 */
11967 .extern MterpCheckBefore
11968 EXPORT_PC
11969
11970 movl rSELF, %ecx
11971 movl %ecx, OUT_ARG0(%esp)
11972 leal OFF_FP_SHADOWFRAME(rFP), %eax
11973 movl %eax, OUT_ARG1(%esp)
11974 call MterpCheckBefore # (self, shadow_frame)
11975 REFRESH_IBASE
11976 jmp .L_op_nop+(223*128)
11977
11978/* ------------------------------ */
11979 .balign 128
11980.L_ALT_op_shl_int_lit8: /* 0xe0 */
11981/* File: x86/alt_stub.S */
11982/*
11983 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11984 * any interesting requests and then jump to the real instruction
11985 * handler. Unlike the Arm handler, we can't do this as a tail call
11986 * because rIBASE is caller save and we need to reload it.
11987 *
11988 * Note that unlike in the Arm implementation, we should never arrive
11989 * here with a zero breakFlag because we always refresh rIBASE on
11990 * return.
11991 */
11992 .extern MterpCheckBefore
11993 EXPORT_PC
11994
11995 movl rSELF, %ecx
11996 movl %ecx, OUT_ARG0(%esp)
11997 leal OFF_FP_SHADOWFRAME(rFP), %eax
11998 movl %eax, OUT_ARG1(%esp)
11999 call MterpCheckBefore # (self, shadow_frame)
12000 REFRESH_IBASE
12001 jmp .L_op_nop+(224*128)
12002
12003/* ------------------------------ */
12004 .balign 128
12005.L_ALT_op_shr_int_lit8: /* 0xe1 */
12006/* File: x86/alt_stub.S */
12007/*
12008 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12009 * any interesting requests and then jump to the real instruction
12010 * handler. Unlike the Arm handler, we can't do this as a tail call
12011 * because rIBASE is caller save and we need to reload it.
12012 *
12013 * Note that unlike in the Arm implementation, we should never arrive
12014 * here with a zero breakFlag because we always refresh rIBASE on
12015 * return.
12016 */
12017 .extern MterpCheckBefore
12018 EXPORT_PC
12019
12020 movl rSELF, %ecx
12021 movl %ecx, OUT_ARG0(%esp)
12022 leal OFF_FP_SHADOWFRAME(rFP), %eax
12023 movl %eax, OUT_ARG1(%esp)
12024 call MterpCheckBefore # (self, shadow_frame)
12025 REFRESH_IBASE
12026 jmp .L_op_nop+(225*128)
12027
12028/* ------------------------------ */
12029 .balign 128
12030.L_ALT_op_ushr_int_lit8: /* 0xe2 */
12031/* File: x86/alt_stub.S */
12032/*
12033 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12034 * any interesting requests and then jump to the real instruction
12035 * handler. Unlike the Arm handler, we can't do this as a tail call
12036 * because rIBASE is caller save and we need to reload it.
12037 *
12038 * Note that unlike in the Arm implementation, we should never arrive
12039 * here with a zero breakFlag because we always refresh rIBASE on
12040 * return.
12041 */
12042 .extern MterpCheckBefore
12043 EXPORT_PC
12044
12045 movl rSELF, %ecx
12046 movl %ecx, OUT_ARG0(%esp)
12047 leal OFF_FP_SHADOWFRAME(rFP), %eax
12048 movl %eax, OUT_ARG1(%esp)
12049 call MterpCheckBefore # (self, shadow_frame)
12050 REFRESH_IBASE
12051 jmp .L_op_nop+(226*128)
12052
12053/* ------------------------------ */
12054 .balign 128
12055.L_ALT_op_iget_quick: /* 0xe3 */
12056/* File: x86/alt_stub.S */
12057/*
12058 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12059 * any interesting requests and then jump to the real instruction
12060 * handler. Unlike the Arm handler, we can't do this as a tail call
12061 * because rIBASE is caller save and we need to reload it.
12062 *
12063 * Note that unlike in the Arm implementation, we should never arrive
12064 * here with a zero breakFlag because we always refresh rIBASE on
12065 * return.
12066 */
12067 .extern MterpCheckBefore
12068 EXPORT_PC
12069
12070 movl rSELF, %ecx
12071 movl %ecx, OUT_ARG0(%esp)
12072 leal OFF_FP_SHADOWFRAME(rFP), %eax
12073 movl %eax, OUT_ARG1(%esp)
12074 call MterpCheckBefore # (self, shadow_frame)
12075 REFRESH_IBASE
12076 jmp .L_op_nop+(227*128)
12077
12078/* ------------------------------ */
12079 .balign 128
12080.L_ALT_op_iget_wide_quick: /* 0xe4 */
12081/* File: x86/alt_stub.S */
12082/*
12083 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12084 * any interesting requests and then jump to the real instruction
12085 * handler. Unlike the Arm handler, we can't do this as a tail call
12086 * because rIBASE is caller save and we need to reload it.
12087 *
12088 * Note that unlike in the Arm implementation, we should never arrive
12089 * here with a zero breakFlag because we always refresh rIBASE on
12090 * return.
12091 */
12092 .extern MterpCheckBefore
12093 EXPORT_PC
12094
12095 movl rSELF, %ecx
12096 movl %ecx, OUT_ARG0(%esp)
12097 leal OFF_FP_SHADOWFRAME(rFP), %eax
12098 movl %eax, OUT_ARG1(%esp)
12099 call MterpCheckBefore # (self, shadow_frame)
12100 REFRESH_IBASE
12101 jmp .L_op_nop+(228*128)
12102
12103/* ------------------------------ */
12104 .balign 128
12105.L_ALT_op_iget_object_quick: /* 0xe5 */
12106/* File: x86/alt_stub.S */
12107/*
12108 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12109 * any interesting requests and then jump to the real instruction
12110 * handler. Unlike the Arm handler, we can't do this as a tail call
12111 * because rIBASE is caller save and we need to reload it.
12112 *
12113 * Note that unlike in the Arm implementation, we should never arrive
12114 * here with a zero breakFlag because we always refresh rIBASE on
12115 * return.
12116 */
12117 .extern MterpCheckBefore
12118 EXPORT_PC
12119
12120 movl rSELF, %ecx
12121 movl %ecx, OUT_ARG0(%esp)
12122 leal OFF_FP_SHADOWFRAME(rFP), %eax
12123 movl %eax, OUT_ARG1(%esp)
12124 call MterpCheckBefore # (self, shadow_frame)
12125 REFRESH_IBASE
12126 jmp .L_op_nop+(229*128)
12127
12128/* ------------------------------ */
12129 .balign 128
12130.L_ALT_op_iput_quick: /* 0xe6 */
12131/* File: x86/alt_stub.S */
12132/*
12133 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12134 * any interesting requests and then jump to the real instruction
12135 * handler. Unlike the Arm handler, we can't do this as a tail call
12136 * because rIBASE is caller save and we need to reload it.
12137 *
12138 * Note that unlike in the Arm implementation, we should never arrive
12139 * here with a zero breakFlag because we always refresh rIBASE on
12140 * return.
12141 */
12142 .extern MterpCheckBefore
12143 EXPORT_PC
12144
12145 movl rSELF, %ecx
12146 movl %ecx, OUT_ARG0(%esp)
12147 leal OFF_FP_SHADOWFRAME(rFP), %eax
12148 movl %eax, OUT_ARG1(%esp)
12149 call MterpCheckBefore # (self, shadow_frame)
12150 REFRESH_IBASE
12151 jmp .L_op_nop+(230*128)
12152
12153/* ------------------------------ */
12154 .balign 128
12155.L_ALT_op_iput_wide_quick: /* 0xe7 */
12156/* File: x86/alt_stub.S */
12157/*
12158 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12159 * any interesting requests and then jump to the real instruction
12160 * handler. Unlike the Arm handler, we can't do this as a tail call
12161 * because rIBASE is caller save and we need to reload it.
12162 *
12163 * Note that unlike in the Arm implementation, we should never arrive
12164 * here with a zero breakFlag because we always refresh rIBASE on
12165 * return.
12166 */
12167 .extern MterpCheckBefore
12168 EXPORT_PC
12169
12170 movl rSELF, %ecx
12171 movl %ecx, OUT_ARG0(%esp)
12172 leal OFF_FP_SHADOWFRAME(rFP), %eax
12173 movl %eax, OUT_ARG1(%esp)
12174 call MterpCheckBefore # (self, shadow_frame)
12175 REFRESH_IBASE
12176 jmp .L_op_nop+(231*128)
12177
12178/* ------------------------------ */
12179 .balign 128
12180.L_ALT_op_iput_object_quick: /* 0xe8 */
12181/* File: x86/alt_stub.S */
12182/*
12183 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12184 * any interesting requests and then jump to the real instruction
12185 * handler. Unlike the Arm handler, we can't do this as a tail call
12186 * because rIBASE is caller save and we need to reload it.
12187 *
12188 * Note that unlike in the Arm implementation, we should never arrive
12189 * here with a zero breakFlag because we always refresh rIBASE on
12190 * return.
12191 */
12192 .extern MterpCheckBefore
12193 EXPORT_PC
12194
12195 movl rSELF, %ecx
12196 movl %ecx, OUT_ARG0(%esp)
12197 leal OFF_FP_SHADOWFRAME(rFP), %eax
12198 movl %eax, OUT_ARG1(%esp)
12199 call MterpCheckBefore # (self, shadow_frame)
12200 REFRESH_IBASE
12201 jmp .L_op_nop+(232*128)
12202
12203/* ------------------------------ */
12204 .balign 128
12205.L_ALT_op_invoke_virtual_quick: /* 0xe9 */
12206/* File: x86/alt_stub.S */
12207/*
12208 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12209 * any interesting requests and then jump to the real instruction
12210 * handler. Unlike the Arm handler, we can't do this as a tail call
12211 * because rIBASE is caller save and we need to reload it.
12212 *
12213 * Note that unlike in the Arm implementation, we should never arrive
12214 * here with a zero breakFlag because we always refresh rIBASE on
12215 * return.
12216 */
12217 .extern MterpCheckBefore
12218 EXPORT_PC
12219
12220 movl rSELF, %ecx
12221 movl %ecx, OUT_ARG0(%esp)
12222 leal OFF_FP_SHADOWFRAME(rFP), %eax
12223 movl %eax, OUT_ARG1(%esp)
12224 call MterpCheckBefore # (self, shadow_frame)
12225 REFRESH_IBASE
12226 jmp .L_op_nop+(233*128)
12227
12228/* ------------------------------ */
12229 .balign 128
12230.L_ALT_op_invoke_virtual_range_quick: /* 0xea */
12231/* File: x86/alt_stub.S */
12232/*
12233 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12234 * any interesting requests and then jump to the real instruction
12235 * handler. Unlike the Arm handler, we can't do this as a tail call
12236 * because rIBASE is caller save and we need to reload it.
12237 *
12238 * Note that unlike in the Arm implementation, we should never arrive
12239 * here with a zero breakFlag because we always refresh rIBASE on
12240 * return.
12241 */
12242 .extern MterpCheckBefore
12243 EXPORT_PC
12244
12245 movl rSELF, %ecx
12246 movl %ecx, OUT_ARG0(%esp)
12247 leal OFF_FP_SHADOWFRAME(rFP), %eax
12248 movl %eax, OUT_ARG1(%esp)
12249 call MterpCheckBefore # (self, shadow_frame)
12250 REFRESH_IBASE
12251 jmp .L_op_nop+(234*128)
12252
12253/* ------------------------------ */
12254 .balign 128
12255.L_ALT_op_iput_boolean_quick: /* 0xeb */
12256/* File: x86/alt_stub.S */
12257/*
12258 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12259 * any interesting requests and then jump to the real instruction
12260 * handler. Unlike the Arm handler, we can't do this as a tail call
12261 * because rIBASE is caller save and we need to reload it.
12262 *
12263 * Note that unlike in the Arm implementation, we should never arrive
12264 * here with a zero breakFlag because we always refresh rIBASE on
12265 * return.
12266 */
12267 .extern MterpCheckBefore
12268 EXPORT_PC
12269
12270 movl rSELF, %ecx
12271 movl %ecx, OUT_ARG0(%esp)
12272 leal OFF_FP_SHADOWFRAME(rFP), %eax
12273 movl %eax, OUT_ARG1(%esp)
12274 call MterpCheckBefore # (self, shadow_frame)
12275 REFRESH_IBASE
12276 jmp .L_op_nop+(235*128)
12277
12278/* ------------------------------ */
12279 .balign 128
12280.L_ALT_op_iput_byte_quick: /* 0xec */
12281/* File: x86/alt_stub.S */
12282/*
12283 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12284 * any interesting requests and then jump to the real instruction
12285 * handler. Unlike the Arm handler, we can't do this as a tail call
12286 * because rIBASE is caller save and we need to reload it.
12287 *
12288 * Note that unlike in the Arm implementation, we should never arrive
12289 * here with a zero breakFlag because we always refresh rIBASE on
12290 * return.
12291 */
12292 .extern MterpCheckBefore
12293 EXPORT_PC
12294
12295 movl rSELF, %ecx
12296 movl %ecx, OUT_ARG0(%esp)
12297 leal OFF_FP_SHADOWFRAME(rFP), %eax
12298 movl %eax, OUT_ARG1(%esp)
12299 call MterpCheckBefore # (self, shadow_frame)
12300 REFRESH_IBASE
12301 jmp .L_op_nop+(236*128)
12302
12303/* ------------------------------ */
12304 .balign 128
12305.L_ALT_op_iput_char_quick: /* 0xed */
12306/* File: x86/alt_stub.S */
12307/*
12308 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12309 * any interesting requests and then jump to the real instruction
12310 * handler. Unlike the Arm handler, we can't do this as a tail call
12311 * because rIBASE is caller save and we need to reload it.
12312 *
12313 * Note that unlike in the Arm implementation, we should never arrive
12314 * here with a zero breakFlag because we always refresh rIBASE on
12315 * return.
12316 */
12317 .extern MterpCheckBefore
12318 EXPORT_PC
12319
12320 movl rSELF, %ecx
12321 movl %ecx, OUT_ARG0(%esp)
12322 leal OFF_FP_SHADOWFRAME(rFP), %eax
12323 movl %eax, OUT_ARG1(%esp)
12324 call MterpCheckBefore # (self, shadow_frame)
12325 REFRESH_IBASE
12326 jmp .L_op_nop+(237*128)
12327
12328/* ------------------------------ */
12329 .balign 128
12330.L_ALT_op_iput_short_quick: /* 0xee */
12331/* File: x86/alt_stub.S */
12332/*
12333 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12334 * any interesting requests and then jump to the real instruction
12335 * handler. Unlike the Arm handler, we can't do this as a tail call
12336 * because rIBASE is caller save and we need to reload it.
12337 *
12338 * Note that unlike in the Arm implementation, we should never arrive
12339 * here with a zero breakFlag because we always refresh rIBASE on
12340 * return.
12341 */
12342 .extern MterpCheckBefore
12343 EXPORT_PC
12344
12345 movl rSELF, %ecx
12346 movl %ecx, OUT_ARG0(%esp)
12347 leal OFF_FP_SHADOWFRAME(rFP), %eax
12348 movl %eax, OUT_ARG1(%esp)
12349 call MterpCheckBefore # (self, shadow_frame)
12350 REFRESH_IBASE
12351 jmp .L_op_nop+(238*128)
12352
12353/* ------------------------------ */
12354 .balign 128
12355.L_ALT_op_iget_boolean_quick: /* 0xef */
12356/* File: x86/alt_stub.S */
12357/*
12358 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12359 * any interesting requests and then jump to the real instruction
12360 * handler. Unlike the Arm handler, we can't do this as a tail call
12361 * because rIBASE is caller save and we need to reload it.
12362 *
12363 * Note that unlike in the Arm implementation, we should never arrive
12364 * here with a zero breakFlag because we always refresh rIBASE on
12365 * return.
12366 */
12367 .extern MterpCheckBefore
12368 EXPORT_PC
12369
12370 movl rSELF, %ecx
12371 movl %ecx, OUT_ARG0(%esp)
12372 leal OFF_FP_SHADOWFRAME(rFP), %eax
12373 movl %eax, OUT_ARG1(%esp)
12374 call MterpCheckBefore # (self, shadow_frame)
12375 REFRESH_IBASE
12376 jmp .L_op_nop+(239*128)
12377
12378/* ------------------------------ */
12379 .balign 128
12380.L_ALT_op_iget_byte_quick: /* 0xf0 */
12381/* File: x86/alt_stub.S */
12382/*
12383 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12384 * any interesting requests and then jump to the real instruction
12385 * handler. Unlike the Arm handler, we can't do this as a tail call
12386 * because rIBASE is caller save and we need to reload it.
12387 *
12388 * Note that unlike in the Arm implementation, we should never arrive
12389 * here with a zero breakFlag because we always refresh rIBASE on
12390 * return.
12391 */
12392 .extern MterpCheckBefore
12393 EXPORT_PC
12394
12395 movl rSELF, %ecx
12396 movl %ecx, OUT_ARG0(%esp)
12397 leal OFF_FP_SHADOWFRAME(rFP), %eax
12398 movl %eax, OUT_ARG1(%esp)
12399 call MterpCheckBefore # (self, shadow_frame)
12400 REFRESH_IBASE
12401 jmp .L_op_nop+(240*128)
12402
12403/* ------------------------------ */
12404 .balign 128
12405.L_ALT_op_iget_char_quick: /* 0xf1 */
12406/* File: x86/alt_stub.S */
12407/*
12408 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12409 * any interesting requests and then jump to the real instruction
12410 * handler. Unlike the Arm handler, we can't do this as a tail call
12411 * because rIBASE is caller save and we need to reload it.
12412 *
12413 * Note that unlike in the Arm implementation, we should never arrive
12414 * here with a zero breakFlag because we always refresh rIBASE on
12415 * return.
12416 */
12417 .extern MterpCheckBefore
12418 EXPORT_PC
12419
12420 movl rSELF, %ecx
12421 movl %ecx, OUT_ARG0(%esp)
12422 leal OFF_FP_SHADOWFRAME(rFP), %eax
12423 movl %eax, OUT_ARG1(%esp)
12424 call MterpCheckBefore # (self, shadow_frame)
12425 REFRESH_IBASE
12426 jmp .L_op_nop+(241*128)
12427
12428/* ------------------------------ */
12429 .balign 128
12430.L_ALT_op_iget_short_quick: /* 0xf2 */
12431/* File: x86/alt_stub.S */
12432/*
12433 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12434 * any interesting requests and then jump to the real instruction
12435 * handler. Unlike the Arm handler, we can't do this as a tail call
12436 * because rIBASE is caller save and we need to reload it.
12437 *
12438 * Note that unlike in the Arm implementation, we should never arrive
12439 * here with a zero breakFlag because we always refresh rIBASE on
12440 * return.
12441 */
12442 .extern MterpCheckBefore
12443 EXPORT_PC
12444
12445 movl rSELF, %ecx
12446 movl %ecx, OUT_ARG0(%esp)
12447 leal OFF_FP_SHADOWFRAME(rFP), %eax
12448 movl %eax, OUT_ARG1(%esp)
12449 call MterpCheckBefore # (self, shadow_frame)
12450 REFRESH_IBASE
12451 jmp .L_op_nop+(242*128)
12452
12453/* ------------------------------ */
12454 .balign 128
12455.L_ALT_op_invoke_lambda: /* 0xf3 */
12456/* File: x86/alt_stub.S */
12457/*
12458 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12459 * any interesting requests and then jump to the real instruction
12460 * handler. Unlike the Arm handler, we can't do this as a tail call
12461 * because rIBASE is caller save and we need to reload it.
12462 *
12463 * Note that unlike in the Arm implementation, we should never arrive
12464 * here with a zero breakFlag because we always refresh rIBASE on
12465 * return.
12466 */
12467 .extern MterpCheckBefore
12468 EXPORT_PC
12469
12470 movl rSELF, %ecx
12471 movl %ecx, OUT_ARG0(%esp)
12472 leal OFF_FP_SHADOWFRAME(rFP), %eax
12473 movl %eax, OUT_ARG1(%esp)
12474 call MterpCheckBefore # (self, shadow_frame)
12475 REFRESH_IBASE
12476 jmp .L_op_nop+(243*128)
12477
12478/* ------------------------------ */
12479 .balign 128
12480.L_ALT_op_unused_f4: /* 0xf4 */
12481/* File: x86/alt_stub.S */
12482/*
12483 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12484 * any interesting requests and then jump to the real instruction
12485 * handler. Unlike the Arm handler, we can't do this as a tail call
12486 * because rIBASE is caller save and we need to reload it.
12487 *
12488 * Note that unlike in the Arm implementation, we should never arrive
12489 * here with a zero breakFlag because we always refresh rIBASE on
12490 * return.
12491 */
12492 .extern MterpCheckBefore
12493 EXPORT_PC
12494
12495 movl rSELF, %ecx
12496 movl %ecx, OUT_ARG0(%esp)
12497 leal OFF_FP_SHADOWFRAME(rFP), %eax
12498 movl %eax, OUT_ARG1(%esp)
12499 call MterpCheckBefore # (self, shadow_frame)
12500 REFRESH_IBASE
12501 jmp .L_op_nop+(244*128)
12502
12503/* ------------------------------ */
12504 .balign 128
12505.L_ALT_op_capture_variable: /* 0xf5 */
12506/* File: x86/alt_stub.S */
12507/*
12508 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12509 * any interesting requests and then jump to the real instruction
12510 * handler. Unlike the Arm handler, we can't do this as a tail call
12511 * because rIBASE is caller save and we need to reload it.
12512 *
12513 * Note that unlike in the Arm implementation, we should never arrive
12514 * here with a zero breakFlag because we always refresh rIBASE on
12515 * return.
12516 */
12517 .extern MterpCheckBefore
12518 EXPORT_PC
12519
12520 movl rSELF, %ecx
12521 movl %ecx, OUT_ARG0(%esp)
12522 leal OFF_FP_SHADOWFRAME(rFP), %eax
12523 movl %eax, OUT_ARG1(%esp)
12524 call MterpCheckBefore # (self, shadow_frame)
12525 REFRESH_IBASE
12526 jmp .L_op_nop+(245*128)
12527
12528/* ------------------------------ */
12529 .balign 128
12530.L_ALT_op_create_lambda: /* 0xf6 */
12531/* File: x86/alt_stub.S */
12532/*
12533 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12534 * any interesting requests and then jump to the real instruction
12535 * handler. Unlike the Arm handler, we can't do this as a tail call
12536 * because rIBASE is caller save and we need to reload it.
12537 *
12538 * Note that unlike in the Arm implementation, we should never arrive
12539 * here with a zero breakFlag because we always refresh rIBASE on
12540 * return.
12541 */
12542 .extern MterpCheckBefore
12543 EXPORT_PC
12544
12545 movl rSELF, %ecx
12546 movl %ecx, OUT_ARG0(%esp)
12547 leal OFF_FP_SHADOWFRAME(rFP), %eax
12548 movl %eax, OUT_ARG1(%esp)
12549 call MterpCheckBefore # (self, shadow_frame)
12550 REFRESH_IBASE
12551 jmp .L_op_nop+(246*128)
12552
12553/* ------------------------------ */
12554 .balign 128
12555.L_ALT_op_liberate_variable: /* 0xf7 */
12556/* File: x86/alt_stub.S */
12557/*
12558 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12559 * any interesting requests and then jump to the real instruction
12560 * handler. Unlike the Arm handler, we can't do this as a tail call
12561 * because rIBASE is caller save and we need to reload it.
12562 *
12563 * Note that unlike in the Arm implementation, we should never arrive
12564 * here with a zero breakFlag because we always refresh rIBASE on
12565 * return.
12566 */
12567 .extern MterpCheckBefore
12568 EXPORT_PC
12569
12570 movl rSELF, %ecx
12571 movl %ecx, OUT_ARG0(%esp)
12572 leal OFF_FP_SHADOWFRAME(rFP), %eax
12573 movl %eax, OUT_ARG1(%esp)
12574 call MterpCheckBefore # (self, shadow_frame)
12575 REFRESH_IBASE
12576 jmp .L_op_nop+(247*128)
12577
12578/* ------------------------------ */
12579 .balign 128
12580.L_ALT_op_box_lambda: /* 0xf8 */
12581/* File: x86/alt_stub.S */
12582/*
12583 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12584 * any interesting requests and then jump to the real instruction
12585 * handler. Unlike the Arm handler, we can't do this as a tail call
12586 * because rIBASE is caller save and we need to reload it.
12587 *
12588 * Note that unlike in the Arm implementation, we should never arrive
12589 * here with a zero breakFlag because we always refresh rIBASE on
12590 * return.
12591 */
12592 .extern MterpCheckBefore
12593 EXPORT_PC
12594
12595 movl rSELF, %ecx
12596 movl %ecx, OUT_ARG0(%esp)
12597 leal OFF_FP_SHADOWFRAME(rFP), %eax
12598 movl %eax, OUT_ARG1(%esp)
12599 call MterpCheckBefore # (self, shadow_frame)
12600 REFRESH_IBASE
12601 jmp .L_op_nop+(248*128)
12602
12603/* ------------------------------ */
12604 .balign 128
12605.L_ALT_op_unbox_lambda: /* 0xf9 */
12606/* File: x86/alt_stub.S */
12607/*
12608 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12609 * any interesting requests and then jump to the real instruction
12610 * handler. Unlike the Arm handler, we can't do this as a tail call
12611 * because rIBASE is caller save and we need to reload it.
12612 *
12613 * Note that unlike in the Arm implementation, we should never arrive
12614 * here with a zero breakFlag because we always refresh rIBASE on
12615 * return.
12616 */
12617 .extern MterpCheckBefore
12618 EXPORT_PC
12619
12620 movl rSELF, %ecx
12621 movl %ecx, OUT_ARG0(%esp)
12622 leal OFF_FP_SHADOWFRAME(rFP), %eax
12623 movl %eax, OUT_ARG1(%esp)
12624 call MterpCheckBefore # (self, shadow_frame)
12625 REFRESH_IBASE
12626 jmp .L_op_nop+(249*128)
12627
12628/* ------------------------------ */
12629 .balign 128
12630.L_ALT_op_unused_fa: /* 0xfa */
12631/* File: x86/alt_stub.S */
12632/*
12633 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12634 * any interesting requests and then jump to the real instruction
12635 * handler. Unlike the Arm handler, we can't do this as a tail call
12636 * because rIBASE is caller save and we need to reload it.
12637 *
12638 * Note that unlike in the Arm implementation, we should never arrive
12639 * here with a zero breakFlag because we always refresh rIBASE on
12640 * return.
12641 */
12642 .extern MterpCheckBefore
12643 EXPORT_PC
12644
12645 movl rSELF, %ecx
12646 movl %ecx, OUT_ARG0(%esp)
12647 leal OFF_FP_SHADOWFRAME(rFP), %eax
12648 movl %eax, OUT_ARG1(%esp)
12649 call MterpCheckBefore # (self, shadow_frame)
12650 REFRESH_IBASE
12651 jmp .L_op_nop+(250*128)
12652
12653/* ------------------------------ */
12654 .balign 128
12655.L_ALT_op_unused_fb: /* 0xfb */
12656/* File: x86/alt_stub.S */
12657/*
12658 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12659 * any interesting requests and then jump to the real instruction
12660 * handler. Unlike the Arm handler, we can't do this as a tail call
12661 * because rIBASE is caller save and we need to reload it.
12662 *
12663 * Note that unlike in the Arm implementation, we should never arrive
12664 * here with a zero breakFlag because we always refresh rIBASE on
12665 * return.
12666 */
12667 .extern MterpCheckBefore
12668 EXPORT_PC
12669
12670 movl rSELF, %ecx
12671 movl %ecx, OUT_ARG0(%esp)
12672 leal OFF_FP_SHADOWFRAME(rFP), %eax
12673 movl %eax, OUT_ARG1(%esp)
12674 call MterpCheckBefore # (self, shadow_frame)
12675 REFRESH_IBASE
12676 jmp .L_op_nop+(251*128)
12677
12678/* ------------------------------ */
12679 .balign 128
12680.L_ALT_op_unused_fc: /* 0xfc */
12681/* File: x86/alt_stub.S */
12682/*
12683 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12684 * any interesting requests and then jump to the real instruction
12685 * handler. Unlike the Arm handler, we can't do this as a tail call
12686 * because rIBASE is caller save and we need to reload it.
12687 *
12688 * Note that unlike in the Arm implementation, we should never arrive
12689 * here with a zero breakFlag because we always refresh rIBASE on
12690 * return.
12691 */
12692 .extern MterpCheckBefore
12693 EXPORT_PC
12694
12695 movl rSELF, %ecx
12696 movl %ecx, OUT_ARG0(%esp)
12697 leal OFF_FP_SHADOWFRAME(rFP), %eax
12698 movl %eax, OUT_ARG1(%esp)
12699 call MterpCheckBefore # (self, shadow_frame)
12700 REFRESH_IBASE
12701 jmp .L_op_nop+(252*128)
12702
12703/* ------------------------------ */
12704 .balign 128
12705.L_ALT_op_unused_fd: /* 0xfd */
12706/* File: x86/alt_stub.S */
12707/*
12708 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12709 * any interesting requests and then jump to the real instruction
12710 * handler. Unlike the Arm handler, we can't do this as a tail call
12711 * because rIBASE is caller save and we need to reload it.
12712 *
12713 * Note that unlike in the Arm implementation, we should never arrive
12714 * here with a zero breakFlag because we always refresh rIBASE on
12715 * return.
12716 */
12717 .extern MterpCheckBefore
12718 EXPORT_PC
12719
12720 movl rSELF, %ecx
12721 movl %ecx, OUT_ARG0(%esp)
12722 leal OFF_FP_SHADOWFRAME(rFP), %eax
12723 movl %eax, OUT_ARG1(%esp)
12724 call MterpCheckBefore # (self, shadow_frame)
12725 REFRESH_IBASE
12726 jmp .L_op_nop+(253*128)
12727
12728/* ------------------------------ */
12729 .balign 128
12730.L_ALT_op_unused_fe: /* 0xfe */
12731/* File: x86/alt_stub.S */
12732/*
12733 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12734 * any interesting requests and then jump to the real instruction
12735 * handler. Unlike the Arm handler, we can't do this as a tail call
12736 * because rIBASE is caller save and we need to reload it.
12737 *
12738 * Note that unlike in the Arm implementation, we should never arrive
12739 * here with a zero breakFlag because we always refresh rIBASE on
12740 * return.
12741 */
12742 .extern MterpCheckBefore
12743 EXPORT_PC
12744
12745 movl rSELF, %ecx
12746 movl %ecx, OUT_ARG0(%esp)
12747 leal OFF_FP_SHADOWFRAME(rFP), %eax
12748 movl %eax, OUT_ARG1(%esp)
12749 call MterpCheckBefore # (self, shadow_frame)
12750 REFRESH_IBASE
12751 jmp .L_op_nop+(254*128)
12752
12753/* ------------------------------ */
12754 .balign 128
12755.L_ALT_op_unused_ff: /* 0xff */
12756/* File: x86/alt_stub.S */
12757/*
12758 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12759 * any interesting requests and then jump to the real instruction
12760 * handler. Unlike the Arm handler, we can't do this as a tail call
12761 * because rIBASE is caller save and we need to reload it.
12762 *
12763 * Note that unlike in the Arm implementation, we should never arrive
12764 * here with a zero breakFlag because we always refresh rIBASE on
12765 * return.
12766 */
12767 .extern MterpCheckBefore
12768 EXPORT_PC
12769
12770 movl rSELF, %ecx
12771 movl %ecx, OUT_ARG0(%esp)
12772 leal OFF_FP_SHADOWFRAME(rFP), %eax
12773 movl %eax, OUT_ARG1(%esp)
12774 call MterpCheckBefore # (self, shadow_frame)
12775 REFRESH_IBASE
12776 jmp .L_op_nop+(255*128)
12777
12778 .balign 128
12779 .size artMterpAsmAltInstructionStart, .-artMterpAsmAltInstructionStart
12780 .global artMterpAsmAltInstructionEnd
12781artMterpAsmAltInstructionEnd:
12782/* File: x86/footer.S */
12783/*
12784 * ===========================================================================
12785 * Common subroutines and data
12786 * ===========================================================================
12787 */
12788
12789 .text
12790 .align 2
12791
12792/*
12793 * We've detected a condition that will result in an exception, but the exception
12794 * has not yet been thrown. Just bail out to the reference interpreter to deal with it.
12795 * TUNING: for consistency, we may want to just go ahead and handle these here.
12796 */
12797#define MTERP_LOGGING 0
12798common_errDivideByZero:
12799 EXPORT_PC
12800#if MTERP_LOGGING
12801 movl rSELF, %eax
12802 movl %eax, OUT_ARG0(%esp)
12803 lea OFF_FP_SHADOWFRAME(rFP), %ecx
12804 movl %ecx, OUT_ARG1(%esp)
12805 call MterpLogDivideByZeroException
12806#endif
12807 jmp MterpCommonFallback
12808
12809common_errArrayIndex:
12810 EXPORT_PC
12811#if MTERP_LOGGING
12812 movl rSELF, %eax
12813 movl %eax, OUT_ARG0(%esp)
12814 lea OFF_FP_SHADOWFRAME(rFP), %ecx
12815 movl %ecx, OUT_ARG1(%esp)
12816 call MterpLogArrayIndexException
12817#endif
12818 jmp MterpCommonFallback
12819
12820common_errNegativeArraySize:
12821 EXPORT_PC
12822#if MTERP_LOGGING
12823 movl rSELF, %eax
12824 movl %eax, OUT_ARG0(%esp)
12825 lea OFF_FP_SHADOWFRAME(rFP), %ecx
12826 movl %ecx, OUT_ARG1(%esp)
12827 call MterpLogNegativeArraySizeException
12828#endif
12829 jmp MterpCommonFallback
12830
12831common_errNoSuchMethod:
12832 EXPORT_PC
12833#if MTERP_LOGGING
12834 movl rSELF, %eax
12835 movl %eax, OUT_ARG0(%esp)
12836 lea OFF_FP_SHADOWFRAME(rFP), %ecx
12837 movl %ecx, OUT_ARG1(%esp)
12838 call MterpLogNoSuchMethodException
12839#endif
12840 jmp MterpCommonFallback
12841
12842common_errNullObject:
12843 EXPORT_PC
12844#if MTERP_LOGGING
12845 movl rSELF, %eax
12846 movl %eax, OUT_ARG0(%esp)
12847 lea OFF_FP_SHADOWFRAME(rFP), %ecx
12848 movl %ecx, OUT_ARG1(%esp)
12849 call MterpLogNullObjectException
12850#endif
12851 jmp MterpCommonFallback
12852
12853common_exceptionThrown:
12854 EXPORT_PC
12855#if MTERP_LOGGING
12856 movl rSELF, %eax
12857 movl %eax, OUT_ARG0(%esp)
12858 lea OFF_FP_SHADOWFRAME(rFP), %ecx
12859 movl %ecx, OUT_ARG0(%esp)
12860 call MterpLogExceptionThrownException
12861#endif
12862 jmp MterpCommonFallback
12863
12864MterpSuspendFallback:
12865 EXPORT_PC
12866#if MTERP_LOGGING
12867 movl rSELF, %eax
12868 movl %eax, OUT_ARG0(%esp)
12869 lea OFF_FP_SHADOWFRAME(rFP), %ecx
12870 movl %ecx, OUT_ARG0(%esp)
12871 movl THREAD_FLAGS_OFFSET(%eax), %eax
12872 movl %eax, OUT_ARG2(%esp)
12873 call MterpLogSuspendFallback
12874#endif
12875 jmp MterpCommonFallback
12876
12877/*
12878 * If we're here, something is out of the ordinary. If there is a pending
12879 * exception, handle it. Otherwise, roll back and retry with the reference
12880 * interpreter.
12881 */
12882MterpPossibleException:
12883 movl rSELF, %eax
12884 testl $-1, THREAD_EXCEPTION_OFFSET(%eax)
12885 jz MterpFallback
12886 /* intentional fallthrough - handle pending exception. */
12887
12888/*
12889 * On return from a runtime helper routine, we've found a pending exception.
12890 * Can we handle it here - or need to bail out to caller?
12891 *
12892 */
12893MterpException:
12894 movl rSELF, %eax
12895 movl %eax, OUT_ARG0(%esp)
12896 lea OFF_FP_SHADOWFRAME(rFP), %ecx
12897 movl %ecx, OUT_ARG1(%esp)
12898 call MterpHandleException
12899 testl %eax, %eax
12900 jz MterpExceptionReturn
12901 REFRESH_IBASE
12902 movl OFF_FP_CODE_ITEM(rFP), %eax
12903 movl OFF_FP_DEX_PC(rFP), %ecx
12904 lea CODEITEM_INSNS_OFFSET(%eax), rPC
12905 lea (rPC, %ecx, 2), rPC
12906 movl rPC, OFF_FP_DEX_PC_PTR(rFP)
12907 /* resume execution at catch block */
12908 FETCH_INST
12909 GOTO_NEXT
12910 /* NOTE: no fallthrough */
12911
12912/*
12913 * Check for suspend check request. Assumes rINST already loaded, rPC advanced and
12914 * still needs to get the opcode and branch to it, and flags are in lr.
12915 */
12916MterpCheckSuspendAndContinue:
12917 movl rSELF, %eax
12918 EXPORT_PC
12919 testl $(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST), THREAD_FLAGS_OFFSET(%eax)
12920 jz 1f
12921 movl %eax, OUT_ARG0(%esp)
12922 call MterpSuspendCheck
12923 REFRESH_IBASE
129241:
12925 GOTO_NEXT
12926
12927/*
12928 * Bail out to reference interpreter.
12929 */
12930MterpFallback:
12931 EXPORT_PC
12932#if MTERP_LOGGING
12933 movl rSELF, %eax
12934 movl %eax, OUT_ARG0(%esp)
12935 lea OFF_FP_SHADOWFRAME(rFP), %ecx
12936 movl %ecx, OUT_ARG1(%esp)
12937 call MterpLogFallback
12938#endif
12939MterpCommonFallback:
12940 xor %eax, %eax
12941 jmp MterpDone
12942
12943/*
12944 * On entry:
12945 * uint32_t* rFP (should still be live, pointer to base of vregs)
12946 */
12947MterpExceptionReturn:
12948 movl $1, %eax
12949 jmp MterpDone
12950MterpReturn:
12951 movl OFF_FP_RESULT_REGISTER(rFP), %edx
12952 movl %eax, (%edx)
12953 movl %ecx, 4(%edx)
Bill Buzbee7c58bd42016-01-20 20:46:01 +000012954 mov $1, %eax
12955MterpDone:
12956 /* Restore callee save register */
12957 movl EBP_SPILL(%esp), %ebp
12958 movl EDI_SPILL(%esp), %edi
12959 movl ESI_SPILL(%esp), %esi
12960 movl EBX_SPILL(%esp), %ebx
12961
12962 /* pop up frame */
12963 addl $FRAME_SIZE, %esp
12964 .cfi_adjust_cfa_offset -FRAME_SIZE
12965 ret
12966
12967 .cfi_endproc
12968 .size ExecuteMterpImpl, .-ExecuteMterpImpl
12969