OSDN Git Service

13fffb03afc41444a85ab6fb56c111651131632b
[android-x86/dalvik.git] / vm / mterp / out / InterpAsm-x86.S
1 /*
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) 2008 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  * 32-bit x86 definitions and declarations.
25  */
26
27 /*
28 386 ABI general notes:
29
30 Caller save set:
31    eax, edx, ecx, st(0)-st(7)
32 Callee save set:
33    ebx, esi, edi, ebp
34 Return regs:
35    32-bit in eax
36    64-bit in edx:eax (low-order 32 in eax)
37    fp on top of fp stack st(0)
38
39 Parameters passed on stack, pushed right-to-left.  On entry to target, first
40 parm is at 4(%esp).  Traditional entry code is:
41
42 functEntry:
43     push    %ebp             # save old frame pointer
44     mov     %ebp,%esp        # establish new frame pointer
45     sub     FrameSize,%esp   # Allocate storage for spill, locals & outs
46
47 Once past the prologue, arguments are referenced at ((argno + 2)*4)(%ebp)
48
49 Alignment of stack not strictly required, but should be for performance.  We'll
50 align frame sizes to 16-byte multiples.
51
52 If we're not doing variable stack allocation (alloca), the frame pointer can be
53 eliminated and all arg references adjusted to be esp relative.
54
55 Mterp notes:
56
57 Some key interpreter variables will be assigned to registers.  Note that each
58 will also have an associated spill location (mostly useful for those assigned
59 to callee save registers).
60
61   nick     reg   purpose
62   rPC      edi   interpreted program counter, used for fetching instructions
63   rFP      esi   interpreted frame pointer, used for accessing locals and args
64   rINSTw   bx    first 16-bit code of current instruction
65   rINSTbl  bl    opcode portion of instruction word
66   rINSTbh  bh    high byte of inst word, usually contains src/tgt reg names
67   rIBASE   edx   base of instruction handler table
68
69 Notes:
70    o High order 16 bits of ebx must be zero on entry to handler
71    o rPC, rFP, rINSTw/rINSTbl valid on handler entry and exit
72    o eax and ecx are scratch, rINSTw/ebx sometimes scratch
73
74 */
75
76 #define rSELF    (%ebp)
77 #define rPC      %esi
78 #define rFP      %edi
79 #define rINST    %ebx
80 #define rINSTw   %bx
81 #define rINSTbh  %bh
82 #define rINSTbl  %bl
83 #define rIBASE   %edx
84
85
86 /* Frame diagram while executing dvmMterpStdRun, high to low addresses */
87 #define IN_ARG0        ( 12)
88 #define CALLER_RP      (  8)
89 #define PREV_FP        (  4)
90 #define rSELF_SPILL    (  0) /* <- dvmMterpStdRun ebp */
91 /* Spill offsets relative to %ebp */
92 #define EDI_SPILL      ( -4)
93 #define ESI_SPILL      ( -8)
94 #define EBX_SPILL      (-12) /* <- esp following dmMterpStdRun header */
95 #define rPC_SPILL      (-16)
96 #define rFP_SPILL      (-20)
97 #define rINST_SPILL    (-24)
98 #define rIBASE_SPILL   (-28)
99 #define TMP_SPILL1     (-32)
100 #define TMP_SPILL2     (-36)
101 #define TMP_SPILL3     (-20)
102 #define LOCAL0_OFFSET  (-44)
103 #define LOCAL1_OFFSET  (-48)
104 #define LOCAL2_OFFSET  (-52)
105 /* Out Arg offsets, relative to %sp */
106 #define OUT_ARG4       ( 16)
107 #define OUT_ARG3       ( 12)
108 #define OUT_ARG2       (  8)
109 #define OUT_ARG1       (  4)
110 #define OUT_ARG0       (  0)  /* <- dvmMterpStdRun esp */
111 #define FRAME_SIZE     80
112
113 #define SPILL(reg) movl reg##,reg##_SPILL(%ebp)
114 #define UNSPILL(reg) movl reg##_SPILL(%ebp),reg
115 #define SPILL_TMP1(reg) movl reg,TMP_SPILL1(%ebp)
116 #define UNSPILL_TMP1(reg) movl TMP_SPILL1(%ebp),reg
117 #define SPILL_TMP2(reg) movl reg,TMP_SPILL2(%ebp)
118 #define UNSPILL_TMP2(reg) movl TMP_SPILL2(%ebp),reg
119 #define SPILL_TMP3(reg) movl reg,TMP_SPILL3(%ebp)
120 #define UNSPILL_TMP3(reg) movl TMP_SPILL3(%ebp),reg
121
122 #if defined(WITH_JIT)
123 .macro GET_JIT_PROF_TABLE _self _reg
124     movl    offThread_pJitProfTable(\_self),\_reg
125 .endm
126 .macro GET_JIT_THRESHOLD _self _reg
127     movl    offThread_jitThreshold(\_self),\_reg
128 .endm
129 #endif
130
131 /* save/restore the PC and/or FP from the self struct */
132 .macro SAVE_PC_FP_TO_SELF _reg
133     movl     rSELF,\_reg
134     movl     rPC,offThread_pc(\_reg)
135     movl     rFP,offThread_fp(\_reg)
136 .endm
137
138 .macro LOAD_PC_FP_FROM_SELF
139     movl    rSELF,rFP
140     movl    offThread_pc(rFP),rPC
141     movl    offThread_fp(rFP),rFP
142 .endm
143
144 /* The interpreter assumes a properly aligned stack on entry, and
145  * will preserve 16-byte alignment.
146  */
147
148 /*
149  * "export" the PC to the interpreted stack frame, f/b/o future exception
150  * objects.  Must be done *before* something throws.
151  *
152  * In C this is "SAVEAREA_FROM_FP(fp)->xtra.currentPc = pc", i.e.
153  * fp - sizeof(StackSaveArea) + offsetof(SaveArea, xtra.currentPc)
154  *
155  * It's okay to do this more than once.
156  */
157 .macro EXPORT_PC
158     movl     rPC, (-sizeofStackSaveArea + offStackSaveArea_currentPc)(rFP)
159 .endm
160
161 /*
162  * Given a frame pointer, find the stack save area.
163  *
164  * In C this is "((StackSaveArea*)(_fp) -1)".
165  */
166 .macro SAVEAREA_FROM_FP _reg
167     leal    -sizeofStackSaveArea(rFP), \_reg
168 .endm
169
170 /*
171  * Fetch the next instruction from rPC into rINSTw.  Does not advance rPC.
172  */
173 .macro FETCH_INST
174     movzwl    (rPC),rINST
175 .endm
176
177 /*
178  * Fetch the opcode byte and zero-extend it into _reg.  Must be used
179  * in conjunction with GOTO_NEXT_R
180  */
181 .macro FETCH_INST_R _reg
182     movzbl    (rPC),\_reg
183 .endm
184
185 /*
186  * Fetch the opcode byte at _count words offset from rPC and zero-extend
187  * it into _reg.  Must be used in conjunction with GOTO_NEXT_R
188  */
189 .macro FETCH_INST_OPCODE _count _reg
190     movzbl  \_count*2(rPC),\_reg
191 .endm
192
193 /*
194  * Fetch the nth instruction word from rPC into rINSTw.  Does not advance
195  * rPC, and _count is in words
196  */
197 .macro FETCH_INST_WORD _count
198     movzwl  \_count*2(rPC),rINST
199 .endm
200
201 /*
202  * Fetch instruction word indexed (used for branching).
203  * Index is in instruction word units.
204  */
205 .macro FETCH_INST_INDEXED _reg
206     movzwl  (rPC,\_reg,2),rINST
207 .endm
208
209 /*
210  * Advance rPC by instruction count
211  */
212 .macro ADVANCE_PC _count
213     leal  2*\_count(rPC),rPC
214 .endm
215
216 /*
217  * Advance rPC by branch offset in register
218  */
219 .macro ADVANCE_PC_INDEXED _reg
220     leal (rPC,\_reg,2),rPC
221 .endm
222
223 .macro GOTO_NEXT
224      movzx   rINSTbl,%eax
225      movzbl  rINSTbh,rINST
226      jmp     *(rIBASE,%eax,4)
227 .endm
228
229    /*
230     * Version of GOTO_NEXT that assumes _reg preloaded with opcode.
231     * Should be paired with FETCH_INST_R
232     */
233 .macro GOTO_NEXT_R _reg
234      movzbl  1(rPC),rINST
235      jmp     *(rIBASE,\_reg,4)
236 .endm
237
238    /*
239     * Jumbo version of GOTO_NEXT that assumes _reg preloaded with table
240     * offset of the jumbo instruction, which is the top half of the extended
241     * opcode + 0x100.  Loads rINST with BBBB field, similar to GOTO_NEXT_R
242     */
243 .macro GOTO_NEXT_JUMBO_R _reg
244      movzwl  6(rPC),rINST
245      jmp     *(rIBASE,\_reg,4)
246 .endm
247
248 /*
249  * Get/set the 32-bit value from a Dalvik register.
250  */
251 .macro GET_VREG_R _reg _vreg
252     movl     (rFP,\_vreg,4),\_reg
253 .endm
254
255 .macro SET_VREG _reg _vreg
256     movl     \_reg,(rFP,\_vreg,4)
257 .endm
258
259 .macro GET_VREG_WORD _reg _vreg _offset
260     movl     4*(\_offset)(rFP,\_vreg,4),\_reg
261 .endm
262
263 .macro SET_VREG_WORD _reg _vreg _offset
264     movl     \_reg,4*(\_offset)(rFP,\_vreg,4)
265 .endm
266
267 #define sReg0 LOCAL0_OFFSET(%ebp)
268 #define sReg1 LOCAL1_OFFSET(%ebp)
269 #define sReg2 LOCAL2_OFFSET(%ebp)
270
271    /*
272     * Hard coded helper values.
273     */
274
275 .balign 16
276
277 .LdoubNeg:
278     .quad       0x8000000000000000
279
280 .L64bits:
281     .quad       0xFFFFFFFFFFFFFFFF
282
283 .LshiftMask2:
284     .quad       0x0000000000000000
285 .LshiftMask:
286     .quad       0x000000000000003F
287
288 .Lvalue64:
289     .quad       0x0000000000000040
290
291 .LvaluePosInfLong:
292     .quad       0x7FFFFFFFFFFFFFFF
293
294 .LvalueNegInfLong:
295     .quad       0x8000000000000000
296
297 .LvalueNanLong:
298     .quad       0x0000000000000000
299
300 .LintMin:
301 .long   0x80000000
302
303 .LintMax:
304 .long   0x7FFFFFFF
305
306
307 /*
308  * This is a #include, not a %include, because we want the C pre-processor
309  * to expand the macros into assembler assignment statements.
310  */
311 #include "../common/asm-constants.h"
312
313 #if defined(WITH_JIT)
314 #include "../common/jit-config.h"
315 #endif
316
317
318     .global dvmAsmInstructionStartCode
319     .type   dvmAsmInstructionStartCode, %function
320 dvmAsmInstructionStartCode = .L_OP_NOP
321     .text
322
323 /* ------------------------------ */
324 .L_OP_NOP: /* 0x00 */
325 /* File: x86/OP_NOP.S */
326     FETCH_INST_OPCODE 1 %ecx
327     ADVANCE_PC 1
328     GOTO_NEXT_R %ecx
329
330 /* ------------------------------ */
331 .L_OP_MOVE: /* 0x01 */
332 /* File: x86/OP_MOVE.S */
333     /* for move, move-object, long-to-int */
334     /* op vA, vB */
335     movzbl rINSTbl,%eax          # eax<- BA
336     andb   $0xf,%al             # eax<- A
337     shrl   $4,rINST            # rINST<- B
338     GET_VREG_R rINST rINST
339     FETCH_INST_OPCODE 1 %ecx
340     ADVANCE_PC 1
341     SET_VREG rINST %eax           # fp[A]<-fp[B]
342     GOTO_NEXT_R %ecx
343
344 /* ------------------------------ */
345 .L_OP_MOVE_FROM16: /* 0x02 */
346 /* File: x86/OP_MOVE_FROM16.S */
347     /* for: move/from16, move-object/from16 */
348     /* op vAA, vBBBB */
349     movzx    rINSTbl,%eax              # eax <= AA
350     movw     2(rPC),rINSTw             # rINSTw <= BBBB
351     GET_VREG_R rINST rINST             # rINST- fp[BBBB]
352     FETCH_INST_OPCODE 2 %ecx
353     ADVANCE_PC 2
354     SET_VREG rINST %eax                # fp[AA]<- ecx]
355     GOTO_NEXT_R %ecx
356
357 /* ------------------------------ */
358 .L_OP_MOVE_16: /* 0x03 */
359 /* File: x86/OP_MOVE_16.S */
360     /* for: move/16, move-object/16 */
361     /* op vAAAA, vBBBB */
362     movzwl    4(rPC),%ecx              # ecx<- BBBB
363     movzwl    2(rPC),%eax              # eax<- AAAA
364     GET_VREG_R  rINST %ecx
365     FETCH_INST_OPCODE 3 %ecx
366     ADVANCE_PC 3
367     SET_VREG  rINST %eax
368     GOTO_NEXT_R %ecx
369
370 /* ------------------------------ */
371 .L_OP_MOVE_WIDE: /* 0x04 */
372 /* File: x86/OP_MOVE_WIDE.S */
373     /* move-wide vA, vB */
374     /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
375     movzbl    rINSTbl,%ecx                # ecx <- BA
376     sarl      $4,rINST                   # rINST<- B
377     GET_VREG_WORD %eax rINST 0            # eax<- v[B+0]
378     GET_VREG_WORD rINST rINST 1           # rINST<- v[B+1]
379     andb      $0xf,%cl                   # ecx <- A
380     SET_VREG_WORD rINST %ecx 1            # v[A+1]<- rINST
381     SET_VREG_WORD %eax %ecx 0             # v[A+0]<- eax
382     FETCH_INST_OPCODE 1 %ecx
383     ADVANCE_PC 1
384     GOTO_NEXT_R %ecx
385
386 /* ------------------------------ */
387 .L_OP_MOVE_WIDE_FROM16: /* 0x05 */
388 /* File: x86/OP_MOVE_WIDE_FROM16.S */
389     /* move-wide/from16 vAA, vBBBB */
390     /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
391     movzwl    2(rPC),%ecx              # ecx<- BBBB
392     movzbl    rINSTbl,%eax             # eax<- AAAA
393     GET_VREG_WORD rINST %ecx 0         # rINST<- v[BBBB+0]
394     GET_VREG_WORD %ecx %ecx 1          # ecx<- v[BBBB+1]
395     SET_VREG_WORD rINST %eax 0         # v[AAAA+0]<- rINST
396     SET_VREG_WORD %ecx %eax 1          # v[AAAA+1]<- eax
397     FETCH_INST_OPCODE 2 %ecx
398     ADVANCE_PC 2
399     GOTO_NEXT_R %ecx
400
401 /* ------------------------------ */
402 .L_OP_MOVE_WIDE_16: /* 0x06 */
403 /* File: x86/OP_MOVE_WIDE_16.S */
404     /* move-wide/16 vAAAA, vBBBB */
405     /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
406     movzwl    4(rPC),%ecx            # ecx<- BBBB
407     movzwl    2(rPC),%eax            # eax<- AAAA
408     GET_VREG_WORD rINST %ecx 0       # rINSTw_WORD<- v[BBBB+0]
409     GET_VREG_WORD %ecx %ecx 1        # ecx<- v[BBBB+1]
410     SET_VREG_WORD rINST %eax 0       # v[AAAA+0]<- rINST
411     SET_VREG_WORD %ecx %eax 1        # v[AAAA+1]<- ecx
412     FETCH_INST_OPCODE 3 %ecx
413     ADVANCE_PC 3
414     GOTO_NEXT_R %ecx
415
416 /* ------------------------------ */
417 .L_OP_MOVE_OBJECT: /* 0x07 */
418 /* File: x86/OP_MOVE_OBJECT.S */
419 /* File: x86/OP_MOVE.S */
420     /* for move, move-object, long-to-int */
421     /* op vA, vB */
422     movzbl rINSTbl,%eax          # eax<- BA
423     andb   $0xf,%al             # eax<- A
424     shrl   $4,rINST            # rINST<- B
425     GET_VREG_R rINST rINST
426     FETCH_INST_OPCODE 1 %ecx
427     ADVANCE_PC 1
428     SET_VREG rINST %eax           # fp[A]<-fp[B]
429     GOTO_NEXT_R %ecx
430
431
432 /* ------------------------------ */
433 .L_OP_MOVE_OBJECT_FROM16: /* 0x08 */
434 /* File: x86/OP_MOVE_OBJECT_FROM16.S */
435 /* File: x86/OP_MOVE_FROM16.S */
436     /* for: move/from16, move-object/from16 */
437     /* op vAA, vBBBB */
438     movzx    rINSTbl,%eax              # eax <= AA
439     movw     2(rPC),rINSTw             # rINSTw <= BBBB
440     GET_VREG_R rINST rINST             # rINST- fp[BBBB]
441     FETCH_INST_OPCODE 2 %ecx
442     ADVANCE_PC 2
443     SET_VREG rINST %eax                # fp[AA]<- ecx]
444     GOTO_NEXT_R %ecx
445
446
447 /* ------------------------------ */
448 .L_OP_MOVE_OBJECT_16: /* 0x09 */
449 /* File: x86/OP_MOVE_OBJECT_16.S */
450 /* File: x86/OP_MOVE_16.S */
451     /* for: move/16, move-object/16 */
452     /* op vAAAA, vBBBB */
453     movzwl    4(rPC),%ecx              # ecx<- BBBB
454     movzwl    2(rPC),%eax              # eax<- AAAA
455     GET_VREG_R  rINST %ecx
456     FETCH_INST_OPCODE 3 %ecx
457     ADVANCE_PC 3
458     SET_VREG  rINST %eax
459     GOTO_NEXT_R %ecx
460
461
462 /* ------------------------------ */
463 .L_OP_MOVE_RESULT: /* 0x0a */
464 /* File: x86/OP_MOVE_RESULT.S */
465     /* for: move-result, move-result-object */
466     /* op vAA */
467     movl     rSELF,%eax                    # eax<- rSELF
468     movl     offThread_retval(%eax),%eax   # eax<- self->retval.l
469     FETCH_INST_OPCODE 1 %ecx
470     ADVANCE_PC 1
471     SET_VREG  %eax rINST                   # fp[AA]<- retval.l
472     GOTO_NEXT_R %ecx
473
474 /* ------------------------------ */
475 .L_OP_MOVE_RESULT_WIDE: /* 0x0b */
476 /* File: x86/OP_MOVE_RESULT_WIDE.S */
477     /* move-result-wide vAA */
478     movl    rSELF,%ecx
479     movl    offThread_retval(%ecx),%eax
480     movl    4+offThread_retval(%ecx),%ecx
481     SET_VREG_WORD %eax rINST 0     # v[AA+0] <- eax
482     SET_VREG_WORD %ecx rINST 1     # v[AA+1] <- ecx
483     FETCH_INST_OPCODE 1 %ecx
484     ADVANCE_PC 1
485     GOTO_NEXT_R %ecx
486
487 /* ------------------------------ */
488 .L_OP_MOVE_RESULT_OBJECT: /* 0x0c */
489 /* File: x86/OP_MOVE_RESULT_OBJECT.S */
490 /* File: x86/OP_MOVE_RESULT.S */
491     /* for: move-result, move-result-object */
492     /* op vAA */
493     movl     rSELF,%eax                    # eax<- rSELF
494     movl     offThread_retval(%eax),%eax   # eax<- self->retval.l
495     FETCH_INST_OPCODE 1 %ecx
496     ADVANCE_PC 1
497     SET_VREG  %eax rINST                   # fp[AA]<- retval.l
498     GOTO_NEXT_R %ecx
499
500
501 /* ------------------------------ */
502 .L_OP_MOVE_EXCEPTION: /* 0x0d */
503 /* File: x86/OP_MOVE_EXCEPTION.S */
504     /* move-exception vAA */
505     movl    rSELF,%ecx
506     movl    offThread_exception(%ecx),%eax # eax<- dvmGetException bypass
507     SET_VREG %eax rINST                # fp[AA]<- exception object
508     FETCH_INST_OPCODE 1 %eax
509     ADVANCE_PC 1
510     movl    $0,offThread_exception(%ecx) # dvmClearException bypass
511     GOTO_NEXT_R %eax
512
513 /* ------------------------------ */
514 .L_OP_RETURN_VOID: /* 0x0e */
515 /* File: x86/OP_RETURN_VOID.S */
516     jmp       common_returnFromMethod
517
518 /* ------------------------------ */
519 .L_OP_RETURN: /* 0x0f */
520 /* File: x86/OP_RETURN.S */
521     /*
522      * Return a 32-bit value.  Copies the return value into the "self"
523      * structure, then jumps to the return handler.
524      *
525      * for: return, return-object
526      */
527     /* op vAA */
528     movl    rSELF,%ecx
529     GET_VREG_R %eax rINST               # eax<- vAA
530     movl    %eax,offThread_retval(%ecx)   # retval.i <- AA
531     jmp     common_returnFromMethod
532
533 /* ------------------------------ */
534 .L_OP_RETURN_WIDE: /* 0x10 */
535 /* File: x86/OP_RETURN_WIDE.S */
536     /*
537      * Return a 64-bit value.  Copies the return value into the "self"
538      * structure, then jumps to the return handler.
539      */
540     /* return-wide vAA */
541     movl    rSELF,%ecx
542     GET_VREG_WORD %eax rINST 0       # eax<- v[AA+0]
543     GET_VREG_WORD rINST rINST 1      # rINST<- v[AA+1]
544     movl    %eax,offThread_retval(%ecx)
545     movl    rINST,4+offThread_retval(%ecx)
546     jmp     common_returnFromMethod
547
548 /* ------------------------------ */
549 .L_OP_RETURN_OBJECT: /* 0x11 */
550 /* File: x86/OP_RETURN_OBJECT.S */
551 /* File: x86/OP_RETURN.S */
552     /*
553      * Return a 32-bit value.  Copies the return value into the "self"
554      * structure, then jumps to the return handler.
555      *
556      * for: return, return-object
557      */
558     /* op vAA */
559     movl    rSELF,%ecx
560     GET_VREG_R %eax rINST               # eax<- vAA
561     movl    %eax,offThread_retval(%ecx)   # retval.i <- AA
562     jmp     common_returnFromMethod
563
564
565 /* ------------------------------ */
566 .L_OP_CONST_4: /* 0x12 */
567 /* File: x86/OP_CONST_4.S */
568     /* const/4 vA, #+B */
569     movsx   rINSTbl,%eax              # eax<-ssssssBx
570     movl    $0xf,rINST
571     andl    %eax,rINST                # rINST<- A
572     FETCH_INST_OPCODE 1 %ecx
573     ADVANCE_PC 1
574     sarl    $4,%eax
575     SET_VREG %eax rINST
576     GOTO_NEXT_R %ecx
577
578 /* ------------------------------ */
579 .L_OP_CONST_16: /* 0x13 */
580 /* File: x86/OP_CONST_16.S */
581     /* const/16 vAA, #+BBBB */
582     movswl  2(rPC),%ecx                # ecx<- ssssBBBB
583     FETCH_INST_OPCODE 2 %eax
584     ADVANCE_PC 2
585     SET_VREG %ecx rINST                # vAA<- ssssBBBB
586     GOTO_NEXT_R %eax
587
588 /* ------------------------------ */
589 .L_OP_CONST: /* 0x14 */
590 /* File: x86/OP_CONST.S */
591     /* const vAA, #+BBBBbbbb */
592     movl      2(rPC),%eax             # grab all 32 bits at once
593     movl      rINST,rINST             # rINST<- AA
594     FETCH_INST_OPCODE 3 %ecx
595     ADVANCE_PC 3
596     SET_VREG %eax rINST               # vAA<- eax
597     GOTO_NEXT_R %ecx
598
599 /* ------------------------------ */
600 .L_OP_CONST_HIGH16: /* 0x15 */
601 /* File: x86/OP_CONST_HIGH16.S */
602     /* const/high16 vAA, #+BBBB0000 */
603     movzwl     2(rPC),%eax                # eax<- 0000BBBB
604     FETCH_INST_OPCODE 2 %ecx
605     ADVANCE_PC 2
606     sall       $16,%eax                  # eax<- BBBB0000
607     SET_VREG %eax rINST                   # vAA<- eax
608     GOTO_NEXT_R %ecx
609
610 /* ------------------------------ */
611 .L_OP_CONST_WIDE_16: /* 0x16 */
612 /* File: x86/OP_CONST_WIDE_16.S */
613     /* const-wide/16 vAA, #+BBBB */
614     movswl    2(rPC),%eax               # eax<- ssssBBBB
615     SPILL(rIBASE)                       # preserve rIBASE (cltd trashes it)
616     cltd                                # rIBASE:eax<- ssssssssssssBBBB
617     SET_VREG_WORD rIBASE rINST 1        # store msw
618     FETCH_INST_OPCODE 2 %ecx
619     UNSPILL(rIBASE)                     # restore rIBASE
620     SET_VREG_WORD %eax rINST 0          # store lsw
621     ADVANCE_PC 2
622     GOTO_NEXT_R %ecx
623
624 /* ------------------------------ */
625 .L_OP_CONST_WIDE_32: /* 0x17 */
626 /* File: x86/OP_CONST_WIDE_32.S */
627     /* const-wide/32 vAA, #+BBBBbbbb */
628     movl     2(rPC),%eax                # eax<- BBBBbbbb
629     SPILL(rIBASE)                       # save rIBASE (cltd trashes it)
630     cltd                                # rIBASE:eax<- ssssssssssssBBBB
631     SET_VREG_WORD rIBASE rINST,1        # store msw
632     FETCH_INST_OPCODE 3 %ecx
633     UNSPILL(rIBASE)                     # restore rIBASE
634     SET_VREG_WORD %eax rINST 0          # store lsw
635     ADVANCE_PC 3
636     GOTO_NEXT_R %ecx
637
638 /* ------------------------------ */
639 .L_OP_CONST_WIDE: /* 0x18 */
640 /* File: x86/OP_CONST_WIDE.S */
641     /* const-wide vAA, #+HHHHhhhhBBBBbbbb */
642     movl      2(rPC),%eax         # eax<- lsw
643     movzbl    rINSTbl,%ecx        # ecx<- AA
644     movl      6(rPC),rINST        # rINST<- msw
645     leal      (rFP,%ecx,4),%ecx   # dst addr
646     movl      rINST,4(%ecx)
647     movl      %eax,(%ecx)
648     FETCH_INST_OPCODE 5 %ecx
649     ADVANCE_PC 5
650     GOTO_NEXT_R %ecx
651
652 /* ------------------------------ */
653 .L_OP_CONST_WIDE_HIGH16: /* 0x19 */
654 /* File: x86/OP_CONST_WIDE_HIGH16.S */
655     /* const-wide/high16 vAA, #+BBBB000000000000 */
656     movzwl     2(rPC),%eax                # eax<- 0000BBBB
657     FETCH_INST_OPCODE 2 %ecx
658     ADVANCE_PC 2
659     sall       $16,%eax                  # eax<- BBBB0000
660     SET_VREG_WORD %eax rINST 1            # v[AA+1]<- eax
661     xorl       %eax,%eax
662     SET_VREG_WORD %eax rINST 0            # v[AA+0]<- eax
663     GOTO_NEXT_R %ecx
664
665 /* ------------------------------ */
666 .L_OP_CONST_STRING: /* 0x1a */
667 /* File: x86/OP_CONST_STRING.S */
668
669     /* const/string vAA, String@BBBB */
670     movl      rSELF,%ecx
671     movzwl    2(rPC),%eax              # eax<- BBBB
672     movl      offThread_methodClassDex(%ecx),%ecx# ecx<- self->methodClassDex
673     movl      offDvmDex_pResStrings(%ecx),%ecx # ecx<- dvmDex->pResStrings
674     movl      (%ecx,%eax,4),%eax       # eax<- rResString[BBBB]
675     FETCH_INST_OPCODE 2 %ecx
676     testl     %eax,%eax                # resolved yet?
677     je        .LOP_CONST_STRING_resolve
678     SET_VREG  %eax rINST               # vAA<- rResString[BBBB]
679     ADVANCE_PC 2
680     GOTO_NEXT_R %ecx
681
682 /* This is the less common path, so we'll redo some work
683    here rather than force spills on the common path */
684 .LOP_CONST_STRING_resolve:
685     movl     rSELF,%eax
686     EXPORT_PC
687     movl     offThread_method(%eax),%eax # eax<- self->method
688     movzwl   2(rPC),%ecx               # ecx<- BBBB
689     movl     offMethod_clazz(%eax),%eax
690     movl     %ecx,OUT_ARG1(%esp)
691     movl     %eax,OUT_ARG0(%esp)
692     SPILL(rIBASE)
693     call     dvmResolveString          # go resolve
694     UNSPILL(rIBASE)
695     testl    %eax,%eax                 # failed?
696     je       common_exceptionThrown
697     FETCH_INST_OPCODE 2 %ecx
698     SET_VREG %eax rINST
699     ADVANCE_PC 2
700     GOTO_NEXT_R %ecx
701
702 /* ------------------------------ */
703 .L_OP_CONST_STRING_JUMBO: /* 0x1b */
704 /* File: x86/OP_CONST_STRING_JUMBO.S */
705
706     /* const/string vAA, String@BBBBBBBB */
707     movl      rSELF,%ecx
708     movl      2(rPC),%eax              # eax<- BBBBBBBB
709     movl      offThread_methodClassDex(%ecx),%ecx# ecx<- self->methodClassDex
710     movl      offDvmDex_pResStrings(%ecx),%ecx # ecx<- dvmDex->pResStrings
711     movl      (%ecx,%eax,4),%eax       # eax<- rResString[BBBB]
712     FETCH_INST_OPCODE 3 %ecx
713     testl     %eax,%eax                # resolved yet?
714     je        .LOP_CONST_STRING_JUMBO_resolve
715     SET_VREG  %eax rINST               # vAA<- rResString[BBBB]
716     ADVANCE_PC 3
717     GOTO_NEXT_R %ecx
718
719 /* This is the less common path, so we'll redo some work
720    here rather than force spills on the common path */
721 .LOP_CONST_STRING_JUMBO_resolve:
722     movl     rSELF,%eax
723     EXPORT_PC
724     movl     offThread_method(%eax),%eax # eax<- self->method
725     movl     2(rPC),%ecx               # ecx<- BBBBBBBB
726     movl     offMethod_clazz(%eax),%eax
727     movl     %ecx,OUT_ARG1(%esp)
728     movl     %eax,OUT_ARG0(%esp)
729     SPILL(rIBASE)
730     call     dvmResolveString          # go resolve
731     UNSPILL(rIBASE)
732     testl    %eax,%eax                 # failed?
733     je       common_exceptionThrown
734     FETCH_INST_OPCODE 3 %ecx
735     SET_VREG %eax rINST
736     ADVANCE_PC 3
737     GOTO_NEXT_R %ecx
738
739 /* ------------------------------ */
740 .L_OP_CONST_CLASS: /* 0x1c */
741 /* File: x86/OP_CONST_CLASS.S */
742
743     /* const/class vAA, Class@BBBB */
744     movl      rSELF,%ecx
745     movzwl    2(rPC),%eax              # eax<- BBBB
746     movl      offThread_methodClassDex(%ecx),%ecx# ecx<- self->methodClassDex
747     movl      offDvmDex_pResClasses(%ecx),%ecx # ecx<- dvmDex->pResClasses
748     movl      (%ecx,%eax,4),%eax       # eax<- rResClasses[BBBB]
749     testl     %eax,%eax                # resolved yet?
750     je        .LOP_CONST_CLASS_resolve
751     FETCH_INST_OPCODE 2 %ecx
752     SET_VREG  %eax rINST               # vAA<- rResClasses[BBBB]
753     ADVANCE_PC 2
754     GOTO_NEXT_R %ecx
755
756 /* This is the less common path, so we'll redo some work
757    here rather than force spills on the common path */
758 .LOP_CONST_CLASS_resolve:
759     movl     rSELF,%eax
760     EXPORT_PC
761     movl     offThread_method(%eax),%eax # eax<- self->method
762     movl     $1,OUT_ARG2(%esp)        # true
763     movzwl   2(rPC),%ecx               # ecx<- BBBB
764     movl     offMethod_clazz(%eax),%eax
765     movl     %ecx,OUT_ARG1(%esp)
766     movl     %eax,OUT_ARG0(%esp)
767     SPILL(rIBASE)
768     call     dvmResolveClass           # go resolve
769     UNSPILL(rIBASE)
770     testl    %eax,%eax                 # failed?
771     je       common_exceptionThrown
772     FETCH_INST_OPCODE 2 %ecx
773     SET_VREG %eax rINST
774     ADVANCE_PC 2
775     GOTO_NEXT_R %ecx
776
777 /* ------------------------------ */
778 .L_OP_MONITOR_ENTER: /* 0x1d */
779 /* File: x86/OP_MONITOR_ENTER.S */
780     /*
781      * Synchronize on an object.
782      */
783     /* monitor-enter vAA */
784     movl    rSELF,%ecx
785     GET_VREG_R %eax rINST               # eax<- vAA
786     FETCH_INST_WORD 1
787     testl   %eax,%eax                   # null object?
788     EXPORT_PC                           # need for precise GC
789     je     common_errNullObject
790     movl    %ecx,OUT_ARG0(%esp)
791     movl    %eax,OUT_ARG1(%esp)
792     SPILL(rIBASE)
793     call    dvmLockObject               # dvmLockObject(self,object)
794     UNSPILL(rIBASE)
795     FETCH_INST_OPCODE 1 %ecx
796     ADVANCE_PC 1
797     GOTO_NEXT_R %ecx
798
799 /* ------------------------------ */
800 .L_OP_MONITOR_EXIT: /* 0x1e */
801 /* File: x86/OP_MONITOR_EXIT.S */
802     /*
803      * Unlock an object.
804      *
805      * Exceptions that occur when unlocking a monitor need to appear as
806      * if they happened at the following instruction.  See the Dalvik
807      * instruction spec.
808      */
809     /* monitor-exit vAA */
810     GET_VREG_R %eax rINST
811     movl    rSELF,%ecx
812     EXPORT_PC
813     testl   %eax,%eax                   # null object?
814     je      .LOP_MONITOR_EXIT_errNullObject   # go if so
815     movl    %eax,OUT_ARG1(%esp)
816     movl    %ecx,OUT_ARG0(%esp)
817     SPILL(rIBASE)
818     call    dvmUnlockObject             # unlock(self,obj)
819     UNSPILL(rIBASE)
820     FETCH_INST_OPCODE 1 %ecx
821     testl   %eax,%eax                   # success?
822     ADVANCE_PC 1
823     je      common_exceptionThrown      # no, exception pending
824     GOTO_NEXT_R %ecx
825 .LOP_MONITOR_EXIT_errNullObject:
826     ADVANCE_PC 1                        # advance before throw
827     jmp     common_errNullObject
828
829 /* ------------------------------ */
830 .L_OP_CHECK_CAST: /* 0x1f */
831 /* File: x86/OP_CHECK_CAST.S */
832     /*
833      * Check to see if a cast from one class to another is allowed.
834      */
835     /* check-cast vAA, class@BBBB */
836     movl      rSELF,%ecx
837     GET_VREG_R  rINST,rINST             # rINST<- vAA (object)
838     movzwl    2(rPC),%eax               # eax<- BBBB
839     movl      offThread_methodClassDex(%ecx),%ecx # ecx<- pDvmDex
840     testl     rINST,rINST               # is oject null?
841     movl      offDvmDex_pResClasses(%ecx),%ecx # ecx<- pDvmDex->pResClasses
842     je        .LOP_CHECK_CAST_okay          # null obj, cast always succeeds
843     movl      (%ecx,%eax,4),%eax        # eax<- resolved class
844     movl      offObject_clazz(rINST),%ecx # ecx<- obj->clazz
845     testl     %eax,%eax                 # have we resolved this before?
846     je        .LOP_CHECK_CAST_resolve       # no, go do it now
847 .LOP_CHECK_CAST_resolved:
848     cmpl      %eax,%ecx                 # same class (trivial success)?
849     jne       .LOP_CHECK_CAST_fullcheck     # no, do full check
850 .LOP_CHECK_CAST_okay:
851     FETCH_INST_OPCODE 2 %ecx
852     ADVANCE_PC 2
853     GOTO_NEXT_R %ecx
854
855     /*
856      * Trivial test failed, need to perform full check.  This is common.
857      *  ecx holds obj->clazz
858      *  eax holds class resolved from BBBB
859      *  rINST holds object
860      */
861 .LOP_CHECK_CAST_fullcheck:
862     movl    %eax,sReg0                 # we'll need the desired class on failure
863     movl    %eax,OUT_ARG1(%esp)
864     movl    %ecx,OUT_ARG0(%esp)
865     SPILL(rIBASE)
866     call    dvmInstanceofNonTrivial    # eax<- boolean result
867     UNSPILL(rIBASE)
868     testl   %eax,%eax                  # failed?
869     jne     .LOP_CHECK_CAST_okay           # no, success
870
871     # A cast has failed.  We need to throw a ClassCastException.
872     EXPORT_PC
873     movl    offObject_clazz(rINST),%eax
874     movl    %eax,OUT_ARG0(%esp)                 # arg0<- obj->clazz
875     movl    sReg0,%ecx
876     movl    %ecx,OUT_ARG1(%esp)                 # arg1<- desired class
877     call    dvmThrowClassCastException
878     jmp     common_exceptionThrown
879
880     /*
881      * Resolution required.  This is the least-likely path, and we're
882      * going to have to recreate some data.
883      *
884      *  rINST holds object
885      */
886 .LOP_CHECK_CAST_resolve:
887     movl    rSELF,%ecx
888     EXPORT_PC
889     movzwl  2(rPC),%eax                # eax<- BBBB
890     movl    offThread_method(%ecx),%ecx  # ecx<- self->method
891     movl    %eax,OUT_ARG1(%esp)        # arg1<- BBBB
892     movl    offMethod_clazz(%ecx),%ecx # ecx<- metho->clazz
893     movl    $0,OUT_ARG2(%esp)         # arg2<- false
894     movl    %ecx,OUT_ARG0(%esp)        # arg0<- method->clazz
895     SPILL(rIBASE)
896     call    dvmResolveClass            # eax<- resolved ClassObject ptr
897     UNSPILL(rIBASE)
898     testl   %eax,%eax                  # got null?
899     je      common_exceptionThrown     # yes, handle exception
900     movl    offObject_clazz(rINST),%ecx  # ecx<- obj->clazz
901     jmp     .LOP_CHECK_CAST_resolved       # pick up where we left off
902
903 /* ------------------------------ */
904 .L_OP_INSTANCE_OF: /* 0x20 */
905 /* File: x86/OP_INSTANCE_OF.S */
906     /*
907      * Check to see if an object reference is an instance of a class.
908      *
909      * Most common situation is a non-null object, being compared against
910      * an already-resolved class.
911      */
912     /* instance-of vA, vB, class@CCCC */
913     movl    rINST,%eax                  # eax<- BA
914     sarl    $4,%eax                    # eax<- B
915     GET_VREG_R %eax %eax                # eax<- vB (obj)
916     movl    rSELF,%ecx
917     testl   %eax,%eax                   # object null?
918     movl    offThread_methodClassDex(%ecx),%ecx  # ecx<- pDvmDex
919     SPILL(rIBASE)                       # preserve rIBASE
920     je      .LOP_INSTANCE_OF_store           # null obj, not instance, store it
921     movzwl  2(rPC),rIBASE               # rIBASE<- CCCC
922     movl    offDvmDex_pResClasses(%ecx),%ecx # ecx<- pDvmDex->pResClasses
923     movl    (%ecx,rIBASE,4),%ecx        # ecx<- resolved class
924     movl    offObject_clazz(%eax),%eax  # eax<- obj->clazz
925     testl   %ecx,%ecx                   # have we resolved this before?
926     je      .LOP_INSTANCE_OF_resolve         # not resolved, do it now
927 .LOP_INSTANCE_OF_resolved:  # eax<- obj->clazz, ecx<- resolved class
928     cmpl    %eax,%ecx                   # same class (trivial success)?
929     je      .LOP_INSTANCE_OF_trivial         # yes, trivial finish
930     /*
931      * Trivial test failed, need to perform full check.  This is common.
932      *  eax holds obj->clazz
933      *  ecx holds class resolved from BBBB
934      *  rINST has BA
935      */
936     movl    %eax,OUT_ARG0(%esp)
937     movl    %ecx,OUT_ARG1(%esp)
938     call    dvmInstanceofNonTrivial     # eax<- boolean result
939     # fall through to OP_INSTANCE_OF_store
940
941     /*
942      * eax holds boolean result
943      * rINST holds BA
944      */
945 .LOP_INSTANCE_OF_store:
946     FETCH_INST_OPCODE 2 %ecx
947     UNSPILL(rIBASE)
948     andb    $0xf,rINSTbl               # <- A
949     ADVANCE_PC 2
950     SET_VREG %eax rINST                 # vA<- eax
951     GOTO_NEXT_R %ecx
952
953     /*
954      * Trivial test succeeded, save and bail.
955      *  r9 holds A
956      */
957 .LOP_INSTANCE_OF_trivial:
958     FETCH_INST_OPCODE 2 %ecx
959     UNSPILL(rIBASE)
960     andb    $0xf,rINSTbl               # <- A
961     ADVANCE_PC 2
962     movl    $1,%eax
963     SET_VREG %eax rINST                 # vA<- true
964     GOTO_NEXT_R %ecx
965
966     /*
967      * Resolution required.  This is the least-likely path.
968      *
969      *  rIBASE holds BBBB
970      *  rINST holds BA
971      */
972 .LOP_INSTANCE_OF_resolve:
973     movl    rIBASE,OUT_ARG1(%esp)         # arg1<- BBBB
974     movl    rSELF,%ecx
975     movl    offThread_method(%ecx),%ecx
976     movl    $1,OUT_ARG2(%esp)          # arg2<- true
977     movl    offMethod_clazz(%ecx),%ecx  # ecx<- method->clazz
978     EXPORT_PC
979     movl    %ecx,OUT_ARG0(%esp)         # arg0<- method->clazz
980     call    dvmResolveClass             # eax<- resolved ClassObject ptr
981     testl   %eax,%eax                   # success?
982     je      common_exceptionThrown      # no, handle exception
983 /* Now, we need to sync up with fast path.  We need eax to
984  * hold the obj->clazz, and ecx to hold the resolved class
985  */
986     movl    %eax,%ecx                   # ecx<- resolved class
987     movl    rINST,%eax                  # eax<- BA
988     sarl    $4,%eax                    # eax<- B
989     GET_VREG_R %eax %eax                # eax<- vB (obj)
990     movl    offObject_clazz(%eax),%eax  # eax<- obj->clazz
991     jmp     .LOP_INSTANCE_OF_resolved
992
993 /* ------------------------------ */
994 .L_OP_ARRAY_LENGTH: /* 0x21 */
995 /* File: x86/OP_ARRAY_LENGTH.S */
996     /*
997      * Return the length of an array.
998      */
999    mov      rINST,%eax                # eax<- BA
1000    sarl     $4,rINST                 # rINST<- B
1001    GET_VREG_R %ecx rINST              # ecx<- vB (object ref)
1002    andb     $0xf,%al                 # eax<- A
1003    testl    %ecx,%ecx                 # is null?
1004    je       common_errNullObject
1005    movl     offArrayObject_length(%ecx),rINST
1006    FETCH_INST_OPCODE 1 %ecx
1007    ADVANCE_PC 1
1008    SET_VREG rINST %eax
1009    GOTO_NEXT_R %ecx
1010
1011 /* ------------------------------ */
1012 .L_OP_NEW_INSTANCE: /* 0x22 */
1013 /* File: x86/OP_NEW_INSTANCE.S */
1014     /*
1015      * Create a new instance of a class.
1016      */
1017     /* new-instance vAA, class@BBBB */
1018     movl      rSELF,%ecx
1019     movzwl    2(rPC),%eax               # eax<- BBBB
1020     movl      offThread_methodClassDex(%ecx),%ecx  # ecx<- pDvmDex
1021     SPILL(rIBASE)
1022     movl      offDvmDex_pResClasses(%ecx),%ecx # ecx<- pDvmDex->pResClasses
1023     EXPORT_PC
1024     movl      (%ecx,%eax,4),%ecx        # ecx<- resolved class
1025     testl     %ecx,%ecx                 # resolved?
1026     je        .LOP_NEW_INSTANCE_resolve       # no, go do it
1027 .LOP_NEW_INSTANCE_resolved:  # on entry, ecx<- class
1028     cmpb      $CLASS_INITIALIZED,offClassObject_status(%ecx)
1029     jne       .LOP_NEW_INSTANCE_needinit
1030 .LOP_NEW_INSTANCE_initialized:  # on entry, ecx<- class
1031     movl      $ALLOC_DONT_TRACK,OUT_ARG1(%esp)
1032     movl     %ecx,OUT_ARG0(%esp)
1033     call     dvmAllocObject             # eax<- new object
1034     FETCH_INST_OPCODE 2 %ecx
1035     UNSPILL(rIBASE)
1036     testl    %eax,%eax                  # success?
1037     je       common_exceptionThrown     # no, bail out
1038     SET_VREG %eax rINST
1039     ADVANCE_PC 2
1040     GOTO_NEXT_R %ecx
1041
1042     /*
1043      * Class initialization required.
1044      *
1045      *  ecx holds class object
1046      */
1047 .LOP_NEW_INSTANCE_needinit:
1048     SPILL_TMP1(%ecx)                    # save object
1049     movl    %ecx,OUT_ARG0(%esp)
1050     call    dvmInitClass                # initialize class
1051     UNSPILL_TMP1(%ecx)                  # restore object
1052     testl   %eax,%eax                   # success?
1053     jne     .LOP_NEW_INSTANCE_initialized     # success, continue
1054     jmp     common_exceptionThrown      # go deal with init exception
1055
1056     /*
1057      * Resolution required.  This is the least-likely path.
1058      *
1059      */
1060 .LOP_NEW_INSTANCE_resolve:
1061     movl    rSELF,%ecx
1062     movzwl  2(rPC),%eax
1063     movl    offThread_method(%ecx),%ecx   # ecx<- self->method
1064     movl    %eax,OUT_ARG1(%esp)
1065     movl    offMethod_clazz(%ecx),%ecx  # ecx<- method->clazz
1066     movl    $0,OUT_ARG2(%esp)
1067     movl    %ecx,OUT_ARG0(%esp)
1068     call    dvmResolveClass             # call(clazz,off,flags)
1069     movl    %eax,%ecx                   # ecx<- resolved ClassObject ptr
1070     testl   %ecx,%ecx                   # success?
1071     jne     .LOP_NEW_INSTANCE_resolved        # good to go
1072     jmp     common_exceptionThrown      # no, handle exception
1073
1074 /* ------------------------------ */
1075 .L_OP_NEW_ARRAY: /* 0x23 */
1076 /* File: x86/OP_NEW_ARRAY.S */
1077     /*
1078      * Allocate an array of objects, specified with the array class
1079      * and a count.
1080      *
1081      * The verifier guarantees that this is an array class, so we don't
1082      * check for it here.
1083      */
1084     /* new-array vA, vB, class@CCCC */
1085     movl    rSELF,%ecx
1086     EXPORT_PC
1087     movl    offThread_methodClassDex(%ecx),%ecx # ecx<- pDvmDex
1088     movzwl  2(rPC),%eax                       # eax<- CCCC
1089     movl    offDvmDex_pResClasses(%ecx),%ecx  # ecx<- pDvmDex->pResClasses
1090     SPILL(rIBASE)
1091     movl    (%ecx,%eax,4),%ecx                # ecx<- resolved class
1092     movzbl  rINSTbl,%eax
1093     sarl    $4,%eax                          # eax<- B
1094     GET_VREG_R %eax %eax                      # eax<- vB (array length)
1095     andb    $0xf,rINSTbl                     # rINST<- A
1096     testl   %eax,%eax
1097     js      common_errNegativeArraySize       # bail, passing len in eax
1098     testl   %ecx,%ecx                         # already resolved?
1099     jne     .LOP_NEW_ARRAY_finish                # yes, fast path
1100     /*
1101      * Resolve class.  (This is an uncommon case.)
1102      *  ecx holds class (null here)
1103      *  eax holds array length (vB)
1104      */
1105     movl    rSELF,%ecx
1106     SPILL_TMP1(%eax)                   # save array length
1107     movl    offThread_method(%ecx),%ecx  # ecx<- self->method
1108     movzwl  2(rPC),%eax                # eax<- CCCC
1109     movl    offMethod_clazz(%ecx),%ecx # ecx<- method->clazz
1110     movl    %eax,OUT_ARG1(%esp)
1111     movl    $0,OUT_ARG2(%esp)
1112     movl    %ecx,OUT_ARG0(%esp)
1113     call    dvmResolveClass            # eax<- call(clazz,ref,flag)
1114     movl    %eax,%ecx
1115     UNSPILL_TMP1(%eax)
1116     testl   %ecx,%ecx                  # successful resolution?
1117     je      common_exceptionThrown     # no, bail.
1118 # fall through to OP_NEW_ARRAY_finish
1119
1120     /*
1121      * Finish allocation
1122      *
1123      * ecx holds class
1124      * eax holds array length (vB)
1125      */
1126 .LOP_NEW_ARRAY_finish:
1127     movl    %ecx,OUT_ARG0(%esp)
1128     movl    %eax,OUT_ARG1(%esp)
1129     movl    $ALLOC_DONT_TRACK,OUT_ARG2(%esp)
1130     call    dvmAllocArrayByClass    # eax<- call(clazz,length,flags)
1131     FETCH_INST_OPCODE 2 %ecx
1132     UNSPILL(rIBASE)
1133     testl   %eax,%eax               # failed?
1134     je      common_exceptionThrown  # yup - go handle
1135     SET_VREG %eax rINST
1136     ADVANCE_PC 2
1137     GOTO_NEXT_R %ecx
1138
1139 /* ------------------------------ */
1140 .L_OP_FILLED_NEW_ARRAY: /* 0x24 */
1141 /* File: x86/OP_FILLED_NEW_ARRAY.S */
1142     /*
1143      * Create a new array with elements filled from registers.
1144      *
1145      * for: filled-new-array, filled-new-array/range
1146      */
1147     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
1148     /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
1149     movl    rSELF,%eax
1150     movl    offThread_methodClassDex(%eax),%eax # eax<- pDvmDex
1151     movzwl  2(rPC),%ecx                       # ecx<- BBBB
1152     movl    offDvmDex_pResClasses(%eax),%eax  # eax<- pDvmDex->pResClasses
1153     SPILL(rIBASE)                             # preserve rIBASE
1154     movl    (%eax,%ecx,4),%eax                # eax<- resolved class
1155     EXPORT_PC
1156     testl   %eax,%eax                         # already resolved?
1157     jne     .LOP_FILLED_NEW_ARRAY_continue              # yes, continue
1158     # less frequent path, so we'll redo some work
1159     movl    rSELF,%eax
1160     movl    $0,OUT_ARG2(%esp)                # arg2<- false
1161     movl    %ecx,OUT_ARG1(%esp)               # arg1<- BBBB
1162     movl    offThread_method(%eax),%eax         # eax<- self->method
1163     movl    offMethod_clazz(%eax),%eax        # eax<- method->clazz
1164     movl    %eax,OUT_ARG0(%esp)               # arg0<- clazz
1165     call    dvmResolveClass                   # eax<- call(clazz,ref,flag)
1166     testl   %eax,%eax                         # null?
1167     je      common_exceptionThrown            # yes, handle it
1168
1169        # note: fall through to .LOP_FILLED_NEW_ARRAY_continue
1170
1171     /*
1172      * On entry:
1173      *    eax holds array class [r0]
1174      *    rINST holds AA or BB [r10]
1175      *    ecx is scratch
1176      */
1177 .LOP_FILLED_NEW_ARRAY_continue:
1178     movl    offClassObject_descriptor(%eax),%ecx  # ecx<- arrayClass->descriptor
1179     movl    $ALLOC_DONT_TRACK,OUT_ARG2(%esp)     # arg2<- flags
1180     movzbl  1(%ecx),%ecx                          # ecx<- descriptor[1]
1181     movl    %eax,OUT_ARG0(%esp)                   # arg0<- arrayClass
1182     movl    rSELF,%eax
1183     cmpb    $'I',%cl                             # supported?
1184     je      1f
1185     cmpb    $'L',%cl
1186     je      1f
1187     cmpb    $'[',%cl
1188     jne      .LOP_FILLED_NEW_ARRAY_notimpl                  # no, not handled yet
1189 1:
1190     movl    %ecx,offThread_retval+4(%eax)           # save type
1191     .if      (!0)
1192     SPILL_TMP1(rINST)                              # save copy, need "B" later
1193     sarl    $4,rINST
1194     .endif
1195     movl    rINST,OUT_ARG1(%esp)                  # arg1<- A or AA (length)
1196     call    dvmAllocArrayByClass     # eax<- call(arrayClass, length, flags)
1197     movl    rSELF,%ecx
1198     testl   %eax,%eax                             # alloc successful?
1199     je      common_exceptionThrown                # no, handle exception
1200     movl    %eax,offThread_retval(%ecx)             # retval.l<- new array
1201     movzwl  4(rPC),%ecx                           # ecx<- FEDC or CCCC
1202     leal    offArrayObject_contents(%eax),%eax    # eax<- newArray->contents
1203
1204 /* at this point:
1205  *     eax is pointer to tgt
1206  *     rINST is length
1207  *     ecx is FEDC or CCCC
1208  *     TMP_SPILL1 is BA
1209  *  We now need to copy values from registers into the array
1210  */
1211
1212     .if 0
1213     # set up src pointer
1214     SPILL_TMP2(%esi)
1215     SPILL_TMP3(%edi)
1216     leal    (rFP,%ecx,4),%esi # set up src ptr
1217     movl    %eax,%edi         # set up dst ptr
1218     movl    rINST,%ecx        # load count register
1219     rep
1220     movsd
1221     UNSPILL_TMP2(%esi)
1222     UNSPILL_TMP3(%edi)
1223     movl    rSELF,%ecx
1224     movl    offThread_retval+4(%ecx),%eax      # eax<- type
1225     .else
1226     testl  rINST,rINST
1227     je     4f
1228     UNSPILL_TMP1(rIBASE)      # restore "BA"
1229     andl   $0x0f,rIBASE      # rIBASE<- 0000000A
1230     sall   $16,rIBASE        # rIBASE<- 000A0000
1231     orl    %ecx,rIBASE        # rIBASE<- 000AFEDC
1232 3:
1233     movl   $0xf,%ecx
1234     andl   rIBASE,%ecx        # ecx<- next reg to load
1235     GET_VREG_R %ecx %ecx
1236     shrl   $4,rIBASE
1237     leal   4(%eax),%eax
1238     movl   %ecx,-4(%eax)
1239     sub    $1,rINST
1240     jne    3b
1241 4:
1242     movl   rSELF,%ecx
1243     movl    offThread_retval+4(%ecx),%eax      # eax<- type
1244     .endif
1245
1246     cmpb    $'I',%al                        # Int array?
1247     je      5f                               # skip card mark if so
1248     movl    offThread_retval(%ecx),%eax        # eax<- object head
1249     movl    offThread_cardTable(%ecx),%ecx     # card table base
1250     shrl    $GC_CARD_SHIFT,%eax             # convert to card num
1251     movb    %cl,(%ecx,%eax)                  # mark card based on object head
1252 5:
1253     UNSPILL(rIBASE)                          # restore rIBASE
1254     FETCH_INST_OPCODE 3 %ecx
1255     ADVANCE_PC 3
1256     GOTO_NEXT_R %ecx
1257
1258
1259     /*
1260      * Throw an exception indicating that we have not implemented this
1261      * mode of filled-new-array.
1262      */
1263 .LOP_FILLED_NEW_ARRAY_notimpl:
1264     movl    $.LstrFilledNewArrayNotImplA,%eax
1265     movl    %eax,OUT_ARG0(%esp)
1266     call    dvmThrowInternalError
1267     jmp     common_exceptionThrown
1268
1269 /* ------------------------------ */
1270 .L_OP_FILLED_NEW_ARRAY_RANGE: /* 0x25 */
1271 /* File: x86/OP_FILLED_NEW_ARRAY_RANGE.S */
1272 /* File: x86/OP_FILLED_NEW_ARRAY.S */
1273     /*
1274      * Create a new array with elements filled from registers.
1275      *
1276      * for: filled-new-array, filled-new-array/range
1277      */
1278     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
1279     /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
1280     movl    rSELF,%eax
1281     movl    offThread_methodClassDex(%eax),%eax # eax<- pDvmDex
1282     movzwl  2(rPC),%ecx                       # ecx<- BBBB
1283     movl    offDvmDex_pResClasses(%eax),%eax  # eax<- pDvmDex->pResClasses
1284     SPILL(rIBASE)                             # preserve rIBASE
1285     movl    (%eax,%ecx,4),%eax                # eax<- resolved class
1286     EXPORT_PC
1287     testl   %eax,%eax                         # already resolved?
1288     jne     .LOP_FILLED_NEW_ARRAY_RANGE_continue              # yes, continue
1289     # less frequent path, so we'll redo some work
1290     movl    rSELF,%eax
1291     movl    $0,OUT_ARG2(%esp)                # arg2<- false
1292     movl    %ecx,OUT_ARG1(%esp)               # arg1<- BBBB
1293     movl    offThread_method(%eax),%eax         # eax<- self->method
1294     movl    offMethod_clazz(%eax),%eax        # eax<- method->clazz
1295     movl    %eax,OUT_ARG0(%esp)               # arg0<- clazz
1296     call    dvmResolveClass                   # eax<- call(clazz,ref,flag)
1297     testl   %eax,%eax                         # null?
1298     je      common_exceptionThrown            # yes, handle it
1299
1300        # note: fall through to .LOP_FILLED_NEW_ARRAY_RANGE_continue
1301
1302     /*
1303      * On entry:
1304      *    eax holds array class [r0]
1305      *    rINST holds AA or BB [r10]
1306      *    ecx is scratch
1307      */
1308 .LOP_FILLED_NEW_ARRAY_RANGE_continue:
1309     movl    offClassObject_descriptor(%eax),%ecx  # ecx<- arrayClass->descriptor
1310     movl    $ALLOC_DONT_TRACK,OUT_ARG2(%esp)     # arg2<- flags
1311     movzbl  1(%ecx),%ecx                          # ecx<- descriptor[1]
1312     movl    %eax,OUT_ARG0(%esp)                   # arg0<- arrayClass
1313     movl    rSELF,%eax
1314     cmpb    $'I',%cl                             # supported?
1315     je      1f
1316     cmpb    $'L',%cl
1317     je      1f
1318     cmpb    $'[',%cl
1319     jne      .LOP_FILLED_NEW_ARRAY_RANGE_notimpl                  # no, not handled yet
1320 1:
1321     movl    %ecx,offThread_retval+4(%eax)           # save type
1322     .if      (!1)
1323     SPILL_TMP1(rINST)                              # save copy, need "B" later
1324     sarl    $4,rINST
1325     .endif
1326     movl    rINST,OUT_ARG1(%esp)                  # arg1<- A or AA (length)
1327     call    dvmAllocArrayByClass     # eax<- call(arrayClass, length, flags)
1328     movl    rSELF,%ecx
1329     testl   %eax,%eax                             # alloc successful?
1330     je      common_exceptionThrown                # no, handle exception
1331     movl    %eax,offThread_retval(%ecx)             # retval.l<- new array
1332     movzwl  4(rPC),%ecx                           # ecx<- FEDC or CCCC
1333     leal    offArrayObject_contents(%eax),%eax    # eax<- newArray->contents
1334
1335 /* at this point:
1336  *     eax is pointer to tgt
1337  *     rINST is length
1338  *     ecx is FEDC or CCCC
1339  *     TMP_SPILL1 is BA
1340  *  We now need to copy values from registers into the array
1341  */
1342
1343     .if 1
1344     # set up src pointer
1345     SPILL_TMP2(%esi)
1346     SPILL_TMP3(%edi)
1347     leal    (rFP,%ecx,4),%esi # set up src ptr
1348     movl    %eax,%edi         # set up dst ptr
1349     movl    rINST,%ecx        # load count register
1350     rep
1351     movsd
1352     UNSPILL_TMP2(%esi)
1353     UNSPILL_TMP3(%edi)
1354     movl    rSELF,%ecx
1355     movl    offThread_retval+4(%ecx),%eax      # eax<- type
1356     .else
1357     testl  rINST,rINST
1358     je     4f
1359     UNSPILL_TMP1(rIBASE)      # restore "BA"
1360     andl   $0x0f,rIBASE      # rIBASE<- 0000000A
1361     sall   $16,rIBASE        # rIBASE<- 000A0000
1362     orl    %ecx,rIBASE        # rIBASE<- 000AFEDC
1363 3:
1364     movl   $0xf,%ecx
1365     andl   rIBASE,%ecx        # ecx<- next reg to load
1366     GET_VREG_R %ecx %ecx
1367     shrl   $4,rIBASE
1368     leal   4(%eax),%eax
1369     movl   %ecx,-4(%eax)
1370     sub    $1,rINST
1371     jne    3b
1372 4:
1373     movl   rSELF,%ecx
1374     movl    offThread_retval+4(%ecx),%eax      # eax<- type
1375     .endif
1376
1377     cmpb    $'I',%al                        # Int array?
1378     je      5f                               # skip card mark if so
1379     movl    offThread_retval(%ecx),%eax        # eax<- object head
1380     movl    offThread_cardTable(%ecx),%ecx     # card table base
1381     shrl    $GC_CARD_SHIFT,%eax             # convert to card num
1382     movb    %cl,(%ecx,%eax)                  # mark card based on object head
1383 5:
1384     UNSPILL(rIBASE)                          # restore rIBASE
1385     FETCH_INST_OPCODE 3 %ecx
1386     ADVANCE_PC 3
1387     GOTO_NEXT_R %ecx
1388
1389
1390     /*
1391      * Throw an exception indicating that we have not implemented this
1392      * mode of filled-new-array.
1393      */
1394 .LOP_FILLED_NEW_ARRAY_RANGE_notimpl:
1395     movl    $.LstrFilledNewArrayNotImplA,%eax
1396     movl    %eax,OUT_ARG0(%esp)
1397     call    dvmThrowInternalError
1398     jmp     common_exceptionThrown
1399
1400
1401 /* ------------------------------ */
1402 .L_OP_FILL_ARRAY_DATA: /* 0x26 */
1403 /* File: x86/OP_FILL_ARRAY_DATA.S */
1404     /* fill-array-data vAA, +BBBBBBBB */
1405     movl    2(rPC),%ecx                # ecx<- BBBBbbbb
1406     leal    (rPC,%ecx,2),%ecx          # ecx<- PC + BBBBbbbb*2
1407     GET_VREG_R %eax rINST
1408     EXPORT_PC
1409     movl    %eax,OUT_ARG0(%esp)
1410     movl    %ecx,OUT_ARG1(%esp)
1411     SPILL(rIBASE)
1412     call    dvmInterpHandleFillArrayData
1413     UNSPILL(rIBASE)
1414     FETCH_INST_OPCODE 3 %ecx
1415     testl   %eax,%eax                   # exception thrown?
1416     je      common_exceptionThrown
1417     ADVANCE_PC 3
1418     GOTO_NEXT_R %ecx
1419
1420 /* ------------------------------ */
1421 .L_OP_THROW: /* 0x27 */
1422 /* File: x86/OP_THROW.S */
1423     /*
1424      * Throw an exception object in the current thread.
1425      */
1426     /* throw vAA */
1427     EXPORT_PC
1428     GET_VREG_R %eax rINST              # eax<- exception object
1429     movl     rSELF,%ecx                # ecx<- self
1430     testl    %eax,%eax                 # null object?
1431     je       common_errNullObject
1432     movl     %eax,offThread_exception(%ecx) # thread->exception<- obj
1433     jmp      common_exceptionThrown
1434
1435 /* ------------------------------ */
1436 .L_OP_GOTO: /* 0x28 */
1437 /* File: x86/OP_GOTO.S */
1438     /*
1439      * Unconditional branch, 8-bit offset.
1440      *
1441      * The branch distance is a signed code-unit offset, which we need to
1442      * double to get a byte offset.
1443      */
1444     /* goto +AA */
1445     movsbl  rINSTbl,rINST         # ebx<- ssssssAA
1446     testl   rINST,rINST           # test for <0
1447     js      common_backwardBranch
1448     movl    rINST,%eax
1449     FETCH_INST_INDEXED %eax
1450     ADVANCE_PC_INDEXED %eax
1451     GOTO_NEXT
1452
1453 /* ------------------------------ */
1454 .L_OP_GOTO_16: /* 0x29 */
1455 /* File: x86/OP_GOTO_16.S */
1456     /*
1457      * Unconditional branch, 16-bit offset.
1458      *
1459      * The branch distance is a signed code-unit offset
1460      */
1461     /* goto/16 +AAAA */
1462     movswl  2(rPC),rINST           # rINST<- ssssAAAA
1463     testl   rINST,rINST            # test for <0
1464     js      common_backwardBranch
1465     movl    rINST,%eax
1466     FETCH_INST_INDEXED %eax
1467     ADVANCE_PC_INDEXED %eax
1468     GOTO_NEXT
1469
1470 /* ------------------------------ */
1471 .L_OP_GOTO_32: /* 0x2a */
1472 /* File: x86/OP_GOTO_32.S */
1473     /*
1474      * Unconditional branch, 32-bit offset.
1475      *
1476      * The branch distance is a signed code-unit offset.
1477      *
1478      * Unlike most opcodes, this one is allowed to branch to itself, so
1479      * our "backward branch" test must be "<=0" instead of "<0".
1480      */
1481     /* goto/32 AAAAAAAA */
1482     movl    2(rPC),rINST           # rINST<- AAAAAAAA
1483     cmpl    $0,rINST              # test for <= 0
1484     jle     common_backwardBranch
1485     movl    rINST,%eax
1486     FETCH_INST_INDEXED %eax
1487     ADVANCE_PC_INDEXED %eax
1488     GOTO_NEXT
1489
1490 /* ------------------------------ */
1491 .L_OP_PACKED_SWITCH: /* 0x2b */
1492 /* File: x86/OP_PACKED_SWITCH.S */
1493     /*
1494      * Handle a packed-switch or sparse-switch instruction.  In both cases
1495      * we decode it and hand it off to a helper function.
1496      *
1497      * We don't really expect backward branches in a switch statement, but
1498      * they're perfectly legal, so we check for them here.
1499      *
1500      * for: packed-switch, sparse-switch
1501      */
1502     /* op vAA, +BBBB */
1503     movl    2(rPC),%ecx           # ecx<- BBBBbbbb
1504     GET_VREG_R %eax rINST         # eax<- vAA
1505     leal    (rPC,%ecx,2),%ecx     # ecx<- PC + BBBBbbbb*2
1506     movl    %eax,OUT_ARG1(%esp)   # ARG1<- vAA
1507     movl    %ecx,OUT_ARG0(%esp)   # ARG0<- switchData
1508     SPILL(rIBASE)
1509     call    dvmInterpHandlePackedSwitch
1510     UNSPILL(rIBASE)
1511     testl   %eax,%eax
1512     movl    %eax,rINST            # set up word offset
1513     jle     common_backwardBranch # check on special actions
1514     ADVANCE_PC_INDEXED rINST
1515     FETCH_INST
1516     GOTO_NEXT
1517
1518 /* ------------------------------ */
1519 .L_OP_SPARSE_SWITCH: /* 0x2c */
1520 /* File: x86/OP_SPARSE_SWITCH.S */
1521 /* File: x86/OP_PACKED_SWITCH.S */
1522     /*
1523      * Handle a packed-switch or sparse-switch instruction.  In both cases
1524      * we decode it and hand it off to a helper function.
1525      *
1526      * We don't really expect backward branches in a switch statement, but
1527      * they're perfectly legal, so we check for them here.
1528      *
1529      * for: packed-switch, sparse-switch
1530      */
1531     /* op vAA, +BBBB */
1532     movl    2(rPC),%ecx           # ecx<- BBBBbbbb
1533     GET_VREG_R %eax rINST         # eax<- vAA
1534     leal    (rPC,%ecx,2),%ecx     # ecx<- PC + BBBBbbbb*2
1535     movl    %eax,OUT_ARG1(%esp)   # ARG1<- vAA
1536     movl    %ecx,OUT_ARG0(%esp)   # ARG0<- switchData
1537     SPILL(rIBASE)
1538     call    dvmInterpHandleSparseSwitch
1539     UNSPILL(rIBASE)
1540     testl   %eax,%eax
1541     movl    %eax,rINST            # set up word offset
1542     jle     common_backwardBranch # check on special actions
1543     ADVANCE_PC_INDEXED rINST
1544     FETCH_INST
1545     GOTO_NEXT
1546
1547
1548 /* ------------------------------ */
1549 .L_OP_CMPL_FLOAT: /* 0x2d */
1550 /* File: x86/OP_CMPL_FLOAT.S */
1551 /* File: x86/OP_CMPG_DOUBLE.S */
1552     /* float/double_cmp[gl] vAA, vBB, vCC */
1553     movzbl    3(rPC),%eax             # eax<- CC
1554     movzbl    2(rPC),%ecx             # ecx<- BB
1555     .if 0
1556     fldl     (rFP,%eax,4)
1557     fldl     (rFP,%ecx,4)
1558     .else
1559     flds     (rFP,%eax,4)
1560     flds     (rFP,%ecx,4)
1561     .endif
1562     xorl     %ecx,%ecx
1563     fucompp     # z if equal, p set if NaN, c set if st0 < st1
1564     fnstsw   %ax
1565     sahf
1566     FETCH_INST_OPCODE 2 %eax
1567     jp       .LOP_CMPL_FLOAT_isNaN
1568     je       .LOP_CMPL_FLOAT_finish
1569     sbbl     %ecx,%ecx
1570     jb       .LOP_CMPL_FLOAT_finish
1571     incl     %ecx
1572 .LOP_CMPL_FLOAT_finish:
1573     SET_VREG %ecx rINST
1574     ADVANCE_PC 2
1575     GOTO_NEXT_R %eax
1576
1577 .LOP_CMPL_FLOAT_isNaN:
1578     movl      $-1,%ecx
1579     jmp       .LOP_CMPL_FLOAT_finish
1580
1581
1582 /* ------------------------------ */
1583 .L_OP_CMPG_FLOAT: /* 0x2e */
1584 /* File: x86/OP_CMPG_FLOAT.S */
1585 /* File: x86/OP_CMPG_DOUBLE.S */
1586     /* float/double_cmp[gl] vAA, vBB, vCC */
1587     movzbl    3(rPC),%eax             # eax<- CC
1588     movzbl    2(rPC),%ecx             # ecx<- BB
1589     .if 0
1590     fldl     (rFP,%eax,4)
1591     fldl     (rFP,%ecx,4)
1592     .else
1593     flds     (rFP,%eax,4)
1594     flds     (rFP,%ecx,4)
1595     .endif
1596     xorl     %ecx,%ecx
1597     fucompp     # z if equal, p set if NaN, c set if st0 < st1
1598     fnstsw   %ax
1599     sahf
1600     FETCH_INST_OPCODE 2 %eax
1601     jp       .LOP_CMPG_FLOAT_isNaN
1602     je       .LOP_CMPG_FLOAT_finish
1603     sbbl     %ecx,%ecx
1604     jb       .LOP_CMPG_FLOAT_finish
1605     incl     %ecx
1606 .LOP_CMPG_FLOAT_finish:
1607     SET_VREG %ecx rINST
1608     ADVANCE_PC 2
1609     GOTO_NEXT_R %eax
1610
1611 .LOP_CMPG_FLOAT_isNaN:
1612     movl      $1,%ecx
1613     jmp       .LOP_CMPG_FLOAT_finish
1614
1615
1616 /* ------------------------------ */
1617 .L_OP_CMPL_DOUBLE: /* 0x2f */
1618 /* File: x86/OP_CMPL_DOUBLE.S */
1619 /* File: x86/OP_CMPG_DOUBLE.S */
1620     /* float/double_cmp[gl] vAA, vBB, vCC */
1621     movzbl    3(rPC),%eax             # eax<- CC
1622     movzbl    2(rPC),%ecx             # ecx<- BB
1623     .if 1
1624     fldl     (rFP,%eax,4)
1625     fldl     (rFP,%ecx,4)
1626     .else
1627     flds     (rFP,%eax,4)
1628     flds     (rFP,%ecx,4)
1629     .endif
1630     xorl     %ecx,%ecx
1631     fucompp     # z if equal, p set if NaN, c set if st0 < st1
1632     fnstsw   %ax
1633     sahf
1634     FETCH_INST_OPCODE 2 %eax
1635     jp       .LOP_CMPL_DOUBLE_isNaN
1636     je       .LOP_CMPL_DOUBLE_finish
1637     sbbl     %ecx,%ecx
1638     jb       .LOP_CMPL_DOUBLE_finish
1639     incl     %ecx
1640 .LOP_CMPL_DOUBLE_finish:
1641     SET_VREG %ecx rINST
1642     ADVANCE_PC 2
1643     GOTO_NEXT_R %eax
1644
1645 .LOP_CMPL_DOUBLE_isNaN:
1646     movl      $-1,%ecx
1647     jmp       .LOP_CMPL_DOUBLE_finish
1648
1649
1650 /* ------------------------------ */
1651 .L_OP_CMPG_DOUBLE: /* 0x30 */
1652 /* File: x86/OP_CMPG_DOUBLE.S */
1653     /* float/double_cmp[gl] vAA, vBB, vCC */
1654     movzbl    3(rPC),%eax             # eax<- CC
1655     movzbl    2(rPC),%ecx             # ecx<- BB
1656     .if 1
1657     fldl     (rFP,%eax,4)
1658     fldl     (rFP,%ecx,4)
1659     .else
1660     flds     (rFP,%eax,4)
1661     flds     (rFP,%ecx,4)
1662     .endif
1663     xorl     %ecx,%ecx
1664     fucompp     # z if equal, p set if NaN, c set if st0 < st1
1665     fnstsw   %ax
1666     sahf
1667     FETCH_INST_OPCODE 2 %eax
1668     jp       .LOP_CMPG_DOUBLE_isNaN
1669     je       .LOP_CMPG_DOUBLE_finish
1670     sbbl     %ecx,%ecx
1671     jb       .LOP_CMPG_DOUBLE_finish
1672     incl     %ecx
1673 .LOP_CMPG_DOUBLE_finish:
1674     SET_VREG %ecx rINST
1675     ADVANCE_PC 2
1676     GOTO_NEXT_R %eax
1677
1678 .LOP_CMPG_DOUBLE_isNaN:
1679     movl      $1,%ecx
1680     jmp       .LOP_CMPG_DOUBLE_finish
1681
1682 /* ------------------------------ */
1683 .L_OP_CMP_LONG: /* 0x31 */
1684 /* File: x86/OP_CMP_LONG.S */
1685     /*
1686      * Compare two 64-bit values.  Puts 0, 1, or -1 into the destination
1687      * register based on the results of the comparison.
1688      */
1689     // TUNING: rework to avoid rIBASE spill
1690     /* cmp-long vAA, vBB, vCC */
1691     movzbl    2(rPC),%ecx              # ecx<- BB
1692     SPILL(rIBASE)
1693     movzbl    3(rPC),rIBASE            # rIBASE- CC
1694     GET_VREG_WORD %eax %ecx,1          # eax<- v[BB+1]
1695     GET_VREG_WORD %ecx %ecx 0          # ecx<- v[BB+0]
1696     cmpl      4(rFP,rIBASE,4),%eax
1697     jl        .LOP_CMP_LONG_smaller
1698     jg        .LOP_CMP_LONG_bigger
1699     sub       (rFP,rIBASE,4),%ecx
1700     ja        .LOP_CMP_LONG_bigger
1701     jb        .LOP_CMP_LONG_smaller
1702     SET_VREG %ecx rINST
1703     FETCH_INST_OPCODE 2 %ecx
1704     UNSPILL(rIBASE)
1705     ADVANCE_PC 2
1706     GOTO_NEXT_R %ecx
1707
1708 .LOP_CMP_LONG_bigger:
1709     movl      $1,%ecx
1710     SET_VREG %ecx rINST
1711     FETCH_INST_OPCODE 2 %ecx
1712     UNSPILL(rIBASE)
1713     ADVANCE_PC 2
1714     GOTO_NEXT_R %ecx
1715
1716 .LOP_CMP_LONG_smaller:
1717     movl      $-1,%ecx
1718     SET_VREG %ecx rINST
1719     FETCH_INST_OPCODE 2 %ecx
1720     UNSPILL(rIBASE)
1721     ADVANCE_PC 2
1722     GOTO_NEXT_R %ecx
1723
1724 /* ------------------------------ */
1725 .L_OP_IF_EQ: /* 0x32 */
1726 /* File: x86/OP_IF_EQ.S */
1727 /* File: x86/bincmp.S */
1728     /*
1729      * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1730      * fragment that specifies the *reverse* comparison to perform, e.g.
1731      * for "if-le" you would use "gt".
1732      *
1733      * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1734      */
1735     /* if-cmp vA, vB, +CCCC */
1736     movzx    rINSTbl,%ecx          # ecx <- A+
1737     andb     $0xf,%cl             # ecx <- A
1738     GET_VREG_R %eax %ecx           # eax <- vA
1739     sarl     $4,rINST            # rINST<- B
1740     cmpl     (rFP,rINST,4),%eax    # compare (vA, vB)
1741     movswl   2(rPC),rINST          # Get signed branch offset
1742     movl     $2,%eax              # assume not taken
1743     jne   1f
1744     testl    rINST,rINST
1745     js       common_backwardBranch
1746     movl     rINST,%eax
1747 1:
1748     FETCH_INST_INDEXED %eax
1749     ADVANCE_PC_INDEXED %eax
1750     GOTO_NEXT
1751
1752
1753 /* ------------------------------ */
1754 .L_OP_IF_NE: /* 0x33 */
1755 /* File: x86/OP_IF_NE.S */
1756 /* File: x86/bincmp.S */
1757     /*
1758      * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1759      * fragment that specifies the *reverse* comparison to perform, e.g.
1760      * for "if-le" you would use "gt".
1761      *
1762      * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1763      */
1764     /* if-cmp vA, vB, +CCCC */
1765     movzx    rINSTbl,%ecx          # ecx <- A+
1766     andb     $0xf,%cl             # ecx <- A
1767     GET_VREG_R %eax %ecx           # eax <- vA
1768     sarl     $4,rINST            # rINST<- B
1769     cmpl     (rFP,rINST,4),%eax    # compare (vA, vB)
1770     movswl   2(rPC),rINST          # Get signed branch offset
1771     movl     $2,%eax              # assume not taken
1772     je   1f
1773     testl    rINST,rINST
1774     js       common_backwardBranch
1775     movl     rINST,%eax
1776 1:
1777     FETCH_INST_INDEXED %eax
1778     ADVANCE_PC_INDEXED %eax
1779     GOTO_NEXT
1780
1781
1782 /* ------------------------------ */
1783 .L_OP_IF_LT: /* 0x34 */
1784 /* File: x86/OP_IF_LT.S */
1785 /* File: x86/bincmp.S */
1786     /*
1787      * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1788      * fragment that specifies the *reverse* comparison to perform, e.g.
1789      * for "if-le" you would use "gt".
1790      *
1791      * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1792      */
1793     /* if-cmp vA, vB, +CCCC */
1794     movzx    rINSTbl,%ecx          # ecx <- A+
1795     andb     $0xf,%cl             # ecx <- A
1796     GET_VREG_R %eax %ecx           # eax <- vA
1797     sarl     $4,rINST            # rINST<- B
1798     cmpl     (rFP,rINST,4),%eax    # compare (vA, vB)
1799     movswl   2(rPC),rINST          # Get signed branch offset
1800     movl     $2,%eax              # assume not taken
1801     jge   1f
1802     testl    rINST,rINST
1803     js       common_backwardBranch
1804     movl     rINST,%eax
1805 1:
1806     FETCH_INST_INDEXED %eax
1807     ADVANCE_PC_INDEXED %eax
1808     GOTO_NEXT
1809
1810
1811 /* ------------------------------ */
1812 .L_OP_IF_GE: /* 0x35 */
1813 /* File: x86/OP_IF_GE.S */
1814 /* File: x86/bincmp.S */
1815     /*
1816      * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1817      * fragment that specifies the *reverse* comparison to perform, e.g.
1818      * for "if-le" you would use "gt".
1819      *
1820      * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1821      */
1822     /* if-cmp vA, vB, +CCCC */
1823     movzx    rINSTbl,%ecx          # ecx <- A+
1824     andb     $0xf,%cl             # ecx <- A
1825     GET_VREG_R %eax %ecx           # eax <- vA
1826     sarl     $4,rINST            # rINST<- B
1827     cmpl     (rFP,rINST,4),%eax    # compare (vA, vB)
1828     movswl   2(rPC),rINST          # Get signed branch offset
1829     movl     $2,%eax              # assume not taken
1830     jl   1f
1831     testl    rINST,rINST
1832     js       common_backwardBranch
1833     movl     rINST,%eax
1834 1:
1835     FETCH_INST_INDEXED %eax
1836     ADVANCE_PC_INDEXED %eax
1837     GOTO_NEXT
1838
1839
1840 /* ------------------------------ */
1841 .L_OP_IF_GT: /* 0x36 */
1842 /* File: x86/OP_IF_GT.S */
1843 /* File: x86/bincmp.S */
1844     /*
1845      * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1846      * fragment that specifies the *reverse* comparison to perform, e.g.
1847      * for "if-le" you would use "gt".
1848      *
1849      * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1850      */
1851     /* if-cmp vA, vB, +CCCC */
1852     movzx    rINSTbl,%ecx          # ecx <- A+
1853     andb     $0xf,%cl             # ecx <- A
1854     GET_VREG_R %eax %ecx           # eax <- vA
1855     sarl     $4,rINST            # rINST<- B
1856     cmpl     (rFP,rINST,4),%eax    # compare (vA, vB)
1857     movswl   2(rPC),rINST          # Get signed branch offset
1858     movl     $2,%eax              # assume not taken
1859     jle   1f
1860     testl    rINST,rINST
1861     js       common_backwardBranch
1862     movl     rINST,%eax
1863 1:
1864     FETCH_INST_INDEXED %eax
1865     ADVANCE_PC_INDEXED %eax
1866     GOTO_NEXT
1867
1868
1869 /* ------------------------------ */
1870 .L_OP_IF_LE: /* 0x37 */
1871 /* File: x86/OP_IF_LE.S */
1872 /* File: x86/bincmp.S */
1873     /*
1874      * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1875      * fragment that specifies the *reverse* comparison to perform, e.g.
1876      * for "if-le" you would use "gt".
1877      *
1878      * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1879      */
1880     /* if-cmp vA, vB, +CCCC */
1881     movzx    rINSTbl,%ecx          # ecx <- A+
1882     andb     $0xf,%cl             # ecx <- A
1883     GET_VREG_R %eax %ecx           # eax <- vA
1884     sarl     $4,rINST            # rINST<- B
1885     cmpl     (rFP,rINST,4),%eax    # compare (vA, vB)
1886     movswl   2(rPC),rINST          # Get signed branch offset
1887     movl     $2,%eax              # assume not taken
1888     jg   1f
1889     testl    rINST,rINST
1890     js       common_backwardBranch
1891     movl     rINST,%eax
1892 1:
1893     FETCH_INST_INDEXED %eax
1894     ADVANCE_PC_INDEXED %eax
1895     GOTO_NEXT
1896
1897
1898 /* ------------------------------ */
1899 .L_OP_IF_EQZ: /* 0x38 */
1900 /* File: x86/OP_IF_EQZ.S */
1901 /* File: x86/zcmp.S */
1902     /*
1903      * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1904      * fragment that specifies the *reverse* comparison to perform, e.g.
1905      * for "if-le" you would use "gt".
1906      *
1907      * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1908      */
1909     /* if-cmp vAA, +BBBB */
1910     cmpl     $0,(rFP,rINST,4)     # compare (vA, 0)
1911     movswl   2(rPC),rINST         # fetch signed displacement
1912     movl     $2,%eax             # assume branch not taken
1913     jne   1f
1914     testl    rINST,rINST
1915     js       common_backwardBranch
1916     movl     rINST,%eax
1917 1:
1918     FETCH_INST_INDEXED %eax
1919     ADVANCE_PC_INDEXED %eax
1920     GOTO_NEXT
1921
1922
1923 /* ------------------------------ */
1924 .L_OP_IF_NEZ: /* 0x39 */
1925 /* File: x86/OP_IF_NEZ.S */
1926 /* File: x86/zcmp.S */
1927     /*
1928      * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1929      * fragment that specifies the *reverse* comparison to perform, e.g.
1930      * for "if-le" you would use "gt".
1931      *
1932      * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1933      */
1934     /* if-cmp vAA, +BBBB */
1935     cmpl     $0,(rFP,rINST,4)     # compare (vA, 0)
1936     movswl   2(rPC),rINST         # fetch signed displacement
1937     movl     $2,%eax             # assume branch not taken
1938     je   1f
1939     testl    rINST,rINST
1940     js       common_backwardBranch
1941     movl     rINST,%eax
1942 1:
1943     FETCH_INST_INDEXED %eax
1944     ADVANCE_PC_INDEXED %eax
1945     GOTO_NEXT
1946
1947
1948 /* ------------------------------ */
1949 .L_OP_IF_LTZ: /* 0x3a */
1950 /* File: x86/OP_IF_LTZ.S */
1951 /* File: x86/zcmp.S */
1952     /*
1953      * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1954      * fragment that specifies the *reverse* comparison to perform, e.g.
1955      * for "if-le" you would use "gt".
1956      *
1957      * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1958      */
1959     /* if-cmp vAA, +BBBB */
1960     cmpl     $0,(rFP,rINST,4)     # compare (vA, 0)
1961     movswl   2(rPC),rINST         # fetch signed displacement
1962     movl     $2,%eax             # assume branch not taken
1963     jge   1f
1964     testl    rINST,rINST
1965     js       common_backwardBranch
1966     movl     rINST,%eax
1967 1:
1968     FETCH_INST_INDEXED %eax
1969     ADVANCE_PC_INDEXED %eax
1970     GOTO_NEXT
1971
1972
1973 /* ------------------------------ */
1974 .L_OP_IF_GEZ: /* 0x3b */
1975 /* File: x86/OP_IF_GEZ.S */
1976 /* File: x86/zcmp.S */
1977     /*
1978      * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1979      * fragment that specifies the *reverse* comparison to perform, e.g.
1980      * for "if-le" you would use "gt".
1981      *
1982      * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1983      */
1984     /* if-cmp vAA, +BBBB */
1985     cmpl     $0,(rFP,rINST,4)     # compare (vA, 0)
1986     movswl   2(rPC),rINST         # fetch signed displacement
1987     movl     $2,%eax             # assume branch not taken
1988     jl   1f
1989     testl    rINST,rINST
1990     js       common_backwardBranch
1991     movl     rINST,%eax
1992 1:
1993     FETCH_INST_INDEXED %eax
1994     ADVANCE_PC_INDEXED %eax
1995     GOTO_NEXT
1996
1997
1998 /* ------------------------------ */
1999 .L_OP_IF_GTZ: /* 0x3c */
2000 /* File: x86/OP_IF_GTZ.S */
2001 /* File: x86/zcmp.S */
2002     /*
2003      * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
2004      * fragment that specifies the *reverse* comparison to perform, e.g.
2005      * for "if-le" you would use "gt".
2006      *
2007      * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
2008      */
2009     /* if-cmp vAA, +BBBB */
2010     cmpl     $0,(rFP,rINST,4)     # compare (vA, 0)
2011     movswl   2(rPC),rINST         # fetch signed displacement
2012     movl     $2,%eax             # assume branch not taken
2013     jle   1f
2014     testl    rINST,rINST
2015     js       common_backwardBranch
2016     movl     rINST,%eax
2017 1:
2018     FETCH_INST_INDEXED %eax
2019     ADVANCE_PC_INDEXED %eax
2020     GOTO_NEXT
2021
2022
2023 /* ------------------------------ */
2024 .L_OP_IF_LEZ: /* 0x3d */
2025 /* File: x86/OP_IF_LEZ.S */
2026 /* File: x86/zcmp.S */
2027     /*
2028      * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
2029      * fragment that specifies the *reverse* comparison to perform, e.g.
2030      * for "if-le" you would use "gt".
2031      *
2032      * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
2033      */
2034     /* if-cmp vAA, +BBBB */
2035     cmpl     $0,(rFP,rINST,4)     # compare (vA, 0)
2036     movswl   2(rPC),rINST         # fetch signed displacement
2037     movl     $2,%eax             # assume branch not taken
2038     jg   1f
2039     testl    rINST,rINST
2040     js       common_backwardBranch
2041     movl     rINST,%eax
2042 1:
2043     FETCH_INST_INDEXED %eax
2044     ADVANCE_PC_INDEXED %eax
2045     GOTO_NEXT
2046
2047
2048 /* ------------------------------ */
2049 .L_OP_UNUSED_3E: /* 0x3e */
2050 /* File: x86/OP_UNUSED_3E.S */
2051 /* File: x86/unused.S */
2052     jmp     common_abort
2053
2054
2055 /* ------------------------------ */
2056 .L_OP_UNUSED_3F: /* 0x3f */
2057 /* File: x86/OP_UNUSED_3F.S */
2058 /* File: x86/unused.S */
2059     jmp     common_abort
2060
2061
2062 /* ------------------------------ */
2063 .L_OP_UNUSED_40: /* 0x40 */
2064 /* File: x86/OP_UNUSED_40.S */
2065 /* File: x86/unused.S */
2066     jmp     common_abort
2067
2068
2069 /* ------------------------------ */
2070 .L_OP_UNUSED_41: /* 0x41 */
2071 /* File: x86/OP_UNUSED_41.S */
2072 /* File: x86/unused.S */
2073     jmp     common_abort
2074
2075
2076 /* ------------------------------ */
2077 .L_OP_UNUSED_42: /* 0x42 */
2078 /* File: x86/OP_UNUSED_42.S */
2079 /* File: x86/unused.S */
2080     jmp     common_abort
2081
2082
2083 /* ------------------------------ */
2084 .L_OP_UNUSED_43: /* 0x43 */
2085 /* File: x86/OP_UNUSED_43.S */
2086 /* File: x86/unused.S */
2087     jmp     common_abort
2088
2089
2090 /* ------------------------------ */
2091 .L_OP_AGET: /* 0x44 */
2092 /* File: x86/OP_AGET.S */
2093     /*
2094      * Array get, 32 bits or less.  vAA <- vBB[vCC].
2095      *
2096      * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2097      */
2098     /* op vAA, vBB, vCC */
2099     movzbl    2(rPC),%eax               # eax<- BB
2100     movzbl    3(rPC),%ecx               # ecx<- CC
2101     GET_VREG_R  %eax %eax               # eax<- vBB (array object)
2102     GET_VREG_R  %ecx %ecx               # ecs<- vCC (requested index)
2103     testl     %eax,%eax                 # null array object?
2104     je        common_errNullObject      # bail if so
2105     cmpl      offArrayObject_length(%eax),%ecx
2106     jae       common_errArrayIndex      # index >= length, bail.  Expects
2107                                         #    arrayObj in eax
2108                                         #    index in ecx
2109     movl     offArrayObject_contents(%eax,%ecx,4),%eax
2110 .LOP_AGET_finish:
2111     FETCH_INST_OPCODE 2 %ecx
2112     SET_VREG  %eax rINST
2113     ADVANCE_PC 2
2114     GOTO_NEXT_R %ecx
2115
2116 /* ------------------------------ */
2117 .L_OP_AGET_WIDE: /* 0x45 */
2118 /* File: x86/OP_AGET_WIDE.S */
2119     /*
2120      * Array get, 64 bits.  vAA <- vBB[vCC].
2121      *
2122      */
2123     /* op vAA, vBB, vCC */
2124     movzbl    2(rPC),%eax               # eax<- BB
2125     movzbl    3(rPC),%ecx               # ecx<- CC
2126     GET_VREG_R  %eax %eax               # eax<- vBB (array object)
2127     GET_VREG_R  %ecx %ecx               # ecs<- vCC (requested index)
2128     testl     %eax,%eax                 # null array object?
2129     je        common_errNullObject      # bail if so
2130     cmpl      offArrayObject_length(%eax),%ecx
2131     jae       common_errArrayIndex      # index >= length, bail.  Expects
2132                                         #    arrayObj in eax
2133                                         #    index in ecx
2134     leal      offArrayObject_contents(%eax,%ecx,8),%eax
2135     movl      (%eax),%ecx
2136     movl      4(%eax),%eax
2137     SET_VREG_WORD %ecx rINST 0
2138     SET_VREG_WORD %eax rINST 1
2139     FETCH_INST_OPCODE 2 %ecx
2140     ADVANCE_PC 2
2141     GOTO_NEXT_R %ecx
2142
2143 /* ------------------------------ */
2144 .L_OP_AGET_OBJECT: /* 0x46 */
2145 /* File: x86/OP_AGET_OBJECT.S */
2146 /* File: x86/OP_AGET.S */
2147     /*
2148      * Array get, 32 bits or less.  vAA <- vBB[vCC].
2149      *
2150      * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2151      */
2152     /* op vAA, vBB, vCC */
2153     movzbl    2(rPC),%eax               # eax<- BB
2154     movzbl    3(rPC),%ecx               # ecx<- CC
2155     GET_VREG_R  %eax %eax               # eax<- vBB (array object)
2156     GET_VREG_R  %ecx %ecx               # ecs<- vCC (requested index)
2157     testl     %eax,%eax                 # null array object?
2158     je        common_errNullObject      # bail if so
2159     cmpl      offArrayObject_length(%eax),%ecx
2160     jae       common_errArrayIndex      # index >= length, bail.  Expects
2161                                         #    arrayObj in eax
2162                                         #    index in ecx
2163     movl     offArrayObject_contents(%eax,%ecx,4),%eax
2164 .LOP_AGET_OBJECT_finish:
2165     FETCH_INST_OPCODE 2 %ecx
2166     SET_VREG  %eax rINST
2167     ADVANCE_PC 2
2168     GOTO_NEXT_R %ecx
2169
2170
2171 /* ------------------------------ */
2172 .L_OP_AGET_BOOLEAN: /* 0x47 */
2173 /* File: x86/OP_AGET_BOOLEAN.S */
2174 /* File: x86/OP_AGET.S */
2175     /*
2176      * Array get, 32 bits or less.  vAA <- vBB[vCC].
2177      *
2178      * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2179      */
2180     /* op vAA, vBB, vCC */
2181     movzbl    2(rPC),%eax               # eax<- BB
2182     movzbl    3(rPC),%ecx               # ecx<- CC
2183     GET_VREG_R  %eax %eax               # eax<- vBB (array object)
2184     GET_VREG_R  %ecx %ecx               # ecs<- vCC (requested index)
2185     testl     %eax,%eax                 # null array object?
2186     je        common_errNullObject      # bail if so
2187     cmpl      offArrayObject_length(%eax),%ecx
2188     jae       common_errArrayIndex      # index >= length, bail.  Expects
2189                                         #    arrayObj in eax
2190                                         #    index in ecx
2191     movzbl     offArrayObject_contents(%eax,%ecx,1),%eax
2192 .LOP_AGET_BOOLEAN_finish:
2193     FETCH_INST_OPCODE 2 %ecx
2194     SET_VREG  %eax rINST
2195     ADVANCE_PC 2
2196     GOTO_NEXT_R %ecx
2197
2198
2199 /* ------------------------------ */
2200 .L_OP_AGET_BYTE: /* 0x48 */
2201 /* File: x86/OP_AGET_BYTE.S */
2202 /* File: x86/OP_AGET.S */
2203     /*
2204      * Array get, 32 bits or less.  vAA <- vBB[vCC].
2205      *
2206      * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2207      */
2208     /* op vAA, vBB, vCC */
2209     movzbl    2(rPC),%eax               # eax<- BB
2210     movzbl    3(rPC),%ecx               # ecx<- CC
2211     GET_VREG_R  %eax %eax               # eax<- vBB (array object)
2212     GET_VREG_R  %ecx %ecx               # ecs<- vCC (requested index)
2213     testl     %eax,%eax                 # null array object?
2214     je        common_errNullObject      # bail if so
2215     cmpl      offArrayObject_length(%eax),%ecx
2216     jae       common_errArrayIndex      # index >= length, bail.  Expects
2217                                         #    arrayObj in eax
2218                                         #    index in ecx
2219     movsbl     offArrayObject_contents(%eax,%ecx,1),%eax
2220 .LOP_AGET_BYTE_finish:
2221     FETCH_INST_OPCODE 2 %ecx
2222     SET_VREG  %eax rINST
2223     ADVANCE_PC 2
2224     GOTO_NEXT_R %ecx
2225
2226
2227 /* ------------------------------ */
2228 .L_OP_AGET_CHAR: /* 0x49 */
2229 /* File: x86/OP_AGET_CHAR.S */
2230 /* File: x86/OP_AGET.S */
2231     /*
2232      * Array get, 32 bits or less.  vAA <- vBB[vCC].
2233      *
2234      * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2235      */
2236     /* op vAA, vBB, vCC */
2237     movzbl    2(rPC),%eax               # eax<- BB
2238     movzbl    3(rPC),%ecx               # ecx<- CC
2239     GET_VREG_R  %eax %eax               # eax<- vBB (array object)
2240     GET_VREG_R  %ecx %ecx               # ecs<- vCC (requested index)
2241     testl     %eax,%eax                 # null array object?
2242     je        common_errNullObject      # bail if so
2243     cmpl      offArrayObject_length(%eax),%ecx
2244     jae       common_errArrayIndex      # index >= length, bail.  Expects
2245                                         #    arrayObj in eax
2246                                         #    index in ecx
2247     movzwl     offArrayObject_contents(%eax,%ecx,2),%eax
2248 .LOP_AGET_CHAR_finish:
2249     FETCH_INST_OPCODE 2 %ecx
2250     SET_VREG  %eax rINST
2251     ADVANCE_PC 2
2252     GOTO_NEXT_R %ecx
2253
2254
2255 /* ------------------------------ */
2256 .L_OP_AGET_SHORT: /* 0x4a */
2257 /* File: x86/OP_AGET_SHORT.S */
2258 /* File: x86/OP_AGET.S */
2259     /*
2260      * Array get, 32 bits or less.  vAA <- vBB[vCC].
2261      *
2262      * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2263      */
2264     /* op vAA, vBB, vCC */
2265     movzbl    2(rPC),%eax               # eax<- BB
2266     movzbl    3(rPC),%ecx               # ecx<- CC
2267     GET_VREG_R  %eax %eax               # eax<- vBB (array object)
2268     GET_VREG_R  %ecx %ecx               # ecs<- vCC (requested index)
2269     testl     %eax,%eax                 # null array object?
2270     je        common_errNullObject      # bail if so
2271     cmpl      offArrayObject_length(%eax),%ecx
2272     jae       common_errArrayIndex      # index >= length, bail.  Expects
2273                                         #    arrayObj in eax
2274                                         #    index in ecx
2275     movswl     offArrayObject_contents(%eax,%ecx,2),%eax
2276 .LOP_AGET_SHORT_finish:
2277     FETCH_INST_OPCODE 2 %ecx
2278     SET_VREG  %eax rINST
2279     ADVANCE_PC 2
2280     GOTO_NEXT_R %ecx
2281
2282
2283 /* ------------------------------ */
2284 .L_OP_APUT: /* 0x4b */
2285 /* File: x86/OP_APUT.S */
2286     /*
2287      * Array put, 32 bits or less.  vBB[vCC] <- vAA
2288      *
2289      * for: aput, aput-object, aput-boolean, aput-byte, aput-char, aput-short
2290      */
2291     /* op vAA, vBB, vCC */
2292     movzbl    2(rPC),%eax               # eax<- BB
2293     movzbl    3(rPC),%ecx               # ecx<- CC
2294     GET_VREG_R  %eax %eax               # eax<- vBB (array object)
2295     GET_VREG_R  %ecx %ecx               # ecs<- vCC (requested index)
2296     testl     %eax,%eax                 # null array object?
2297     je        common_errNullObject      # bail if so
2298     cmpl      offArrayObject_length(%eax),%ecx
2299     jae       common_errArrayIndex      # index >= length, bail.  Expects:
2300                                         #   arrayObj in eax
2301                                         #   index in ecx
2302     leal      offArrayObject_contents(%eax,%ecx,4),%eax
2303 .LOP_APUT_finish:
2304     GET_VREG_R  rINST rINST
2305     FETCH_INST_OPCODE 2 %ecx
2306     movl     rINST,(%eax)
2307     ADVANCE_PC 2
2308     GOTO_NEXT_R %ecx
2309
2310 /* ------------------------------ */
2311 .L_OP_APUT_WIDE: /* 0x4c */
2312 /* File: x86/OP_APUT_WIDE.S */
2313     /*
2314      * Array put, 64 bits.  vBB[vCC]<-vAA.
2315      *
2316      */
2317     /* op vAA, vBB, vCC */
2318     movzbl    2(rPC),%eax               # eax<- BB
2319     movzbl    3(rPC),%ecx               # ecx<- CC
2320     GET_VREG_R  %eax %eax               # eax<- vBB (array object)
2321     GET_VREG_R  %ecx %ecx               # ecs<- vCC (requested index)
2322     testl     %eax,%eax                 # null array object?
2323     je        common_errNullObject      # bail if so
2324     cmpl      offArrayObject_length(%eax),%ecx
2325     jae       common_errArrayIndex      # index >= length, bail.  Expects:
2326                                         #   arrayObj in eax
2327                                         #   index in ecx
2328     leal      offArrayObject_contents(%eax,%ecx,8),%eax
2329     GET_VREG_WORD %ecx rINST 0
2330     GET_VREG_WORD rINST rINST 1
2331     movl      %ecx,(%eax)
2332     FETCH_INST_OPCODE 2 %ecx
2333     movl      rINST,4(%eax)
2334     ADVANCE_PC 2
2335     GOTO_NEXT_R %ecx
2336
2337 /* ------------------------------ */
2338 .L_OP_APUT_OBJECT: /* 0x4d */
2339 /* File: x86/OP_APUT_OBJECT.S */
2340     /*
2341      * Array put, 32 bits or less.  vBB[vCC] <- vAA
2342      *
2343      * for: aput, aput-object, aput-boolean, aput-byte, aput-char, aput-short
2344      */
2345     /* op vAA, vBB, vCC */
2346     movzbl    2(rPC),%eax               # eax<- BB
2347     movzbl    3(rPC),%ecx               # ecx<- CC
2348     GET_VREG_R  %eax %eax               # eax<- vBB (array object)
2349     GET_VREG_R  %ecx %ecx               # ecs<- vCC (requested index)
2350     GET_VREG_R  rINST rINST             # rINST<- vAA
2351     testl     %eax,%eax                 # null array object?
2352     je        common_errNullObject      # bail if so
2353     cmpl      offArrayObject_length(%eax),%ecx
2354     jae       common_errArrayIndex      # index >= length, bail.  Expects
2355                                         #    arrayObj in eax
2356                                         #    index in ecx
2357     /* On entry:
2358      *   eax<- array object
2359      *   ecx<- index
2360      *   rINST<- vAA
2361      */
2362     leal      offArrayObject_contents(%eax,%ecx,4),%ecx
2363     testl     rINST,rINST                    # storing null reference?
2364     je        .LOP_APUT_OBJECT_skip_check
2365     SPILL_TMP1(%ecx)                         # save target address
2366     SPILL_TMP2(%eax)                         # save object head
2367     movl      offObject_clazz(%eax),%eax     # eax<- arrayObj->clazz
2368     movl      offObject_clazz(rINST),%ecx    # ecx<- obj->clazz
2369     movl      %eax,OUT_ARG1(%esp)
2370     movl      %ecx,OUT_ARG0(%esp)
2371     movl      %ecx,sReg0                     # store the two classes for later
2372     movl      %eax,sReg1
2373     SPILL(rIBASE)
2374     call      dvmCanPutArrayElement          # test object type vs. array type
2375     UNSPILL(rIBASE)
2376     UNSPILL_TMP1(%ecx)                       # recover target address
2377     testl     %eax,%eax
2378     movl      rSELF,%eax
2379     jne       .LOP_APUT_OBJECT_types_okay
2380
2381     # The types don't match.  We need to throw an ArrayStoreException.
2382     EXPORT_PC
2383     movl      sReg0,%eax                     # restore the two classes...
2384     movl      %eax,OUT_ARG0(%esp)
2385     movl      sReg1,%ecx
2386     movl      %ecx,OUT_ARG1(%esp)
2387     call      dvmThrowArrayStoreException    # ...and throw
2388     jmp       common_exceptionThrown
2389
2390 .LOP_APUT_OBJECT_types_okay:
2391     movl      offThread_cardTable(%eax),%eax   # get card table base
2392     movl      rINST,(%ecx)                   # store into array
2393     UNSPILL_TMP2(rINST)                      # recover object head
2394     FETCH_INST_OPCODE 2 %ecx
2395     shrl      $GC_CARD_SHIFT,rINST          # object head to card number
2396     movb      %al,(%eax,rINST)               # mark card using object head
2397     ADVANCE_PC 2
2398     GOTO_NEXT_R %ecx
2399
2400 .LOP_APUT_OBJECT_skip_check:
2401     movl      rINST,(%ecx)
2402     FETCH_INST_OPCODE 2 %ecx
2403     ADVANCE_PC 2
2404     GOTO_NEXT_R %ecx
2405
2406 /* ------------------------------ */
2407 .L_OP_APUT_BOOLEAN: /* 0x4e */
2408 /* File: x86/OP_APUT_BOOLEAN.S */
2409 /* File: x86/OP_APUT.S */
2410     /*
2411      * Array put, 32 bits or less.  vBB[vCC] <- vAA
2412      *
2413      * for: aput, aput-object, aput-boolean, aput-byte, aput-char, aput-short
2414      */
2415     /* op vAA, vBB, vCC */
2416     movzbl    2(rPC),%eax               # eax<- BB
2417     movzbl    3(rPC),%ecx               # ecx<- CC
2418     GET_VREG_R  %eax %eax               # eax<- vBB (array object)
2419     GET_VREG_R  %ecx %ecx               # ecs<- vCC (requested index)
2420     testl     %eax,%eax                 # null array object?
2421     je        common_errNullObject      # bail if so
2422     cmpl      offArrayObject_length(%eax),%ecx
2423     jae       common_errArrayIndex      # index >= length, bail.  Expects:
2424                                         #   arrayObj in eax
2425                                         #   index in ecx
2426     leal      offArrayObject_contents(%eax,%ecx,1),%eax
2427 .LOP_APUT_BOOLEAN_finish:
2428     GET_VREG_R  rINST rINST
2429     FETCH_INST_OPCODE 2 %ecx
2430     movb     rINSTbl,(%eax)
2431     ADVANCE_PC 2
2432     GOTO_NEXT_R %ecx
2433
2434
2435 /* ------------------------------ */
2436 .L_OP_APUT_BYTE: /* 0x4f */
2437 /* File: x86/OP_APUT_BYTE.S */
2438 /* File: x86/OP_APUT.S */
2439     /*
2440      * Array put, 32 bits or less.  vBB[vCC] <- vAA
2441      *
2442      * for: aput, aput-object, aput-boolean, aput-byte, aput-char, aput-short
2443      */
2444     /* op vAA, vBB, vCC */
2445     movzbl    2(rPC),%eax               # eax<- BB
2446     movzbl    3(rPC),%ecx               # ecx<- CC
2447     GET_VREG_R  %eax %eax               # eax<- vBB (array object)
2448     GET_VREG_R  %ecx %ecx               # ecs<- vCC (requested index)
2449     testl     %eax,%eax                 # null array object?
2450     je        common_errNullObject      # bail if so
2451     cmpl      offArrayObject_length(%eax),%ecx
2452     jae       common_errArrayIndex      # index >= length, bail.  Expects:
2453                                         #   arrayObj in eax
2454                                         #   index in ecx
2455     leal      offArrayObject_contents(%eax,%ecx,1),%eax
2456 .LOP_APUT_BYTE_finish:
2457     GET_VREG_R  rINST rINST
2458     FETCH_INST_OPCODE 2 %ecx
2459     movb     rINSTbl,(%eax)
2460     ADVANCE_PC 2
2461     GOTO_NEXT_R %ecx
2462
2463
2464 /* ------------------------------ */
2465 .L_OP_APUT_CHAR: /* 0x50 */
2466 /* File: x86/OP_APUT_CHAR.S */
2467 /* File: x86/OP_APUT.S */
2468     /*
2469      * Array put, 32 bits or less.  vBB[vCC] <- vAA
2470      *
2471      * for: aput, aput-object, aput-boolean, aput-byte, aput-char, aput-short
2472      */
2473     /* op vAA, vBB, vCC */
2474     movzbl    2(rPC),%eax               # eax<- BB
2475     movzbl    3(rPC),%ecx               # ecx<- CC
2476     GET_VREG_R  %eax %eax               # eax<- vBB (array object)
2477     GET_VREG_R  %ecx %ecx               # ecs<- vCC (requested index)
2478     testl     %eax,%eax                 # null array object?
2479     je        common_errNullObject      # bail if so
2480     cmpl      offArrayObject_length(%eax),%ecx
2481     jae       common_errArrayIndex      # index >= length, bail.  Expects:
2482                                         #   arrayObj in eax
2483                                         #   index in ecx
2484     leal      offArrayObject_contents(%eax,%ecx,2),%eax
2485 .LOP_APUT_CHAR_finish:
2486     GET_VREG_R  rINST rINST
2487     FETCH_INST_OPCODE 2 %ecx
2488     movw     rINSTw,(%eax)
2489     ADVANCE_PC 2
2490     GOTO_NEXT_R %ecx
2491
2492
2493 /* ------------------------------ */
2494 .L_OP_APUT_SHORT: /* 0x51 */
2495 /* File: x86/OP_APUT_SHORT.S */
2496 /* File: x86/OP_APUT.S */
2497     /*
2498      * Array put, 32 bits or less.  vBB[vCC] <- vAA
2499      *
2500      * for: aput, aput-object, aput-boolean, aput-byte, aput-char, aput-short
2501      */
2502     /* op vAA, vBB, vCC */
2503     movzbl    2(rPC),%eax               # eax<- BB
2504     movzbl    3(rPC),%ecx               # ecx<- CC
2505     GET_VREG_R  %eax %eax               # eax<- vBB (array object)
2506     GET_VREG_R  %ecx %ecx               # ecs<- vCC (requested index)
2507     testl     %eax,%eax                 # null array object?
2508     je        common_errNullObject      # bail if so
2509     cmpl      offArrayObject_length(%eax),%ecx
2510     jae       common_errArrayIndex      # index >= length, bail.  Expects:
2511                                         #   arrayObj in eax
2512                                         #   index in ecx
2513     leal      offArrayObject_contents(%eax,%ecx,2),%eax
2514 .LOP_APUT_SHORT_finish:
2515     GET_VREG_R  rINST rINST
2516     FETCH_INST_OPCODE 2 %ecx
2517     movw     rINSTw,(%eax)
2518     ADVANCE_PC 2
2519     GOTO_NEXT_R %ecx
2520
2521
2522 /* ------------------------------ */
2523 .L_OP_IGET: /* 0x52 */
2524 /* File: x86/OP_IGET.S */
2525     /*
2526      * General 32-bit instance field get.
2527      *
2528      * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2529      */
2530     /* op vA, vB, field@CCCC */
2531     movl    rSELF,%ecx
2532     SPILL(rIBASE)                               # preserve rIBASE
2533     movzwl  2(rPC),rIBASE                       # rIBASE<- 0000CCCC
2534     movl    offThread_methodClassDex(%ecx),%eax # eax<- DvmDex
2535     movzbl  rINSTbl,%ecx                        # ecx<- BA
2536     sarl    $4,%ecx                            # ecx<- B
2537     movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
2538     andb    $0xf,rINSTbl                       # rINST<- A
2539     GET_VREG_R %ecx %ecx                        # ecx<- fp[B], the object ptr
2540     movl    (%eax,rIBASE,4),%eax                # resolved entry
2541     testl   %eax,%eax                           # is resolved entry null?
2542     jne     .LOP_IGET_finish                  # no, already resolved
2543     movl    rIBASE,OUT_ARG1(%esp)               # needed by dvmResolveInstField
2544     movl    rSELF,rIBASE
2545     EXPORT_PC
2546     movl    offThread_method(rIBASE),rIBASE     # rIBASE<- current method
2547     movl    offMethod_clazz(rIBASE),rIBASE      # rIBASE<- method->clazz
2548     SPILL_TMP1(%ecx)                            # save obj pointer across call
2549     movl    rIBASE,OUT_ARG0(%esp)               # pass in method->clazz
2550     call    dvmResolveInstField                 #  ... to dvmResolveInstField
2551     UNSPILL_TMP1(%ecx)
2552     testl   %eax,%eax                           #  returns InstrField ptr
2553     jne     .LOP_IGET_finish
2554     jmp     common_exceptionThrown
2555
2556 .LOP_IGET_finish:
2557     /*
2558      * Currently:
2559      *   eax holds resolved field
2560      *   ecx holds object
2561      *   rINST holds A
2562      */
2563     movl    offInstField_byteOffset(%eax),%eax  # eax<- byte offset of field
2564     testl   %ecx,%ecx                           # object null?
2565     je      common_errNullObject                # object was null
2566     movl   (%ecx,%eax,1),%ecx                  # ecx<- obj.field (8/16/32 bits)
2567     FETCH_INST_OPCODE 2 %eax
2568     UNSPILL(rIBASE)
2569     SET_VREG %ecx rINST
2570     ADVANCE_PC 2
2571     GOTO_NEXT_R %eax
2572
2573 /* ------------------------------ */
2574 .L_OP_IGET_WIDE: /* 0x53 */
2575 /* File: x86/OP_IGET_WIDE.S */
2576     /*
2577      * 64-bit instance field get.
2578      *
2579      */
2580     /* op vA, vB, field@CCCC */
2581     movl    rSELF,%ecx
2582     SPILL(rIBASE)                               # preserve rIBASE
2583     movzwl  2(rPC),rIBASE                       # rIBASE<- 0000CCCC
2584     movl    offThread_methodClassDex(%ecx),%eax # eax<- DvmDex
2585     movzbl  rINSTbl,%ecx                        # ecx<- BA
2586     sarl    $4,%ecx                            # ecx<- B
2587     movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
2588     andb    $0xf,rINSTbl                       # rINST<- A
2589     GET_VREG_R %ecx %ecx                        # ecx<- fp[B], the object ptr
2590     movl    (%eax,rIBASE,4),%eax                # resolved entry
2591     testl   %eax,%eax                           # is resolved entry null?
2592     jne     .LOP_IGET_WIDE_finish                  # no, already resolved
2593     movl    rIBASE,OUT_ARG1(%esp)               # for dvmResolveInstField
2594     movl    rSELF,rIBASE
2595     EXPORT_PC
2596     movl    offThread_method(rIBASE),rIBASE     # rIBASE<- current method
2597     movl    offMethod_clazz(rIBASE),rIBASE      # rIBASE<- method->clazz
2598     SPILL_TMP1(%ecx)                            # save objpointer across call
2599     movl    rPC,OUT_ARG0(%esp)                  # pass in method->clazz
2600     call    dvmResolveInstField                 #  ... to dvmResolveInstField
2601     UNSPILL_TMP1(%ecx)
2602     testl   %eax,%eax                           # returns InstrField ptr
2603     jne     .LOP_IGET_WIDE_finish
2604     jmp     common_exceptionThrown
2605
2606 .LOP_IGET_WIDE_finish:
2607     /*
2608      * Currently:
2609      *   eax holds resolved field
2610      *   ecx holds object
2611      *   rINST holds A
2612      */
2613     movl    offInstField_byteOffset(%eax),%eax  # eax<- byte offset of field
2614     testl   %ecx,%ecx                           # object null?
2615     je      common_errNullObject                # object was null
2616     leal    (%ecx,%eax,1),%eax                  # eax<- address of field
2617     movl    (%eax),%ecx                         # ecx<- lsw
2618     movl    4(%eax),%eax                        # eax<- msw
2619     SET_VREG_WORD %ecx rINST 0
2620     FETCH_INST_OPCODE 2 %ecx
2621     UNSPILL(rIBASE)                             # restore rIBASE
2622     SET_VREG_WORD %eax rINST 1
2623     ADVANCE_PC 2
2624     GOTO_NEXT_R %ecx
2625
2626 /* ------------------------------ */
2627 .L_OP_IGET_OBJECT: /* 0x54 */
2628 /* File: x86/OP_IGET_OBJECT.S */
2629 /* File: x86/OP_IGET.S */
2630     /*
2631      * General 32-bit instance field get.
2632      *
2633      * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2634      */
2635     /* op vA, vB, field@CCCC */
2636     movl    rSELF,%ecx
2637     SPILL(rIBASE)                               # preserve rIBASE
2638     movzwl  2(rPC),rIBASE                       # rIBASE<- 0000CCCC
2639     movl    offThread_methodClassDex(%ecx),%eax # eax<- DvmDex
2640     movzbl  rINSTbl,%ecx                        # ecx<- BA
2641     sarl    $4,%ecx                            # ecx<- B
2642     movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
2643     andb    $0xf,rINSTbl                       # rINST<- A
2644     GET_VREG_R %ecx %ecx                        # ecx<- fp[B], the object ptr
2645     movl    (%eax,rIBASE,4),%eax                # resolved entry
2646     testl   %eax,%eax                           # is resolved entry null?
2647     jne     .LOP_IGET_OBJECT_finish                  # no, already resolved
2648     movl    rIBASE,OUT_ARG1(%esp)               # needed by dvmResolveInstField
2649     movl    rSELF,rIBASE
2650     EXPORT_PC
2651     movl    offThread_method(rIBASE),rIBASE     # rIBASE<- current method
2652     movl    offMethod_clazz(rIBASE),rIBASE      # rIBASE<- method->clazz
2653     SPILL_TMP1(%ecx)                            # save obj pointer across call
2654     movl    rIBASE,OUT_ARG0(%esp)               # pass in method->clazz
2655     call    dvmResolveInstField                 #  ... to dvmResolveInstField
2656     UNSPILL_TMP1(%ecx)
2657     testl   %eax,%eax                           #  returns InstrField ptr
2658     jne     .LOP_IGET_OBJECT_finish
2659     jmp     common_exceptionThrown
2660
2661 .LOP_IGET_OBJECT_finish:
2662     /*
2663      * Currently:
2664      *   eax holds resolved field
2665      *   ecx holds object
2666      *   rINST holds A
2667      */
2668     movl    offInstField_byteOffset(%eax),%eax  # eax<- byte offset of field
2669     testl   %ecx,%ecx                           # object null?
2670     je      common_errNullObject                # object was null
2671     movl   (%ecx,%eax,1),%ecx                  # ecx<- obj.field (8/16/32 bits)
2672     FETCH_INST_OPCODE 2 %eax
2673     UNSPILL(rIBASE)
2674     SET_VREG %ecx rINST
2675     ADVANCE_PC 2
2676     GOTO_NEXT_R %eax
2677
2678
2679 /* ------------------------------ */
2680 .L_OP_IGET_BOOLEAN: /* 0x55 */
2681 /* File: x86/OP_IGET_BOOLEAN.S */
2682 /* File: x86/OP_IGET.S */
2683     /*
2684      * General 32-bit instance field get.
2685      *
2686      * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2687      */
2688     /* op vA, vB, field@CCCC */
2689     movl    rSELF,%ecx
2690     SPILL(rIBASE)                               # preserve rIBASE
2691     movzwl  2(rPC),rIBASE                       # rIBASE<- 0000CCCC
2692     movl    offThread_methodClassDex(%ecx),%eax # eax<- DvmDex
2693     movzbl  rINSTbl,%ecx                        # ecx<- BA
2694     sarl    $4,%ecx                            # ecx<- B
2695     movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
2696     andb    $0xf,rINSTbl                       # rINST<- A
2697     GET_VREG_R %ecx %ecx                        # ecx<- fp[B], the object ptr
2698     movl    (%eax,rIBASE,4),%eax                # resolved entry
2699     testl   %eax,%eax                           # is resolved entry null?
2700     jne     .LOP_IGET_BOOLEAN_finish                  # no, already resolved
2701     movl    rIBASE,OUT_ARG1(%esp)               # needed by dvmResolveInstField
2702     movl    rSELF,rIBASE
2703     EXPORT_PC
2704     movl    offThread_method(rIBASE),rIBASE     # rIBASE<- current method
2705     movl    offMethod_clazz(rIBASE),rIBASE      # rIBASE<- method->clazz
2706     SPILL_TMP1(%ecx)                            # save obj pointer across call
2707     movl    rIBASE,OUT_ARG0(%esp)               # pass in method->clazz
2708     call    dvmResolveInstField                 #  ... to dvmResolveInstField
2709     UNSPILL_TMP1(%ecx)
2710     testl   %eax,%eax                           #  returns InstrField ptr
2711     jne     .LOP_IGET_BOOLEAN_finish
2712     jmp     common_exceptionThrown
2713
2714 .LOP_IGET_BOOLEAN_finish:
2715     /*
2716      * Currently:
2717      *   eax holds resolved field
2718      *   ecx holds object
2719      *   rINST holds A
2720      */
2721     movl    offInstField_byteOffset(%eax),%eax  # eax<- byte offset of field
2722     testl   %ecx,%ecx                           # object null?
2723     je      common_errNullObject                # object was null
2724     movzbl   (%ecx,%eax,1),%ecx                  # ecx<- obj.field (8/16/32 bits)
2725     FETCH_INST_OPCODE 2 %eax
2726     UNSPILL(rIBASE)
2727     SET_VREG %ecx rINST
2728     ADVANCE_PC 2
2729     GOTO_NEXT_R %eax
2730
2731
2732 /* ------------------------------ */
2733 .L_OP_IGET_BYTE: /* 0x56 */
2734 /* File: x86/OP_IGET_BYTE.S */
2735 /* File: x86/OP_IGET.S */
2736     /*
2737      * General 32-bit instance field get.
2738      *
2739      * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2740      */
2741     /* op vA, vB, field@CCCC */
2742     movl    rSELF,%ecx
2743     SPILL(rIBASE)                               # preserve rIBASE
2744     movzwl  2(rPC),rIBASE                       # rIBASE<- 0000CCCC
2745     movl    offThread_methodClassDex(%ecx),%eax # eax<- DvmDex
2746     movzbl  rINSTbl,%ecx                        # ecx<- BA
2747     sarl    $4,%ecx                            # ecx<- B
2748     movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
2749     andb    $0xf,rINSTbl                       # rINST<- A
2750     GET_VREG_R %ecx %ecx                        # ecx<- fp[B], the object ptr
2751     movl    (%eax,rIBASE,4),%eax                # resolved entry
2752     testl   %eax,%eax                           # is resolved entry null?
2753     jne     .LOP_IGET_BYTE_finish                  # no, already resolved
2754     movl    rIBASE,OUT_ARG1(%esp)               # needed by dvmResolveInstField
2755     movl    rSELF,rIBASE
2756     EXPORT_PC
2757     movl    offThread_method(rIBASE),rIBASE     # rIBASE<- current method
2758     movl    offMethod_clazz(rIBASE),rIBASE      # rIBASE<- method->clazz
2759     SPILL_TMP1(%ecx)                            # save obj pointer across call
2760     movl    rIBASE,OUT_ARG0(%esp)               # pass in method->clazz
2761     call    dvmResolveInstField                 #  ... to dvmResolveInstField
2762     UNSPILL_TMP1(%ecx)
2763     testl   %eax,%eax                           #  returns InstrField ptr
2764     jne     .LOP_IGET_BYTE_finish
2765     jmp     common_exceptionThrown
2766
2767 .LOP_IGET_BYTE_finish:
2768     /*
2769      * Currently:
2770      *   eax holds resolved field
2771      *   ecx holds object
2772      *   rINST holds A
2773      */
2774     movl    offInstField_byteOffset(%eax),%eax  # eax<- byte offset of field
2775     testl   %ecx,%ecx                           # object null?
2776     je      common_errNullObject                # object was null
2777     movsbl   (%ecx,%eax,1),%ecx                  # ecx<- obj.field (8/16/32 bits)
2778     FETCH_INST_OPCODE 2 %eax
2779     UNSPILL(rIBASE)
2780     SET_VREG %ecx rINST
2781     ADVANCE_PC 2
2782     GOTO_NEXT_R %eax
2783
2784
2785 /* ------------------------------ */
2786 .L_OP_IGET_CHAR: /* 0x57 */
2787 /* File: x86/OP_IGET_CHAR.S */
2788 /* File: x86/OP_IGET.S */
2789     /*
2790      * General 32-bit instance field get.
2791      *
2792      * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2793      */
2794     /* op vA, vB, field@CCCC */
2795     movl    rSELF,%ecx
2796     SPILL(rIBASE)                               # preserve rIBASE
2797     movzwl  2(rPC),rIBASE                       # rIBASE<- 0000CCCC
2798     movl    offThread_methodClassDex(%ecx),%eax # eax<- DvmDex
2799     movzbl  rINSTbl,%ecx                        # ecx<- BA
2800     sarl    $4,%ecx                            # ecx<- B
2801     movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
2802     andb    $0xf,rINSTbl                       # rINST<- A
2803     GET_VREG_R %ecx %ecx                        # ecx<- fp[B], the object ptr
2804     movl    (%eax,rIBASE,4),%eax                # resolved entry
2805     testl   %eax,%eax                           # is resolved entry null?
2806     jne     .LOP_IGET_CHAR_finish                  # no, already resolved
2807     movl    rIBASE,OUT_ARG1(%esp)               # needed by dvmResolveInstField
2808     movl    rSELF,rIBASE
2809     EXPORT_PC
2810     movl    offThread_method(rIBASE),rIBASE     # rIBASE<- current method
2811     movl    offMethod_clazz(rIBASE),rIBASE      # rIBASE<- method->clazz
2812     SPILL_TMP1(%ecx)                            # save obj pointer across call
2813     movl    rIBASE,OUT_ARG0(%esp)               # pass in method->clazz
2814     call    dvmResolveInstField                 #  ... to dvmResolveInstField
2815     UNSPILL_TMP1(%ecx)
2816     testl   %eax,%eax                           #  returns InstrField ptr
2817     jne     .LOP_IGET_CHAR_finish
2818     jmp     common_exceptionThrown
2819
2820 .LOP_IGET_CHAR_finish:
2821     /*
2822      * Currently:
2823      *   eax holds resolved field
2824      *   ecx holds object
2825      *   rINST holds A
2826      */
2827     movl    offInstField_byteOffset(%eax),%eax  # eax<- byte offset of field
2828     testl   %ecx,%ecx                           # object null?
2829     je      common_errNullObject                # object was null
2830     movzwl   (%ecx,%eax,1),%ecx                  # ecx<- obj.field (8/16/32 bits)
2831     FETCH_INST_OPCODE 2 %eax
2832     UNSPILL(rIBASE)
2833     SET_VREG %ecx rINST
2834     ADVANCE_PC 2
2835     GOTO_NEXT_R %eax
2836
2837
2838 /* ------------------------------ */
2839 .L_OP_IGET_SHORT: /* 0x58 */
2840 /* File: x86/OP_IGET_SHORT.S */
2841 /* File: x86/OP_IGET.S */
2842     /*
2843      * General 32-bit instance field get.
2844      *
2845      * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2846      */
2847     /* op vA, vB, field@CCCC */
2848     movl    rSELF,%ecx
2849     SPILL(rIBASE)                               # preserve rIBASE
2850     movzwl  2(rPC),rIBASE                       # rIBASE<- 0000CCCC
2851     movl    offThread_methodClassDex(%ecx),%eax # eax<- DvmDex
2852     movzbl  rINSTbl,%ecx                        # ecx<- BA
2853     sarl    $4,%ecx                            # ecx<- B
2854     movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
2855     andb    $0xf,rINSTbl                       # rINST<- A
2856     GET_VREG_R %ecx %ecx                        # ecx<- fp[B], the object ptr
2857     movl    (%eax,rIBASE,4),%eax                # resolved entry
2858     testl   %eax,%eax                           # is resolved entry null?
2859     jne     .LOP_IGET_SHORT_finish                  # no, already resolved
2860     movl    rIBASE,OUT_ARG1(%esp)               # needed by dvmResolveInstField
2861     movl    rSELF,rIBASE
2862     EXPORT_PC
2863     movl    offThread_method(rIBASE),rIBASE     # rIBASE<- current method
2864     movl    offMethod_clazz(rIBASE),rIBASE      # rIBASE<- method->clazz
2865     SPILL_TMP1(%ecx)                            # save obj pointer across call
2866     movl    rIBASE,OUT_ARG0(%esp)               # pass in method->clazz
2867     call    dvmResolveInstField                 #  ... to dvmResolveInstField
2868     UNSPILL_TMP1(%ecx)
2869     testl   %eax,%eax                           #  returns InstrField ptr
2870     jne     .LOP_IGET_SHORT_finish
2871     jmp     common_exceptionThrown
2872
2873 .LOP_IGET_SHORT_finish:
2874     /*
2875      * Currently:
2876      *   eax holds resolved field
2877      *   ecx holds object
2878      *   rINST holds A
2879      */
2880     movl    offInstField_byteOffset(%eax),%eax  # eax<- byte offset of field
2881     testl   %ecx,%ecx                           # object null?
2882     je      common_errNullObject                # object was null
2883     movswl   (%ecx,%eax,1),%ecx                  # ecx<- obj.field (8/16/32 bits)
2884     FETCH_INST_OPCODE 2 %eax
2885     UNSPILL(rIBASE)
2886     SET_VREG %ecx rINST
2887     ADVANCE_PC 2
2888     GOTO_NEXT_R %eax
2889
2890
2891 /* ------------------------------ */
2892 .L_OP_IPUT: /* 0x59 */
2893 /* File: x86/OP_IPUT.S */
2894
2895     /*
2896      * General 32-bit instance field put.
2897      *
2898      * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2899      */
2900     /* op vA, vB, field@CCCC */
2901     movl    rSELF,%ecx
2902     SPILL   (rIBASE)
2903     movzwl  2(rPC),rIBASE                       # rIBASE<- 0000CCCC
2904     movl    offThread_methodClassDex(%ecx),%eax # eax<- DvmDex
2905     movzbl  rINSTbl,%ecx                        # ecx<- BA
2906     sarl    $4,%ecx                            # ecx<- B
2907     movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
2908     andb    $0xf,rINSTbl                       # rINST<- A
2909     GET_VREG_R %ecx %ecx                        # ecx<- fp[B], the object ptr
2910     movl    (%eax,rIBASE,4),%eax                # resolved entry
2911     testl   %eax,%eax                           # is resolved entry null?
2912     jne     .LOP_IPUT_finish                  # no, already resolved
2913     movl    rIBASE,OUT_ARG1(%esp)
2914     movl    rSELF,rIBASE
2915     EXPORT_PC
2916     movl    offThread_method(rIBASE),rIBASE     # rIBASE<- current method
2917     movl    offMethod_clazz(rIBASE),rIBASE      # rIBASE<- method->clazz
2918     SPILL_TMP1(%ecx)                            # save obj pointer across call
2919     movl    rIBASE,OUT_ARG0(%esp)               # pass in method->clazz
2920     call    dvmResolveInstField                 #  ... to dvmResolveInstField
2921     UNSPILL_TMP1(%ecx)
2922     testl   %eax,%eax                           # returns InstrField ptr
2923     jne     .LOP_IPUT_finish
2924     jmp     common_exceptionThrown
2925
2926 .LOP_IPUT_finish:
2927     /*
2928      * Currently:
2929      *   eax holds resolved field
2930      *   ecx holds object
2931      *   rINST holds A
2932      */
2933     GET_VREG_R rINST rINST                       # rINST<- v[A]
2934     movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
2935     testl   %ecx,%ecx                            # object null?
2936     je      common_errNullObject                 # object was null
2937     movl   rINST,(%ecx,%eax,1)            # obj.field <- v[A](8/16/32 bits)
2938     FETCH_INST_OPCODE 2 %ecx
2939     UNSPILL(rIBASE)
2940     ADVANCE_PC 2
2941     GOTO_NEXT_R %ecx
2942
2943 /* ------------------------------ */
2944 .L_OP_IPUT_WIDE: /* 0x5a */
2945 /* File: x86/OP_IPUT_WIDE.S */
2946     /*
2947      * 64-bit instance field put.
2948      *
2949      */
2950     /* op vA, vB, field@CCCC */
2951     movl    rSELF,%ecx
2952     SPILL(rIBASE)
2953     movzwl  2(rPC),rIBASE                       # rIBASE<- 0000CCCC
2954     movl    offThread_methodClassDex(%ecx),%eax # eax<- DvmDex
2955     movzbl  rINSTbl,%ecx                        # ecx<- BA
2956     sarl    $4,%ecx                            # ecx<- B
2957     movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
2958     andb    $0xf,rINSTbl                       # rINST<- A
2959     GET_VREG_R %ecx %ecx                        # ecx<- fp[B], the object ptr
2960     movl    (%eax,rIBASE,4),%eax                # resolved entry
2961     testl   %eax,%eax                           # is resolved entry null?
2962     jne     .LOP_IPUT_WIDE_finish                  # no, already resolved
2963     movl    rIBASE,OUT_ARG1(%esp)
2964     movl    rSELF,rIBASE
2965     EXPORT_PC
2966     movl    offThread_method(rIBASE),rIBASE     # rIBASE<- current method
2967     movl    offMethod_clazz(rIBASE),rIBASE      # rIBASE<- method->clazz
2968     SPILL_TMP1(%ecx)                            # save obj pointer across call
2969     movl    rIBASE,OUT_ARG0(%esp)               # pass in method->clazz
2970     call    dvmResolveInstField                 #  ... to dvmResolveInstField
2971     UNSPILL_TMP1(%ecx)
2972     testl   %eax,%eax                           #  ... which returns InstrField ptr
2973     jne     .LOP_IPUT_WIDE_finish
2974     jmp     common_exceptionThrown
2975
2976 .LOP_IPUT_WIDE_finish:
2977     /*
2978      * Currently:
2979      *   eax holds resolved field
2980      *   ecx holds object
2981      *   rIBASE is scratch, but needs to be unspilled
2982      *   rINST holds A
2983      */
2984     movl    offInstField_byteOffset(%eax),%eax  # eax<- byte offset of field
2985     testl   %ecx,%ecx                           # object null?
2986     je      common_errNullObject                # object was null
2987     leal    (%ecx,%eax,1),%eax                  # eax<- address of field
2988     GET_VREG_WORD %ecx rINST 0                  # ecx<- lsw
2989     GET_VREG_WORD rINST rINST 1                 # rINST<- msw
2990     movl    rINST,4(%eax)
2991     movl    %ecx,(%eax)
2992     FETCH_INST_OPCODE 2 %ecx
2993     UNSPILL(rIBASE)
2994     ADVANCE_PC 2
2995     GOTO_NEXT_R %ecx
2996
2997 /* ------------------------------ */
2998 .L_OP_IPUT_OBJECT: /* 0x5b */
2999 /* File: x86/OP_IPUT_OBJECT.S */
3000     /*
3001      * Object field put.
3002      *
3003      * for: iput-object
3004      */
3005     /* op vA, vB, field@CCCC */
3006     movl    rSELF,%ecx
3007     SPILL(rIBASE)
3008     movzwl  2(rPC),rIBASE                       # rIBASE<- 0000CCCC
3009     movl    offThread_methodClassDex(%ecx),%eax # eax<- DvmDex
3010     movzbl  rINSTbl,%ecx                        # ecx<- BA
3011     sarl    $4,%ecx                            # ecx<- B
3012     movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
3013     andb    $0xf,rINSTbl                       # rINST<- A
3014     GET_VREG_R %ecx %ecx                        # ecx<- fp[B], the object ptr
3015     movl    (%eax,rIBASE,4),%eax                  # resolved entry
3016     testl   %eax,%eax                           # is resolved entry null?
3017     jne     .LOP_IPUT_OBJECT_finish                  # no, already resolved
3018     movl    rIBASE,OUT_ARG1(%esp)
3019     movl    rSELF,rIBASE
3020     EXPORT_PC
3021     movl    offThread_method(rIBASE),rIBASE     # rIBASE<- current method
3022     movl    offMethod_clazz(rIBASE),rIBASE      # rIBASE<- method->clazz
3023     SPILL_TMP1(%ecx)                            # save obj pointer across call
3024     movl    rIBASE,OUT_ARG0(%esp)               # pass in method->clazz
3025     call    dvmResolveInstField                 #  ... to dvmResolveInstField
3026     UNSPILL_TMP1(%ecx)
3027     testl   %eax,%eax                           # returns InstrField ptr
3028     jne     .LOP_IPUT_OBJECT_finish
3029     jmp     common_exceptionThrown
3030
3031 .LOP_IPUT_OBJECT_finish:
3032     /*
3033      * Currently:
3034      *   eax holds resolved field
3035      *   ecx holds object
3036      *   rIBASE is scratch, but needs to be unspilled
3037      *   rINST holds A
3038      */
3039     GET_VREG_R rINST rINST                      # rINST<- v[A]
3040     movl    offInstField_byteOffset(%eax),%eax  # eax<- byte offset of field
3041     testl   %ecx,%ecx                           # object null?
3042     je      common_errNullObject                # object was null
3043     movl    rINST,(%ecx,%eax)      # obj.field <- v[A](8/16/32 bits)
3044     movl    rSELF,%eax
3045     testl   rINST,rINST                         # stored a NULL?
3046     movl    offThread_cardTable(%eax),%eax      # get card table base
3047     je      1f                                  # skip card mark if null store
3048     shrl    $GC_CARD_SHIFT,%ecx                # object head to card number
3049     movb    %al,(%eax,%ecx)                     # mark card using object head
3050 1:
3051     UNSPILL(rIBASE)
3052     FETCH_INST_OPCODE 2 %ecx
3053     ADVANCE_PC 2
3054     GOTO_NEXT_R %ecx
3055
3056 /* ------------------------------ */
3057 .L_OP_IPUT_BOOLEAN: /* 0x5c */
3058 /* File: x86/OP_IPUT_BOOLEAN.S */
3059 /* File: x86/OP_IPUT.S */
3060
3061     /*
3062      * General 32-bit instance field put.
3063      *
3064      * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
3065      */
3066     /* op vA, vB, field@CCCC */
3067     movl    rSELF,%ecx
3068     SPILL   (rIBASE)
3069     movzwl  2(rPC),rIBASE                       # rIBASE<- 0000CCCC
3070     movl    offThread_methodClassDex(%ecx),%eax # eax<- DvmDex
3071     movzbl  rINSTbl,%ecx                        # ecx<- BA
3072     sarl    $4,%ecx                            # ecx<- B
3073     movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
3074     andb    $0xf,rINSTbl                       # rINST<- A
3075     GET_VREG_R %ecx %ecx                        # ecx<- fp[B], the object ptr
3076     movl    (%eax,rIBASE,4),%eax                # resolved entry
3077     testl   %eax,%eax                           # is resolved entry null?
3078     jne     .LOP_IPUT_BOOLEAN_finish                  # no, already resolved
3079     movl    rIBASE,OUT_ARG1(%esp)
3080     movl    rSELF,rIBASE
3081     EXPORT_PC
3082     movl    offThread_method(rIBASE),rIBASE     # rIBASE<- current method
3083     movl    offMethod_clazz(rIBASE),rIBASE      # rIBASE<- method->clazz
3084     SPILL_TMP1(%ecx)                            # save obj pointer across call
3085     movl    rIBASE,OUT_ARG0(%esp)               # pass in method->clazz
3086     call    dvmResolveInstField                 #  ... to dvmResolveInstField
3087     UNSPILL_TMP1(%ecx)
3088     testl   %eax,%eax                           # returns InstrField ptr
3089     jne     .LOP_IPUT_BOOLEAN_finish
3090     jmp     common_exceptionThrown
3091
3092 .LOP_IPUT_BOOLEAN_finish:
3093     /*
3094      * Currently:
3095      *   eax holds resolved field
3096      *   ecx holds object
3097      *   rINST holds A
3098      */
3099     GET_VREG_R rINST rINST                       # rINST<- v[A]
3100     movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
3101     testl   %ecx,%ecx                            # object null?
3102     je      common_errNullObject                 # object was null
3103     movb   rINSTbl,(%ecx,%eax,1)            # obj.field <- v[A](8/16/32 bits)
3104     FETCH_INST_OPCODE 2 %ecx
3105     UNSPILL(rIBASE)
3106     ADVANCE_PC 2
3107     GOTO_NEXT_R %ecx
3108
3109
3110 /* ------------------------------ */
3111 .L_OP_IPUT_BYTE: /* 0x5d */
3112 /* File: x86/OP_IPUT_BYTE.S */
3113 /* File: x86/OP_IPUT.S */
3114
3115     /*
3116      * General 32-bit instance field put.
3117      *
3118      * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
3119      */
3120     /* op vA, vB, field@CCCC */
3121     movl    rSELF,%ecx
3122     SPILL   (rIBASE)
3123     movzwl  2(rPC),rIBASE                       # rIBASE<- 0000CCCC
3124     movl    offThread_methodClassDex(%ecx),%eax # eax<- DvmDex
3125     movzbl  rINSTbl,%ecx                        # ecx<- BA
3126     sarl    $4,%ecx                            # ecx<- B
3127     movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
3128     andb    $0xf,rINSTbl                       # rINST<- A
3129     GET_VREG_R %ecx %ecx                        # ecx<- fp[B], the object ptr
3130     movl    (%eax,rIBASE,4),%eax                # resolved entry
3131     testl   %eax,%eax                           # is resolved entry null?
3132     jne     .LOP_IPUT_BYTE_finish                  # no, already resolved
3133     movl    rIBASE,OUT_ARG1(%esp)
3134     movl    rSELF,rIBASE
3135     EXPORT_PC
3136     movl    offThread_method(rIBASE),rIBASE     # rIBASE<- current method
3137     movl    offMethod_clazz(rIBASE),rIBASE      # rIBASE<- method->clazz
3138     SPILL_TMP1(%ecx)                            # save obj pointer across call
3139     movl    rIBASE,OUT_ARG0(%esp)               # pass in method->clazz
3140     call    dvmResolveInstField                 #  ... to dvmResolveInstField
3141     UNSPILL_TMP1(%ecx)
3142     testl   %eax,%eax                           # returns InstrField ptr
3143     jne     .LOP_IPUT_BYTE_finish
3144     jmp     common_exceptionThrown
3145
3146 .LOP_IPUT_BYTE_finish:
3147     /*
3148      * Currently:
3149      *   eax holds resolved field
3150      *   ecx holds object
3151      *   rINST holds A
3152      */
3153     GET_VREG_R rINST rINST                       # rINST<- v[A]
3154     movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
3155     testl   %ecx,%ecx                            # object null?
3156     je      common_errNullObject                 # object was null
3157     movb   rINSTbl,(%ecx,%eax,1)            # obj.field <- v[A](8/16/32 bits)
3158     FETCH_INST_OPCODE 2 %ecx
3159     UNSPILL(rIBASE)
3160     ADVANCE_PC 2
3161     GOTO_NEXT_R %ecx
3162
3163
3164 /* ------------------------------ */
3165 .L_OP_IPUT_CHAR: /* 0x5e */
3166 /* File: x86/OP_IPUT_CHAR.S */
3167 /* File: x86/OP_IPUT.S */
3168
3169     /*
3170      * General 32-bit instance field put.
3171      *
3172      * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
3173      */
3174     /* op vA, vB, field@CCCC */
3175     movl    rSELF,%ecx
3176     SPILL   (rIBASE)
3177     movzwl  2(rPC),rIBASE                       # rIBASE<- 0000CCCC
3178     movl    offThread_methodClassDex(%ecx),%eax # eax<- DvmDex
3179     movzbl  rINSTbl,%ecx                        # ecx<- BA
3180     sarl    $4,%ecx                            # ecx<- B
3181     movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
3182     andb    $0xf,rINSTbl                       # rINST<- A
3183     GET_VREG_R %ecx %ecx                        # ecx<- fp[B], the object ptr
3184     movl    (%eax,rIBASE,4),%eax                # resolved entry
3185     testl   %eax,%eax                           # is resolved entry null?
3186     jne     .LOP_IPUT_CHAR_finish                  # no, already resolved
3187     movl    rIBASE,OUT_ARG1(%esp)
3188     movl    rSELF,rIBASE
3189     EXPORT_PC
3190     movl    offThread_method(rIBASE),rIBASE     # rIBASE<- current method
3191     movl    offMethod_clazz(rIBASE),rIBASE      # rIBASE<- method->clazz
3192     SPILL_TMP1(%ecx)                            # save obj pointer across call
3193     movl    rIBASE,OUT_ARG0(%esp)               # pass in method->clazz
3194     call    dvmResolveInstField                 #  ... to dvmResolveInstField
3195     UNSPILL_TMP1(%ecx)
3196     testl   %eax,%eax                           # returns InstrField ptr
3197     jne     .LOP_IPUT_CHAR_finish
3198     jmp     common_exceptionThrown
3199
3200 .LOP_IPUT_CHAR_finish:
3201     /*
3202      * Currently:
3203      *   eax holds resolved field
3204      *   ecx holds object
3205      *   rINST holds A
3206      */
3207     GET_VREG_R rINST rINST                       # rINST<- v[A]
3208     movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
3209     testl   %ecx,%ecx                            # object null?
3210     je      common_errNullObject                 # object was null
3211     movw   rINSTw,(%ecx,%eax,1)            # obj.field <- v[A](8/16/32 bits)
3212     FETCH_INST_OPCODE 2 %ecx
3213     UNSPILL(rIBASE)
3214     ADVANCE_PC 2
3215     GOTO_NEXT_R %ecx
3216
3217
3218 /* ------------------------------ */
3219 .L_OP_IPUT_SHORT: /* 0x5f */
3220 /* File: x86/OP_IPUT_SHORT.S */
3221 /* File: x86/OP_IPUT.S */
3222
3223     /*
3224      * General 32-bit instance field put.
3225      *
3226      * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
3227      */
3228     /* op vA, vB, field@CCCC */
3229     movl    rSELF,%ecx
3230     SPILL   (rIBASE)
3231     movzwl  2(rPC),rIBASE                       # rIBASE<- 0000CCCC
3232     movl    offThread_methodClassDex(%ecx),%eax # eax<- DvmDex
3233     movzbl  rINSTbl,%ecx                        # ecx<- BA
3234     sarl    $4,%ecx                            # ecx<- B
3235     movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
3236     andb    $0xf,rINSTbl                       # rINST<- A
3237     GET_VREG_R %ecx %ecx                        # ecx<- fp[B], the object ptr
3238     movl    (%eax,rIBASE,4),%eax                # resolved entry
3239     testl   %eax,%eax                           # is resolved entry null?
3240     jne     .LOP_IPUT_SHORT_finish                  # no, already resolved
3241     movl    rIBASE,OUT_ARG1(%esp)
3242     movl    rSELF,rIBASE
3243     EXPORT_PC
3244     movl    offThread_method(rIBASE),rIBASE     # rIBASE<- current method
3245     movl    offMethod_clazz(rIBASE),rIBASE      # rIBASE<- method->clazz
3246     SPILL_TMP1(%ecx)                            # save obj pointer across call
3247     movl    rIBASE,OUT_ARG0(%esp)               # pass in method->clazz
3248     call    dvmResolveInstField                 #  ... to dvmResolveInstField
3249     UNSPILL_TMP1(%ecx)
3250     testl   %eax,%eax                           # returns InstrField ptr
3251     jne     .LOP_IPUT_SHORT_finish
3252     jmp     common_exceptionThrown
3253
3254 .LOP_IPUT_SHORT_finish:
3255     /*
3256      * Currently:
3257      *   eax holds resolved field
3258      *   ecx holds object
3259      *   rINST holds A
3260      */
3261     GET_VREG_R rINST rINST                       # rINST<- v[A]
3262     movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
3263     testl   %ecx,%ecx                            # object null?
3264     je      common_errNullObject                 # object was null
3265     movw   rINSTw,(%ecx,%eax,1)            # obj.field <- v[A](8/16/32 bits)
3266     FETCH_INST_OPCODE 2 %ecx
3267     UNSPILL(rIBASE)
3268     ADVANCE_PC 2
3269     GOTO_NEXT_R %ecx
3270
3271
3272 /* ------------------------------ */
3273 .L_OP_SGET: /* 0x60 */
3274 /* File: x86/OP_SGET.S */
3275     /*
3276      * General 32-bit SGET handler.
3277      *
3278      * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3279      */
3280     /* op vAA, field@BBBB */
3281     movl      rSELF,%ecx
3282     movzwl    2(rPC),%eax                        # eax<- field ref BBBB
3283     movl      offThread_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
3284     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
3285     movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
3286     testl     %eax,%eax                          # resolved entry null?
3287     je        .LOP_SGET_resolve                # if not, make it so
3288 .LOP_SGET_finish:     # field ptr in eax
3289     movl      offStaticField_value(%eax),%eax
3290     FETCH_INST_OPCODE 2 %ecx
3291     ADVANCE_PC 2
3292     SET_VREG %eax rINST
3293     GOTO_NEXT_R %ecx
3294
3295     /*
3296      * Go resolve the field
3297      */
3298 .LOP_SGET_resolve:
3299     movl     rSELF,%ecx
3300     movzwl   2(rPC),%eax                        # eax<- field ref BBBB
3301     movl     offThread_method(%ecx),%ecx          # ecx<- current method
3302     EXPORT_PC                                   # could throw, need to export
3303     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
3304     movl     %eax,OUT_ARG1(%esp)
3305     movl     %ecx,OUT_ARG0(%esp)
3306     SPILL(rIBASE)
3307     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
3308     UNSPILL(rIBASE)
3309     testl    %eax,%eax
3310     jne      .LOP_SGET_finish                 # success, continue
3311     jmp      common_exceptionThrown             # no, handle exception
3312
3313 /* ------------------------------ */
3314 .L_OP_SGET_WIDE: /* 0x61 */
3315 /* File: x86/OP_SGET_WIDE.S */
3316     /*
3317      * 64-bit SGET handler.
3318      *
3319      */
3320     /* sget-wide vAA, field@BBBB */
3321     movl      rSELF,%ecx
3322     movzwl    2(rPC),%eax                        # eax<- field ref BBBB
3323     movl      offThread_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
3324     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
3325     movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
3326     testl     %eax,%eax                          # resolved entry null?
3327     je        .LOP_SGET_WIDE_resolve                # if not, make it so
3328 .LOP_SGET_WIDE_finish:     # field ptr in eax
3329     movl      offStaticField_value(%eax),%ecx    # ecx<- lsw
3330     movl      4+offStaticField_value(%eax),%eax  # eax<- msw
3331     SET_VREG_WORD %ecx rINST 0
3332     FETCH_INST_OPCODE 2 %ecx
3333     SET_VREG_WORD %eax rINST 1
3334     ADVANCE_PC 2
3335     GOTO_NEXT_R %ecx
3336
3337     /*
3338      * Go resolve the field
3339      */
3340 .LOP_SGET_WIDE_resolve:
3341     movl     rSELF,%ecx
3342     movzwl   2(rPC),%eax                        # eax<- field ref BBBB
3343     movl     offThread_method(%ecx),%ecx          # ecx<- current method
3344     EXPORT_PC                                   # could throw, need to export
3345     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
3346     movl     %eax,OUT_ARG1(%esp)
3347     movl     %ecx,OUT_ARG0(%esp)
3348     SPILL(rIBASE)
3349     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
3350     UNSPILL(rIBASE)
3351     testl    %eax,%eax
3352     jne      .LOP_SGET_WIDE_finish                 # success, continue
3353     jmp      common_exceptionThrown             # no, handle exception
3354
3355 /* ------------------------------ */
3356 .L_OP_SGET_OBJECT: /* 0x62 */
3357 /* File: x86/OP_SGET_OBJECT.S */
3358 /* File: x86/OP_SGET.S */
3359     /*
3360      * General 32-bit SGET handler.
3361      *
3362      * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3363      */
3364     /* op vAA, field@BBBB */
3365     movl      rSELF,%ecx
3366     movzwl    2(rPC),%eax                        # eax<- field ref BBBB
3367     movl      offThread_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
3368     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
3369     movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
3370     testl     %eax,%eax                          # resolved entry null?
3371     je        .LOP_SGET_OBJECT_resolve                # if not, make it so
3372 .LOP_SGET_OBJECT_finish:     # field ptr in eax
3373     movl      offStaticField_value(%eax),%eax
3374     FETCH_INST_OPCODE 2 %ecx
3375     ADVANCE_PC 2
3376     SET_VREG %eax rINST
3377     GOTO_NEXT_R %ecx
3378
3379     /*
3380      * Go resolve the field
3381      */
3382 .LOP_SGET_OBJECT_resolve:
3383     movl     rSELF,%ecx
3384     movzwl   2(rPC),%eax                        # eax<- field ref BBBB
3385     movl     offThread_method(%ecx),%ecx          # ecx<- current method
3386     EXPORT_PC                                   # could throw, need to export
3387     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
3388     movl     %eax,OUT_ARG1(%esp)
3389     movl     %ecx,OUT_ARG0(%esp)
3390     SPILL(rIBASE)
3391     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
3392     UNSPILL(rIBASE)
3393     testl    %eax,%eax
3394     jne      .LOP_SGET_OBJECT_finish                 # success, continue
3395     jmp      common_exceptionThrown             # no, handle exception
3396
3397
3398 /* ------------------------------ */
3399 .L_OP_SGET_BOOLEAN: /* 0x63 */
3400 /* File: x86/OP_SGET_BOOLEAN.S */
3401 /* File: x86/OP_SGET.S */
3402     /*
3403      * General 32-bit SGET handler.
3404      *
3405      * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3406      */
3407     /* op vAA, field@BBBB */
3408     movl      rSELF,%ecx
3409     movzwl    2(rPC),%eax                        # eax<- field ref BBBB
3410     movl      offThread_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
3411     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
3412     movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
3413     testl     %eax,%eax                          # resolved entry null?
3414     je        .LOP_SGET_BOOLEAN_resolve                # if not, make it so
3415 .LOP_SGET_BOOLEAN_finish:     # field ptr in eax
3416     movl      offStaticField_value(%eax),%eax
3417     FETCH_INST_OPCODE 2 %ecx
3418     ADVANCE_PC 2
3419     SET_VREG %eax rINST
3420     GOTO_NEXT_R %ecx
3421
3422     /*
3423      * Go resolve the field
3424      */
3425 .LOP_SGET_BOOLEAN_resolve:
3426     movl     rSELF,%ecx
3427     movzwl   2(rPC),%eax                        # eax<- field ref BBBB
3428     movl     offThread_method(%ecx),%ecx          # ecx<- current method
3429     EXPORT_PC                                   # could throw, need to export
3430     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
3431     movl     %eax,OUT_ARG1(%esp)
3432     movl     %ecx,OUT_ARG0(%esp)
3433     SPILL(rIBASE)
3434     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
3435     UNSPILL(rIBASE)
3436     testl    %eax,%eax
3437     jne      .LOP_SGET_BOOLEAN_finish                 # success, continue
3438     jmp      common_exceptionThrown             # no, handle exception
3439
3440
3441 /* ------------------------------ */
3442 .L_OP_SGET_BYTE: /* 0x64 */
3443 /* File: x86/OP_SGET_BYTE.S */
3444 /* File: x86/OP_SGET.S */
3445     /*
3446      * General 32-bit SGET handler.
3447      *
3448      * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3449      */
3450     /* op vAA, field@BBBB */
3451     movl      rSELF,%ecx
3452     movzwl    2(rPC),%eax                        # eax<- field ref BBBB
3453     movl      offThread_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
3454     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
3455     movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
3456     testl     %eax,%eax                          # resolved entry null?
3457     je        .LOP_SGET_BYTE_resolve                # if not, make it so
3458 .LOP_SGET_BYTE_finish:     # field ptr in eax
3459     movl      offStaticField_value(%eax),%eax
3460     FETCH_INST_OPCODE 2 %ecx
3461     ADVANCE_PC 2
3462     SET_VREG %eax rINST
3463     GOTO_NEXT_R %ecx
3464
3465     /*
3466      * Go resolve the field
3467      */
3468 .LOP_SGET_BYTE_resolve:
3469     movl     rSELF,%ecx
3470     movzwl   2(rPC),%eax                        # eax<- field ref BBBB
3471     movl     offThread_method(%ecx),%ecx          # ecx<- current method
3472     EXPORT_PC                                   # could throw, need to export
3473     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
3474     movl     %eax,OUT_ARG1(%esp)
3475     movl     %ecx,OUT_ARG0(%esp)
3476     SPILL(rIBASE)
3477     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
3478     UNSPILL(rIBASE)
3479     testl    %eax,%eax
3480     jne      .LOP_SGET_BYTE_finish                 # success, continue
3481     jmp      common_exceptionThrown             # no, handle exception
3482
3483
3484 /* ------------------------------ */
3485 .L_OP_SGET_CHAR: /* 0x65 */
3486 /* File: x86/OP_SGET_CHAR.S */
3487 /* File: x86/OP_SGET.S */
3488     /*
3489      * General 32-bit SGET handler.
3490      *
3491      * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3492      */
3493     /* op vAA, field@BBBB */
3494     movl      rSELF,%ecx
3495     movzwl    2(rPC),%eax                        # eax<- field ref BBBB
3496     movl      offThread_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
3497     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
3498     movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
3499     testl     %eax,%eax                          # resolved entry null?
3500     je        .LOP_SGET_CHAR_resolve                # if not, make it so
3501 .LOP_SGET_CHAR_finish:     # field ptr in eax
3502     movl      offStaticField_value(%eax),%eax
3503     FETCH_INST_OPCODE 2 %ecx
3504     ADVANCE_PC 2
3505     SET_VREG %eax rINST
3506     GOTO_NEXT_R %ecx
3507
3508     /*
3509      * Go resolve the field
3510      */
3511 .LOP_SGET_CHAR_resolve:
3512     movl     rSELF,%ecx
3513     movzwl   2(rPC),%eax                        # eax<- field ref BBBB
3514     movl     offThread_method(%ecx),%ecx          # ecx<- current method
3515     EXPORT_PC                                   # could throw, need to export
3516     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
3517     movl     %eax,OUT_ARG1(%esp)
3518     movl     %ecx,OUT_ARG0(%esp)
3519     SPILL(rIBASE)
3520     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
3521     UNSPILL(rIBASE)
3522     testl    %eax,%eax
3523     jne      .LOP_SGET_CHAR_finish                 # success, continue
3524     jmp      common_exceptionThrown             # no, handle exception
3525
3526
3527 /* ------------------------------ */
3528 .L_OP_SGET_SHORT: /* 0x66 */
3529 /* File: x86/OP_SGET_SHORT.S */
3530 /* File: x86/OP_SGET.S */
3531     /*
3532      * General 32-bit SGET handler.
3533      *
3534      * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3535      */
3536     /* op vAA, field@BBBB */
3537     movl      rSELF,%ecx
3538     movzwl    2(rPC),%eax                        # eax<- field ref BBBB
3539     movl      offThread_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
3540     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
3541     movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
3542     testl     %eax,%eax                          # resolved entry null?
3543     je        .LOP_SGET_SHORT_resolve                # if not, make it so
3544 .LOP_SGET_SHORT_finish:     # field ptr in eax
3545     movl      offStaticField_value(%eax),%eax
3546     FETCH_INST_OPCODE 2 %ecx
3547     ADVANCE_PC 2
3548     SET_VREG %eax rINST
3549     GOTO_NEXT_R %ecx
3550
3551     /*
3552      * Go resolve the field
3553      */
3554 .LOP_SGET_SHORT_resolve:
3555     movl     rSELF,%ecx
3556     movzwl   2(rPC),%eax                        # eax<- field ref BBBB
3557     movl     offThread_method(%ecx),%ecx          # ecx<- current method
3558     EXPORT_PC                                   # could throw, need to export
3559     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
3560     movl     %eax,OUT_ARG1(%esp)
3561     movl     %ecx,OUT_ARG0(%esp)
3562     SPILL(rIBASE)
3563     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
3564     UNSPILL(rIBASE)
3565     testl    %eax,%eax
3566     jne      .LOP_SGET_SHORT_finish                 # success, continue
3567     jmp      common_exceptionThrown             # no, handle exception
3568
3569
3570 /* ------------------------------ */
3571 .L_OP_SPUT: /* 0x67 */
3572 /* File: x86/OP_SPUT.S */
3573     /*
3574      * General 32-bit SPUT handler.
3575      *
3576      * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3577      */
3578     /* op vAA, field@BBBB */
3579     movl      rSELF,%ecx
3580     movzwl    2(rPC),%eax                        # eax<- field ref BBBB
3581     movl      offThread_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
3582     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
3583     movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
3584     testl     %eax,%eax                          # resolved entry null?
3585     je        .LOP_SPUT_resolve                # if not, make it so
3586 .LOP_SPUT_finish:     # field ptr in eax
3587     GET_VREG_R  rINST rINST
3588     FETCH_INST_OPCODE 2 %ecx
3589     ADVANCE_PC 2
3590     movl      rINST,offStaticField_value(%eax)
3591     GOTO_NEXT_R %ecx
3592
3593     /*
3594      * Go resolve the field
3595      */
3596 .LOP_SPUT_resolve:
3597     movl     rSELF,%ecx
3598     movzwl   2(rPC),%eax                        # eax<- field ref BBBB
3599     movl     offThread_method(%ecx),%ecx          # ecx<- current method
3600     EXPORT_PC                                   # could throw, need to export
3601     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
3602     movl     %eax,OUT_ARG1(%esp)
3603     movl     %ecx,OUT_ARG0(%esp)
3604     SPILL(rIBASE)
3605     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
3606     UNSPILL(rIBASE)
3607     testl    %eax,%eax
3608     jne      .LOP_SPUT_finish                 # success, continue
3609     jmp      common_exceptionThrown             # no, handle exception
3610
3611 /* ------------------------------ */
3612 .L_OP_SPUT_WIDE: /* 0x68 */
3613 /* File: x86/OP_SPUT_WIDE.S */
3614     /*
3615      * General 32-bit SPUT handler.
3616      *
3617      * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
3618      */
3619     /* op vAA, field@BBBB */
3620     movl      rSELF,%ecx
3621     movzwl    2(rPC),%eax                        # eax<- field ref BBBB
3622     movl      offThread_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
3623     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
3624     movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
3625     testl     %eax,%eax                          # resolved entry null?
3626     je        .LOP_SPUT_WIDE_resolve                # if not, make it so
3627 .LOP_SPUT_WIDE_finish:     # field ptr in eax
3628     GET_VREG_WORD %ecx rINST 0                  # rINST<- lsw
3629     GET_VREG_WORD rINST rINST 1                 # ecx<- msw
3630     movl      %ecx,offStaticField_value(%eax)
3631     FETCH_INST_OPCODE 2 %ecx
3632     movl      rINST,4+offStaticField_value(%eax)
3633     ADVANCE_PC 2
3634     GOTO_NEXT_R %ecx
3635
3636     /*
3637      * Go resolve the field
3638      */
3639 .LOP_SPUT_WIDE_resolve:
3640     movl     rSELF,%ecx
3641     movzwl   2(rPC),%eax                        # eax<- field ref BBBB
3642     movl     offThread_method(%ecx),%ecx          # ecx<- current method
3643     EXPORT_PC                                   # could throw, need to export
3644     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
3645     movl     %eax,OUT_ARG1(%esp)
3646     movl     %ecx,OUT_ARG0(%esp)
3647     SPILL(rIBASE)
3648     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
3649     UNSPILL(rIBASE)
3650     testl    %eax,%eax
3651     jne      .LOP_SPUT_WIDE_finish                 # success, continue
3652     jmp      common_exceptionThrown             # no, handle exception
3653
3654 /* ------------------------------ */
3655 .L_OP_SPUT_OBJECT: /* 0x69 */
3656 /* File: x86/OP_SPUT_OBJECT.S */
3657     /*
3658      * SPUT object handler.
3659      */
3660     /* op vAA, field@BBBB */
3661     movl      rSELF,%ecx
3662     movzwl    2(rPC),%eax                        # eax<- field ref BBBB
3663     movl      offThread_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
3664     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
3665     movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField
3666     testl     %eax,%eax                          # resolved entry null?
3667     je        .LOP_SPUT_OBJECT_resolve                # if not, make it so
3668 .LOP_SPUT_OBJECT_finish:                              # field ptr in eax
3669     movzbl    rINSTbl,%ecx                       # ecx<- AA
3670     GET_VREG_R  %ecx %ecx
3671     movl      %ecx,offStaticField_value(%eax)    # do the store
3672     testl     %ecx,%ecx                          # stored null object ptr?
3673     je        1f                                 # skip card mark if null
3674     movl      rSELF,%ecx
3675     movl      offField_clazz(%eax),%eax          # eax<- method->clazz
3676     movl      offThread_cardTable(%ecx),%ecx       # get card table base
3677     shrl      $GC_CARD_SHIFT,%eax               # head to card number
3678     movb      %cl,(%ecx,%eax)                    # mark card
3679 1:
3680     FETCH_INST_OPCODE 2 %ecx
3681     ADVANCE_PC 2
3682     GOTO_NEXT_R %ecx
3683
3684 .LOP_SPUT_OBJECT_resolve:
3685     movl     rSELF,%ecx
3686     movzwl   2(rPC),%eax                        # eax<- field ref BBBB
3687     movl     offThread_method(%ecx),%ecx          # ecx<- current method
3688     EXPORT_PC                                   # could throw, need to export
3689     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
3690     movl     %eax,OUT_ARG1(%esp)
3691     movl     %ecx,OUT_ARG0(%esp)
3692     SPILL(rIBASE)
3693     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
3694     UNSPILL(rIBASE)
3695     testl    %eax,%eax
3696     jne      .LOP_SPUT_OBJECT_finish                 # success, continue
3697     jmp      common_exceptionThrown             # no, handle exception
3698
3699 /* ------------------------------ */
3700 .L_OP_SPUT_BOOLEAN: /* 0x6a */
3701 /* File: x86/OP_SPUT_BOOLEAN.S */
3702 /* File: x86/OP_SPUT.S */
3703     /*
3704      * General 32-bit SPUT handler.
3705      *
3706      * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3707      */
3708     /* op vAA, field@BBBB */
3709     movl      rSELF,%ecx
3710     movzwl    2(rPC),%eax                        # eax<- field ref BBBB
3711     movl      offThread_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
3712     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
3713     movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
3714     testl     %eax,%eax                          # resolved entry null?
3715     je        .LOP_SPUT_BOOLEAN_resolve                # if not, make it so
3716 .LOP_SPUT_BOOLEAN_finish:     # field ptr in eax
3717     GET_VREG_R  rINST rINST
3718     FETCH_INST_OPCODE 2 %ecx
3719     ADVANCE_PC 2
3720     movl      rINST,offStaticField_value(%eax)
3721     GOTO_NEXT_R %ecx
3722
3723     /*
3724      * Go resolve the field
3725      */
3726 .LOP_SPUT_BOOLEAN_resolve:
3727     movl     rSELF,%ecx
3728     movzwl   2(rPC),%eax                        # eax<- field ref BBBB
3729     movl     offThread_method(%ecx),%ecx          # ecx<- current method
3730     EXPORT_PC                                   # could throw, need to export
3731     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
3732     movl     %eax,OUT_ARG1(%esp)
3733     movl     %ecx,OUT_ARG0(%esp)
3734     SPILL(rIBASE)
3735     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
3736     UNSPILL(rIBASE)
3737     testl    %eax,%eax
3738     jne      .LOP_SPUT_BOOLEAN_finish                 # success, continue
3739     jmp      common_exceptionThrown             # no, handle exception
3740
3741
3742 /* ------------------------------ */
3743 .L_OP_SPUT_BYTE: /* 0x6b */
3744 /* File: x86/OP_SPUT_BYTE.S */
3745 /* File: x86/OP_SPUT.S */
3746     /*
3747      * General 32-bit SPUT handler.
3748      *
3749      * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3750      */
3751     /* op vAA, field@BBBB */
3752     movl      rSELF,%ecx
3753     movzwl    2(rPC),%eax                        # eax<- field ref BBBB
3754     movl      offThread_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
3755     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
3756     movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
3757     testl     %eax,%eax                          # resolved entry null?
3758     je        .LOP_SPUT_BYTE_resolve                # if not, make it so
3759 .LOP_SPUT_BYTE_finish:     # field ptr in eax
3760     GET_VREG_R  rINST rINST
3761     FETCH_INST_OPCODE 2 %ecx
3762     ADVANCE_PC 2
3763     movl      rINST,offStaticField_value(%eax)
3764     GOTO_NEXT_R %ecx
3765
3766     /*
3767      * Go resolve the field
3768      */
3769 .LOP_SPUT_BYTE_resolve:
3770     movl     rSELF,%ecx
3771     movzwl   2(rPC),%eax                        # eax<- field ref BBBB
3772     movl     offThread_method(%ecx),%ecx          # ecx<- current method
3773     EXPORT_PC                                   # could throw, need to export
3774     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
3775     movl     %eax,OUT_ARG1(%esp)
3776     movl     %ecx,OUT_ARG0(%esp)
3777     SPILL(rIBASE)
3778     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
3779     UNSPILL(rIBASE)
3780     testl    %eax,%eax
3781     jne      .LOP_SPUT_BYTE_finish                 # success, continue
3782     jmp      common_exceptionThrown             # no, handle exception
3783
3784
3785 /* ------------------------------ */
3786 .L_OP_SPUT_CHAR: /* 0x6c */
3787 /* File: x86/OP_SPUT_CHAR.S */
3788 /* File: x86/OP_SPUT.S */
3789     /*
3790      * General 32-bit SPUT handler.
3791      *
3792      * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3793      */
3794     /* op vAA, field@BBBB */
3795     movl      rSELF,%ecx
3796     movzwl    2(rPC),%eax                        # eax<- field ref BBBB
3797     movl      offThread_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
3798     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
3799     movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
3800     testl     %eax,%eax                          # resolved entry null?
3801     je        .LOP_SPUT_CHAR_resolve                # if not, make it so
3802 .LOP_SPUT_CHAR_finish:     # field ptr in eax
3803     GET_VREG_R  rINST rINST
3804     FETCH_INST_OPCODE 2 %ecx
3805     ADVANCE_PC 2
3806     movl      rINST,offStaticField_value(%eax)
3807     GOTO_NEXT_R %ecx
3808
3809     /*
3810      * Go resolve the field
3811      */
3812 .LOP_SPUT_CHAR_resolve:
3813     movl     rSELF,%ecx
3814     movzwl   2(rPC),%eax                        # eax<- field ref BBBB
3815     movl     offThread_method(%ecx),%ecx          # ecx<- current method
3816     EXPORT_PC                                   # could throw, need to export
3817     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
3818     movl     %eax,OUT_ARG1(%esp)
3819     movl     %ecx,OUT_ARG0(%esp)
3820     SPILL(rIBASE)
3821     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
3822     UNSPILL(rIBASE)
3823     testl    %eax,%eax
3824     jne      .LOP_SPUT_CHAR_finish                 # success, continue
3825     jmp      common_exceptionThrown             # no, handle exception
3826
3827
3828 /* ------------------------------ */
3829 .L_OP_SPUT_SHORT: /* 0x6d */
3830 /* File: x86/OP_SPUT_SHORT.S */
3831 /* File: x86/OP_SPUT.S */
3832     /*
3833      * General 32-bit SPUT handler.
3834      *
3835      * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3836      */
3837     /* op vAA, field@BBBB */
3838     movl      rSELF,%ecx
3839     movzwl    2(rPC),%eax                        # eax<- field ref BBBB
3840     movl      offThread_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
3841     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
3842     movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
3843     testl     %eax,%eax                          # resolved entry null?
3844     je        .LOP_SPUT_SHORT_resolve                # if not, make it so
3845 .LOP_SPUT_SHORT_finish:     # field ptr in eax
3846     GET_VREG_R  rINST rINST
3847     FETCH_INST_OPCODE 2 %ecx
3848     ADVANCE_PC 2
3849     movl      rINST,offStaticField_value(%eax)
3850     GOTO_NEXT_R %ecx
3851
3852     /*
3853      * Go resolve the field
3854      */
3855 .LOP_SPUT_SHORT_resolve:
3856     movl     rSELF,%ecx
3857     movzwl   2(rPC),%eax                        # eax<- field ref BBBB
3858     movl     offThread_method(%ecx),%ecx          # ecx<- current method
3859     EXPORT_PC                                   # could throw, need to export
3860     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
3861     movl     %eax,OUT_ARG1(%esp)
3862     movl     %ecx,OUT_ARG0(%esp)
3863     SPILL(rIBASE)
3864     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
3865     UNSPILL(rIBASE)
3866     testl    %eax,%eax
3867     jne      .LOP_SPUT_SHORT_finish                 # success, continue
3868     jmp      common_exceptionThrown             # no, handle exception
3869
3870
3871 /* ------------------------------ */
3872 .L_OP_INVOKE_VIRTUAL: /* 0x6e */
3873 /* File: x86/OP_INVOKE_VIRTUAL.S */
3874
3875     /*
3876      * Handle a virtual method call.
3877      *
3878      * for: invoke-virtual, invoke-virtual/range
3879      */
3880     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3881     /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3882     movl      rSELF,%eax
3883     movzwl    2(rPC),%ecx                 # ecx<- BBBB
3884     movl      offThread_methodClassDex(%eax),%eax  # eax<- pDvmDex
3885     EXPORT_PC
3886     movl      offDvmDex_pResMethods(%eax),%eax   # eax<- pDvmDex->pResMethods
3887     movl      (%eax,%ecx,4),%eax          # eax<- resolved baseMethod
3888     testl     %eax,%eax                   # already resolved?
3889     jne       .LOP_INVOKE_VIRTUAL_continue        # yes, continue
3890     movl      rSELF,%eax
3891     movl      %ecx,OUT_ARG1(%esp)         # arg1<- ref
3892     movl      offThread_method(%eax),%eax   # eax<- self->method
3893     movl      offMethod_clazz(%eax),%eax  # ecx<- method->clazz
3894     movl      %eax,OUT_ARG0(%esp)         # arg0<- clazz
3895     movl      $METHOD_VIRTUAL,OUT_ARG2(%esp) # arg2<- flags
3896     call      dvmResolveMethod            # eax<- call(clazz, ref, flags)
3897     testl     %eax,%eax                   # got null?
3898     jne       .LOP_INVOKE_VIRTUAL_continue        # no, continue
3899     jmp       common_exceptionThrown      # yes, handle exception
3900
3901     /* At this point:
3902      *   eax = resolved base method
3903      *   ecx = scratch
3904      */
3905 .LOP_INVOKE_VIRTUAL_continue:
3906     movzwl    4(rPC),%ecx               # ecx<- GFED or CCCC
3907     .if       (!0)
3908     andl      $0xf,%ecx                # ecx<- D (or stays CCCC)
3909     .endif
3910     GET_VREG_R  %ecx %ecx               # ecx<- "this"
3911     movzwl    offMethod_methodIndex(%eax),%eax  # eax<- baseMethod->methodIndex
3912     testl     %ecx,%ecx                 # null this?
3913     je        common_errNullObject      # go if so
3914     movl      offObject_clazz(%ecx),%ecx  # ecx<- thisPtr->clazz
3915     movl      offClassObject_vtable(%ecx),%ecx # ecx<- thisPtr->clazz->vtable
3916     movl      (%ecx,%eax,4),%eax        # eax<- vtable[methodIndex]
3917     jmp       common_invokeMethodNoRange
3918
3919 /* ------------------------------ */
3920 .L_OP_INVOKE_SUPER: /* 0x6f */
3921 /* File: x86/OP_INVOKE_SUPER.S */
3922     /*
3923      * Handle a "super" method call.
3924      *
3925      * for: invoke-super, invoke-super/range
3926      */
3927     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3928     /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3929     movl      rSELF,rINST
3930     movzwl    2(rPC),%eax               # eax<- BBBB
3931     movl      offThread_methodClassDex(rINST),%ecx # ecx<- pDvmDex
3932     EXPORT_PC
3933     movl      offDvmDex_pResMethods(%ecx),%ecx # ecx<- pDvmDex->pResMethods
3934     movl      (%ecx,%eax,4),%ecx        # ecx<- resolved baseMethod
3935     movl      offThread_method(rINST),%eax # eax<- method
3936     movzwl    4(rPC),rINST              # rINST<- GFED or CCCC
3937     .if       (!0)
3938     andl      $0xf,rINST               # rINST<- D (or stays CCCC)
3939     .endif
3940     GET_VREG_R  rINST rINST             # rINST<- "this" ptr
3941     testl     rINST,rINST               # null "this"?
3942     je        common_errNullObject      # yes, throw
3943     movl      offMethod_clazz(%eax),%eax # eax<- method->clazz
3944     testl     %ecx,%ecx                 # already resolved?
3945     je       .LOP_INVOKE_SUPER_resolve
3946     /*
3947      * At this point:
3948      *  ecx = resolved base method [r0]
3949      *  eax = method->clazz [r9]
3950      */
3951 .LOP_INVOKE_SUPER_continue:
3952     movl    offClassObject_super(%eax),%eax   # eax<- method->clazz->super
3953     movzwl  offMethod_methodIndex(%ecx),%ecx  # ecx<- baseMthod->methodIndex
3954     cmpl    offClassObject_vtableCount(%eax),%ecx # compare(methodIndex,vtableCount)
3955     jae     .LOP_INVOKE_SUPER_nsm           # method not present in superclass
3956     movl    offClassObject_vtable(%eax),%eax   # eax<- ...clazz->super->vtable
3957     movl    (%eax,%ecx,4),%eax        # eax<- vtable[methodIndex]
3958     jmp     common_invokeMethodNoRange
3959
3960
3961     /* At this point:
3962      * ecx = null (needs to be resolved base method)
3963      * eax = method->clazz
3964     */
3965 .LOP_INVOKE_SUPER_resolve:
3966     SPILL_TMP1(%eax)                    # method->clazz
3967     movl    %eax,OUT_ARG0(%esp)         # arg0<- method->clazz
3968     movzwl  2(rPC),%ecx                 # ecx<- BBBB
3969     movl    $METHOD_VIRTUAL,OUT_ARG2(%esp)  # arg2<- resolver method type
3970     movl    %ecx,OUT_ARG1(%esp)         # arg1<- ref
3971     call    dvmResolveMethod            # eax<- call(clazz, ref, flags)
3972     testl   %eax,%eax                   # got null?
3973     movl    %eax,%ecx                   # ecx<- resolved base method
3974     UNSPILL_TMP1(%eax)                  # restore method->clazz
3975     jne     .LOP_INVOKE_SUPER_continue        # good to go - continue
3976     jmp     common_exceptionThrown      # handle exception
3977
3978     /*
3979      * Throw a NoSuchMethodError with the method name as the message.
3980      *  ecx = resolved base method
3981      */
3982 .LOP_INVOKE_SUPER_nsm:
3983     movl    offMethod_name(%ecx),%eax
3984     jmp     common_errNoSuchMethod
3985
3986 /* ------------------------------ */
3987 .L_OP_INVOKE_DIRECT: /* 0x70 */
3988 /* File: x86/OP_INVOKE_DIRECT.S */
3989     /*
3990      * Handle a direct method call.
3991      *
3992      * (We could defer the "is 'this' pointer null" test to the common
3993      * method invocation code, and use a flag to indicate that static
3994      * calls don't count.  If we do this as part of copying the arguments
3995      * out we could avoiding loading the first arg twice.)
3996      *
3997      * for: invoke-direct, invoke-direct/range
3998      */
3999     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
4000     /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
4001     movl      rSELF,%ecx
4002     movzwl    2(rPC),%eax              # eax<- BBBB
4003     movl      offThread_methodClassDex(%ecx),%ecx # ecx<- pDvmDex
4004     EXPORT_PC
4005     movl      offDvmDex_pResMethods(%ecx),%ecx  # ecx<- pDvmDex->pResMethods
4006     movzwl    4(rPC),rIBASE            # rIBASE<- GFED or CCCC
4007     movl      (%ecx,%eax,4),%eax       # eax<- resolved methodToCall
4008     .if       (!0)
4009     andl      $0xf,rIBASE             # rIBASE<- D (or stays CCCC)
4010     .endif
4011     testl     %eax,%eax                # already resolved?
4012     GET_VREG_R  %ecx rIBASE            # ecx<- "this" ptr
4013     je        .LOP_INVOKE_DIRECT_resolve      # not resolved, do it now
4014 .LOP_INVOKE_DIRECT_finish:
4015     testl     %ecx,%ecx                # null "this"?
4016     jne       common_invokeMethodNoRange  # no, continue on
4017     jmp       common_errNullObject
4018
4019     /*
4020      * On entry:
4021      *   TMP_SPILL  <- "this" register
4022      * Things a bit ugly on this path, but it's the less
4023      * frequent one.  We'll have to do some reloading.
4024      */
4025 .LOP_INVOKE_DIRECT_resolve:
4026      SPILL_TMP1(%ecx)
4027      movl     rSELF,%ecx
4028      movl     offThread_method(%ecx),%ecx  # ecx<- self->method
4029      movzwl   2(rPC),%eax      # reference (BBBB or CCCC)
4030      movl     offMethod_clazz(%ecx),%ecx # ecx<- method->clazz
4031      movl     $METHOD_DIRECT,OUT_ARG2(%esp)
4032      movl     %eax,OUT_ARG1(%esp)
4033      movl     %ecx,OUT_ARG0(%esp)
4034      call     dvmResolveMethod # eax<- call(clazz, ref, flags)
4035      UNSPILL_TMP1(%ecx)
4036      testl    %eax,%eax
4037      jne      .LOP_INVOKE_DIRECT_finish
4038      jmp      common_exceptionThrown
4039
4040 /* ------------------------------ */
4041 .L_OP_INVOKE_STATIC: /* 0x71 */
4042 /* File: x86/OP_INVOKE_STATIC.S */
4043     /*
4044      * Handle a static method call.
4045      *
4046      * for: invoke-static, invoke-static/range
4047      */
4048     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
4049     /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
4050     movl      rSELF,%ecx
4051     movzwl    2(rPC),%eax               # eax<- BBBB
4052     movl      offThread_methodClassDex(%ecx),%ecx # ecx<- pDvmDex
4053     EXPORT_PC
4054     movl      offDvmDex_pResMethods(%ecx),%ecx  # ecx<- pDvmDex->pResMethods
4055     movl      (%ecx,%eax,4),%eax        # eax<- resolved methodToCall
4056     testl     %eax,%eax
4057     jne       common_invokeMethodNoRange
4058     movl      rSELF,%ecx
4059     movl      offThread_method(%ecx),%ecx # ecx<- self->method
4060     movzwl    2(rPC),%eax
4061     movl      offMethod_clazz(%ecx),%ecx# ecx<- method->clazz
4062     movl      %eax,OUT_ARG1(%esp)       # arg1<- BBBB
4063     movl      %ecx,OUT_ARG0(%esp)       # arg0<- clazz
4064     movl      $METHOD_STATIC,%eax
4065     movl      %eax,OUT_ARG2(%esp)       # arg2<- flags
4066     call      dvmResolveMethod          # call(clazz,ref,flags)
4067     testl     %eax,%eax                 # got null?
4068     jne       common_invokeMethodNoRange
4069     jmp       common_exceptionThrown
4070
4071 /* ------------------------------ */
4072 .L_OP_INVOKE_INTERFACE: /* 0x72 */
4073 /* File: x86/OP_INVOKE_INTERFACE.S */
4074     /*
4075      * Handle an interface method call.
4076      *
4077      * for: invoke-interface, invoke-interface/range
4078      */
4079     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
4080     /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
4081     movzwl     4(rPC),%eax              # eax<- FEDC or CCCC
4082     movl       rSELF,%ecx
4083     .if        (!0)
4084     andl       $0xf,%eax               # eax<- C (or stays CCCC)
4085     .endif
4086     GET_VREG_R   %eax %eax              # eax<- "this"
4087     EXPORT_PC
4088     testl      %eax,%eax                # null this?
4089     je         common_errNullObject     # yes, fail
4090     movl       offObject_clazz(%eax),%eax# eax<- thisPtr->clazz
4091     movl       %eax,OUT_ARG0(%esp)                 # arg0<- class
4092     movl       offThread_methodClassDex(%ecx),%eax   # eax<- methodClassDex
4093     movl       offThread_method(%ecx),%ecx           # ecx<- method
4094     movl       %eax,OUT_ARG3(%esp)                 # arg3<- dex
4095     movzwl     2(rPC),%eax                         # eax<- BBBB
4096     movl       %ecx,OUT_ARG2(%esp)                 # arg2<- method
4097     movl       %eax,OUT_ARG1(%esp)                 # arg1<- BBBB
4098     call       dvmFindInterfaceMethodInCache # eax<- call(class, ref, method, dex)
4099     testl      %eax,%eax
4100     je         common_exceptionThrown
4101     jmp        common_invokeMethodNoRange
4102
4103 /* ------------------------------ */
4104 .L_OP_UNUSED_73: /* 0x73 */
4105 /* File: x86/OP_UNUSED_73.S */
4106 /* File: x86/unused.S */
4107     jmp     common_abort
4108
4109
4110 /* ------------------------------ */
4111 .L_OP_INVOKE_VIRTUAL_RANGE: /* 0x74 */
4112 /* File: x86/OP_INVOKE_VIRTUAL_RANGE.S */
4113 /* File: x86/OP_INVOKE_VIRTUAL.S */
4114
4115     /*
4116      * Handle a virtual method call.
4117      *
4118      * for: invoke-virtual, invoke-virtual/range
4119      */
4120     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
4121     /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
4122     movl      rSELF,%eax
4123     movzwl    2(rPC),%ecx                 # ecx<- BBBB
4124     movl      offThread_methodClassDex(%eax),%eax  # eax<- pDvmDex
4125     EXPORT_PC
4126     movl      offDvmDex_pResMethods(%eax),%eax   # eax<- pDvmDex->pResMethods
4127     movl      (%eax,%ecx,4),%eax          # eax<- resolved baseMethod
4128     testl     %eax,%eax                   # already resolved?
4129     jne       .LOP_INVOKE_VIRTUAL_RANGE_continue        # yes, continue
4130     movl      rSELF,%eax
4131     movl      %ecx,OUT_ARG1(%esp)         # arg1<- ref
4132     movl      offThread_method(%eax),%eax   # eax<- self->method
4133     movl      offMethod_clazz(%eax),%eax  # ecx<- method->clazz
4134     movl      %eax,OUT_ARG0(%esp)         # arg0<- clazz
4135     movl      $METHOD_VIRTUAL,OUT_ARG2(%esp) # arg2<- flags
4136     call      dvmResolveMethod            # eax<- call(clazz, ref, flags)
4137     testl     %eax,%eax                   # got null?
4138     jne       .LOP_INVOKE_VIRTUAL_RANGE_continue        # no, continue
4139     jmp       common_exceptionThrown      # yes, handle exception
4140
4141     /* At this point:
4142      *   eax = resolved base method
4143      *   ecx = scratch
4144      */
4145 .LOP_INVOKE_VIRTUAL_RANGE_continue:
4146     movzwl    4(rPC),%ecx               # ecx<- GFED or CCCC
4147     .if       (!1)
4148     andl      $0xf,%ecx                # ecx<- D (or stays CCCC)
4149     .endif
4150     GET_VREG_R  %ecx %ecx               # ecx<- "this"
4151     movzwl    offMethod_methodIndex(%eax),%eax  # eax<- baseMethod->methodIndex
4152     testl     %ecx,%ecx                 # null this?
4153     je        common_errNullObject      # go if so
4154     movl      offObject_clazz(%ecx),%ecx  # ecx<- thisPtr->clazz
4155     movl      offClassObject_vtable(%ecx),%ecx # ecx<- thisPtr->clazz->vtable
4156     movl      (%ecx,%eax,4),%eax        # eax<- vtable[methodIndex]
4157     jmp       common_invokeMethodRange
4158
4159
4160 /* ------------------------------ */
4161 .L_OP_INVOKE_SUPER_RANGE: /* 0x75 */
4162 /* File: x86/OP_INVOKE_SUPER_RANGE.S */
4163 /* File: x86/OP_INVOKE_SUPER.S */
4164     /*
4165      * Handle a "super" method call.
4166      *
4167      * for: invoke-super, invoke-super/range
4168      */
4169     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
4170     /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
4171     movl      rSELF,rINST
4172     movzwl    2(rPC),%eax               # eax<- BBBB
4173     movl      offThread_methodClassDex(rINST),%ecx # ecx<- pDvmDex
4174     EXPORT_PC
4175     movl      offDvmDex_pResMethods(%ecx),%ecx # ecx<- pDvmDex->pResMethods
4176     movl      (%ecx,%eax,4),%ecx        # ecx<- resolved baseMethod
4177     movl      offThread_method(rINST),%eax # eax<- method
4178     movzwl    4(rPC),rINST              # rINST<- GFED or CCCC
4179     .if       (!1)
4180     andl      $0xf,rINST               # rINST<- D (or stays CCCC)
4181     .endif
4182     GET_VREG_R  rINST rINST             # rINST<- "this" ptr
4183     testl     rINST,rINST               # null "this"?
4184     je        common_errNullObject      # yes, throw
4185     movl      offMethod_clazz(%eax),%eax # eax<- method->clazz
4186     testl     %ecx,%ecx                 # already resolved?
4187     je       .LOP_INVOKE_SUPER_RANGE_resolve
4188     /*
4189      * At this point:
4190      *  ecx = resolved base method [r0]
4191      *  eax = method->clazz [r9]
4192      */
4193 .LOP_INVOKE_SUPER_RANGE_continue:
4194     movl    offClassObject_super(%eax),%eax   # eax<- method->clazz->super
4195     movzwl  offMethod_methodIndex(%ecx),%ecx  # ecx<- baseMthod->methodIndex
4196     cmpl    offClassObject_vtableCount(%eax),%ecx # compare(methodIndex,vtableCount)
4197     jae     .LOP_INVOKE_SUPER_RANGE_nsm           # method not present in superclass
4198     movl    offClassObject_vtable(%eax),%eax   # eax<- ...clazz->super->vtable
4199     movl    (%eax,%ecx,4),%eax        # eax<- vtable[methodIndex]
4200     jmp     common_invokeMethodRange
4201
4202
4203     /* At this point:
4204      * ecx = null (needs to be resolved base method)
4205      * eax = method->clazz
4206     */
4207 .LOP_INVOKE_SUPER_RANGE_resolve:
4208     SPILL_TMP1(%eax)                    # method->clazz
4209     movl    %eax,OUT_ARG0(%esp)         # arg0<- method->clazz
4210     movzwl  2(rPC),%ecx                 # ecx<- BBBB
4211     movl    $METHOD_VIRTUAL,OUT_ARG2(%esp)  # arg2<- resolver method type
4212     movl    %ecx,OUT_ARG1(%esp)         # arg1<- ref
4213     call    dvmResolveMethod            # eax<- call(clazz, ref, flags)
4214     testl   %eax,%eax                   # got null?
4215     movl    %eax,%ecx                   # ecx<- resolved base method
4216     UNSPILL_TMP1(%eax)                  # restore method->clazz
4217     jne     .LOP_INVOKE_SUPER_RANGE_continue        # good to go - continue
4218     jmp     common_exceptionThrown      # handle exception
4219
4220     /*
4221      * Throw a NoSuchMethodError with the method name as the message.
4222      *  ecx = resolved base method
4223      */
4224 .LOP_INVOKE_SUPER_RANGE_nsm:
4225     movl    offMethod_name(%ecx),%eax
4226     jmp     common_errNoSuchMethod
4227
4228
4229 /* ------------------------------ */
4230 .L_OP_INVOKE_DIRECT_RANGE: /* 0x76 */
4231 /* File: x86/OP_INVOKE_DIRECT_RANGE.S */
4232 /* File: x86/OP_INVOKE_DIRECT.S */
4233     /*
4234      * Handle a direct method call.
4235      *
4236      * (We could defer the "is 'this' pointer null" test to the common
4237      * method invocation code, and use a flag to indicate that static
4238      * calls don't count.  If we do this as part of copying the arguments
4239      * out we could avoiding loading the first arg twice.)
4240      *
4241      * for: invoke-direct, invoke-direct/range
4242      */
4243     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
4244     /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
4245     movl      rSELF,%ecx
4246     movzwl    2(rPC),%eax              # eax<- BBBB
4247     movl      offThread_methodClassDex(%ecx),%ecx # ecx<- pDvmDex
4248     EXPORT_PC
4249     movl      offDvmDex_pResMethods(%ecx),%ecx  # ecx<- pDvmDex->pResMethods
4250     movzwl    4(rPC),rIBASE            # rIBASE<- GFED or CCCC
4251     movl      (%ecx,%eax,4),%eax       # eax<- resolved methodToCall
4252     .if       (!1)
4253     andl      $0xf,rIBASE             # rIBASE<- D (or stays CCCC)
4254     .endif
4255     testl     %eax,%eax                # already resolved?
4256     GET_VREG_R  %ecx rIBASE            # ecx<- "this" ptr
4257     je        .LOP_INVOKE_DIRECT_RANGE_resolve      # not resolved, do it now
4258 .LOP_INVOKE_DIRECT_RANGE_finish:
4259     testl     %ecx,%ecx                # null "this"?
4260     jne       common_invokeMethodRange  # no, continue on
4261     jmp       common_errNullObject
4262
4263     /*
4264      * On entry:
4265      *   TMP_SPILL  <- "this" register
4266      * Things a bit ugly on this path, but it's the less
4267      * frequent one.  We'll have to do some reloading.
4268      */
4269 .LOP_INVOKE_DIRECT_RANGE_resolve:
4270      SPILL_TMP1(%ecx)
4271      movl     rSELF,%ecx
4272      movl     offThread_method(%ecx),%ecx  # ecx<- self->method
4273      movzwl   2(rPC),%eax      # reference (BBBB or CCCC)
4274      movl     offMethod_clazz(%ecx),%ecx # ecx<- method->clazz
4275      movl     $METHOD_DIRECT,OUT_ARG2(%esp)
4276      movl     %eax,OUT_ARG1(%esp)
4277      movl     %ecx,OUT_ARG0(%esp)
4278      call     dvmResolveMethod # eax<- call(clazz, ref, flags)
4279      UNSPILL_TMP1(%ecx)
4280      testl    %eax,%eax
4281      jne      .LOP_INVOKE_DIRECT_RANGE_finish
4282      jmp      common_exceptionThrown
4283
4284
4285 /* ------------------------------ */
4286 .L_OP_INVOKE_STATIC_RANGE: /* 0x77 */
4287 /* File: x86/OP_INVOKE_STATIC_RANGE.S */
4288 /* File: x86/OP_INVOKE_STATIC.S */
4289     /*
4290      * Handle a static method call.
4291      *
4292      * for: invoke-static, invoke-static/range
4293      */
4294     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
4295     /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
4296     movl      rSELF,%ecx
4297     movzwl    2(rPC),%eax               # eax<- BBBB
4298     movl      offThread_methodClassDex(%ecx),%ecx # ecx<- pDvmDex
4299     EXPORT_PC
4300     movl      offDvmDex_pResMethods(%ecx),%ecx  # ecx<- pDvmDex->pResMethods
4301     movl      (%ecx,%eax,4),%eax        # eax<- resolved methodToCall
4302     testl     %eax,%eax
4303     jne       common_invokeMethodRange
4304     movl      rSELF,%ecx
4305     movl      offThread_method(%ecx),%ecx # ecx<- self->method
4306     movzwl    2(rPC),%eax
4307     movl      offMethod_clazz(%ecx),%ecx# ecx<- method->clazz
4308     movl      %eax,OUT_ARG1(%esp)       # arg1<- BBBB
4309     movl      %ecx,OUT_ARG0(%esp)       # arg0<- clazz
4310     movl      $METHOD_STATIC,%eax
4311     movl      %eax,OUT_ARG2(%esp)       # arg2<- flags
4312     call      dvmResolveMethod          # call(clazz,ref,flags)
4313     testl     %eax,%eax                 # got null?
4314     jne       common_invokeMethodRange
4315     jmp       common_exceptionThrown
4316
4317
4318 /* ------------------------------ */
4319 .L_OP_INVOKE_INTERFACE_RANGE: /* 0x78 */
4320 /* File: x86/OP_INVOKE_INTERFACE_RANGE.S */
4321 /* File: x86/OP_INVOKE_INTERFACE.S */
4322     /*
4323      * Handle an interface method call.
4324      *
4325      * for: invoke-interface, invoke-interface/range
4326      */
4327     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
4328     /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
4329     movzwl     4(rPC),%eax              # eax<- FEDC or CCCC
4330     movl       rSELF,%ecx
4331     .if        (!1)
4332     andl       $0xf,%eax               # eax<- C (or stays CCCC)
4333     .endif
4334     GET_VREG_R   %eax %eax              # eax<- "this"
4335     EXPORT_PC
4336     testl      %eax,%eax                # null this?
4337     je         common_errNullObject     # yes, fail
4338     movl       offObject_clazz(%eax),%eax# eax<- thisPtr->clazz
4339     movl       %eax,OUT_ARG0(%esp)                 # arg0<- class
4340     movl       offThread_methodClassDex(%ecx),%eax   # eax<- methodClassDex
4341     movl       offThread_method(%ecx),%ecx           # ecx<- method
4342     movl       %eax,OUT_ARG3(%esp)                 # arg3<- dex
4343     movzwl     2(rPC),%eax                         # eax<- BBBB
4344     movl       %ecx,OUT_ARG2(%esp)                 # arg2<- method
4345     movl       %eax,OUT_ARG1(%esp)                 # arg1<- BBBB
4346     call       dvmFindInterfaceMethodInCache # eax<- call(class, ref, method, dex)
4347     testl      %eax,%eax
4348     je         common_exceptionThrown
4349     jmp        common_invokeMethodRange
4350
4351
4352 /* ------------------------------ */
4353 .L_OP_UNUSED_79: /* 0x79 */
4354 /* File: x86/OP_UNUSED_79.S */
4355 /* File: x86/unused.S */
4356     jmp     common_abort
4357
4358
4359 /* ------------------------------ */
4360 .L_OP_UNUSED_7A: /* 0x7a */
4361 /* File: x86/OP_UNUSED_7A.S */
4362 /* File: x86/unused.S */
4363     jmp     common_abort
4364
4365
4366 /* ------------------------------ */
4367 .L_OP_NEG_INT: /* 0x7b */
4368 /* File: x86/OP_NEG_INT.S */
4369 /* File: x86/unop.S */
4370     /*
4371      * Generic 32-bit unary operation.  Provide an "instr" line that
4372      * specifies an instruction that performs "result = op eax".
4373      */
4374     /* unop vA, vB */
4375     movzbl   rINSTbl,%ecx           # ecx<- A+
4376     sarl     $4,rINST             # rINST<- B
4377     GET_VREG_R %eax rINST           # eax<- vB
4378     andb     $0xf,%cl              # ecx<- A
4379     
4380     
4381     negl %eax
4382     SET_VREG %eax %ecx
4383     FETCH_INST_OPCODE 1 %ecx
4384     ADVANCE_PC 1
4385     GOTO_NEXT_R %ecx
4386
4387
4388 /* ------------------------------ */
4389 .L_OP_NOT_INT: /* 0x7c */
4390 /* File: x86/OP_NOT_INT.S */
4391 /* File: x86/unop.S */
4392     /*
4393      * Generic 32-bit unary operation.  Provide an "instr" line that
4394      * specifies an instruction that performs "result = op eax".
4395      */
4396     /* unop vA, vB */
4397     movzbl   rINSTbl,%ecx           # ecx<- A+
4398     sarl     $4,rINST             # rINST<- B
4399     GET_VREG_R %eax rINST           # eax<- vB
4400     andb     $0xf,%cl              # ecx<- A
4401     
4402     
4403     notl %eax
4404     SET_VREG %eax %ecx
4405     FETCH_INST_OPCODE 1 %ecx
4406     ADVANCE_PC 1
4407     GOTO_NEXT_R %ecx
4408
4409
4410 /* ------------------------------ */
4411 .L_OP_NEG_LONG: /* 0x7d */
4412 /* File: x86/OP_NEG_LONG.S */
4413     /* unop vA, vB */
4414     movzbl    rINSTbl,%ecx        # ecx<- BA
4415     sarl      $4,%ecx            # ecx<- B
4416     andb      $0xf,rINSTbl       # rINST<- A
4417     GET_VREG_WORD %eax %ecx 0     # eax<- v[B+0]
4418     GET_VREG_WORD %ecx %ecx 1     # ecx<- v[B+1]
4419     negl      %eax
4420     adcl      $0,%ecx
4421     negl      %ecx
4422     SET_VREG_WORD %eax rINST 0    # v[A+0]<- eax
4423     FETCH_INST_OPCODE 1 %eax
4424     SET_VREG_WORD %ecx rINST 1    # v[A+1]<- ecx
4425     ADVANCE_PC 1
4426     GOTO_NEXT_R %eax
4427
4428 /* ------------------------------ */
4429 .L_OP_NOT_LONG: /* 0x7e */
4430 /* File: x86/OP_NOT_LONG.S */
4431     /* unop vA, vB */
4432     movzbl    rINSTbl,%ecx       # ecx<- BA
4433     sarl      $4,%ecx           # ecx<- B
4434     andb      $0xf,rINSTbl      # rINST<- A
4435     GET_VREG_WORD %eax %ecx 0    # eax<- v[B+0]
4436     GET_VREG_WORD %ecx %ecx 1    # ecx<- v[B+1]
4437     notl      %eax
4438     notl      %ecx
4439     SET_VREG_WORD %eax rINST 0   # v[A+0]<- eax
4440     FETCH_INST_OPCODE 1 %eax
4441     SET_VREG_WORD %ecx rINST 1   # v[A+1]<- ecx
4442     ADVANCE_PC 1
4443     GOTO_NEXT_R %eax
4444
4445 /* ------------------------------ */
4446 .L_OP_NEG_FLOAT: /* 0x7f */
4447 /* File: x86/OP_NEG_FLOAT.S */
4448 /* File: x86/fpcvt.S */
4449     /*
4450      * Generic 32-bit FP conversion operation.
4451      */
4452     /* unop vA, vB */
4453     movzbl   rINSTbl,%ecx       # ecx<- A+
4454     sarl     $4,rINST         # rINST<- B
4455     flds    (rFP,rINST,4)      # %st0<- vB
4456     andb     $0xf,%cl          # ecx<- A
4457     fchs
4458     fstps  (rFP,%ecx,4)        # vA<- %st0
4459     FETCH_INST_OPCODE 1 %ecx
4460     ADVANCE_PC 1
4461     GOTO_NEXT_R %ecx
4462
4463
4464 /* ------------------------------ */
4465 .L_OP_NEG_DOUBLE: /* 0x80 */
4466 /* File: x86/OP_NEG_DOUBLE.S */
4467 /* File: x86/fpcvt.S */
4468     /*
4469      * Generic 32-bit FP conversion operation.
4470      */
4471     /* unop vA, vB */
4472     movzbl   rINSTbl,%ecx       # ecx<- A+
4473     sarl     $4,rINST         # rINST<- B
4474     fldl    (rFP,rINST,4)      # %st0<- vB
4475     andb     $0xf,%cl          # ecx<- A
4476     fchs
4477     fstpl  (rFP,%ecx,4)        # vA<- %st0
4478     FETCH_INST_OPCODE 1 %ecx
4479     ADVANCE_PC 1
4480     GOTO_NEXT_R %ecx
4481
4482
4483 /* ------------------------------ */
4484 .L_OP_INT_TO_LONG: /* 0x81 */
4485 /* File: x86/OP_INT_TO_LONG.S */
4486     /* int to long vA, vB */
4487     movzbl  rINSTbl,%eax                # eax<- +A
4488     sarl    $4,%eax                    # eax<- B
4489     GET_VREG_R %eax %eax                # eax<- vB
4490     andb    $0xf,rINSTbl               # rINST<- A
4491     SPILL(rIBASE)                       # cltd trashes rIBASE/edx
4492     cltd                                # rINST:eax<- sssssssBBBBBBBB
4493     SET_VREG_WORD rIBASE rINST 1        # v[A+1]<- rIBASE/rPC
4494     FETCH_INST_OPCODE 1 %ecx
4495     UNSPILL(rIBASE)
4496     SET_VREG_WORD %eax rINST 0          # v[A+0]<- %eax
4497     ADVANCE_PC 1
4498     GOTO_NEXT_R %ecx
4499
4500 /* ------------------------------ */
4501 .L_OP_INT_TO_FLOAT: /* 0x82 */
4502 /* File: x86/OP_INT_TO_FLOAT.S */
4503 /* File: x86/fpcvt.S */
4504     /*
4505      * Generic 32-bit FP conversion operation.
4506      */
4507     /* unop vA, vB */
4508     movzbl   rINSTbl,%ecx       # ecx<- A+
4509     sarl     $4,rINST         # rINST<- B
4510     fildl    (rFP,rINST,4)      # %st0<- vB
4511     andb     $0xf,%cl          # ecx<- A
4512     
4513     fstps  (rFP,%ecx,4)        # vA<- %st0
4514     FETCH_INST_OPCODE 1 %ecx
4515     ADVANCE_PC 1
4516     GOTO_NEXT_R %ecx
4517
4518
4519 /* ------------------------------ */
4520 .L_OP_INT_TO_DOUBLE: /* 0x83 */
4521 /* File: x86/OP_INT_TO_DOUBLE.S */
4522 /* File: x86/fpcvt.S */
4523     /*
4524      * Generic 32-bit FP conversion operation.
4525      */
4526     /* unop vA, vB */
4527     movzbl   rINSTbl,%ecx       # ecx<- A+
4528     sarl     $4,rINST         # rINST<- B
4529     fildl    (rFP,rINST,4)      # %st0<- vB
4530     andb     $0xf,%cl          # ecx<- A
4531     
4532     fstpl  (rFP,%ecx,4)        # vA<- %st0
4533     FETCH_INST_OPCODE 1 %ecx
4534     ADVANCE_PC 1
4535     GOTO_NEXT_R %ecx
4536
4537
4538 /* ------------------------------ */
4539 .L_OP_LONG_TO_INT: /* 0x84 */
4540 /* File: x86/OP_LONG_TO_INT.S */
4541 /* we ignore the high word, making this equivalent to a 32-bit reg move */
4542 /* File: x86/OP_MOVE.S */
4543     /* for move, move-object, long-to-int */
4544     /* op vA, vB */
4545     movzbl rINSTbl,%eax          # eax<- BA
4546     andb   $0xf,%al             # eax<- A
4547     shrl   $4,rINST            # rINST<- B
4548     GET_VREG_R rINST rINST
4549     FETCH_INST_OPCODE 1 %ecx
4550     ADVANCE_PC 1
4551     SET_VREG rINST %eax           # fp[A]<-fp[B]
4552     GOTO_NEXT_R %ecx
4553
4554
4555 /* ------------------------------ */
4556 .L_OP_LONG_TO_FLOAT: /* 0x85 */
4557 /* File: x86/OP_LONG_TO_FLOAT.S */
4558 /* File: x86/fpcvt.S */
4559     /*
4560      * Generic 32-bit FP conversion operation.
4561      */
4562     /* unop vA, vB */
4563     movzbl   rINSTbl,%ecx       # ecx<- A+
4564     sarl     $4,rINST         # rINST<- B
4565     fildll    (rFP,rINST,4)      # %st0<- vB
4566     andb     $0xf,%cl          # ecx<- A
4567     
4568     fstps  (rFP,%ecx,4)        # vA<- %st0
4569     FETCH_INST_OPCODE 1 %ecx
4570     ADVANCE_PC 1
4571     GOTO_NEXT_R %ecx
4572
4573
4574 /* ------------------------------ */
4575 .L_OP_LONG_TO_DOUBLE: /* 0x86 */
4576 /* File: x86/OP_LONG_TO_DOUBLE.S */
4577 /* File: x86/fpcvt.S */
4578     /*
4579      * Generic 32-bit FP conversion operation.
4580      */
4581     /* unop vA, vB */
4582     movzbl   rINSTbl,%ecx       # ecx<- A+
4583     sarl     $4,rINST         # rINST<- B
4584     fildll    (rFP,rINST,4)      # %st0<- vB
4585     andb     $0xf,%cl          # ecx<- A
4586     
4587     fstpl  (rFP,%ecx,4)        # vA<- %st0
4588     FETCH_INST_OPCODE 1 %ecx
4589     ADVANCE_PC 1
4590     GOTO_NEXT_R %ecx
4591
4592
4593 /* ------------------------------ */
4594 .L_OP_FLOAT_TO_INT: /* 0x87 */
4595 /* File: x86/OP_FLOAT_TO_INT.S */
4596 /* File: x86/cvtfp_int.S */
4597 /* On fp to int conversions, Java requires that
4598  * if the result > maxint, it should be clamped to maxint.  If it is less
4599  * than minint, it should be clamped to minint.  If it is a nan, the result
4600  * should be zero.  Further, the rounding mode is to truncate.  This model
4601  * differs from what is delivered normally via the x86 fpu, so we have
4602  * to play some games.
4603  */
4604     /* float/double to int/long vA, vB */
4605     movzbl    rINSTbl,%ecx       # ecx<- A+
4606     sarl      $4,rINST         # rINST<- B
4607     .if 0
4608     fldl     (rFP,rINST,4)       # %st0<- vB
4609     .else
4610     flds     (rFP,rINST,4)       # %st0<- vB
4611     .endif
4612     ftst
4613     fnstcw   LOCAL0_OFFSET(%ebp)      # remember original rounding mode
4614     movzwl   LOCAL0_OFFSET(%ebp),%eax
4615     movb     $0xc,%ah
4616     movw     %ax,LOCAL0_OFFSET+2(%ebp)
4617     fldcw    LOCAL0_OFFSET+2(%ebp)    # set "to zero" rounding mode
4618     andb     $0xf,%cl                # ecx<- A
4619     .if 0
4620     fistpll  (rFP,%ecx,4)             # convert and store
4621     .else
4622     fistpl   (rFP,%ecx,4)             # convert and store
4623     .endif
4624     fldcw    LOCAL0_OFFSET(%ebp)      # restore previous rounding mode
4625     .if 0
4626     movl     $0x80000000,%eax
4627     xorl     4(rFP,%ecx,4),%eax
4628     orl      (rFP,%ecx,4),%eax
4629     .else
4630     cmpl     $0x80000000,(rFP,%ecx,4)
4631     .endif
4632     je       .LOP_FLOAT_TO_INT_special_case # fix up result
4633
4634 .LOP_FLOAT_TO_INT_finish:
4635     FETCH_INST_OPCODE 1 %ecx
4636     ADVANCE_PC 1
4637     GOTO_NEXT_R %ecx
4638
4639 .LOP_FLOAT_TO_INT_special_case:
4640     fnstsw   %ax
4641     sahf
4642     jp       .LOP_FLOAT_TO_INT_isNaN
4643     adcl     $-1,(rFP,%ecx,4)
4644     .if 0
4645     adcl     $-1,4(rFP,%ecx,4)
4646     .endif
4647    jmp       .LOP_FLOAT_TO_INT_finish
4648 .LOP_FLOAT_TO_INT_isNaN:
4649     movl      $0,(rFP,%ecx,4)
4650     .if 0
4651     movl      $0,4(rFP,%ecx,4)
4652     .endif
4653     jmp       .LOP_FLOAT_TO_INT_finish
4654
4655
4656 /* ------------------------------ */
4657 .L_OP_FLOAT_TO_LONG: /* 0x88 */
4658 /* File: x86/OP_FLOAT_TO_LONG.S */
4659 /* File: x86/cvtfp_int.S */
4660 /* On fp to int conversions, Java requires that
4661  * if the result > maxint, it should be clamped to maxint.  If it is less
4662  * than minint, it should be clamped to minint.  If it is a nan, the result
4663  * should be zero.  Further, the rounding mode is to truncate.  This model
4664  * differs from what is delivered normally via the x86 fpu, so we have
4665  * to play some games.
4666  */
4667     /* float/double to int/long vA, vB */
4668     movzbl    rINSTbl,%ecx       # ecx<- A+
4669     sarl      $4,rINST         # rINST<- B
4670     .if 0
4671     fldl     (rFP,rINST,4)       # %st0<- vB
4672     .else
4673     flds     (rFP,rINST,4)       # %st0<- vB
4674     .endif
4675     ftst
4676     fnstcw   LOCAL0_OFFSET(%ebp)      # remember original rounding mode
4677     movzwl   LOCAL0_OFFSET(%ebp),%eax
4678     movb     $0xc,%ah
4679     movw     %ax,LOCAL0_OFFSET+2(%ebp)
4680     fldcw    LOCAL0_OFFSET+2(%ebp)    # set "to zero" rounding mode
4681     andb     $0xf,%cl                # ecx<- A
4682     .if 1
4683     fistpll  (rFP,%ecx,4)             # convert and store
4684     .else
4685     fistpl   (rFP,%ecx,4)             # convert and store
4686     .endif
4687     fldcw    LOCAL0_OFFSET(%ebp)      # restore previous rounding mode
4688     .if 1
4689     movl     $0x80000000,%eax
4690     xorl     4(rFP,%ecx,4),%eax
4691     orl      (rFP,%ecx,4),%eax
4692     .else
4693     cmpl     $0x80000000,(rFP,%ecx,4)
4694     .endif
4695     je       .LOP_FLOAT_TO_LONG_special_case # fix up result
4696
4697 .LOP_FLOAT_TO_LONG_finish:
4698     FETCH_INST_OPCODE 1 %ecx
4699     ADVANCE_PC 1
4700     GOTO_NEXT_R %ecx
4701
4702 .LOP_FLOAT_TO_LONG_special_case:
4703     fnstsw   %ax
4704     sahf
4705     jp       .LOP_FLOAT_TO_LONG_isNaN
4706     adcl     $-1,(rFP,%ecx,4)
4707     .if 1
4708     adcl     $-1,4(rFP,%ecx,4)
4709     .endif
4710    jmp       .LOP_FLOAT_TO_LONG_finish
4711 .LOP_FLOAT_TO_LONG_isNaN:
4712     movl      $0,(rFP,%ecx,4)
4713     .if 1
4714     movl      $0,4(rFP,%ecx,4)
4715     .endif
4716     jmp       .LOP_FLOAT_TO_LONG_finish
4717
4718
4719 /* ------------------------------ */
4720 .L_OP_FLOAT_TO_DOUBLE: /* 0x89 */
4721 /* File: x86/OP_FLOAT_TO_DOUBLE.S */
4722 /* File: x86/fpcvt.S */
4723     /*
4724      * Generic 32-bit FP conversion operation.
4725      */
4726     /* unop vA, vB */
4727     movzbl   rINSTbl,%ecx       # ecx<- A+
4728     sarl     $4,rINST         # rINST<- B
4729     flds    (rFP,rINST,4)      # %st0<- vB
4730     andb     $0xf,%cl          # ecx<- A
4731     
4732     fstpl  (rFP,%ecx,4)        # vA<- %st0
4733     FETCH_INST_OPCODE 1 %ecx
4734     ADVANCE_PC 1
4735     GOTO_NEXT_R %ecx
4736
4737
4738 /* ------------------------------ */
4739 .L_OP_DOUBLE_TO_INT: /* 0x8a */
4740 /* File: x86/OP_DOUBLE_TO_INT.S */
4741 /* File: x86/cvtfp_int.S */
4742 /* On fp to int conversions, Java requires that
4743  * if the result > maxint, it should be clamped to maxint.  If it is less
4744  * than minint, it should be clamped to minint.  If it is a nan, the result
4745  * should be zero.  Further, the rounding mode is to truncate.  This model
4746  * differs from what is delivered normally via the x86 fpu, so we have
4747  * to play some games.
4748  */
4749     /* float/double to int/long vA, vB */
4750     movzbl    rINSTbl,%ecx       # ecx<- A+
4751     sarl      $4,rINST         # rINST<- B
4752     .if 1
4753     fldl     (rFP,rINST,4)       # %st0<- vB
4754     .else
4755     flds     (rFP,rINST,4)       # %st0<- vB
4756     .endif
4757     ftst
4758     fnstcw   LOCAL0_OFFSET(%ebp)      # remember original rounding mode
4759     movzwl   LOCAL0_OFFSET(%ebp),%eax
4760     movb     $0xc,%ah
4761     movw     %ax,LOCAL0_OFFSET+2(%ebp)
4762     fldcw    LOCAL0_OFFSET+2(%ebp)    # set "to zero" rounding mode
4763     andb     $0xf,%cl                # ecx<- A
4764     .if 0
4765     fistpll  (rFP,%ecx,4)             # convert and store
4766     .else
4767     fistpl   (rFP,%ecx,4)             # convert and store
4768     .endif
4769     fldcw    LOCAL0_OFFSET(%ebp)      # restore previous rounding mode
4770     .if 0
4771     movl     $0x80000000,%eax
4772     xorl     4(rFP,%ecx,4),%eax
4773     orl      (rFP,%ecx,4),%eax
4774     .else
4775     cmpl     $0x80000000,(rFP,%ecx,4)
4776     .endif
4777     je       .LOP_DOUBLE_TO_INT_special_case # fix up result
4778
4779 .LOP_DOUBLE_TO_INT_finish:
4780     FETCH_INST_OPCODE 1 %ecx
4781     ADVANCE_PC 1
4782     GOTO_NEXT_R %ecx
4783
4784 .LOP_DOUBLE_TO_INT_special_case:
4785     fnstsw   %ax
4786     sahf
4787     jp       .LOP_DOUBLE_TO_INT_isNaN
4788     adcl     $-1,(rFP,%ecx,4)
4789     .if 0
4790     adcl     $-1,4(rFP,%ecx,4)
4791     .endif
4792    jmp       .LOP_DOUBLE_TO_INT_finish
4793 .LOP_DOUBLE_TO_INT_isNaN:
4794     movl      $0,(rFP,%ecx,4)
4795     .if 0
4796     movl      $0,4(rFP,%ecx,4)
4797     .endif
4798     jmp       .LOP_DOUBLE_TO_INT_finish
4799
4800
4801 /* ------------------------------ */
4802 .L_OP_DOUBLE_TO_LONG: /* 0x8b */
4803 /* File: x86/OP_DOUBLE_TO_LONG.S */
4804 /* File: x86/cvtfp_int.S */
4805 /* On fp to int conversions, Java requires that
4806  * if the result > maxint, it should be clamped to maxint.  If it is less
4807  * than minint, it should be clamped to minint.  If it is a nan, the result
4808  * should be zero.  Further, the rounding mode is to truncate.  This model
4809  * differs from what is delivered normally via the x86 fpu, so we have
4810  * to play some games.
4811  */
4812     /* float/double to int/long vA, vB */
4813     movzbl    rINSTbl,%ecx       # ecx<- A+
4814     sarl      $4,rINST         # rINST<- B
4815     .if 1
4816     fldl     (rFP,rINST,4)       # %st0<- vB
4817     .else
4818     flds     (rFP,rINST,4)       # %st0<- vB
4819     .endif
4820     ftst
4821     fnstcw   LOCAL0_OFFSET(%ebp)      # remember original rounding mode
4822     movzwl   LOCAL0_OFFSET(%ebp),%eax
4823     movb     $0xc,%ah
4824     movw     %ax,LOCAL0_OFFSET+2(%ebp)
4825     fldcw    LOCAL0_OFFSET+2(%ebp)    # set "to zero" rounding mode
4826     andb     $0xf,%cl                # ecx<- A
4827     .if 1
4828     fistpll  (rFP,%ecx,4)             # convert and store
4829     .else
4830     fistpl   (rFP,%ecx,4)             # convert and store
4831     .endif
4832     fldcw    LOCAL0_OFFSET(%ebp)      # restore previous rounding mode
4833     .if 1
4834     movl     $0x80000000,%eax
4835     xorl     4(rFP,%ecx,4),%eax
4836     orl      (rFP,%ecx,4),%eax
4837     .else
4838     cmpl     $0x80000000,(rFP,%ecx,4)
4839     .endif
4840     je       .LOP_DOUBLE_TO_LONG_special_case # fix up result
4841
4842 .LOP_DOUBLE_TO_LONG_finish:
4843     FETCH_INST_OPCODE 1 %ecx
4844     ADVANCE_PC 1
4845     GOTO_NEXT_R %ecx
4846
4847 .LOP_DOUBLE_TO_LONG_special_case:
4848     fnstsw   %ax
4849     sahf
4850     jp       .LOP_DOUBLE_TO_LONG_isNaN
4851     adcl     $-1,(rFP,%ecx,4)
4852     .if 1
4853     adcl     $-1,4(rFP,%ecx,4)
4854     .endif
4855    jmp       .LOP_DOUBLE_TO_LONG_finish
4856 .LOP_DOUBLE_TO_LONG_isNaN:
4857     movl      $0,(rFP,%ecx,4)
4858     .if 1
4859     movl      $0,4(rFP,%ecx,4)
4860     .endif
4861     jmp       .LOP_DOUBLE_TO_LONG_finish
4862
4863
4864 /* ------------------------------ */
4865 .L_OP_DOUBLE_TO_FLOAT: /* 0x8c */
4866 /* File: x86/OP_DOUBLE_TO_FLOAT.S */
4867 /* File: x86/fpcvt.S */
4868     /*
4869      * Generic 32-bit FP conversion operation.
4870      */
4871     /* unop vA, vB */
4872     movzbl   rINSTbl,%ecx       # ecx<- A+
4873     sarl     $4,rINST         # rINST<- B
4874     fldl    (rFP,rINST,4)      # %st0<- vB
4875     andb     $0xf,%cl          # ecx<- A
4876     
4877     fstps  (rFP,%ecx,4)        # vA<- %st0
4878     FETCH_INST_OPCODE 1 %ecx
4879     ADVANCE_PC 1
4880     GOTO_NEXT_R %ecx
4881
4882
4883 /* ------------------------------ */
4884 .L_OP_INT_TO_BYTE: /* 0x8d */
4885 /* File: x86/OP_INT_TO_BYTE.S */
4886 /* File: x86/unop.S */
4887     /*
4888      * Generic 32-bit unary operation.  Provide an "instr" line that
4889      * specifies an instruction that performs "result = op eax".
4890      */
4891     /* unop vA, vB */
4892     movzbl   rINSTbl,%ecx           # ecx<- A+
4893     sarl     $4,rINST             # rINST<- B
4894     GET_VREG_R %eax rINST           # eax<- vB
4895     andb     $0xf,%cl              # ecx<- A
4896     
4897     
4898     movsbl %al,%eax
4899     SET_VREG %eax %ecx
4900     FETCH_INST_OPCODE 1 %ecx
4901     ADVANCE_PC 1
4902     GOTO_NEXT_R %ecx
4903
4904
4905 /* ------------------------------ */
4906 .L_OP_INT_TO_CHAR: /* 0x8e */
4907 /* File: x86/OP_INT_TO_CHAR.S */
4908 /* File: x86/unop.S */
4909     /*
4910      * Generic 32-bit unary operation.  Provide an "instr" line that
4911      * specifies an instruction that performs "result = op eax".
4912      */
4913     /* unop vA, vB */
4914     movzbl   rINSTbl,%ecx           # ecx<- A+
4915     sarl     $4,rINST             # rINST<- B
4916     GET_VREG_R %eax rINST           # eax<- vB
4917     andb     $0xf,%cl              # ecx<- A
4918     
4919     
4920     movzwl %ax,%eax
4921     SET_VREG %eax %ecx
4922     FETCH_INST_OPCODE 1 %ecx
4923     ADVANCE_PC 1
4924     GOTO_NEXT_R %ecx
4925
4926
4927 /* ------------------------------ */
4928 .L_OP_INT_TO_SHORT: /* 0x8f */
4929 /* File: x86/OP_INT_TO_SHORT.S */
4930 /* File: x86/unop.S */
4931     /*
4932      * Generic 32-bit unary operation.  Provide an "instr" line that
4933      * specifies an instruction that performs "result = op eax".
4934      */
4935     /* unop vA, vB */
4936     movzbl   rINSTbl,%ecx           # ecx<- A+
4937     sarl     $4,rINST             # rINST<- B
4938     GET_VREG_R %eax rINST           # eax<- vB
4939     andb     $0xf,%cl              # ecx<- A
4940     
4941     
4942     movswl %ax,%eax
4943     SET_VREG %eax %ecx
4944     FETCH_INST_OPCODE 1 %ecx
4945     ADVANCE_PC 1
4946     GOTO_NEXT_R %ecx
4947
4948
4949 /* ------------------------------ */
4950 .L_OP_ADD_INT: /* 0x90 */
4951 /* File: x86/OP_ADD_INT.S */
4952 /* File: x86/binop.S */
4953     /*
4954      * Generic 32-bit binary operation.  Provide an "instr" line that
4955      * specifies an instruction that performs "result = eax op (rFP,%ecx,4)".
4956      * This could be an x86 instruction or a function call.  (If the result
4957      * comes back in a register other than eax, you can override "result".)
4958      *
4959      * For: add-int, sub-int, and-int, or-int,
4960      *      xor-int, shl-int, shr-int, ushr-int
4961      */
4962     /* binop vAA, vBB, vCC */
4963     movzbl   2(rPC),%eax   # eax<- BB
4964     movzbl   3(rPC),%ecx   # ecx<- CC
4965     GET_VREG_R %eax %eax   # eax<- vBB
4966     addl (rFP,%ecx,4),%eax                 # ex: addl    (rFP,%ecx,4),%eax
4967     SET_VREG %eax rINST
4968     FETCH_INST_OPCODE 2 %ecx
4969     ADVANCE_PC 2
4970     GOTO_NEXT_R %ecx
4971
4972
4973 /* ------------------------------ */
4974 .L_OP_SUB_INT: /* 0x91 */
4975 /* File: x86/OP_SUB_INT.S */
4976 /* File: x86/binop.S */
4977     /*
4978      * Generic 32-bit binary operation.  Provide an "instr" line that
4979      * specifies an instruction that performs "result = eax op (rFP,%ecx,4)".
4980      * This could be an x86 instruction or a function call.  (If the result
4981      * comes back in a register other than eax, you can override "result".)
4982      *
4983      * For: add-int, sub-int, and-int, or-int,
4984      *      xor-int, shl-int, shr-int, ushr-int
4985      */
4986     /* binop vAA, vBB, vCC */
4987     movzbl   2(rPC),%eax   # eax<- BB
4988     movzbl   3(rPC),%ecx   # ecx<- CC
4989     GET_VREG_R %eax %eax   # eax<- vBB
4990     subl   (rFP,%ecx,4),%eax                 # ex: addl    (rFP,%ecx,4),%eax
4991     SET_VREG %eax rINST
4992     FETCH_INST_OPCODE 2 %ecx
4993     ADVANCE_PC 2
4994     GOTO_NEXT_R %ecx
4995
4996
4997 /* ------------------------------ */
4998 .L_OP_MUL_INT: /* 0x92 */
4999 /* File: x86/OP_MUL_INT.S */
5000     /*
5001      * 32-bit binary multiplication.
5002      */
5003     /* mul vAA, vBB, vCC */
5004     movzbl   2(rPC),%eax            # eax<- BB
5005     movzbl   3(rPC),%ecx            # ecx<- CC
5006     GET_VREG_R %eax %eax            # eax<- vBB
5007     SPILL(rIBASE)
5008     imull    (rFP,%ecx,4),%eax      # trashes rIBASE/edx
5009     UNSPILL(rIBASE)
5010     FETCH_INST_OPCODE 2 %ecx
5011     ADVANCE_PC 2
5012     SET_VREG %eax rINST
5013     GOTO_NEXT_R %ecx
5014
5015 /* ------------------------------ */
5016 .L_OP_DIV_INT: /* 0x93 */
5017 /* File: x86/OP_DIV_INT.S */
5018 /* File: x86/bindiv.S */
5019
5020     /*
5021      * 32-bit binary div/rem operation.  Handles special case of op0=minint and
5022      * op1=-1.
5023      */
5024     /* binop vAA, vBB, vCC */
5025     movzbl   2(rPC),%eax            # eax<- BB
5026     movzbl   3(rPC),%ecx            # ecx<- CC
5027     GET_VREG_R %eax %eax            # eax<- vBB
5028     GET_VREG_R %ecx %ecx            # eax<- vBB
5029     SPILL(rIBASE)
5030     cmpl     $0,%ecx
5031     je       common_errDivideByZero
5032     cmpl     $-1,%ecx
5033     jne      .LOP_DIV_INT_continue_div
5034     cmpl     $0x80000000,%eax
5035     jne      .LOP_DIV_INT_continue_div
5036     movl     $0x80000000,%eax
5037     SET_VREG %eax rINST
5038     UNSPILL(rIBASE)
5039     FETCH_INST_OPCODE 2 %ecx
5040     ADVANCE_PC 2
5041     GOTO_NEXT_R %ecx
5042
5043 .LOP_DIV_INT_continue_div:
5044     cltd
5045     idivl   %ecx
5046     SET_VREG %eax rINST
5047     UNSPILL(rIBASE)
5048     FETCH_INST_OPCODE 2 %ecx
5049     ADVANCE_PC 2
5050     GOTO_NEXT_R %ecx
5051
5052
5053 /* ------------------------------ */
5054 .L_OP_REM_INT: /* 0x94 */
5055 /* File: x86/OP_REM_INT.S */
5056 /* File: x86/bindiv.S */
5057
5058     /*
5059      * 32-bit binary div/rem operation.  Handles special case of op0=minint and
5060      * op1=-1.
5061      */
5062     /* binop vAA, vBB, vCC */
5063     movzbl   2(rPC),%eax            # eax<- BB
5064     movzbl   3(rPC),%ecx            # ecx<- CC
5065     GET_VREG_R %eax %eax            # eax<- vBB
5066     GET_VREG_R %ecx %ecx            # eax<- vBB
5067     SPILL(rIBASE)
5068     cmpl     $0,%ecx
5069     je       common_errDivideByZero
5070     cmpl     $-1,%ecx
5071     jne      .LOP_REM_INT_continue_div
5072     cmpl     $0x80000000,%eax
5073     jne      .LOP_REM_INT_continue_div
5074     movl     $0,rIBASE
5075     SET_VREG rIBASE rINST
5076     UNSPILL(rIBASE)
5077     FETCH_INST_OPCODE 2 %ecx
5078     ADVANCE_PC 2
5079     GOTO_NEXT_R %ecx
5080
5081 .LOP_REM_INT_continue_div:
5082     cltd
5083     idivl   %ecx
5084     SET_VREG rIBASE rINST
5085     UNSPILL(rIBASE)
5086     FETCH_INST_OPCODE 2 %ecx
5087     ADVANCE_PC 2
5088     GOTO_NEXT_R %ecx
5089
5090
5091 /* ------------------------------ */
5092 .L_OP_AND_INT: /* 0x95 */
5093 /* File: x86/OP_AND_INT.S */
5094 /* File: x86/binop.S */
5095     /*
5096      * Generic 32-bit binary operation.  Provide an "instr" line that
5097      * specifies an instruction that performs "result = eax op (rFP,%ecx,4)".
5098      * This could be an x86 instruction or a function call.  (If the result
5099      * comes back in a register other than eax, you can override "result".)
5100      *
5101      * For: add-int, sub-int, and-int, or-int,
5102      *      xor-int, shl-int, shr-int, ushr-int
5103      */
5104     /* binop vAA, vBB, vCC */
5105     movzbl   2(rPC),%eax   # eax<- BB
5106     movzbl   3(rPC),%ecx   # ecx<- CC
5107     GET_VREG_R %eax %eax   # eax<- vBB
5108     andl   (rFP,%ecx,4),%eax                 # ex: addl    (rFP,%ecx,4),%eax
5109     SET_VREG %eax rINST
5110     FETCH_INST_OPCODE 2 %ecx
5111     ADVANCE_PC 2
5112     GOTO_NEXT_R %ecx
5113
5114
5115 /* ------------------------------ */
5116 .L_OP_OR_INT: /* 0x96 */
5117 /* File: x86/OP_OR_INT.S */
5118 /* File: x86/binop.S */
5119     /*
5120      * Generic 32-bit binary operation.  Provide an "instr" line that
5121      * specifies an instruction that performs "result = eax op (rFP,%ecx,4)".
5122      * This could be an x86 instruction or a function call.  (If the result
5123      * comes back in a register other than eax, you can override "result".)
5124      *
5125      * For: add-int, sub-int, and-int, or-int,
5126      *      xor-int, shl-int, shr-int, ushr-int
5127      */
5128     /* binop vAA, vBB, vCC */
5129     movzbl   2(rPC),%eax   # eax<- BB
5130     movzbl   3(rPC),%ecx   # ecx<- CC
5131     GET_VREG_R %eax %eax   # eax<- vBB
5132     orl   (rFP,%ecx,4),%eax                 # ex: addl    (rFP,%ecx,4),%eax
5133     SET_VREG %eax rINST
5134     FETCH_INST_OPCODE 2 %ecx
5135     ADVANCE_PC 2
5136     GOTO_NEXT_R %ecx
5137
5138
5139 /* ------------------------------ */
5140 .L_OP_XOR_INT: /* 0x97 */
5141 /* File: x86/OP_XOR_INT.S */
5142 /* File: x86/binop.S */
5143     /*
5144      * Generic 32-bit binary operation.  Provide an "instr" line that
5145      * specifies an instruction that performs "result = eax op (rFP,%ecx,4)".
5146      * This could be an x86 instruction or a function call.  (If the result
5147      * comes back in a register other than eax, you can override "result".)
5148      *
5149      * For: add-int, sub-int, and-int, or-int,
5150      *      xor-int, shl-int, shr-int, ushr-int
5151      */
5152     /* binop vAA, vBB, vCC */
5153     movzbl   2(rPC),%eax   # eax<- BB
5154     movzbl   3(rPC),%ecx   # ecx<- CC
5155     GET_VREG_R %eax %eax   # eax<- vBB
5156     xorl   (rFP,%ecx,4),%eax                 # ex: addl    (rFP,%ecx,4),%eax
5157     SET_VREG %eax rINST
5158     FETCH_INST_OPCODE 2 %ecx
5159     ADVANCE_PC 2
5160     GOTO_NEXT_R %ecx
5161
5162
5163 /* ------------------------------ */
5164 .L_OP_SHL_INT: /* 0x98 */
5165 /* File: x86/OP_SHL_INT.S */
5166 /* File: x86/binop1.S */
5167     /*
5168      * Generic 32-bit binary operation in which both operands loaded to
5169      * registers (op0 in eax, op1 in ecx).
5170      */
5171     /* binop vAA, vBB, vCC */
5172     movzbl   2(rPC),%eax            # eax<- BB
5173     movzbl   3(rPC),%ecx            # ecx<- CC
5174     GET_VREG_R %eax %eax            # eax<- vBB
5175     GET_VREG_R %ecx %ecx            # eax<- vBB
5176     sall    %cl,%eax                          # ex: addl    %ecx,%eax
5177     SET_VREG %eax rINST
5178     FETCH_INST_OPCODE 2 %ecx
5179     ADVANCE_PC 2
5180     GOTO_NEXT_R %ecx
5181
5182
5183 /* ------------------------------ */
5184 .L_OP_SHR_INT: /* 0x99 */
5185 /* File: x86/OP_SHR_INT.S */
5186 /* File: x86/binop1.S */
5187     /*
5188      * Generic 32-bit binary operation in which both operands loaded to
5189      * registers (op0 in eax, op1 in ecx).
5190      */
5191     /* binop vAA, vBB, vCC */
5192     movzbl   2(rPC),%eax            # eax<- BB
5193     movzbl   3(rPC),%ecx            # ecx<- CC
5194     GET_VREG_R %eax %eax            # eax<- vBB
5195     GET_VREG_R %ecx %ecx            # eax<- vBB
5196     sarl    %cl,%eax                          # ex: addl    %ecx,%eax
5197     SET_VREG %eax rINST
5198     FETCH_INST_OPCODE 2 %ecx
5199     ADVANCE_PC 2
5200     GOTO_NEXT_R %ecx
5201
5202
5203 /* ------------------------------ */
5204 .L_OP_USHR_INT: /* 0x9a */
5205 /* File: x86/OP_USHR_INT.S */
5206 /* File: x86/binop1.S */
5207     /*
5208      * Generic 32-bit binary operation in which both operands loaded to
5209      * registers (op0 in eax, op1 in ecx).
5210      */
5211     /* binop vAA, vBB, vCC */
5212     movzbl   2(rPC),%eax            # eax<- BB
5213     movzbl   3(rPC),%ecx            # ecx<- CC
5214     GET_VREG_R %eax %eax            # eax<- vBB
5215     GET_VREG_R %ecx %ecx            # eax<- vBB
5216     shrl    %cl,%eax                          # ex: addl    %ecx,%eax
5217     SET_VREG %eax rINST
5218     FETCH_INST_OPCODE 2 %ecx
5219     ADVANCE_PC 2
5220     GOTO_NEXT_R %ecx
5221
5222
5223 /* ------------------------------ */
5224 .L_OP_ADD_LONG: /* 0x9b */
5225 /* File: x86/OP_ADD_LONG.S */
5226 /* File: x86/binopWide.S */
5227     /*
5228      * Generic 64-bit binary operation.
5229      */
5230     /* binop vAA, vBB, vCC */
5231
5232     movzbl    2(rPC),%eax               # eax<- BB
5233     movzbl    3(rPC),%ecx               # ecx<- CC
5234     SPILL(rIBASE)                       # save rIBASE
5235     GET_VREG_WORD rIBASE %eax 0         # rIBASE<- v[BB+0]
5236     GET_VREG_WORD %eax %eax 1           # eax<- v[BB+1]
5237     addl (rFP,%ecx,4),rIBASE         # ex: addl   (rFP,%ecx,4),rIBASE
5238     adcl 4(rFP,%ecx,4),%eax         # ex: adcl   4(rFP,%ecx,4),%eax
5239     SET_VREG_WORD rIBASE rINST 0        # v[AA+0] <- rIBASE
5240     FETCH_INST_OPCODE 2 %ecx
5241     UNSPILL(rIBASE)                     # restore rIBASE
5242     SET_VREG_WORD %eax rINST 1          # v[AA+1] <- eax
5243     ADVANCE_PC 2
5244     GOTO_NEXT_R %ecx
5245
5246
5247 /* ------------------------------ */
5248 .L_OP_SUB_LONG: /* 0x9c */
5249 /* File: x86/OP_SUB_LONG.S */
5250 /* File: x86/binopWide.S */
5251     /*
5252      * Generic 64-bit binary operation.
5253      */
5254     /* binop vAA, vBB, vCC */
5255
5256     movzbl    2(rPC),%eax               # eax<- BB
5257     movzbl    3(rPC),%ecx               # ecx<- CC
5258     SPILL(rIBASE)                       # save rIBASE
5259     GET_VREG_WORD rIBASE %eax 0         # rIBASE<- v[BB+0]
5260     GET_VREG_WORD %eax %eax 1           # eax<- v[BB+1]
5261     subl (rFP,%ecx,4),rIBASE         # ex: addl   (rFP,%ecx,4),rIBASE
5262     sbbl 4(rFP,%ecx,4),%eax         # ex: adcl   4(rFP,%ecx,4),%eax
5263     SET_VREG_WORD rIBASE rINST 0        # v[AA+0] <- rIBASE
5264     FETCH_INST_OPCODE 2 %ecx
5265     UNSPILL(rIBASE)                     # restore rIBASE
5266     SET_VREG_WORD %eax rINST 1          # v[AA+1] <- eax
5267     ADVANCE_PC 2
5268     GOTO_NEXT_R %ecx
5269
5270
5271 /* ------------------------------ */
5272 .L_OP_MUL_LONG: /* 0x9d */
5273 /* File: x86/OP_MUL_LONG.S */
5274     /*
5275      * Signed 64-bit integer multiply.
5276      *
5277      * We could definately use more free registers for
5278      * this code.   We spill rINSTw (ebx),
5279      * giving us eax, ebc, ecx and edx as computational
5280      * temps.  On top of that, we'll spill edi (rFP)
5281      * for use as the vB pointer and esi (rPC) for use
5282      * as the vC pointer.  Yuck.
5283      */
5284     /* mul-long vAA, vBB, vCC */
5285     movzbl    2(rPC),%eax              # eax<- B
5286     movzbl    3(rPC),%ecx              # ecx<- C
5287     SPILL_TMP2(%esi)                   # save Dalvik PC
5288     SPILL(rFP)
5289     SPILL(rINST)
5290     SPILL(rIBASE)
5291     leal      (rFP,%eax,4),%esi        # esi<- &v[B]
5292     leal      (rFP,%ecx,4),rFP         # rFP<- &v[C]
5293     movl      4(%esi),%ecx             # ecx<- Bmsw
5294     imull     (rFP),%ecx               # ecx<- (Bmsw*Clsw)
5295     movl      4(rFP),%eax              # eax<- Cmsw
5296     imull     (%esi),%eax              # eax<- (Cmsw*Blsw)
5297     addl      %eax,%ecx                # ecx<- (Bmsw*Clsw)+(Cmsw*Blsw)
5298     movl      (rFP),%eax               # eax<- Clsw
5299     mull      (%esi)                   # eax<- (Clsw*Alsw)
5300     UNSPILL(rINST)
5301     UNSPILL(rFP)
5302     leal      (%ecx,rIBASE),rIBASE # full result now in rIBASE:%eax
5303     UNSPILL_TMP2(%esi)             # Restore Dalvik PC
5304     FETCH_INST_OPCODE 2 %ecx       # Fetch next instruction
5305     movl      rIBASE,4(rFP,rINST,4)# v[B+1]<- rIBASE
5306     UNSPILL(rIBASE)
5307     movl      %eax,(rFP,rINST,4)   # v[B]<- %eax
5308     ADVANCE_PC 2
5309     GOTO_NEXT_R %ecx
5310
5311 /* ------------------------------ */
5312 .L_OP_DIV_LONG: /* 0x9e */
5313 /* File: x86/OP_DIV_LONG.S */
5314     /* div vAA, vBB, vCC */
5315     movzbl    3(rPC),%eax              # eax<- CC
5316     movzbl    2(rPC),%ecx              # ecx<- BB
5317     SPILL(rIBASE)                      # save rIBASE/%edx
5318     GET_VREG_WORD rIBASE %eax 0
5319     GET_VREG_WORD %eax %eax 1
5320     movl     rIBASE,OUT_ARG2(%esp)
5321     testl    %eax,%eax
5322     je       .LOP_DIV_LONG_check_zero
5323     cmpl     $-1,%eax
5324     je       .LOP_DIV_LONG_check_neg1
5325 .LOP_DIV_LONG_notSpecial:
5326     GET_VREG_WORD rIBASE %ecx 0
5327     GET_VREG_WORD %ecx %ecx 1
5328 .LOP_DIV_LONG_notSpecial1:
5329     movl     %eax,OUT_ARG3(%esp)
5330     movl     rIBASE,OUT_ARG0(%esp)
5331     movl     %ecx,OUT_ARG1(%esp)
5332     call     __divdi3
5333 .LOP_DIV_LONG_finish:
5334     SET_VREG_WORD rIBASE rINST 1
5335     UNSPILL(rIBASE)                 # restore rIBASE/%edx
5336     SET_VREG_WORD %eax rINST 0
5337     FETCH_INST_OPCODE 2 %ecx
5338     ADVANCE_PC 2
5339     GOTO_NEXT_R %ecx
5340
5341 .LOP_DIV_LONG_check_zero:
5342     testl   rIBASE,rIBASE
5343     jne     .LOP_DIV_LONG_notSpecial
5344     jmp     common_errDivideByZero
5345 .LOP_DIV_LONG_check_neg1:
5346     testl   rIBASE,%eax
5347     jne     .LOP_DIV_LONG_notSpecial
5348     GET_VREG_WORD rIBASE %ecx 0
5349     GET_VREG_WORD %ecx %ecx 1
5350     testl    rIBASE,rIBASE
5351     jne      .LOP_DIV_LONG_notSpecial1
5352     cmpl     $0x80000000,%ecx
5353     jne      .LOP_DIV_LONG_notSpecial1
5354     /* minint / -1, return minint on div, 0 on rem */
5355     xorl     %eax,%eax
5356     movl     $0x80000000,rIBASE
5357     jmp      .LOP_DIV_LONG_finish
5358
5359 /* ------------------------------ */
5360 .L_OP_REM_LONG: /* 0x9f */
5361 /* File: x86/OP_REM_LONG.S */
5362 /* File: x86/OP_DIV_LONG.S */
5363     /* div vAA, vBB, vCC */
5364     movzbl    3(rPC),%eax              # eax<- CC
5365     movzbl    2(rPC),%ecx              # ecx<- BB
5366     SPILL(rIBASE)                      # save rIBASE/%edx
5367     GET_VREG_WORD rIBASE %eax 0
5368     GET_VREG_WORD %eax %eax 1
5369     movl     rIBASE,OUT_ARG2(%esp)
5370     testl    %eax,%eax
5371     je       .LOP_REM_LONG_check_zero
5372     cmpl     $-1,%eax
5373     je       .LOP_REM_LONG_check_neg1
5374 .LOP_REM_LONG_notSpecial:
5375     GET_VREG_WORD rIBASE %ecx 0
5376     GET_VREG_WORD %ecx %ecx 1
5377 .LOP_REM_LONG_notSpecial1:
5378     movl     %eax,OUT_ARG3(%esp)
5379     movl     rIBASE,OUT_ARG0(%esp)
5380     movl     %ecx,OUT_ARG1(%esp)
5381     call     __moddi3
5382 .LOP_REM_LONG_finish:
5383     SET_VREG_WORD rIBASE rINST 1
5384     UNSPILL(rIBASE)                 # restore rIBASE/%edx
5385     SET_VREG_WORD %eax rINST 0
5386     FETCH_INST_OPCODE 2 %ecx
5387     ADVANCE_PC 2
5388     GOTO_NEXT_R %ecx
5389
5390 .LOP_REM_LONG_check_zero:
5391     testl   rIBASE,rIBASE
5392     jne     .LOP_REM_LONG_notSpecial
5393     jmp     common_errDivideByZero
5394 .LOP_REM_LONG_check_neg1:
5395     testl   rIBASE,%eax
5396     jne     .LOP_REM_LONG_notSpecial
5397     GET_VREG_WORD rIBASE %ecx 0
5398     GET_VREG_WORD %ecx %ecx 1
5399     testl    rIBASE,rIBASE
5400     jne      .LOP_REM_LONG_notSpecial1
5401     cmpl     $0x80000000,%ecx
5402     jne      .LOP_REM_LONG_notSpecial1
5403     /* minint / -1, return minint on div, 0 on rem */
5404     xorl     %eax,%eax
5405     movl     $0,rIBASE
5406     jmp      .LOP_REM_LONG_finish
5407
5408
5409 /* ------------------------------ */
5410 .L_OP_AND_LONG: /* 0xa0 */
5411 /* File: x86/OP_AND_LONG.S */
5412 /* File: x86/binopWide.S */
5413     /*
5414      * Generic 64-bit binary operation.
5415      */
5416     /* binop vAA, vBB, vCC */
5417
5418     movzbl    2(rPC),%eax               # eax<- BB
5419     movzbl    3(rPC),%ecx               # ecx<- CC
5420     SPILL(rIBASE)                       # save rIBASE
5421     GET_VREG_WORD rIBASE %eax 0         # rIBASE<- v[BB+0]
5422     GET_VREG_WORD %eax %eax 1           # eax<- v[BB+1]
5423     andl (rFP,%ecx,4),rIBASE         # ex: addl   (rFP,%ecx,4),rIBASE
5424     andl 4(rFP,%ecx,4),%eax         # ex: adcl   4(rFP,%ecx,4),%eax
5425     SET_VREG_WORD rIBASE rINST 0        # v[AA+0] <- rIBASE
5426     FETCH_INST_OPCODE 2 %ecx
5427     UNSPILL(rIBASE)                     # restore rIBASE
5428     SET_VREG_WORD %eax rINST 1          # v[AA+1] <- eax
5429     ADVANCE_PC 2
5430     GOTO_NEXT_R %ecx
5431
5432
5433 /* ------------------------------ */
5434 .L_OP_OR_LONG: /* 0xa1 */
5435 /* File: x86/OP_OR_LONG.S */
5436 /* File: x86/binopWide.S */
5437     /*
5438      * Generic 64-bit binary operation.
5439      */
5440     /* binop vAA, vBB, vCC */
5441
5442     movzbl    2(rPC),%eax               # eax<- BB
5443     movzbl    3(rPC),%ecx               # ecx<- CC
5444     SPILL(rIBASE)                       # save rIBASE
5445     GET_VREG_WORD rIBASE %eax 0         # rIBASE<- v[BB+0]
5446     GET_VREG_WORD %eax %eax 1           # eax<- v[BB+1]
5447     orl (rFP,%ecx,4),rIBASE         # ex: addl   (rFP,%ecx,4),rIBASE
5448     orl 4(rFP,%ecx,4),%eax         # ex: adcl   4(rFP,%ecx,4),%eax
5449     SET_VREG_WORD rIBASE rINST 0        # v[AA+0] <- rIBASE
5450     FETCH_INST_OPCODE 2 %ecx
5451     UNSPILL(rIBASE)                     # restore rIBASE
5452     SET_VREG_WORD %eax rINST 1          # v[AA+1] <- eax
5453     ADVANCE_PC 2
5454     GOTO_NEXT_R %ecx
5455
5456
5457 /* ------------------------------ */
5458 .L_OP_XOR_LONG: /* 0xa2 */
5459 /* File: x86/OP_XOR_LONG.S */
5460 /* File: x86/binopWide.S */
5461     /*
5462      * Generic 64-bit binary operation.
5463      */
5464     /* binop vAA, vBB, vCC */
5465
5466     movzbl    2(rPC),%eax               # eax<- BB
5467     movzbl    3(rPC),%ecx               # ecx<- CC
5468     SPILL(rIBASE)                       # save rIBASE
5469     GET_VREG_WORD rIBASE %eax 0         # rIBASE<- v[BB+0]
5470     GET_VREG_WORD %eax %eax 1           # eax<- v[BB+1]
5471     xorl (rFP,%ecx,4),rIBASE         # ex: addl   (rFP,%ecx,4),rIBASE
5472     xorl 4(rFP,%ecx,4),%eax         # ex: adcl   4(rFP,%ecx,4),%eax
5473     SET_VREG_WORD rIBASE rINST 0        # v[AA+0] <- rIBASE
5474     FETCH_INST_OPCODE 2 %ecx
5475     UNSPILL(rIBASE)                     # restore rIBASE
5476     SET_VREG_WORD %eax rINST 1          # v[AA+1] <- eax
5477     ADVANCE_PC 2
5478     GOTO_NEXT_R %ecx
5479
5480
5481 /* ------------------------------ */
5482 .L_OP_SHL_LONG: /* 0xa3 */
5483 /* File: x86/OP_SHL_LONG.S */
5484     /*
5485      * Long integer shift.  This is different from the generic 32/64-bit
5486      * binary operations because vAA/vBB are 64-bit but vCC (the shift
5487      * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
5488      * 6 bits of the shift distance.  x86 shifts automatically mask off
5489      * the low 5 bits of %cl, so have to handle the 64 > shiftcount > 31
5490      * case specially.
5491      */
5492     /* shl-long vAA, vBB, vCC */
5493     /* ecx gets shift count */
5494     /* Need to spill rINST */
5495     /* rINSTw gets AA */
5496     movzbl    2(rPC),%eax               # eax<- BB
5497     movzbl    3(rPC),%ecx               # ecx<- CC
5498     SPILL(rIBASE)
5499     GET_VREG_WORD rIBASE %eax 1         # ecx<- v[BB+1]
5500     GET_VREG_R   %ecx %ecx              # ecx<- vCC
5501     GET_VREG_WORD %eax %eax 0           # eax<- v[BB+0]
5502     shldl     %eax,rIBASE
5503     sall      %cl,%eax
5504     testb     $32,%cl
5505     je        2f
5506     movl      %eax,rIBASE
5507     xorl      %eax,%eax
5508 2:
5509     SET_VREG_WORD rIBASE rINST 1        # v[AA+1]<- rIBASE
5510     FETCH_INST_OPCODE 2 %ecx
5511     UNSPILL(rIBASE)
5512     SET_VREG_WORD %eax rINST 0          # v[AA+0]<- %eax
5513     ADVANCE_PC 2
5514     GOTO_NEXT_R %ecx
5515
5516 /* ------------------------------ */
5517 .L_OP_SHR_LONG: /* 0xa4 */
5518 /* File: x86/OP_SHR_LONG.S */
5519     /*
5520      * Long integer shift.  This is different from the generic 32/64-bit
5521      * binary operations because vAA/vBB are 64-bit but vCC (the shift
5522      * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
5523      * 6 bits of the shift distance.  x86 shifts automatically mask off
5524      * the low 5 bits of %cl, so have to handle the 64 > shiftcount > 31
5525      * case specially.
5526      */
5527     /* shr-long vAA, vBB, vCC */
5528     /* ecx gets shift count */
5529     /* Need to spill rIBASE */
5530     /* rINSTw gets AA */
5531     movzbl    2(rPC),%eax               # eax<- BB
5532     movzbl    3(rPC),%ecx               # ecx<- CC
5533     SPILL(rIBASE)
5534     GET_VREG_WORD rIBASE %eax 1         # rIBASE<- v[BB+1]
5535     GET_VREG_R   %ecx %ecx              # ecx<- vCC
5536     GET_VREG_WORD %eax %eax 0           # eax<- v[BB+0]
5537     shrdl     rIBASE,%eax
5538     sarl      %cl,rIBASE
5539     testb     $32,%cl
5540     je        2f
5541     movl      rIBASE,%eax
5542     sarl      $31,rIBASE
5543 2:
5544     SET_VREG_WORD rIBASE rINST 1        # v[AA+1]<- rIBASE
5545     FETCH_INST_OPCODE 2 %ecx
5546     UNSPILL(rIBASE)
5547     SET_VREG_WORD %eax rINST 0          # v[AA+0]<- eax
5548     ADVANCE_PC 2
5549     GOTO_NEXT_R %ecx
5550
5551 /* ------------------------------ */
5552 .L_OP_USHR_LONG: /* 0xa5 */
5553 /* File: x86/OP_USHR_LONG.S */
5554     /*
5555      * Long integer shift.  This is different from the generic 32/64-bit
5556      * binary operations because vAA/vBB are 64-bit but vCC (the shift
5557      * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
5558      * 6 bits of the shift distance.  x86 shifts automatically mask off
5559      * the low 5 bits of %cl, so have to handle the 64 > shiftcount > 31
5560      * case specially.
5561      */
5562     /* shr-long vAA, vBB, vCC */
5563     /* ecx gets shift count */
5564     /* Need to spill rIBASE */
5565     /* rINSTw gets AA */
5566     movzbl    2(rPC),%eax               # eax<- BB
5567     movzbl    3(rPC),%ecx               # ecx<- CC
5568     SPILL(rIBASE)
5569     GET_VREG_WORD rIBASE %eax 1         # rIBASE<- v[BB+1]
5570     GET_VREG_R  %ecx %ecx               # ecx<- vCC
5571     GET_VREG_WORD %eax %eax 0           # eax<- v[BB+0]
5572     shrdl     rIBASE,%eax
5573     shrl      %cl,rIBASE
5574     testb     $32,%cl
5575     je        2f
5576     movl      rIBASE,%eax
5577     xorl      rIBASE,rIBASE
5578 2:
5579     SET_VREG_WORD rIBASE rINST 1          # v[AA+1]<- rIBASE
5580     FETCH_INST_OPCODE 2 %ecx
5581     UNSPILL(rIBASE)
5582     SET_VREG_WORD %eax rINST 0         # v[BB+0]<- eax
5583     ADVANCE_PC 2
5584     GOTO_NEXT_R %ecx
5585
5586 /* ------------------------------ */
5587 .L_OP_ADD_FLOAT: /* 0xa6 */
5588 /* File: x86/OP_ADD_FLOAT.S */
5589 /* File: x86/binflop.S */
5590     /*
5591      * Generic 32-bit binary float operation.
5592      *
5593      * For: add-fp, sub-fp, mul-fp, div-fp
5594      */
5595     /* binop vAA, vBB, vCC */
5596     movzbl   2(rPC),%eax          # eax<- CC
5597     movzbl   3(rPC),%ecx          # ecx<- BB
5598     flds    (rFP,%eax,4)         # vCC to fp stack
5599     fadds   (rFP,%ecx,4)         # ex: faddp
5600     FETCH_INST_OPCODE 2 %ecx
5601     ADVANCE_PC 2
5602     fstps   (rFP,rINST,4)         # %st to vAA
5603     GOTO_NEXT_R %ecx
5604
5605
5606 /* ------------------------------ */
5607 .L_OP_SUB_FLOAT: /* 0xa7 */
5608 /* File: x86/OP_SUB_FLOAT.S */
5609 /* File: x86/binflop.S */
5610     /*
5611      * Generic 32-bit binary float operation.
5612      *
5613      * For: add-fp, sub-fp, mul-fp, div-fp
5614      */
5615     /* binop vAA, vBB, vCC */
5616     movzbl   2(rPC),%eax          # eax<- CC
5617     movzbl   3(rPC),%ecx          # ecx<- BB
5618     flds    (rFP,%eax,4)         # vCC to fp stack
5619     fsubs   (rFP,%ecx,4)         # ex: faddp
5620     FETCH_INST_OPCODE 2 %ecx
5621     ADVANCE_PC 2
5622     fstps   (rFP,rINST,4)         # %st to vAA
5623     GOTO_NEXT_R %ecx
5624
5625
5626 /* ------------------------------ */
5627 .L_OP_MUL_FLOAT: /* 0xa8 */
5628 /* File: x86/OP_MUL_FLOAT.S */
5629 /* File: x86/binflop.S */
5630     /*
5631      * Generic 32-bit binary float operation.
5632      *
5633      * For: add-fp, sub-fp, mul-fp, div-fp
5634      */
5635     /* binop vAA, vBB, vCC */
5636     movzbl   2(rPC),%eax          # eax<- CC
5637     movzbl   3(rPC),%ecx          # ecx<- BB
5638     flds    (rFP,%eax,4)         # vCC to fp stack
5639     fmuls   (rFP,%ecx,4)         # ex: faddp
5640     FETCH_INST_OPCODE 2 %ecx
5641     ADVANCE_PC 2
5642     fstps   (rFP,rINST,4)         # %st to vAA
5643     GOTO_NEXT_R %ecx
5644
5645
5646 /* ------------------------------ */
5647 .L_OP_DIV_FLOAT: /* 0xa9 */
5648 /* File: x86/OP_DIV_FLOAT.S */
5649 /* File: x86/binflop.S */
5650     /*
5651      * Generic 32-bit binary float operation.
5652      *
5653      * For: add-fp, sub-fp, mul-fp, div-fp
5654      */
5655     /* binop vAA, vBB, vCC */
5656     movzbl   2(rPC),%eax          # eax<- CC
5657     movzbl   3(rPC),%ecx          # ecx<- BB
5658     flds    (rFP,%eax,4)         # vCC to fp stack
5659     fdivs   (rFP,%ecx,4)         # ex: faddp
5660     FETCH_INST_OPCODE 2 %ecx
5661     ADVANCE_PC 2
5662     fstps   (rFP,rINST,4)         # %st to vAA
5663     GOTO_NEXT_R %ecx
5664
5665
5666 /* ------------------------------ */
5667 .L_OP_REM_FLOAT: /* 0xaa */
5668 /* File: x86/OP_REM_FLOAT.S */
5669     /* rem_float vAA, vBB, vCC */
5670     movzbl   3(rPC),%ecx            # ecx<- BB
5671     movzbl   2(rPC),%eax            # eax<- CC
5672     flds     (rFP,%ecx,4)           # vCC to fp stack
5673     flds     (rFP,%eax,4)           # vCC to fp stack
5674     movzbl   rINSTbl,%ecx           # ecx<- AA
5675 1:
5676     fprem
5677     fstsw     %ax
5678     sahf
5679     jp        1b
5680     fstp      %st(1)
5681     FETCH_INST_OPCODE 2 %eax
5682     ADVANCE_PC 2
5683     fstps    (rFP,%ecx,4)           # %st to vAA
5684     GOTO_NEXT_R %eax
5685
5686 /* ------------------------------ */
5687 .L_OP_ADD_DOUBLE: /* 0xab */
5688 /* File: x86/OP_ADD_DOUBLE.S */
5689 /* File: x86/binflop.S */
5690     /*
5691      * Generic 32-bit binary float operation.
5692      *
5693      * For: add-fp, sub-fp, mul-fp, div-fp
5694      */
5695     /* binop vAA, vBB, vCC */
5696     movzbl   2(rPC),%eax          # eax<- CC
5697     movzbl   3(rPC),%ecx          # ecx<- BB
5698     fldl    (rFP,%eax,4)         # vCC to fp stack
5699     faddl   (rFP,%ecx,4)         # ex: faddp
5700     FETCH_INST_OPCODE 2 %ecx
5701     ADVANCE_PC 2
5702     fstpl   (rFP,rINST,4)         # %st to vAA
5703     GOTO_NEXT_R %ecx
5704
5705
5706 /* ------------------------------ */
5707 .L_OP_SUB_DOUBLE: /* 0xac */
5708 /* File: x86/OP_SUB_DOUBLE.S */
5709 /* File: x86/binflop.S */
5710     /*
5711      * Generic 32-bit binary float operation.
5712      *
5713      * For: add-fp, sub-fp, mul-fp, div-fp
5714      */
5715     /* binop vAA, vBB, vCC */
5716     movzbl   2(rPC),%eax          # eax<- CC
5717     movzbl   3(rPC),%ecx          # ecx<- BB
5718     fldl    (rFP,%eax,4)         # vCC to fp stack
5719     fsubl   (rFP,%ecx,4)         # ex: faddp
5720     FETCH_INST_OPCODE 2 %ecx
5721     ADVANCE_PC 2
5722     fstpl   (rFP,rINST,4)         # %st to vAA
5723     GOTO_NEXT_R %ecx
5724
5725
5726 /* ------------------------------ */
5727 .L_OP_MUL_DOUBLE: /* 0xad */
5728 /* File: x86/OP_MUL_DOUBLE.S */
5729 /* File: x86/binflop.S */
5730     /*
5731      * Generic 32-bit binary float operation.
5732      *
5733      * For: add-fp, sub-fp, mul-fp, div-fp
5734      */
5735     /* binop vAA, vBB, vCC */
5736     movzbl   2(rPC),%eax          # eax<- CC
5737     movzbl   3(rPC),%ecx          # ecx<- BB
5738     fldl    (rFP,%eax,4)         # vCC to fp stack
5739     fmull   (rFP,%ecx,4)         # ex: faddp
5740     FETCH_INST_OPCODE 2 %ecx
5741     ADVANCE_PC 2
5742     fstpl   (rFP,rINST,4)         # %st to vAA
5743     GOTO_NEXT_R %ecx
5744
5745
5746 /* ------------------------------ */
5747 .L_OP_DIV_DOUBLE: /* 0xae */
5748 /* File: x86/OP_DIV_DOUBLE.S */
5749 /* File: x86/binflop.S */
5750     /*
5751      * Generic 32-bit binary float operation.
5752      *
5753      * For: add-fp, sub-fp, mul-fp, div-fp
5754      */
5755     /* binop vAA, vBB, vCC */
5756     movzbl   2(rPC),%eax          # eax<- CC
5757     movzbl   3(rPC),%ecx          # ecx<- BB
5758     fldl    (rFP,%eax,4)         # vCC to fp stack
5759     fdivl   (rFP,%ecx,4)         # ex: faddp
5760     FETCH_INST_OPCODE 2 %ecx
5761     ADVANCE_PC 2
5762     fstpl   (rFP,rINST,4)         # %st to vAA
5763     GOTO_NEXT_R %ecx
5764
5765
5766 /* ------------------------------ */
5767 .L_OP_REM_DOUBLE: /* 0xaf */
5768 /* File: x86/OP_REM_DOUBLE.S */
5769     /* rem_float vAA, vBB, vCC */
5770     movzbl   3(rPC),%ecx            # ecx<- BB
5771     movzbl   2(rPC),%eax            # eax<- CC
5772     fldl     (rFP,%ecx,4)           # vCC to fp stack
5773     fldl     (rFP,%eax,4)           # vCC to fp stack
5774     FETCH_INST_OPCODE 2 %ecx
5775 1:
5776     fprem
5777     fstsw     %ax
5778     sahf
5779     jp        1b
5780     fstp      %st(1)
5781     ADVANCE_PC 2
5782     fstpl    (rFP,rINST,4)           # %st to vAA
5783     GOTO_NEXT_R %ecx
5784
5785 /* ------------------------------ */
5786 .L_OP_ADD_INT_2ADDR: /* 0xb0 */
5787 /* File: x86/OP_ADD_INT_2ADDR.S */
5788 /* File: x86/binop2addr.S */
5789     /*
5790      * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5791      * that specifies an instruction that performs "result = r0 op r1".
5792      * This could be an ARM instruction or a function call.  (If the result
5793      * comes back in a register other than r0, you can override "result".)
5794      *
5795      * If "chkzero" is set to 1, we perform a divide-by-zero check on
5796      * vCC (r1).  Useful for integer division and modulus.
5797      *
5798      * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5799      *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5800      *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5801      *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5802      */
5803     /* binop/2addr vA, vB */
5804     movzx   rINSTbl,%ecx               # ecx<- A+
5805     sarl    $4,rINST                 # rINST<- B
5806     GET_VREG_R %eax rINST              # eax<- vB
5807     andb    $0xf,%cl                  # ecx<- A
5808     addl     %eax,(rFP,%ecx,4)                             # for ex: addl   %eax,(rFP,%ecx,4)
5809     FETCH_INST_OPCODE 1 %ecx
5810     ADVANCE_PC 1
5811     GOTO_NEXT_R %ecx
5812
5813
5814 /* ------------------------------ */
5815 .L_OP_SUB_INT_2ADDR: /* 0xb1 */
5816 /* File: x86/OP_SUB_INT_2ADDR.S */
5817 /* File: x86/binop2addr.S */
5818     /*
5819      * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5820      * that specifies an instruction that performs "result = r0 op r1".
5821      * This could be an ARM instruction or a function call.  (If the result
5822      * comes back in a register other than r0, you can override "result".)
5823      *
5824      * If "chkzero" is set to 1, we perform a divide-by-zero check on
5825      * vCC (r1).  Useful for integer division and modulus.
5826      *
5827      * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5828      *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5829      *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5830      *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5831      */
5832     /* binop/2addr vA, vB */
5833     movzx   rINSTbl,%ecx               # ecx<- A+
5834     sarl    $4,rINST                 # rINST<- B
5835     GET_VREG_R %eax rINST              # eax<- vB
5836     andb    $0xf,%cl                  # ecx<- A
5837     subl     %eax,(rFP,%ecx,4)                             # for ex: addl   %eax,(rFP,%ecx,4)
5838     FETCH_INST_OPCODE 1 %ecx
5839     ADVANCE_PC 1
5840     GOTO_NEXT_R %ecx
5841
5842
5843 /* ------------------------------ */
5844 .L_OP_MUL_INT_2ADDR: /* 0xb2 */
5845 /* File: x86/OP_MUL_INT_2ADDR.S */
5846     /* mul vA, vB */
5847     movzx   rINSTbl,%ecx              # ecx<- A+
5848     sarl    $4,rINST                 # rINST<- B
5849     GET_VREG_R %eax rINST             # eax<- vB
5850     andb    $0xf,%cl                 # ecx<- A
5851     SPILL(rIBASE)
5852     imull   (rFP,%ecx,4),%eax         # trashes rIBASE/edx
5853     UNSPILL(rIBASE)
5854     SET_VREG %eax %ecx
5855     FETCH_INST_OPCODE 1 %ecx
5856     ADVANCE_PC 1
5857     GOTO_NEXT_R %ecx
5858
5859 /* ------------------------------ */
5860 .L_OP_DIV_INT_2ADDR: /* 0xb3 */
5861 /* File: x86/OP_DIV_INT_2ADDR.S */
5862 /* File: x86/bindiv2addr.S */
5863     /*
5864      * 32-bit binary div/rem operation.  Handles special case of op0=minint and
5865      * op1=-1.
5866      */
5867     /* div/rem/2addr vA, vB */
5868     movzx    rINSTbl,%ecx          # eax<- BA
5869     SPILL(rIBASE)
5870     sarl     $4,%ecx              # ecx<- B
5871     GET_VREG_R %ecx %ecx           # eax<- vBB
5872     andb     $0xf,rINSTbl         # rINST<- A
5873     GET_VREG_R %eax rINST          # eax<- vBB
5874     cmpl     $0,%ecx
5875     je       common_errDivideByZero
5876     cmpl     $-1,%ecx
5877     jne      .LOP_DIV_INT_2ADDR_continue_div2addr
5878     cmpl     $0x80000000,%eax
5879     jne      .LOP_DIV_INT_2ADDR_continue_div2addr
5880     movl     $0x80000000,%eax
5881     SET_VREG %eax rINST
5882     UNSPILL(rIBASE)
5883     FETCH_INST_OPCODE 1 %ecx
5884     ADVANCE_PC 1
5885     GOTO_NEXT_R %ecx
5886
5887 .LOP_DIV_INT_2ADDR_continue_div2addr:
5888     cltd
5889     idivl   %ecx
5890     SET_VREG %eax rINST
5891     UNSPILL(rIBASE)
5892     FETCH_INST_OPCODE 1 %ecx
5893     ADVANCE_PC 1
5894     GOTO_NEXT_R %ecx
5895
5896
5897 /* ------------------------------ */
5898 .L_OP_REM_INT_2ADDR: /* 0xb4 */
5899 /* File: x86/OP_REM_INT_2ADDR.S */
5900 /* File: x86/bindiv2addr.S */
5901     /*
5902      * 32-bit binary div/rem operation.  Handles special case of op0=minint and
5903      * op1=-1.
5904      */
5905     /* div/rem/2addr vA, vB */
5906     movzx    rINSTbl,%ecx          # eax<- BA
5907     SPILL(rIBASE)
5908     sarl     $4,%ecx              # ecx<- B
5909     GET_VREG_R %ecx %ecx           # eax<- vBB
5910     andb     $0xf,rINSTbl         # rINST<- A
5911     GET_VREG_R %eax rINST          # eax<- vBB
5912     cmpl     $0,%ecx
5913     je       common_errDivideByZero
5914     cmpl     $-1,%ecx
5915     jne      .LOP_REM_INT_2ADDR_continue_div2addr
5916     cmpl     $0x80000000,%eax
5917     jne      .LOP_REM_INT_2ADDR_continue_div2addr
5918     movl     $0,rIBASE
5919     SET_VREG rIBASE rINST
5920     UNSPILL(rIBASE)
5921     FETCH_INST_OPCODE 1 %ecx
5922     ADVANCE_PC 1
5923     GOTO_NEXT_R %ecx
5924
5925 .LOP_REM_INT_2ADDR_continue_div2addr:
5926     cltd
5927     idivl   %ecx
5928     SET_VREG rIBASE rINST
5929     UNSPILL(rIBASE)
5930     FETCH_INST_OPCODE 1 %ecx
5931     ADVANCE_PC 1
5932     GOTO_NEXT_R %ecx
5933
5934
5935 /* ------------------------------ */
5936 .L_OP_AND_INT_2ADDR: /* 0xb5 */
5937 /* File: x86/OP_AND_INT_2ADDR.S */
5938 /* File: x86/binop2addr.S */
5939     /*
5940      * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5941      * that specifies an instruction that performs "result = r0 op r1".
5942      * This could be an ARM instruction or a function call.  (If the result
5943      * comes back in a register other than r0, you can override "result".)
5944      *
5945      * If "chkzero" is set to 1, we perform a divide-by-zero check on
5946      * vCC (r1).  Useful for integer division and modulus.
5947      *
5948      * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5949      *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5950      *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5951      *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5952      */
5953     /* binop/2addr vA, vB */
5954     movzx   rINSTbl,%ecx               # ecx<- A+
5955     sarl    $4,rINST                 # rINST<- B
5956     GET_VREG_R %eax rINST              # eax<- vB
5957     andb    $0xf,%cl                  # ecx<- A
5958     andl     %eax,(rFP,%ecx,4)                             # for ex: addl   %eax,(rFP,%ecx,4)
5959     FETCH_INST_OPCODE 1 %ecx
5960     ADVANCE_PC 1
5961     GOTO_NEXT_R %ecx
5962
5963
5964 /* ------------------------------ */
5965 .L_OP_OR_INT_2ADDR: /* 0xb6 */
5966 /* File: x86/OP_OR_INT_2ADDR.S */
5967 /* File: x86/binop2addr.S */
5968     /*
5969      * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5970      * that specifies an instruction that performs "result = r0 op r1".
5971      * This could be an ARM instruction or a function call.  (If the result
5972      * comes back in a register other than r0, you can override "result".)
5973      *
5974      * If "chkzero" is set to 1, we perform a divide-by-zero check on
5975      * vCC (r1).  Useful for integer division and modulus.
5976      *
5977      * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5978      *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5979      *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5980      *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5981      */
5982     /* binop/2addr vA, vB */
5983     movzx   rINSTbl,%ecx               # ecx<- A+
5984     sarl    $4,rINST                 # rINST<- B
5985     GET_VREG_R %eax rINST              # eax<- vB
5986     andb    $0xf,%cl                  # ecx<- A
5987     orl     %eax,(rFP,%ecx,4)                             # for ex: addl   %eax,(rFP,%ecx,4)
5988     FETCH_INST_OPCODE 1 %ecx
5989     ADVANCE_PC 1
5990     GOTO_NEXT_R %ecx
5991
5992
5993 /* ------------------------------ */
5994 .L_OP_XOR_INT_2ADDR: /* 0xb7 */
5995 /* File: x86/OP_XOR_INT_2ADDR.S */
5996 /* File: x86/binop2addr.S */
5997     /*
5998      * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5999      * that specifies an instruction that performs "result = r0 op r1".
6000      * This could be an ARM instruction or a function call.  (If the result
6001      * comes back in a register other than r0, you can override "result".)
6002      *
6003      * If "chkzero" is set to 1, we perform a divide-by-zero check on
6004      * vCC (r1).  Useful for integer division and modulus.
6005      *
6006      * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6007      *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6008      *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6009      *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6010      */
6011     /* binop/2addr vA, vB */
6012     movzx   rINSTbl,%ecx               # ecx<- A+
6013     sarl    $4,rINST                 # rINST<- B
6014     GET_VREG_R %eax rINST              # eax<- vB
6015     andb    $0xf,%cl                  # ecx<- A
6016     xorl     %eax,(rFP,%ecx,4)                             # for ex: addl   %eax,(rFP,%ecx,4)
6017     FETCH_INST_OPCODE 1 %ecx
6018     ADVANCE_PC 1
6019     GOTO_NEXT_R %ecx
6020
6021
6022 /* ------------------------------ */
6023 .L_OP_SHL_INT_2ADDR: /* 0xb8 */
6024 /* File: x86/OP_SHL_INT_2ADDR.S */
6025 /* File: x86/shop2addr.S */
6026     /*
6027      * Generic 32-bit "shift/2addr" operation.
6028      */
6029     /* shift/2addr vA, vB */
6030     movzx    rINSTbl,%ecx           # eax<- BA
6031     sarl     $4,%ecx               # ecx<- B
6032     GET_VREG_R %ecx %ecx            # eax<- vBB
6033     andb     $0xf,rINSTbl          # rINST<- A
6034     GET_VREG_R %eax rINST           # eax<- vAA
6035     sall    %cl,%eax                          # ex: sarl %cl,%eax
6036     FETCH_INST_OPCODE 1 %ecx
6037     SET_VREG %eax rINST
6038     ADVANCE_PC 1
6039     GOTO_NEXT_R %ecx
6040
6041
6042 /* ------------------------------ */
6043 .L_OP_SHR_INT_2ADDR: /* 0xb9 */
6044 /* File: x86/OP_SHR_INT_2ADDR.S */
6045 /* File: x86/shop2addr.S */
6046     /*
6047      * Generic 32-bit "shift/2addr" operation.
6048      */
6049     /* shift/2addr vA, vB */
6050     movzx    rINSTbl,%ecx           # eax<- BA
6051     sarl     $4,%ecx               # ecx<- B
6052     GET_VREG_R %ecx %ecx            # eax<- vBB
6053     andb     $0xf,rINSTbl          # rINST<- A
6054     GET_VREG_R %eax rINST           # eax<- vAA
6055     sarl    %cl,%eax                          # ex: sarl %cl,%eax
6056     FETCH_INST_OPCODE 1 %ecx
6057     SET_VREG %eax rINST
6058     ADVANCE_PC 1
6059     GOTO_NEXT_R %ecx
6060
6061
6062 /* ------------------------------ */
6063 .L_OP_USHR_INT_2ADDR: /* 0xba */
6064 /* File: x86/OP_USHR_INT_2ADDR.S */
6065 /* File: x86/shop2addr.S */
6066     /*
6067      * Generic 32-bit "shift/2addr" operation.
6068      */
6069     /* shift/2addr vA, vB */
6070     movzx    rINSTbl,%ecx           # eax<- BA
6071     sarl     $4,%ecx               # ecx<- B
6072     GET_VREG_R %ecx %ecx            # eax<- vBB
6073     andb     $0xf,rINSTbl          # rINST<- A
6074     GET_VREG_R %eax rINST           # eax<- vAA
6075     shrl    %cl,%eax                          # ex: sarl %cl,%eax
6076     FETCH_INST_OPCODE 1 %ecx
6077     SET_VREG %eax rINST
6078     ADVANCE_PC 1
6079     GOTO_NEXT_R %ecx
6080
6081
6082 /* ------------------------------ */
6083 .L_OP_ADD_LONG_2ADDR: /* 0xbb */
6084 /* File: x86/OP_ADD_LONG_2ADDR.S */
6085 /* File: x86/binopWide2addr.S */
6086     /*
6087      * Generic 64-bit binary operation.
6088      */
6089     /* binop/2addr vA, vB */
6090     movzbl    rINSTbl,%ecx              # ecx<- BA
6091     sarl      $4,%ecx                  # ecx<- B
6092     GET_VREG_WORD %eax %ecx 0           # eax<- v[B+0]
6093     GET_VREG_WORD %ecx %ecx 1           # eax<- v[B+1]
6094     andb      $0xF,rINSTbl             # rINST<- A
6095     addl %eax,(rFP,rINST,4)         # example: addl   %eax,(rFP,rINST,4)
6096     adcl %ecx,4(rFP,rINST,4)         # example: adcl   %ecx,4(rFP,rINST,4)
6097     FETCH_INST_OPCODE 1 %ecx
6098     ADVANCE_PC 1
6099     GOTO_NEXT_R %ecx
6100
6101
6102 /* ------------------------------ */
6103 .L_OP_SUB_LONG_2ADDR: /* 0xbc */
6104 /* File: x86/OP_SUB_LONG_2ADDR.S */
6105 /* File: x86/binopWide2addr.S */
6106     /*
6107      * Generic 64-bit binary operation.
6108      */
6109     /* binop/2addr vA, vB */
6110     movzbl    rINSTbl,%ecx              # ecx<- BA
6111     sarl      $4,%ecx                  # ecx<- B
6112     GET_VREG_WORD %eax %ecx 0           # eax<- v[B+0]
6113     GET_VREG_WORD %ecx %ecx 1           # eax<- v[B+1]
6114     andb      $0xF,rINSTbl             # rINST<- A
6115     subl %eax,(rFP,rINST,4)         # example: addl   %eax,(rFP,rINST,4)
6116     sbbl %ecx,4(rFP,rINST,4)         # example: adcl   %ecx,4(rFP,rINST,4)
6117     FETCH_INST_OPCODE 1 %ecx
6118     ADVANCE_PC 1
6119     GOTO_NEXT_R %ecx
6120
6121
6122 /* ------------------------------ */
6123 .L_OP_MUL_LONG_2ADDR: /* 0xbd */
6124 /* File: x86/OP_MUL_LONG_2ADDR.S */
6125     /*
6126      * Signed 64-bit integer multiply, 2-addr version
6127      *
6128      * We could definately use more free registers for
6129      * this code.  We must spill %edx (rIBASE) because it
6130      * is used by imul.  We'll also spill rINST (ebx),
6131      * giving us eax, ebc, ecx and rIBASE as computational
6132      * temps.  On top of that, we'll spill %esi (edi)
6133      * for use as the vA pointer and rFP (esi) for use
6134      * as the vB pointer.  Yuck.
6135      */
6136     /* mul-long/2addr vA, vB */
6137     movzbl    rINSTbl,%eax             # eax<- BA
6138     andb      $0xf,%al                # eax<- A
6139     sarl      $4,rINST                # rINST<- B
6140     SPILL_TMP2(%esi)
6141     SPILL(rFP)
6142     SPILL(rIBASE)
6143     leal      (rFP,%eax,4),%esi        # %esi<- &v[A]
6144     leal      (rFP,rINST,4),rFP        # rFP<- &v[B]
6145     movl      4(%esi),%ecx             # ecx<- Amsw
6146     imull     (rFP),%ecx               # ecx<- (Amsw*Blsw)
6147     movl      4(rFP),%eax              # eax<- Bmsw
6148     imull     (%esi),%eax              # eax<- (Bmsw*Alsw)
6149     addl      %eax,%ecx                # ecx<- (Amsw*Blsw)+(Bmsw*Alsw)
6150     movl      (rFP),%eax               # eax<- Blsw
6151     mull      (%esi)                   # eax<- (Blsw*Alsw)
6152     leal      (%ecx,rIBASE),rIBASE     # full result now in %edx:%eax
6153     movl      rIBASE,4(%esi)           # v[A+1]<- rIBASE
6154     movl      %eax,(%esi)              # v[A]<- %eax
6155     UNSPILL_TMP2(%esi)
6156     FETCH_INST_OPCODE 1 %ecx
6157     UNSPILL(rIBASE)
6158     UNSPILL(rFP)
6159     ADVANCE_PC 1
6160     GOTO_NEXT_R %ecx
6161
6162 /* ------------------------------ */
6163 .L_OP_DIV_LONG_2ADDR: /* 0xbe */
6164 /* File: x86/OP_DIV_LONG_2ADDR.S */
6165     /* div/2addr vA, vB */
6166     movzbl    rINSTbl,%eax
6167     shrl      $4,%eax                  # eax<- B
6168     andb      $0xf,rINSTbl             # rINST<- A
6169     SPILL(rIBASE)                       # save rIBASE/%edx
6170     GET_VREG_WORD rIBASE %eax 0
6171     GET_VREG_WORD %eax %eax 1
6172     movl     rIBASE,OUT_ARG2(%esp)
6173     testl    %eax,%eax
6174     je       .LOP_DIV_LONG_2ADDR_check_zero
6175     cmpl     $-1,%eax
6176     je       .LOP_DIV_LONG_2ADDR_check_neg1
6177 .LOP_DIV_LONG_2ADDR_notSpecial:
6178     GET_VREG_WORD rIBASE rINST 0
6179     GET_VREG_WORD %ecx rINST 1
6180 .LOP_DIV_LONG_2ADDR_notSpecial1:
6181     movl     %eax,OUT_ARG3(%esp)
6182     movl     rIBASE,OUT_ARG0(%esp)
6183     movl     %ecx,OUT_ARG1(%esp)
6184     call     __divdi3
6185 .LOP_DIV_LONG_2ADDR_finish:
6186     SET_VREG_WORD rIBASE rINST 1
6187     UNSPILL(rIBASE)                    # restore rIBASE/%edx
6188     SET_VREG_WORD %eax rINST 0
6189     FETCH_INST_OPCODE 1 %ecx
6190     ADVANCE_PC 1
6191     GOTO_NEXT_R %ecx
6192
6193 .LOP_DIV_LONG_2ADDR_check_zero:
6194     testl   rIBASE,rIBASE
6195     jne     .LOP_DIV_LONG_2ADDR_notSpecial
6196     jmp     common_errDivideByZero
6197 .LOP_DIV_LONG_2ADDR_check_neg1:
6198     testl   rIBASE,%eax
6199     jne     .LOP_DIV_LONG_2ADDR_notSpecial
6200     GET_VREG_WORD rIBASE rINST 0
6201     GET_VREG_WORD %ecx rINST 1
6202     testl    rIBASE,rIBASE
6203     jne      .LOP_DIV_LONG_2ADDR_notSpecial1
6204     cmpl     $0x80000000,%ecx
6205     jne      .LOP_DIV_LONG_2ADDR_notSpecial1
6206     /* minint / -1, return minint on div, 0 on rem */
6207     xorl     %eax,%eax
6208     movl     $0x80000000,rIBASE
6209     jmp      .LOP_DIV_LONG_2ADDR_finish
6210
6211 /* ------------------------------ */
6212 .L_OP_REM_LONG_2ADDR: /* 0xbf */
6213 /* File: x86/OP_REM_LONG_2ADDR.S */
6214 /* File: x86/OP_DIV_LONG_2ADDR.S */
6215     /* div/2addr vA, vB */
6216     movzbl    rINSTbl,%eax
6217     shrl      $4,%eax                  # eax<- B
6218     andb      $0xf,rINSTbl             # rINST<- A
6219     SPILL(rIBASE)                       # save rIBASE/%edx
6220     GET_VREG_WORD rIBASE %eax 0
6221     GET_VREG_WORD %eax %eax 1
6222     movl     rIBASE,OUT_ARG2(%esp)
6223     testl    %eax,%eax
6224     je       .LOP_REM_LONG_2ADDR_check_zero
6225     cmpl     $-1,%eax
6226     je       .LOP_REM_LONG_2ADDR_check_neg1
6227 .LOP_REM_LONG_2ADDR_notSpecial:
6228     GET_VREG_WORD rIBASE rINST 0
6229     GET_VREG_WORD %ecx rINST 1
6230 .LOP_REM_LONG_2ADDR_notSpecial1:
6231     movl     %eax,OUT_ARG3(%esp)
6232     movl     rIBASE,OUT_ARG0(%esp)
6233     movl     %ecx,OUT_ARG1(%esp)
6234     call     __moddi3
6235 .LOP_REM_LONG_2ADDR_finish:
6236     SET_VREG_WORD rIBASE rINST 1
6237     UNSPILL(rIBASE)                    # restore rIBASE/%edx
6238     SET_VREG_WORD %eax rINST 0
6239     FETCH_INST_OPCODE 1 %ecx
6240     ADVANCE_PC 1
6241     GOTO_NEXT_R %ecx
6242
6243 .LOP_REM_LONG_2ADDR_check_zero:
6244     testl   rIBASE,rIBASE
6245     jne     .LOP_REM_LONG_2ADDR_notSpecial
6246     jmp     common_errDivideByZero
6247 .LOP_REM_LONG_2ADDR_check_neg1:
6248     testl   rIBASE,%eax
6249     jne     .LOP_REM_LONG_2ADDR_notSpecial
6250     GET_VREG_WORD rIBASE rINST 0
6251     GET_VREG_WORD %ecx rINST 1
6252     testl    rIBASE,rIBASE
6253     jne      .LOP_REM_LONG_2ADDR_notSpecial1
6254     cmpl     $0x80000000,%ecx
6255     jne      .LOP_REM_LONG_2ADDR_notSpecial1
6256     /* minint / -1, return minint on div, 0 on rem */
6257     xorl     %eax,%eax
6258     movl     $0,rIBASE
6259     jmp      .LOP_REM_LONG_2ADDR_finish
6260
6261
6262 /* ------------------------------ */
6263 .L_OP_AND_LONG_2ADDR: /* 0xc0 */
6264 /* File: x86/OP_AND_LONG_2ADDR.S */
6265 /* File: x86/binopWide2addr.S */
6266     /*
6267      * Generic 64-bit binary operation.
6268      */
6269     /* binop/2addr vA, vB */
6270     movzbl    rINSTbl,%ecx              # ecx<- BA
6271     sarl      $4,%ecx                  # ecx<- B
6272     GET_VREG_WORD %eax %ecx 0           # eax<- v[B+0]
6273     GET_VREG_WORD %ecx %ecx 1           # eax<- v[B+1]
6274     andb      $0xF,rINSTbl             # rINST<- A
6275     andl %eax,(rFP,rINST,4)         # example: addl   %eax,(rFP,rINST,4)
6276     andl %ecx,4(rFP,rINST,4)         # example: adcl   %ecx,4(rFP,rINST,4)
6277     FETCH_INST_OPCODE 1 %ecx
6278     ADVANCE_PC 1
6279     GOTO_NEXT_R %ecx
6280
6281
6282 /* ------------------------------ */
6283 .L_OP_OR_LONG_2ADDR: /* 0xc1 */
6284 /* File: x86/OP_OR_LONG_2ADDR.S */
6285 /* File: x86/binopWide2addr.S */
6286     /*
6287      * Generic 64-bit binary operation.
6288      */
6289     /* binop/2addr vA, vB */
6290     movzbl    rINSTbl,%ecx              # ecx<- BA
6291     sarl      $4,%ecx                  # ecx<- B
6292     GET_VREG_WORD %eax %ecx 0           # eax<- v[B+0]
6293     GET_VREG_WORD %ecx %ecx 1           # eax<- v[B+1]
6294     andb      $0xF,rINSTbl             # rINST<- A
6295     orl %eax,(rFP,rINST,4)         # example: addl   %eax,(rFP,rINST,4)
6296     orl %ecx,4(rFP,rINST,4)         # example: adcl   %ecx,4(rFP,rINST,4)
6297     FETCH_INST_OPCODE 1 %ecx
6298     ADVANCE_PC 1
6299     GOTO_NEXT_R %ecx
6300
6301
6302 /* ------------------------------ */
6303 .L_OP_XOR_LONG_2ADDR: /* 0xc2 */
6304 /* File: x86/OP_XOR_LONG_2ADDR.S */
6305 /* File: x86/binopWide2addr.S */
6306     /*
6307      * Generic 64-bit binary operation.
6308      */
6309     /* binop/2addr vA, vB */
6310     movzbl    rINSTbl,%ecx              # ecx<- BA
6311     sarl      $4,%ecx                  # ecx<- B
6312     GET_VREG_WORD %eax %ecx 0           # eax<- v[B+0]
6313     GET_VREG_WORD %ecx %ecx 1           # eax<- v[B+1]
6314     andb      $0xF,rINSTbl             # rINST<- A
6315     xorl %eax,(rFP,rINST,4)         # example: addl   %eax,(rFP,rINST,4)
6316     xorl %ecx,4(rFP,rINST,4)         # example: adcl   %ecx,4(rFP,rINST,4)
6317     FETCH_INST_OPCODE 1 %ecx
6318     ADVANCE_PC 1
6319     GOTO_NEXT_R %ecx
6320
6321
6322 /* ------------------------------ */
6323 .L_OP_SHL_LONG_2ADDR: /* 0xc3 */
6324 /* File: x86/OP_SHL_LONG_2ADDR.S */
6325     /*
6326      * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
6327      * 32-bit shift distance.
6328      */
6329     /* shl-long/2addr vA, vB */
6330     /* ecx gets shift count */
6331     /* Need to spill rIBASE */
6332     /* rINSTw gets AA */
6333     movzbl    rINSTbl,%ecx             # ecx<- BA
6334     andb      $0xf,rINSTbl            # rINST<- A
6335     GET_VREG_WORD %eax rINST 0         # eax<- v[AA+0]
6336     sarl      $4,%ecx                 # ecx<- B
6337     SPILL(rIBASE)
6338     GET_VREG_WORD rIBASE rINST 1       # rIBASE<- v[AA+1]
6339     GET_VREG_R  %ecx %ecx              # ecx<- vBB
6340     shldl     %eax,rIBASE
6341     sall      %cl,%eax
6342     testb     $32,%cl
6343     je        2f
6344     movl      %eax,rIBASE
6345     xorl      %eax,%eax
6346 2:
6347     SET_VREG_WORD rIBASE rINST 1       # v[AA+1]<- rIBASE
6348     UNSPILL(rIBASE)
6349     FETCH_INST_OPCODE 1 %ecx
6350     SET_VREG_WORD %eax rINST 0         # v[AA+0]<- eax
6351     ADVANCE_PC 1
6352     GOTO_NEXT_R %ecx
6353
6354 /* ------------------------------ */
6355 .L_OP_SHR_LONG_2ADDR: /* 0xc4 */
6356 /* File: x86/OP_SHR_LONG_2ADDR.S */
6357     /*
6358      * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
6359      * 32-bit shift distance.
6360      */
6361     /* shl-long/2addr vA, vB */
6362     /* ecx gets shift count */
6363     /* Need to spill rIBASE */
6364     /* rINSTw gets AA */
6365     movzbl    rINSTbl,%ecx         # ecx<- BA
6366     andb      $0xf,rINSTbl        # rINST<- A
6367     GET_VREG_WORD %eax rINST 0     # eax<- v[AA+0]
6368     sarl      $4,%ecx             # ecx<- B
6369     SPILL(rIBASE)
6370     GET_VREG_WORD rIBASE rINST 1   # rIBASE<- v[AA+1]
6371     GET_VREG_R %ecx %ecx           # ecx<- vBB
6372     shrdl     rIBASE,%eax
6373     sarl      %cl,rIBASE
6374     testb     $32,%cl
6375     je        2f
6376     movl      rIBASE,%eax
6377     sarl      $31,rIBASE
6378 2:
6379     SET_VREG_WORD rIBASE rINST 1   # v[AA+1]<- rIBASE
6380     UNSPILL(rIBASE)
6381     FETCH_INST_OPCODE 1 %ecx
6382     SET_VREG_WORD %eax rINST 0    # v[AA+0]<- eax
6383     ADVANCE_PC 1
6384     GOTO_NEXT_R %ecx
6385
6386 /* ------------------------------ */
6387 .L_OP_USHR_LONG_2ADDR: /* 0xc5 */
6388 /* File: x86/OP_USHR_LONG_2ADDR.S */
6389     /*
6390      * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
6391      * 32-bit shift distance.
6392      */
6393     /* shl-long/2addr vA, vB */
6394     /* ecx gets shift count */
6395     /* Need to spill rIBASE */
6396     /* rINSTw gets AA */
6397     movzbl    rINSTbl,%ecx             # ecx<- BA
6398     andb      $0xf,rINSTbl            # rINST<- A
6399     GET_VREG_WORD %eax rINST 0         # eax<- v[AA+0]
6400     sarl      $4,%ecx                 # ecx<- B
6401     SPILL(rIBASE)
6402     GET_VREG_WORD rIBASE rINST 1       # rIBASE<- v[AA+1]
6403     GET_VREG_R %ecx %ecx               # ecx<- vBB
6404     shrdl     rIBASE,%eax
6405     shrl      %cl,rIBASE
6406     testb     $32,%cl
6407     je        2f
6408     movl      rIBASE,%eax
6409     xorl      rIBASE,rIBASE
6410 2:
6411     SET_VREG_WORD rIBASE rINST 1       # v[AA+1]<- rIBASE
6412     FETCH_INST_OPCODE 1 %ecx
6413     UNSPILL(rIBASE)
6414     SET_VREG_WORD %eax rINST 0         # v[AA+0]<- eax
6415     ADVANCE_PC 1
6416     GOTO_NEXT_R %ecx
6417
6418 /* ------------------------------ */
6419 .L_OP_ADD_FLOAT_2ADDR: /* 0xc6 */
6420 /* File: x86/OP_ADD_FLOAT_2ADDR.S */
6421 /* File: x86/binflop2addr.S */
6422     /*
6423      * Generic 32-bit binary float operation.
6424      *
6425      * For: add-fp, sub-fp, mul-fp, div-fp
6426      */
6427
6428     /* binop/2addr vA, vB */
6429     movzx   rINSTbl,%ecx           # ecx<- A+
6430     andb    $0xf,%cl              # ecx<- A
6431     flds    (rFP,%ecx,4)          # vAA to fp stack
6432     sarl    $4,rINST             # rINST<- B
6433     fadds   (rFP,rINST,4)         # ex: faddp
6434     FETCH_INST_OPCODE 1 %eax
6435     ADVANCE_PC 1
6436     fstps    (rFP,%ecx,4)         # %st to vA
6437     GOTO_NEXT_R %eax
6438
6439
6440 /* ------------------------------ */
6441 .L_OP_SUB_FLOAT_2ADDR: /* 0xc7 */
6442 /* File: x86/OP_SUB_FLOAT_2ADDR.S */
6443 /* File: x86/binflop2addr.S */
6444     /*
6445      * Generic 32-bit binary float operation.
6446      *
6447      * For: add-fp, sub-fp, mul-fp, div-fp
6448      */
6449
6450     /* binop/2addr vA, vB */
6451     movzx   rINSTbl,%ecx           # ecx<- A+
6452     andb    $0xf,%cl              # ecx<- A
6453     flds    (rFP,%ecx,4)          # vAA to fp stack
6454     sarl    $4,rINST             # rINST<- B
6455     fsubs   (rFP,rINST,4)         # ex: faddp
6456     FETCH_INST_OPCODE 1 %eax
6457     ADVANCE_PC 1
6458     fstps    (rFP,%ecx,4)         # %st to vA
6459     GOTO_NEXT_R %eax
6460
6461
6462 /* ------------------------------ */
6463 .L_OP_MUL_FLOAT_2ADDR: /* 0xc8 */
6464 /* File: x86/OP_MUL_FLOAT_2ADDR.S */
6465 /* File: x86/binflop2addr.S */
6466     /*
6467      * Generic 32-bit binary float operation.
6468      *
6469      * For: add-fp, sub-fp, mul-fp, div-fp
6470      */
6471
6472     /* binop/2addr vA, vB */
6473     movzx   rINSTbl,%ecx           # ecx<- A+
6474     andb    $0xf,%cl              # ecx<- A
6475     flds    (rFP,%ecx,4)          # vAA to fp stack
6476     sarl    $4,rINST             # rINST<- B
6477     fmuls   (rFP,rINST,4)         # ex: faddp
6478     FETCH_INST_OPCODE 1 %eax
6479     ADVANCE_PC 1
6480     fstps    (rFP,%ecx,4)         # %st to vA
6481     GOTO_NEXT_R %eax
6482
6483
6484 /* ------------------------------ */
6485 .L_OP_DIV_FLOAT_2ADDR: /* 0xc9 */
6486 /* File: x86/OP_DIV_FLOAT_2ADDR.S */
6487 /* File: x86/binflop2addr.S */
6488     /*
6489      * Generic 32-bit binary float operation.
6490      *
6491      * For: add-fp, sub-fp, mul-fp, div-fp
6492      */
6493
6494     /* binop/2addr vA, vB */
6495     movzx   rINSTbl,%ecx           # ecx<- A+
6496     andb    $0xf,%cl              # ecx<- A
6497     flds    (rFP,%ecx,4)          # vAA to fp stack
6498     sarl    $4,rINST             # rINST<- B
6499     fdivs   (rFP,rINST,4)         # ex: faddp
6500     FETCH_INST_OPCODE 1 %eax
6501     ADVANCE_PC 1
6502     fstps    (rFP,%ecx,4)         # %st to vA
6503     GOTO_NEXT_R %eax
6504
6505
6506 /* ------------------------------ */
6507 .L_OP_REM_FLOAT_2ADDR: /* 0xca */
6508 /* File: x86/OP_REM_FLOAT_2ADDR.S */
6509     /* rem_float/2addr vA, vB */
6510     movzx   rINSTbl,%ecx                # ecx<- A+
6511     sarl    $4,rINST                  # rINST<- B
6512     flds     (rFP,rINST,4)              # vBB to fp stack
6513     andb    $0xf,%cl                   # ecx<- A
6514     flds     (rFP,%ecx,4)               # vAA to fp stack
6515 1:
6516     fprem
6517     fstsw     %ax
6518     sahf
6519     jp        1b
6520     fstp      %st(1)
6521     FETCH_INST_OPCODE 1 %eax
6522     ADVANCE_PC 1
6523     fstps    (rFP,%ecx,4)               # %st to vA
6524     GOTO_NEXT_R %eax
6525
6526 /* ------------------------------ */
6527 .L_OP_ADD_DOUBLE_2ADDR: /* 0xcb */
6528 /* File: x86/OP_ADD_DOUBLE_2ADDR.S */
6529 /* File: x86/binflop2addr.S */
6530     /*
6531      * Generic 32-bit binary float operation.
6532      *
6533      * For: add-fp, sub-fp, mul-fp, div-fp
6534      */
6535
6536     /* binop/2addr vA, vB */
6537     movzx   rINSTbl,%ecx           # ecx<- A+
6538     andb    $0xf,%cl              # ecx<- A
6539     fldl    (rFP,%ecx,4)          # vAA to fp stack
6540     sarl    $4,rINST             # rINST<- B
6541     faddl   (rFP,rINST,4)         # ex: faddp
6542     FETCH_INST_OPCODE 1 %eax
6543     ADVANCE_PC 1
6544     fstpl    (rFP,%ecx,4)         # %st to vA
6545     GOTO_NEXT_R %eax
6546
6547
6548 /* ------------------------------ */
6549 .L_OP_SUB_DOUBLE_2ADDR: /* 0xcc */
6550 /* File: x86/OP_SUB_DOUBLE_2ADDR.S */
6551 /* File: x86/binflop2addr.S */
6552     /*
6553      * Generic 32-bit binary float operation.
6554      *
6555      * For: add-fp, sub-fp, mul-fp, div-fp
6556      */
6557
6558     /* binop/2addr vA, vB */
6559     movzx   rINSTbl,%ecx           # ecx<- A+
6560     andb    $0xf,%cl              # ecx<- A
6561     fldl    (rFP,%ecx,4)          # vAA to fp stack
6562     sarl    $4,rINST             # rINST<- B
6563     fsubl   (rFP,rINST,4)         # ex: faddp
6564     FETCH_INST_OPCODE 1 %eax
6565     ADVANCE_PC 1
6566     fstpl    (rFP,%ecx,4)         # %st to vA
6567     GOTO_NEXT_R %eax
6568
6569
6570 /* ------------------------------ */
6571 .L_OP_MUL_DOUBLE_2ADDR: /* 0xcd */
6572 /* File: x86/OP_MUL_DOUBLE_2ADDR.S */
6573 /* File: x86/binflop2addr.S */
6574     /*
6575      * Generic 32-bit binary float operation.
6576      *
6577      * For: add-fp, sub-fp, mul-fp, div-fp
6578      */
6579
6580     /* binop/2addr vA, vB */
6581     movzx   rINSTbl,%ecx           # ecx<- A+
6582     andb    $0xf,%cl              # ecx<- A
6583     fldl    (rFP,%ecx,4)          # vAA to fp stack
6584     sarl    $4,rINST             # rINST<- B
6585     fmull   (rFP,rINST,4)         # ex: faddp
6586     FETCH_INST_OPCODE 1 %eax
6587     ADVANCE_PC 1
6588     fstpl    (rFP,%ecx,4)         # %st to vA
6589     GOTO_NEXT_R %eax
6590
6591
6592 /* ------------------------------ */
6593 .L_OP_DIV_DOUBLE_2ADDR: /* 0xce */
6594 /* File: x86/OP_DIV_DOUBLE_2ADDR.S */
6595 /* File: x86/binflop2addr.S */
6596     /*
6597      * Generic 32-bit binary float operation.
6598      *
6599      * For: add-fp, sub-fp, mul-fp, div-fp
6600      */
6601
6602     /* binop/2addr vA, vB */
6603     movzx   rINSTbl,%ecx           # ecx<- A+
6604     andb    $0xf,%cl              # ecx<- A
6605     fldl    (rFP,%ecx,4)          # vAA to fp stack
6606     sarl    $4,rINST             # rINST<- B
6607     fdivl   (rFP,rINST,4)         # ex: faddp
6608     FETCH_INST_OPCODE 1 %eax
6609     ADVANCE_PC 1
6610     fstpl    (rFP,%ecx,4)         # %st to vA
6611     GOTO_NEXT_R %eax
6612
6613
6614 /* ------------------------------ */
6615 .L_OP_REM_DOUBLE_2ADDR: /* 0xcf */
6616 /* File: x86/OP_REM_DOUBLE_2ADDR.S */
6617     /* rem_float/2addr vA, vB */
6618     movzx   rINSTbl,%ecx                # ecx<- A+
6619     sarl    $4,rINST                  # rINST<- B
6620     fldl     (rFP,rINST,4)              # vBB to fp stack
6621     andb    $0xf,%cl                   # ecx<- A
6622     fldl     (rFP,%ecx,4)               # vAA to fp stack
6623 1:
6624     fprem
6625     fstsw     %ax
6626     sahf
6627     jp        1b
6628     fstp      %st(1)
6629     FETCH_INST_OPCODE 1 %eax
6630     ADVANCE_PC 1
6631     fstpl    (rFP,%ecx,4)               # %st to vA
6632     GOTO_NEXT_R %eax
6633
6634 /* ------------------------------ */
6635 .L_OP_ADD_INT_LIT16: /* 0xd0 */
6636 /* File: x86/OP_ADD_INT_LIT16.S */
6637 /* File: x86/binopLit16.S */
6638     /*
6639      * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6640      * that specifies an instruction that performs "result = eax op ecx".
6641      * This could be an x86 instruction or a function call.  (If the result
6642      * comes back in a register other than eax, you can override "result".)
6643      *
6644      * For: add-int/lit16, rsub-int,
6645      *      and-int/lit16, or-int/lit16, xor-int/lit16
6646      */
6647     /* binop/lit16 vA, vB, #+CCCC */
6648     movzbl   rINSTbl,%eax               # eax<- 000000BA
6649     sarl     $4,%eax                   # eax<- B
6650     GET_VREG_R %eax %eax                # eax<- vB
6651     movswl   2(rPC),%ecx                # ecx<- ssssCCCC
6652     andb     $0xf,rINSTbl              # rINST<- A
6653     addl %ecx,%eax                              # for example: addl %ecx, %eax
6654     SET_VREG %eax rINST
6655     FETCH_INST_OPCODE 2 %ecx
6656     ADVANCE_PC 2
6657     GOTO_NEXT_R %ecx
6658
6659
6660 /* ------------------------------ */
6661 .L_OP_RSUB_INT: /* 0xd1 */
6662 /* File: x86/OP_RSUB_INT.S */
6663 /* File: x86/binopLit16.S */
6664     /*
6665      * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6666      * that specifies an instruction that performs "result = eax op ecx".
6667      * This could be an x86 instruction or a function call.  (If the result
6668      * comes back in a register other than eax, you can override "result".)
6669      *
6670      * For: add-int/lit16, rsub-int,
6671      *      and-int/lit16, or-int/lit16, xor-int/lit16
6672      */
6673     /* binop/lit16 vA, vB, #+CCCC */
6674     movzbl   rINSTbl,%eax               # eax<- 000000BA
6675     sarl     $4,%eax                   # eax<- B
6676     GET_VREG_R %eax %eax                # eax<- vB
6677     movswl   2(rPC),%ecx                # ecx<- ssssCCCC
6678     andb     $0xf,rINSTbl              # rINST<- A
6679     subl %eax,%ecx                              # for example: addl %ecx, %eax
6680     SET_VREG %ecx rINST
6681     FETCH_INST_OPCODE 2 %ecx
6682     ADVANCE_PC 2
6683     GOTO_NEXT_R %ecx
6684
6685
6686 /* ------------------------------ */
6687 .L_OP_MUL_INT_LIT16: /* 0xd2 */
6688 /* File: x86/OP_MUL_INT_LIT16.S */
6689     /* mul/lit16 vA, vB, #+CCCC */
6690     /* Need A in rINST, ssssCCCC in ecx, vB in eax */
6691     movzbl   rINSTbl,%eax               # eax<- 000000BA
6692     sarl     $4,%eax                   # eax<- B
6693     GET_VREG_R %eax %eax                # eax<- vB
6694     movswl   2(rPC),%ecx                # ecx<- ssssCCCC
6695     andb     $0xf,rINSTbl              # rINST<- A
6696     SPILL(rIBASE)
6697     imull     %ecx,%eax                 # trashes rIBASE/edx
6698     UNSPILL(rIBASE)
6699     FETCH_INST_OPCODE 2 %ecx
6700     ADVANCE_PC 2
6701     SET_VREG %eax rINST
6702     GOTO_NEXT_R %ecx
6703
6704 /* ------------------------------ */
6705 .L_OP_DIV_INT_LIT16: /* 0xd3 */
6706 /* File: x86/OP_DIV_INT_LIT16.S */
6707 /* File: x86/bindivLit16.S */
6708     /*
6709      * 32-bit binary div/rem operation.  Handles special case of op0=minint and
6710      * op1=-1.
6711      */
6712     /* div/rem/lit16 vA, vB, #+CCCC */
6713     /* Need A in rINST, ssssCCCC in ecx, vB in eax */
6714     movzbl   rINSTbl,%eax         # eax<- 000000BA
6715     SPILL(rIBASE)
6716     sarl     $4,%eax             # eax<- B
6717     GET_VREG_R %eax %eax          # eax<- vB
6718     movswl   2(rPC),%ecx          # ecx<- ssssCCCC
6719     andb     $0xf,rINSTbl        # rINST<- A
6720     cmpl     $0,%ecx
6721     je       common_errDivideByZero
6722     cmpl     $-1,%ecx
6723     jne      .LOP_DIV_INT_LIT16_continue_div
6724     cmpl     $0x80000000,%eax
6725     jne      .LOP_DIV_INT_LIT16_continue_div
6726     movl     $0x80000000,%eax
6727     SET_VREG %eax rINST
6728     UNSPILL(rIBASE)
6729     FETCH_INST_OPCODE 2 %ecx
6730     ADVANCE_PC 2
6731     GOTO_NEXT_R %ecx
6732
6733 .LOP_DIV_INT_LIT16_continue_div:
6734     cltd
6735     idivl   %ecx
6736     SET_VREG %eax rINST
6737     UNSPILL(rIBASE)
6738     FETCH_INST_OPCODE 2 %ecx
6739     ADVANCE_PC 2
6740     GOTO_NEXT_R %ecx
6741
6742
6743 /* ------------------------------ */
6744 .L_OP_REM_INT_LIT16: /* 0xd4 */
6745 /* File: x86/OP_REM_INT_LIT16.S */
6746 /* File: x86/bindivLit16.S */
6747     /*
6748      * 32-bit binary div/rem operation.  Handles special case of op0=minint and
6749      * op1=-1.
6750      */
6751     /* div/rem/lit16 vA, vB, #+CCCC */
6752     /* Need A in rINST, ssssCCCC in ecx, vB in eax */
6753     movzbl   rINSTbl,%eax         # eax<- 000000BA
6754     SPILL(rIBASE)
6755     sarl     $4,%eax             # eax<- B
6756     GET_VREG_R %eax %eax          # eax<- vB
6757     movswl   2(rPC),%ecx          # ecx<- ssssCCCC
6758     andb     $0xf,rINSTbl        # rINST<- A
6759     cmpl     $0,%ecx
6760     je       common_errDivideByZero
6761     cmpl     $-1,%ecx
6762     jne      .LOP_REM_INT_LIT16_continue_div
6763     cmpl     $0x80000000,%eax
6764     jne      .LOP_REM_INT_LIT16_continue_div
6765     movl     $0,rIBASE
6766     SET_VREG rIBASE rINST
6767     UNSPILL(rIBASE)
6768     FETCH_INST_OPCODE 2 %ecx
6769     ADVANCE_PC 2
6770     GOTO_NEXT_R %ecx
6771
6772 .LOP_REM_INT_LIT16_continue_div:
6773     cltd
6774     idivl   %ecx
6775     SET_VREG rIBASE rINST
6776     UNSPILL(rIBASE)
6777     FETCH_INST_OPCODE 2 %ecx
6778     ADVANCE_PC 2
6779     GOTO_NEXT_R %ecx
6780
6781
6782 /* ------------------------------ */
6783 .L_OP_AND_INT_LIT16: /* 0xd5 */
6784 /* File: x86/OP_AND_INT_LIT16.S */
6785 /* File: x86/binopLit16.S */
6786     /*
6787      * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6788      * that specifies an instruction that performs "result = eax op ecx".
6789      * This could be an x86 instruction or a function call.  (If the result
6790      * comes back in a register other than eax, you can override "result".)
6791      *
6792      * For: add-int/lit16, rsub-int,
6793      *      and-int/lit16, or-int/lit16, xor-int/lit16
6794      */
6795     /* binop/lit16 vA, vB, #+CCCC */
6796     movzbl   rINSTbl,%eax               # eax<- 000000BA
6797     sarl     $4,%eax                   # eax<- B
6798     GET_VREG_R %eax %eax                # eax<- vB
6799     movswl   2(rPC),%ecx                # ecx<- ssssCCCC
6800     andb     $0xf,rINSTbl              # rINST<- A
6801     andl %ecx,%eax                              # for example: addl %ecx, %eax
6802     SET_VREG %eax rINST
6803     FETCH_INST_OPCODE 2 %ecx
6804     ADVANCE_PC 2
6805     GOTO_NEXT_R %ecx
6806
6807
6808 /* ------------------------------ */
6809 .L_OP_OR_INT_LIT16: /* 0xd6 */
6810 /* File: x86/OP_OR_INT_LIT16.S */
6811 /* File: x86/binopLit16.S */
6812     /*
6813      * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6814      * that specifies an instruction that performs "result = eax op ecx".
6815      * This could be an x86 instruction or a function call.  (If the result
6816      * comes back in a register other than eax, you can override "result".)
6817      *
6818      * For: add-int/lit16, rsub-int,
6819      *      and-int/lit16, or-int/lit16, xor-int/lit16
6820      */
6821     /* binop/lit16 vA, vB, #+CCCC */
6822     movzbl   rINSTbl,%eax               # eax<- 000000BA
6823     sarl     $4,%eax                   # eax<- B
6824     GET_VREG_R %eax %eax                # eax<- vB
6825     movswl   2(rPC),%ecx                # ecx<- ssssCCCC
6826     andb     $0xf,rINSTbl              # rINST<- A
6827     orl     %ecx,%eax                              # for example: addl %ecx, %eax
6828     SET_VREG %eax rINST
6829     FETCH_INST_OPCODE 2 %ecx
6830     ADVANCE_PC 2
6831     GOTO_NEXT_R %ecx
6832
6833
6834 /* ------------------------------ */
6835 .L_OP_XOR_INT_LIT16: /* 0xd7 */
6836 /* File: x86/OP_XOR_INT_LIT16.S */
6837 /* File: x86/binopLit16.S */
6838     /*
6839      * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6840      * that specifies an instruction that performs "result = eax op ecx".
6841      * This could be an x86 instruction or a function call.  (If the result
6842      * comes back in a register other than eax, you can override "result".)
6843      *
6844      * For: add-int/lit16, rsub-int,
6845      *      and-int/lit16, or-int/lit16, xor-int/lit16
6846      */
6847     /* binop/lit16 vA, vB, #+CCCC */
6848     movzbl   rINSTbl,%eax               # eax<- 000000BA
6849     sarl     $4,%eax                   # eax<- B
6850     GET_VREG_R %eax %eax                # eax<- vB
6851     movswl   2(rPC),%ecx                # ecx<- ssssCCCC
6852     andb     $0xf,rINSTbl              # rINST<- A
6853     xor    %ecx,%eax                              # for example: addl %ecx, %eax
6854     SET_VREG %eax rINST
6855     FETCH_INST_OPCODE 2 %ecx
6856     ADVANCE_PC 2
6857     GOTO_NEXT_R %ecx
6858
6859
6860 /* ------------------------------ */
6861 .L_OP_ADD_INT_LIT8: /* 0xd8 */
6862 /* File: x86/OP_ADD_INT_LIT8.S */
6863 /* File: x86/binopLit8.S */
6864     /*
6865      * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6866      * that specifies an instruction that performs "result = eax op ecx".
6867      * This could be an x86 instruction or a function call.  (If the result
6868      * comes back in a register other than r0, you can override "result".)
6869      *
6870      * For: add-int/lit8, rsub-int/lit8
6871      *      and-int/lit8, or-int/lit8, xor-int/lit8,
6872      *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6873      */
6874     /* binop/lit8 vAA, vBB, #+CC */
6875     movzbl    2(rPC),%eax              # eax<- BB
6876     movsbl    3(rPC),%ecx              # ecx<- ssssssCC
6877     GET_VREG_R   %eax %eax             # eax<- rBB
6878     addl %ecx,%eax                             # ex: addl %ecx,%eax
6879     SET_VREG   %eax rINST
6880     FETCH_INST_OPCODE 2 %ecx
6881     ADVANCE_PC 2
6882     GOTO_NEXT_R %ecx
6883
6884
6885 /* ------------------------------ */
6886 .L_OP_RSUB_INT_LIT8: /* 0xd9 */
6887 /* File: x86/OP_RSUB_INT_LIT8.S */
6888 /* File: x86/binopLit8.S */
6889     /*
6890      * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6891      * that specifies an instruction that performs "result = eax op ecx".
6892      * This could be an x86 instruction or a function call.  (If the result
6893      * comes back in a register other than r0, you can override "result".)
6894      *
6895      * For: add-int/lit8, rsub-int/lit8
6896      *      and-int/lit8, or-int/lit8, xor-int/lit8,
6897      *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6898      */
6899     /* binop/lit8 vAA, vBB, #+CC */
6900     movzbl    2(rPC),%eax              # eax<- BB
6901     movsbl    3(rPC),%ecx              # ecx<- ssssssCC
6902     GET_VREG_R   %eax %eax             # eax<- rBB
6903     subl  %eax,%ecx                             # ex: addl %ecx,%eax
6904     SET_VREG   %ecx rINST
6905     FETCH_INST_OPCODE 2 %ecx
6906     ADVANCE_PC 2
6907     GOTO_NEXT_R %ecx
6908
6909
6910 /* ------------------------------ */
6911 .L_OP_MUL_INT_LIT8: /* 0xda */
6912 /* File: x86/OP_MUL_INT_LIT8.S */
6913     /* mul/lit8 vAA, vBB, #+CC */
6914     movzbl    2(rPC),%eax              # eax<- BB
6915     movsbl    3(rPC),%ecx              # ecx<- ssssssCC
6916     GET_VREG_R   %eax %eax             # eax<- rBB
6917     SPILL(rIBASE)
6918     imull     %ecx,%eax                # trashes rIBASE/edx
6919     UNSPILL(rIBASE)
6920     FETCH_INST_OPCODE 2 %ecx
6921     ADVANCE_PC 2
6922     SET_VREG  %eax rINST
6923     GOTO_NEXT_R %ecx
6924
6925 /* ------------------------------ */
6926 .L_OP_DIV_INT_LIT8: /* 0xdb */
6927 /* File: x86/OP_DIV_INT_LIT8.S */
6928 /* File: x86/bindivLit8.S */
6929     /*
6930      * 32-bit div/rem "lit8" binary operation.  Handles special case of
6931      * op0=minint & op1=-1
6932      */
6933     /* div/rem/lit8 vAA, vBB, #+CC */
6934     movzbl    2(rPC),%eax        # eax<- BB
6935     movsbl    3(rPC),%ecx        # ecx<- ssssssCC
6936     SPILL(rIBASE)
6937     GET_VREG_R  %eax %eax        # eax<- rBB
6938     cmpl     $0,%ecx
6939     je       common_errDivideByZero
6940     cmpl     $0x80000000,%eax
6941     jne      .LOP_DIV_INT_LIT8_continue_div
6942     cmpl     $-1,%ecx
6943     jne      .LOP_DIV_INT_LIT8_continue_div
6944     movl     $0x80000000,%eax
6945     SET_VREG %eax rINST
6946     UNSPILL(rIBASE)
6947     FETCH_INST_OPCODE 2 %ecx
6948     ADVANCE_PC 2
6949     GOTO_NEXT_R %ecx
6950
6951 .LOP_DIV_INT_LIT8_continue_div:
6952     cltd
6953     idivl   %ecx
6954     SET_VREG %eax rINST
6955     UNSPILL(rIBASE)
6956     FETCH_INST_OPCODE 2 %ecx
6957     ADVANCE_PC 2
6958     GOTO_NEXT_R %ecx
6959
6960
6961 /* ------------------------------ */
6962 .L_OP_REM_INT_LIT8: /* 0xdc */
6963 /* File: x86/OP_REM_INT_LIT8.S */
6964 /* File: x86/bindivLit8.S */
6965     /*
6966      * 32-bit div/rem "lit8" binary operation.  Handles special case of
6967      * op0=minint & op1=-1
6968      */
6969     /* div/rem/lit8 vAA, vBB, #+CC */
6970     movzbl    2(rPC),%eax        # eax<- BB
6971     movsbl    3(rPC),%ecx        # ecx<- ssssssCC
6972     SPILL(rIBASE)
6973     GET_VREG_R  %eax %eax        # eax<- rBB
6974     cmpl     $0,%ecx
6975     je       common_errDivideByZero
6976     cmpl     $0x80000000,%eax
6977     jne      .LOP_REM_INT_LIT8_continue_div
6978     cmpl     $-1,%ecx
6979     jne      .LOP_REM_INT_LIT8_continue_div
6980     movl     $0,rIBASE
6981     SET_VREG rIBASE rINST
6982     UNSPILL(rIBASE)
6983     FETCH_INST_OPCODE 2 %ecx
6984     ADVANCE_PC 2
6985     GOTO_NEXT_R %ecx
6986
6987 .LOP_REM_INT_LIT8_continue_div:
6988     cltd
6989     idivl   %ecx
6990     SET_VREG rIBASE rINST
6991     UNSPILL(rIBASE)
6992     FETCH_INST_OPCODE 2 %ecx
6993     ADVANCE_PC 2
6994     GOTO_NEXT_R %ecx
6995
6996
6997 /* ------------------------------ */
6998 .L_OP_AND_INT_LIT8: /* 0xdd */
6999 /* File: x86/OP_AND_INT_LIT8.S */
7000 /* File: x86/binopLit8.S */
7001     /*
7002      * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7003      * that specifies an instruction that performs "result = eax op ecx".
7004      * This could be an x86 instruction or a function call.  (If the result
7005      * comes back in a register other than r0, you can override "result".)
7006      *
7007      * For: add-int/lit8, rsub-int/lit8
7008      *      and-int/lit8, or-int/lit8, xor-int/lit8,
7009      *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7010      */
7011     /* binop/lit8 vAA, vBB, #+CC */
7012     movzbl    2(rPC),%eax              # eax<- BB
7013     movsbl    3(rPC),%ecx              # ecx<- ssssssCC
7014     GET_VREG_R   %eax %eax             # eax<- rBB
7015     andl %ecx,%eax                             # ex: addl %ecx,%eax
7016     SET_VREG   %eax rINST
7017     FETCH_INST_OPCODE 2 %ecx
7018     ADVANCE_PC 2
7019     GOTO_NEXT_R %ecx
7020
7021
7022 /* ------------------------------ */
7023 .L_OP_OR_INT_LIT8: /* 0xde */
7024 /* File: x86/OP_OR_INT_LIT8.S */
7025 /* File: x86/binopLit8.S */
7026     /*
7027      * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7028      * that specifies an instruction that performs "result = eax op ecx".
7029      * This could be an x86 instruction or a function call.  (If the result
7030      * comes back in a register other than r0, you can override "result".)
7031      *
7032      * For: add-int/lit8, rsub-int/lit8
7033      *      and-int/lit8, or-int/lit8, xor-int/lit8,
7034      *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7035      */
7036     /* binop/lit8 vAA, vBB, #+CC */
7037     movzbl    2(rPC),%eax              # eax<- BB
7038     movsbl    3(rPC),%ecx              # ecx<- ssssssCC
7039     GET_VREG_R   %eax %eax             # eax<- rBB
7040     orl     %ecx,%eax                             # ex: addl %ecx,%eax
7041     SET_VREG   %eax rINST
7042     FETCH_INST_OPCODE 2 %ecx
7043     ADVANCE_PC 2
7044     GOTO_NEXT_R %ecx
7045
7046
7047 /* ------------------------------ */
7048 .L_OP_XOR_INT_LIT8: /* 0xdf */
7049 /* File: x86/OP_XOR_INT_LIT8.S */
7050 /* File: x86/binopLit8.S */
7051     /*
7052      * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7053      * that specifies an instruction that performs "result = eax op ecx".
7054      * This could be an x86 instruction or a function call.  (If the result
7055      * comes back in a register other than r0, you can override "result".)
7056      *
7057      * For: add-int/lit8, rsub-int/lit8
7058      *      and-int/lit8, or-int/lit8, xor-int/lit8,
7059      *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7060      */
7061     /* binop/lit8 vAA, vBB, #+CC */
7062     movzbl    2(rPC),%eax              # eax<- BB
7063     movsbl    3(rPC),%ecx              # ecx<- ssssssCC
7064     GET_VREG_R   %eax %eax             # eax<- rBB
7065     xor    %ecx,%eax                             # ex: addl %ecx,%eax
7066     SET_VREG   %eax rINST
7067     FETCH_INST_OPCODE 2 %ecx
7068     ADVANCE_PC 2
7069     GOTO_NEXT_R %ecx
7070
7071
7072 /* ------------------------------ */
7073 .L_OP_SHL_INT_LIT8: /* 0xe0 */
7074 /* File: x86/OP_SHL_INT_LIT8.S */
7075 /* File: x86/binopLit8.S */
7076     /*
7077      * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7078      * that specifies an instruction that performs "result = eax op ecx".
7079      * This could be an x86 instruction or a function call.  (If the result
7080      * comes back in a register other than r0, you can override "result".)
7081      *
7082      * For: add-int/lit8, rsub-int/lit8
7083      *      and-int/lit8, or-int/lit8, xor-int/lit8,
7084      *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7085      */
7086     /* binop/lit8 vAA, vBB, #+CC */
7087     movzbl    2(rPC),%eax              # eax<- BB
7088     movsbl    3(rPC),%ecx              # ecx<- ssssssCC
7089     GET_VREG_R   %eax %eax             # eax<- rBB
7090     sall  %cl,%eax                             # ex: addl %ecx,%eax
7091     SET_VREG   %eax rINST
7092     FETCH_INST_OPCODE 2 %ecx
7093     ADVANCE_PC 2
7094     GOTO_NEXT_R %ecx
7095
7096
7097 /* ------------------------------ */
7098 .L_OP_SHR_INT_LIT8: /* 0xe1 */
7099 /* File: x86/OP_SHR_INT_LIT8.S */
7100 /* File: x86/binopLit8.S */
7101     /*
7102      * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7103      * that specifies an instruction that performs "result = eax op ecx".
7104      * This could be an x86 instruction or a function call.  (If the result
7105      * comes back in a register other than r0, you can override "result".)
7106      *
7107      * For: add-int/lit8, rsub-int/lit8
7108      *      and-int/lit8, or-int/lit8, xor-int/lit8,
7109      *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7110      */
7111     /* binop/lit8 vAA, vBB, #+CC */
7112     movzbl    2(rPC),%eax              # eax<- BB
7113     movsbl    3(rPC),%ecx              # ecx<- ssssssCC
7114     GET_VREG_R   %eax %eax             # eax<- rBB
7115     sarl    %cl,%eax                             # ex: addl %ecx,%eax
7116     SET_VREG   %eax rINST
7117     FETCH_INST_OPCODE 2 %ecx
7118     ADVANCE_PC 2
7119     GOTO_NEXT_R %ecx
7120
7121
7122 /* ------------------------------ */
7123 .L_OP_USHR_INT_LIT8: /* 0xe2 */
7124 /* File: x86/OP_USHR_INT_LIT8.S */
7125 /* File: x86/binopLit8.S */
7126     /*
7127      * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7128      * that specifies an instruction that performs "result = eax op ecx".
7129      * This could be an x86 instruction or a function call.  (If the result
7130      * comes back in a register other than r0, you can override "result".)
7131      *
7132      * For: add-int/lit8, rsub-int/lit8
7133      *      and-int/lit8, or-int/lit8, xor-int/lit8,
7134      *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7135      */
7136     /* binop/lit8 vAA, vBB, #+CC */
7137     movzbl    2(rPC),%eax              # eax<- BB
7138     movsbl    3(rPC),%ecx              # ecx<- ssssssCC
7139     GET_VREG_R   %eax %eax             # eax<- rBB
7140     shrl     %cl,%eax                             # ex: addl %ecx,%eax
7141     SET_VREG   %eax rINST
7142     FETCH_INST_OPCODE 2 %ecx
7143     ADVANCE_PC 2
7144     GOTO_NEXT_R %ecx
7145
7146
7147 /* ------------------------------ */
7148 .L_OP_IGET_VOLATILE: /* 0xe3 */
7149 /* File: x86/OP_IGET_VOLATILE.S */
7150 /* File: x86/OP_IGET.S */
7151     /*
7152      * General 32-bit instance field get.
7153      *
7154      * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
7155      */
7156     /* op vA, vB, field@CCCC */
7157     movl    rSELF,%ecx
7158     SPILL(rIBASE)                               # preserve rIBASE
7159     movzwl  2(rPC),rIBASE                       # rIBASE<- 0000CCCC
7160     movl    offThread_methodClassDex(%ecx),%eax # eax<- DvmDex
7161     movzbl  rINSTbl,%ecx                        # ecx<- BA
7162     sarl    $4,%ecx                            # ecx<- B
7163     movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
7164     andb    $0xf,rINSTbl                       # rINST<- A
7165     GET_VREG_R %ecx %ecx                        # ecx<- fp[B], the object ptr
7166     movl    (%eax,rIBASE,4),%eax                # resolved entry
7167     testl   %eax,%eax                           # is resolved entry null?
7168     jne     .LOP_IGET_VOLATILE_finish                  # no, already resolved
7169     movl    rIBASE,OUT_ARG1(%esp)               # needed by dvmResolveInstField
7170     movl    rSELF,rIBASE
7171     EXPORT_PC
7172     movl    offThread_method(rIBASE),rIBASE     # rIBASE<- current method
7173     movl    offMethod_clazz(rIBASE),rIBASE      # rIBASE<- method->clazz
7174     SPILL_TMP1(%ecx)                            # save obj pointer across call
7175     movl    rIBASE,OUT_ARG0(%esp)               # pass in method->clazz
7176     call    dvmResolveInstField                 #  ... to dvmResolveInstField
7177     UNSPILL_TMP1(%ecx)
7178     testl   %eax,%eax                           #  returns InstrField ptr
7179     jne     .LOP_IGET_VOLATILE_finish
7180     jmp     common_exceptionThrown
7181
7182 .LOP_IGET_VOLATILE_finish:
7183     /*
7184      * Currently:
7185      *   eax holds resolved field
7186      *   ecx holds object
7187      *   rINST holds A
7188      */
7189     movl    offInstField_byteOffset(%eax),%eax  # eax<- byte offset of field
7190     testl   %ecx,%ecx                           # object null?
7191     je      common_errNullObject                # object was null
7192     movl   (%ecx,%eax,1),%ecx                  # ecx<- obj.field (8/16/32 bits)
7193     FETCH_INST_OPCODE 2 %eax
7194     UNSPILL(rIBASE)
7195     SET_VREG %ecx rINST
7196     ADVANCE_PC 2
7197     GOTO_NEXT_R %eax
7198
7199
7200 /* ------------------------------ */
7201 .L_OP_IPUT_VOLATILE: /* 0xe4 */
7202 /* File: x86/OP_IPUT_VOLATILE.S */
7203 /* File: x86/OP_IPUT.S */
7204
7205     /*
7206      * General 32-bit instance field put.
7207      *
7208      * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
7209      */
7210     /* op vA, vB, field@CCCC */
7211     movl    rSELF,%ecx
7212     SPILL   (rIBASE)
7213     movzwl  2(rPC),rIBASE                       # rIBASE<- 0000CCCC
7214     movl    offThread_methodClassDex(%ecx),%eax # eax<- DvmDex
7215     movzbl  rINSTbl,%ecx                        # ecx<- BA
7216     sarl    $4,%ecx                            # ecx<- B
7217     movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
7218     andb    $0xf,rINSTbl                       # rINST<- A
7219     GET_VREG_R %ecx %ecx                        # ecx<- fp[B], the object ptr
7220     movl    (%eax,rIBASE,4),%eax                # resolved entry
7221     testl   %eax,%eax                           # is resolved entry null?
7222     jne     .LOP_IPUT_VOLATILE_finish                  # no, already resolved
7223     movl    rIBASE,OUT_ARG1(%esp)
7224     movl    rSELF,rIBASE
7225     EXPORT_PC
7226     movl    offThread_method(rIBASE),rIBASE     # rIBASE<- current method
7227     movl    offMethod_clazz(rIBASE),rIBASE      # rIBASE<- method->clazz
7228     SPILL_TMP1(%ecx)                            # save obj pointer across call
7229     movl    rIBASE,OUT_ARG0(%esp)               # pass in method->clazz
7230     call    dvmResolveInstField                 #  ... to dvmResolveInstField
7231     UNSPILL_TMP1(%ecx)
7232     testl   %eax,%eax                           # returns InstrField ptr
7233     jne     .LOP_IPUT_VOLATILE_finish
7234     jmp     common_exceptionThrown
7235
7236 .LOP_IPUT_VOLATILE_finish:
7237     /*
7238      * Currently:
7239      *   eax holds resolved field
7240      *   ecx holds object
7241      *   rINST holds A
7242      */
7243     GET_VREG_R rINST rINST                       # rINST<- v[A]
7244     movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
7245     testl   %ecx,%ecx                            # object null?
7246     je      common_errNullObject                 # object was null
7247     movl   rINST,(%ecx,%eax,1)            # obj.field <- v[A](8/16/32 bits)
7248     FETCH_INST_OPCODE 2 %ecx
7249     UNSPILL(rIBASE)
7250     ADVANCE_PC 2
7251     GOTO_NEXT_R %ecx
7252
7253
7254 /* ------------------------------ */
7255 .L_OP_SGET_VOLATILE: /* 0xe5 */
7256 /* File: x86/OP_SGET_VOLATILE.S */
7257 /* File: x86/OP_SGET.S */
7258     /*
7259      * General 32-bit SGET handler.
7260      *
7261      * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
7262      */
7263     /* op vAA, field@BBBB */
7264     movl      rSELF,%ecx
7265     movzwl    2(rPC),%eax                        # eax<- field ref BBBB
7266     movl      offThread_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
7267     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
7268     movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
7269     testl     %eax,%eax                          # resolved entry null?
7270     je        .LOP_SGET_VOLATILE_resolve                # if not, make it so
7271 .LOP_SGET_VOLATILE_finish:     # field ptr in eax
7272     movl      offStaticField_value(%eax),%eax
7273     FETCH_INST_OPCODE 2 %ecx
7274     ADVANCE_PC 2
7275     SET_VREG %eax rINST
7276     GOTO_NEXT_R %ecx
7277
7278     /*
7279      * Go resolve the field
7280      */
7281 .LOP_SGET_VOLATILE_resolve:
7282     movl     rSELF,%ecx
7283     movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7284     movl     offThread_method(%ecx),%ecx          # ecx<- current method
7285     EXPORT_PC                                   # could throw, need to export
7286     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7287     movl     %eax,OUT_ARG1(%esp)
7288     movl     %ecx,OUT_ARG0(%esp)
7289     SPILL(rIBASE)
7290     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7291     UNSPILL(rIBASE)
7292     testl    %eax,%eax
7293     jne      .LOP_SGET_VOLATILE_finish                 # success, continue
7294     jmp      common_exceptionThrown             # no, handle exception
7295
7296
7297 /* ------------------------------ */
7298 .L_OP_SPUT_VOLATILE: /* 0xe6 */
7299 /* File: x86/OP_SPUT_VOLATILE.S */
7300 /* File: x86/OP_SPUT.S */
7301     /*
7302      * General 32-bit SPUT handler.
7303      *
7304      * for: sput, sput-boolean, sput-byte, sput-char, sput-short
7305      */
7306     /* op vAA, field@BBBB */
7307     movl      rSELF,%ecx
7308     movzwl    2(rPC),%eax                        # eax<- field ref BBBB
7309     movl      offThread_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
7310     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
7311     movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
7312     testl     %eax,%eax                          # resolved entry null?
7313     je        .LOP_SPUT_VOLATILE_resolve                # if not, make it so
7314 .LOP_SPUT_VOLATILE_finish:     # field ptr in eax
7315     GET_VREG_R  rINST rINST
7316     FETCH_INST_OPCODE 2 %ecx
7317     ADVANCE_PC 2
7318     movl      rINST,offStaticField_value(%eax)
7319     GOTO_NEXT_R %ecx
7320
7321     /*
7322      * Go resolve the field
7323      */
7324 .LOP_SPUT_VOLATILE_resolve:
7325     movl     rSELF,%ecx
7326     movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7327     movl     offThread_method(%ecx),%ecx          # ecx<- current method
7328     EXPORT_PC                                   # could throw, need to export
7329     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7330     movl     %eax,OUT_ARG1(%esp)
7331     movl     %ecx,OUT_ARG0(%esp)
7332     SPILL(rIBASE)
7333     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7334     UNSPILL(rIBASE)
7335     testl    %eax,%eax
7336     jne      .LOP_SPUT_VOLATILE_finish                 # success, continue
7337     jmp      common_exceptionThrown             # no, handle exception
7338
7339
7340 /* ------------------------------ */
7341 .L_OP_IGET_OBJECT_VOLATILE: /* 0xe7 */
7342 /* File: x86/OP_IGET_OBJECT_VOLATILE.S */
7343 /* File: x86/OP_IGET.S */
7344     /*
7345      * General 32-bit instance field get.
7346      *
7347      * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
7348      */
7349     /* op vA, vB, field@CCCC */
7350     movl    rSELF,%ecx
7351     SPILL(rIBASE)                               # preserve rIBASE
7352     movzwl  2(rPC),rIBASE                       # rIBASE<- 0000CCCC
7353     movl    offThread_methodClassDex(%ecx),%eax # eax<- DvmDex
7354     movzbl  rINSTbl,%ecx                        # ecx<- BA
7355     sarl    $4,%ecx                            # ecx<- B
7356     movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
7357     andb    $0xf,rINSTbl                       # rINST<- A
7358     GET_VREG_R %ecx %ecx                        # ecx<- fp[B], the object ptr
7359     movl    (%eax,rIBASE,4),%eax                # resolved entry
7360     testl   %eax,%eax                           # is resolved entry null?
7361     jne     .LOP_IGET_OBJECT_VOLATILE_finish                  # no, already resolved
7362     movl    rIBASE,OUT_ARG1(%esp)               # needed by dvmResolveInstField
7363     movl    rSELF,rIBASE
7364     EXPORT_PC
7365     movl    offThread_method(rIBASE),rIBASE     # rIBASE<- current method
7366     movl    offMethod_clazz(rIBASE),rIBASE      # rIBASE<- method->clazz
7367     SPILL_TMP1(%ecx)                            # save obj pointer across call
7368     movl    rIBASE,OUT_ARG0(%esp)               # pass in method->clazz
7369     call    dvmResolveInstField                 #  ... to dvmResolveInstField
7370     UNSPILL_TMP1(%ecx)
7371     testl   %eax,%eax                           #  returns InstrField ptr
7372     jne     .LOP_IGET_OBJECT_VOLATILE_finish
7373     jmp     common_exceptionThrown
7374
7375 .LOP_IGET_OBJECT_VOLATILE_finish:
7376     /*
7377      * Currently:
7378      *   eax holds resolved field
7379      *   ecx holds object
7380      *   rINST holds A
7381      */
7382     movl    offInstField_byteOffset(%eax),%eax  # eax<- byte offset of field
7383     testl   %ecx,%ecx                           # object null?
7384     je      common_errNullObject                # object was null
7385     movl   (%ecx,%eax,1),%ecx                  # ecx<- obj.field (8/16/32 bits)
7386     FETCH_INST_OPCODE 2 %eax
7387     UNSPILL(rIBASE)
7388     SET_VREG %ecx rINST
7389     ADVANCE_PC 2
7390     GOTO_NEXT_R %eax
7391
7392
7393 /* ------------------------------ */
7394 .L_OP_IGET_WIDE_VOLATILE: /* 0xe8 */
7395     /* (stub) */
7396     SAVE_PC_FP_TO_SELF %ecx          # leaves rSELF in %ecx
7397     movl %ecx,OUT_ARG0(%esp)         # self is first arg to function
7398     call      dvmMterp_OP_IGET_WIDE_VOLATILE     # do the real work
7399     movl      rSELF,%ecx
7400     LOAD_PC_FP_FROM_SELF             # retrieve updated values
7401     movl      offThread_curHandlerTable(%ecx),rIBASE  # set up rIBASE
7402     FETCH_INST
7403     GOTO_NEXT
7404 /* ------------------------------ */
7405 .L_OP_IPUT_WIDE_VOLATILE: /* 0xe9 */
7406     /* (stub) */
7407     SAVE_PC_FP_TO_SELF %ecx          # leaves rSELF in %ecx
7408     movl %ecx,OUT_ARG0(%esp)         # self is first arg to function
7409     call      dvmMterp_OP_IPUT_WIDE_VOLATILE     # do the real work
7410     movl      rSELF,%ecx
7411     LOAD_PC_FP_FROM_SELF             # retrieve updated values
7412     movl      offThread_curHandlerTable(%ecx),rIBASE  # set up rIBASE
7413     FETCH_INST
7414     GOTO_NEXT
7415 /* ------------------------------ */
7416 .L_OP_SGET_WIDE_VOLATILE: /* 0xea */
7417     /* (stub) */
7418     SAVE_PC_FP_TO_SELF %ecx          # leaves rSELF in %ecx
7419     movl %ecx,OUT_ARG0(%esp)         # self is first arg to function
7420     call      dvmMterp_OP_SGET_WIDE_VOLATILE     # do the real work
7421     movl      rSELF,%ecx
7422     LOAD_PC_FP_FROM_SELF             # retrieve updated values
7423     movl      offThread_curHandlerTable(%ecx),rIBASE  # set up rIBASE
7424     FETCH_INST
7425     GOTO_NEXT
7426 /* ------------------------------ */
7427 .L_OP_SPUT_WIDE_VOLATILE: /* 0xeb */
7428     /* (stub) */
7429     SAVE_PC_FP_TO_SELF %ecx          # leaves rSELF in %ecx
7430     movl %ecx,OUT_ARG0(%esp)         # self is first arg to function
7431     call      dvmMterp_OP_SPUT_WIDE_VOLATILE     # do the real work
7432     movl      rSELF,%ecx
7433     LOAD_PC_FP_FROM_SELF             # retrieve updated values
7434     movl      offThread_curHandlerTable(%ecx),rIBASE  # set up rIBASE
7435     FETCH_INST
7436     GOTO_NEXT
7437 /* ------------------------------ */
7438 .L_OP_BREAKPOINT: /* 0xec */
7439 /* File: x86/OP_BREAKPOINT.S */
7440 /* File: x86/unused.S */
7441     jmp     common_abort
7442
7443
7444 /* ------------------------------ */
7445 .L_OP_THROW_VERIFICATION_ERROR: /* 0xed */
7446 /* File: x86/OP_THROW_VERIFICATION_ERROR.S */
7447     /*
7448      * Handle a throw-verification-error instruction.  This throws an
7449      * exception for an error discovered during verification.  The
7450      * exception is indicated by AA, with some detail provided by BBBB.
7451      */
7452     /* op AA, ref@BBBB */
7453     movl     rSELF,%ecx
7454     movzwl   2(rPC),%eax                     # eax<- BBBB
7455     movl     offThread_method(%ecx),%ecx       # ecx<- self->method
7456     EXPORT_PC
7457     movl     %eax,OUT_ARG2(%esp)             # arg2<- BBBB
7458     movl     rINST,OUT_ARG1(%esp)            # arg1<- AA
7459     movl     %ecx,OUT_ARG0(%esp)             # arg0<- method
7460     call     dvmThrowVerificationError       # call(method, kind, ref)
7461     jmp      common_exceptionThrown          # handle exception
7462
7463 /* ------------------------------ */
7464 .L_OP_EXECUTE_INLINE: /* 0xee */
7465 /* File: x86/OP_EXECUTE_INLINE.S */
7466     /*
7467      * Execute a "native inline" instruction.
7468      *
7469      * We will be calling through a function table:
7470      *
7471      * (*gDvmInlineOpsTable[opIndex].func)(arg0, arg1, arg2, arg3, pResult)
7472      *
7473      * Ignores argument count - always loads 4.
7474      *
7475      */
7476     /* [opt] execute-inline vAA, {vC, vD, vE, vF}, inline@BBBB */
7477     movl      rSELF,%ecx
7478     EXPORT_PC
7479     movzwl    2(rPC),%eax               # eax<- BBBB
7480     leal      offThread_retval(%ecx),%ecx # ecx<- & self->retval
7481     SPILL(rIBASE)                       # preserve rIBASE
7482     movl      %ecx,OUT_ARG4(%esp)
7483     call      .LOP_EXECUTE_INLINE_continue      # make call; will return after
7484     UNSPILL(rIBASE)                     # restore rIBASE
7485     testl     %eax,%eax                 # successful?
7486     FETCH_INST_OPCODE 3 %ecx
7487     je        common_exceptionThrown    # no, handle exception
7488     ADVANCE_PC 3
7489     GOTO_NEXT_R %ecx
7490
7491 .LOP_EXECUTE_INLINE_continue:
7492     /*
7493      * Extract args, call function.
7494      *  ecx = #of args (0-4)
7495      *  eax = call index
7496      *  @esp = return addr
7497      *  esp is -4 from normal
7498      *
7499      *  Go ahead and load all 4 args, even if not used.
7500      */
7501     movzwl    4(rPC),rIBASE
7502
7503     movl      $0xf,%ecx
7504     andl      rIBASE,%ecx
7505     GET_VREG_R  %ecx %ecx
7506     sarl      $4,rIBASE
7507     movl      %ecx,4+OUT_ARG0(%esp)
7508
7509     movl      $0xf,%ecx
7510     andl      rIBASE,%ecx
7511     GET_VREG_R  %ecx %ecx
7512     sarl      $4,rIBASE
7513     movl      %ecx,4+OUT_ARG1(%esp)
7514
7515     movl      $0xf,%ecx
7516     andl      rIBASE,%ecx
7517     GET_VREG_R  %ecx %ecx
7518     sarl      $4,rIBASE
7519     movl      %ecx,4+OUT_ARG2(%esp)
7520
7521     movl      $0xf,%ecx
7522     andl      rIBASE,%ecx
7523     GET_VREG_R  %ecx %ecx
7524     sarl      $4,rIBASE
7525     movl      %ecx,4+OUT_ARG3(%esp)
7526
7527     sall      $4,%eax      # index *= sizeof(table entry)
7528     jmp       *gDvmInlineOpsTable(%eax)
7529     # will return to caller of .LOP_EXECUTE_INLINE_continue
7530
7531 /* ------------------------------ */
7532 .L_OP_EXECUTE_INLINE_RANGE: /* 0xef */
7533     /* (stub) */
7534     SAVE_PC_FP_TO_SELF %ecx          # leaves rSELF in %ecx
7535     movl %ecx,OUT_ARG0(%esp)         # self is first arg to function
7536     call      dvmMterp_OP_EXECUTE_INLINE_RANGE     # do the real work
7537     movl      rSELF,%ecx
7538     LOAD_PC_FP_FROM_SELF             # retrieve updated values
7539     movl      offThread_curHandlerTable(%ecx),rIBASE  # set up rIBASE
7540     FETCH_INST
7541     GOTO_NEXT
7542 /* ------------------------------ */
7543 .L_OP_INVOKE_OBJECT_INIT_RANGE: /* 0xf0 */
7544     /* (stub) */
7545     SAVE_PC_FP_TO_SELF %ecx          # leaves rSELF in %ecx
7546     movl %ecx,OUT_ARG0(%esp)         # self is first arg to function
7547     call      dvmMterp_OP_INVOKE_OBJECT_INIT_RANGE     # do the real work
7548     movl      rSELF,%ecx
7549     LOAD_PC_FP_FROM_SELF             # retrieve updated values
7550     movl      offThread_curHandlerTable(%ecx),rIBASE  # set up rIBASE
7551     FETCH_INST
7552     GOTO_NEXT
7553 /* ------------------------------ */
7554 .L_OP_RETURN_VOID_BARRIER: /* 0xf1 */
7555     /* (stub) */
7556     SAVE_PC_FP_TO_SELF %ecx          # leaves rSELF in %ecx
7557     movl %ecx,OUT_ARG0(%esp)         # self is first arg to function
7558     call      dvmMterp_OP_RETURN_VOID_BARRIER     # do the real work
7559     movl      rSELF,%ecx
7560     LOAD_PC_FP_FROM_SELF             # retrieve updated values
7561     movl      offThread_curHandlerTable(%ecx),rIBASE  # set up rIBASE
7562     FETCH_INST
7563     GOTO_NEXT
7564 /* ------------------------------ */
7565 .L_OP_IGET_QUICK: /* 0xf2 */
7566 /* File: x86/OP_IGET_QUICK.S */
7567     /* For: iget-quick, iget-object-quick */
7568     /* op vA, vB, offset@CCCC */
7569     movzbl    rINSTbl,%ecx              # ecx<- BA
7570     sarl      $4,%ecx                  # ecx<- B
7571     GET_VREG_R  %ecx %ecx               # vB (object we're operating on)
7572     movzwl    2(rPC),%eax               # eax<- field byte offset
7573     cmpl      $0,%ecx                  # is object null?
7574     je        common_errNullObject
7575     movl      (%ecx,%eax,1),%eax
7576     FETCH_INST_OPCODE 2 %ecx
7577     ADVANCE_PC 2
7578     andb      $0xf,rINSTbl             # rINST<- A
7579     SET_VREG  %eax rINST                # fp[A]<- result
7580     GOTO_NEXT_R %ecx
7581
7582 /* ------------------------------ */
7583 .L_OP_IGET_WIDE_QUICK: /* 0xf3 */
7584 /* File: x86/OP_IGET_WIDE_QUICK.S */
7585     /* For: iget-wide-quick */
7586     /* op vA, vB, offset@CCCC */
7587     movzbl    rINSTbl,%ecx              # ecx<- BA
7588     sarl      $4,%ecx                  # ecx<- B
7589     GET_VREG_R  %ecx %ecx               # vB (object we're operating on)
7590     movzwl    2(rPC),%eax               # eax<- field byte offset
7591     cmpl      $0,%ecx                  # is object null?
7592     je        common_errNullObject
7593     leal      (%ecx,%eax,1),%eax        # eax<- address of 64-bit source
7594     movl      (%eax),%ecx               # ecx<- lsw
7595     movl      4(%eax),%eax              # eax<- msw
7596     andb      $0xf,rINSTbl             # rINST<- A
7597     SET_VREG_WORD %ecx rINST 0          # v[A+0]<- lsw
7598     FETCH_INST_OPCODE 2 %ecx
7599     SET_VREG_WORD %eax rINST 1          # v[A+1]<- msw
7600     ADVANCE_PC 2
7601     GOTO_NEXT_R %ecx
7602
7603 /* ------------------------------ */
7604 .L_OP_IGET_OBJECT_QUICK: /* 0xf4 */
7605 /* File: x86/OP_IGET_OBJECT_QUICK.S */
7606 /* File: x86/OP_IGET_QUICK.S */
7607     /* For: iget-quick, iget-object-quick */
7608     /* op vA, vB, offset@CCCC */
7609     movzbl    rINSTbl,%ecx              # ecx<- BA
7610     sarl      $4,%ecx                  # ecx<- B
7611     GET_VREG_R  %ecx %ecx               # vB (object we're operating on)
7612     movzwl    2(rPC),%eax               # eax<- field byte offset
7613     cmpl      $0,%ecx                  # is object null?
7614     je        common_errNullObject
7615     movl      (%ecx,%eax,1),%eax
7616     FETCH_INST_OPCODE 2 %ecx
7617     ADVANCE_PC 2
7618     andb      $0xf,rINSTbl             # rINST<- A
7619     SET_VREG  %eax rINST                # fp[A]<- result
7620     GOTO_NEXT_R %ecx
7621
7622
7623 /* ------------------------------ */
7624 .L_OP_IPUT_QUICK: /* 0xf5 */
7625 /* File: x86/OP_IPUT_QUICK.S */
7626     /* For: iput-quick */
7627     /* op vA, vB, offset@CCCC */
7628     movzbl    rINSTbl,%ecx              # ecx<- BA
7629     sarl      $4,%ecx                  # ecx<- B
7630     GET_VREG_R  %ecx %ecx               # vB (object we're operating on)
7631     andb      $0xf,rINSTbl             # rINST<- A
7632     GET_VREG_R  rINST,rINST             # rINST<- v[A]
7633     movzwl    2(rPC),%eax               # eax<- field byte offset
7634     testl     %ecx,%ecx                 # is object null?
7635     je        common_errNullObject
7636     movl      rINST,(%ecx,%eax,1)
7637     FETCH_INST_OPCODE 2 %ecx
7638     ADVANCE_PC 2
7639     GOTO_NEXT_R %ecx
7640
7641 /* ------------------------------ */
7642 .L_OP_IPUT_WIDE_QUICK: /* 0xf6 */
7643 /* File: x86/OP_IPUT_WIDE_QUICK.S */
7644     /* For: iput-wide-quick */
7645     /* op vA, vB, offset@CCCC */
7646     movzbl    rINSTbl,%ecx              # ecx<- BA
7647     sarl      $4,%ecx                  # ecx<- B
7648     GET_VREG_R  %ecx %ecx               # vB (object we're operating on)
7649     movzwl    2(rPC),%eax               # eax<- field byte offset
7650     testl      %ecx,%ecx                # is object null?
7651     je        common_errNullObject
7652     leal      (%ecx,%eax,1),%ecx        # ecx<- Address of 64-bit target
7653     andb      $0xf,rINSTbl             # rINST<- A
7654     GET_VREG_WORD %eax rINST 0          # eax<- lsw
7655     GET_VREG_WORD rINST rINST 1         # rINST<- msw
7656     movl      %eax,(%ecx)
7657     movl      rINST,4(%ecx)
7658     FETCH_INST_OPCODE 2 %ecx
7659     ADVANCE_PC 2
7660     GOTO_NEXT_R %ecx
7661
7662 /* ------------------------------ */
7663 .L_OP_IPUT_OBJECT_QUICK: /* 0xf7 */
7664 /* File: x86/OP_IPUT_OBJECT_QUICK.S */
7665     /* For: iput-object-quick */
7666     /* op vA, vB, offset@CCCC */
7667     movzbl    rINSTbl,%ecx              # ecx<- BA
7668     sarl      $4,%ecx                  # ecx<- B
7669     GET_VREG_R  %ecx %ecx               # vB (object we're operating on)
7670     andb      $0xf,rINSTbl             # rINST<- A
7671     GET_VREG_R  rINST rINST             # rINST<- v[A]
7672     movzwl    2(rPC),%eax               # eax<- field byte offset
7673     testl     %ecx,%ecx                 # is object null?
7674     je        common_errNullObject
7675     movl      rINST,(%ecx,%eax,1)
7676     movl      rSELF,%eax
7677     testl     rINST,rINST               # did we store null?
7678     movl      offThread_cardTable(%eax),%eax  # get card table base
7679     je        1f                            # skip card mark if null store
7680     shrl      $GC_CARD_SHIFT,%ecx          # object head to card number
7681     movb      %al,(%eax,%ecx)               # mark card based on object head
7682 1:
7683     FETCH_INST_OPCODE 2 %ecx
7684     ADVANCE_PC 2
7685     GOTO_NEXT_R %ecx
7686
7687 /* ------------------------------ */
7688 .L_OP_INVOKE_VIRTUAL_QUICK: /* 0xf8 */
7689 /* File: x86/OP_INVOKE_VIRTUAL_QUICK.S */
7690     /*
7691      * Handle an optimized virtual method call.
7692      *
7693      * for: [opt] invoke-virtual-quick, invoke-virtual-quick/range
7694      */
7695     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7696     /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7697     movzwl    4(rPC),%eax               # eax<- FEDC or CCCC
7698     movzwl    2(rPC),%ecx               # ecx<- BBBB
7699     .if     (!0)
7700     andl      $0xf,%eax                # eax<- C (or stays CCCC)
7701     .endif
7702     GET_VREG_R  %eax %eax               # eax<- vC ("this" ptr)
7703     testl     %eax,%eax                 # null?
7704     je        common_errNullObject      # yep, throw exception
7705     movl      offObject_clazz(%eax),%eax # eax<- thisPtr->clazz
7706     movl      offClassObject_vtable(%eax),%eax # eax<- thisPtr->clazz->vtable
7707     EXPORT_PC                           # might throw later - get ready
7708     movl      (%eax,%ecx,4),%eax        # eax<- vtable[BBBB]
7709     jmp       common_invokeMethodNoRange
7710
7711 /* ------------------------------ */
7712 .L_OP_INVOKE_VIRTUAL_QUICK_RANGE: /* 0xf9 */
7713 /* File: x86/OP_INVOKE_VIRTUAL_QUICK_RANGE.S */
7714 /* File: x86/OP_INVOKE_VIRTUAL_QUICK.S */
7715     /*
7716      * Handle an optimized virtual method call.
7717      *
7718      * for: [opt] invoke-virtual-quick, invoke-virtual-quick/range
7719      */
7720     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7721     /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7722     movzwl    4(rPC),%eax               # eax<- FEDC or CCCC
7723     movzwl    2(rPC),%ecx               # ecx<- BBBB
7724     .if     (!1)
7725     andl      $0xf,%eax                # eax<- C (or stays CCCC)
7726     .endif
7727     GET_VREG_R  %eax %eax               # eax<- vC ("this" ptr)
7728     testl     %eax,%eax                 # null?
7729     je        common_errNullObject      # yep, throw exception
7730     movl      offObject_clazz(%eax),%eax # eax<- thisPtr->clazz
7731     movl      offClassObject_vtable(%eax),%eax # eax<- thisPtr->clazz->vtable
7732     EXPORT_PC                           # might throw later - get ready
7733     movl      (%eax,%ecx,4),%eax        # eax<- vtable[BBBB]
7734     jmp       common_invokeMethodRange
7735
7736
7737 /* ------------------------------ */
7738 .L_OP_INVOKE_SUPER_QUICK: /* 0xfa */
7739 /* File: x86/OP_INVOKE_SUPER_QUICK.S */
7740     /*
7741      * Handle an optimized "super" method call.
7742      *
7743      * for: [opt] invoke-super-quick, invoke-super-quick/range
7744      */
7745     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7746     /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7747     movl      rSELF,%ecx
7748     movzwl    4(rPC),%eax               # eax<- GFED or CCCC
7749     movl      offThread_method(%ecx),%ecx # ecx<- current method
7750     .if       (!0)
7751     andl      $0xf,%eax                # eax<- D (or stays CCCC)
7752     .endif
7753     movl      offMethod_clazz(%ecx),%ecx # ecx<- method->clazz
7754     GET_VREG_R  %eax %eax               # eax<- "this"
7755     movl      offClassObject_super(%ecx),%ecx # ecx<- method->clazz->super
7756     testl     %eax,%eax                 # null "this"?
7757     je        common_errNullObject      # "this" is null, throw exception
7758     movzwl    2(rPC),%eax               # eax<- BBBB
7759     movl      offClassObject_vtable(%ecx),%ecx # ecx<- vtable
7760     EXPORT_PC
7761     movl      (%ecx,%eax,4),%eax        # eax<- super->vtable[BBBB]
7762     jmp       common_invokeMethodNoRange
7763
7764 /* ------------------------------ */
7765 .L_OP_INVOKE_SUPER_QUICK_RANGE: /* 0xfb */
7766 /* File: x86/OP_INVOKE_SUPER_QUICK_RANGE.S */
7767 /* File: x86/OP_INVOKE_SUPER_QUICK.S */
7768     /*
7769      * Handle an optimized "super" method call.
7770      *
7771      * for: [opt] invoke-super-quick, invoke-super-quick/range
7772      */
7773     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7774     /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7775     movl      rSELF,%ecx
7776     movzwl    4(rPC),%eax               # eax<- GFED or CCCC
7777     movl      offThread_method(%ecx),%ecx # ecx<- current method
7778     .if       (!1)
7779     andl      $0xf,%eax                # eax<- D (or stays CCCC)
7780     .endif
7781     movl      offMethod_clazz(%ecx),%ecx # ecx<- method->clazz
7782     GET_VREG_R  %eax %eax               # eax<- "this"
7783     movl      offClassObject_super(%ecx),%ecx # ecx<- method->clazz->super
7784     testl     %eax,%eax                 # null "this"?
7785     je        common_errNullObject      # "this" is null, throw exception
7786     movzwl    2(rPC),%eax               # eax<- BBBB
7787     movl      offClassObject_vtable(%ecx),%ecx # ecx<- vtable
7788     EXPORT_PC
7789     movl      (%ecx,%eax,4),%eax        # eax<- super->vtable[BBBB]
7790     jmp       common_invokeMethodRange
7791
7792
7793 /* ------------------------------ */
7794 .L_OP_IPUT_OBJECT_VOLATILE: /* 0xfc */
7795 /* File: x86/OP_IPUT_OBJECT_VOLATILE.S */
7796 /* File: x86/OP_IPUT_OBJECT.S */
7797     /*
7798      * Object field put.
7799      *
7800      * for: iput-object
7801      */
7802     /* op vA, vB, field@CCCC */
7803     movl    rSELF,%ecx
7804     SPILL(rIBASE)
7805     movzwl  2(rPC),rIBASE                       # rIBASE<- 0000CCCC
7806     movl    offThread_methodClassDex(%ecx),%eax # eax<- DvmDex
7807     movzbl  rINSTbl,%ecx                        # ecx<- BA
7808     sarl    $4,%ecx                            # ecx<- B
7809     movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
7810     andb    $0xf,rINSTbl                       # rINST<- A
7811     GET_VREG_R %ecx %ecx                        # ecx<- fp[B], the object ptr
7812     movl    (%eax,rIBASE,4),%eax                  # resolved entry
7813     testl   %eax,%eax                           # is resolved entry null?
7814     jne     .LOP_IPUT_OBJECT_VOLATILE_finish                  # no, already resolved
7815     movl    rIBASE,OUT_ARG1(%esp)
7816     movl    rSELF,rIBASE
7817     EXPORT_PC
7818     movl    offThread_method(rIBASE),rIBASE     # rIBASE<- current method
7819     movl    offMethod_clazz(rIBASE),rIBASE      # rIBASE<- method->clazz
7820     SPILL_TMP1(%ecx)                            # save obj pointer across call
7821     movl    rIBASE,OUT_ARG0(%esp)               # pass in method->clazz
7822     call    dvmResolveInstField                 #  ... to dvmResolveInstField
7823     UNSPILL_TMP1(%ecx)
7824     testl   %eax,%eax                           # returns InstrField ptr
7825     jne     .LOP_IPUT_OBJECT_VOLATILE_finish
7826     jmp     common_exceptionThrown
7827
7828 .LOP_IPUT_OBJECT_VOLATILE_finish:
7829     /*
7830      * Currently:
7831      *   eax holds resolved field
7832      *   ecx holds object
7833      *   rIBASE is scratch, but needs to be unspilled
7834      *   rINST holds A
7835      */
7836     GET_VREG_R rINST rINST                      # rINST<- v[A]
7837     movl    offInstField_byteOffset(%eax),%eax  # eax<- byte offset of field
7838     testl   %ecx,%ecx                           # object null?
7839     je      common_errNullObject                # object was null
7840     movl    rINST,(%ecx,%eax)      # obj.field <- v[A](8/16/32 bits)
7841     movl    rSELF,%eax
7842     testl   rINST,rINST                         # stored a NULL?
7843     movl    offThread_cardTable(%eax),%eax      # get card table base
7844     je      1f                                  # skip card mark if null store
7845     shrl    $GC_CARD_SHIFT,%ecx                # object head to card number
7846     movb    %al,(%eax,%ecx)                     # mark card using object head
7847 1:
7848     UNSPILL(rIBASE)
7849     FETCH_INST_OPCODE 2 %ecx
7850     ADVANCE_PC 2
7851     GOTO_NEXT_R %ecx
7852
7853
7854 /* ------------------------------ */
7855 .L_OP_SGET_OBJECT_VOLATILE: /* 0xfd */
7856 /* File: x86/OP_SGET_OBJECT_VOLATILE.S */
7857 /* File: x86/OP_SGET.S */
7858     /*
7859      * General 32-bit SGET handler.
7860      *
7861      * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
7862      */
7863     /* op vAA, field@BBBB */
7864     movl      rSELF,%ecx
7865     movzwl    2(rPC),%eax                        # eax<- field ref BBBB
7866     movl      offThread_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
7867     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
7868     movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
7869     testl     %eax,%eax                          # resolved entry null?
7870     je        .LOP_SGET_OBJECT_VOLATILE_resolve                # if not, make it so
7871 .LOP_SGET_OBJECT_VOLATILE_finish:     # field ptr in eax
7872     movl      offStaticField_value(%eax),%eax
7873     FETCH_INST_OPCODE 2 %ecx
7874     ADVANCE_PC 2
7875     SET_VREG %eax rINST
7876     GOTO_NEXT_R %ecx
7877
7878     /*
7879      * Go resolve the field
7880      */
7881 .LOP_SGET_OBJECT_VOLATILE_resolve:
7882     movl     rSELF,%ecx
7883     movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7884     movl     offThread_method(%ecx),%ecx          # ecx<- current method
7885     EXPORT_PC                                   # could throw, need to export
7886     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7887     movl     %eax,OUT_ARG1(%esp)
7888     movl     %ecx,OUT_ARG0(%esp)
7889     SPILL(rIBASE)
7890     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7891     UNSPILL(rIBASE)
7892     testl    %eax,%eax
7893     jne      .LOP_SGET_OBJECT_VOLATILE_finish                 # success, continue
7894     jmp      common_exceptionThrown             # no, handle exception
7895
7896
7897 /* ------------------------------ */
7898 .L_OP_SPUT_OBJECT_VOLATILE: /* 0xfe */
7899 /* File: x86/OP_SPUT_OBJECT_VOLATILE.S */
7900 /* File: x86/OP_SPUT_OBJECT.S */
7901     /*
7902      * SPUT object handler.
7903      */
7904     /* op vAA, field@BBBB */
7905     movl      rSELF,%ecx
7906     movzwl    2(rPC),%eax                        # eax<- field ref BBBB
7907     movl      offThread_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
7908     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
7909     movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField
7910     testl     %eax,%eax                          # resolved entry null?
7911     je        .LOP_SPUT_OBJECT_VOLATILE_resolve                # if not, make it so
7912 .LOP_SPUT_OBJECT_VOLATILE_finish:                              # field ptr in eax
7913     movzbl    rINSTbl,%ecx                       # ecx<- AA
7914     GET_VREG_R  %ecx %ecx
7915     movl      %ecx,offStaticField_value(%eax)    # do the store
7916     testl     %ecx,%ecx                          # stored null object ptr?
7917     je        1f                                 # skip card mark if null
7918     movl      rSELF,%ecx
7919     movl      offField_clazz(%eax),%eax          # eax<- method->clazz
7920     movl      offThread_cardTable(%ecx),%ecx       # get card table base
7921     shrl      $GC_CARD_SHIFT,%eax               # head to card number
7922     movb      %cl,(%ecx,%eax)                    # mark card
7923 1:
7924     FETCH_INST_OPCODE 2 %ecx
7925     ADVANCE_PC 2
7926     GOTO_NEXT_R %ecx
7927
7928 .LOP_SPUT_OBJECT_VOLATILE_resolve:
7929     movl     rSELF,%ecx
7930     movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7931     movl     offThread_method(%ecx),%ecx          # ecx<- current method
7932     EXPORT_PC                                   # could throw, need to export
7933     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7934     movl     %eax,OUT_ARG1(%esp)
7935     movl     %ecx,OUT_ARG0(%esp)
7936     SPILL(rIBASE)
7937     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7938     UNSPILL(rIBASE)
7939     testl    %eax,%eax
7940     jne      .LOP_SPUT_OBJECT_VOLATILE_finish                 # success, continue
7941     jmp      common_exceptionThrown             # no, handle exception
7942
7943
7944 /* ------------------------------ */
7945 .L_OP_DISPATCH_FF: /* 0xff */
7946 /* File: x86/OP_DISPATCH_FF.S */
7947     leal      256(rINST),%ecx
7948     GOTO_NEXT_JUMBO_R %ecx
7949
7950 /* ------------------------------ */
7951 .L_OP_CONST_CLASS_JUMBO: /* 0x100 */
7952 /* File: x86/OP_CONST_CLASS_JUMBO.S */
7953     /* const-class/jumbo vBBBB, Class@AAAAAAAA */
7954     movl      rSELF,%ecx
7955     movl      2(rPC),%eax              # eax<- AAAAAAAA
7956     movl      offThread_methodClassDex(%ecx),%ecx# ecx<- self->methodClassDex
7957     movl      offDvmDex_pResClasses(%ecx),%ecx # ecx<- dvmDex->pResClasses
7958     FETCH_INST_OPCODE 4 %ecx
7959     movl      (%ecx,%eax,4),%eax       # eax<- rResClasses[AAAAAAAA]
7960     testl     %eax,%eax                # resolved yet?
7961     je        .LOP_CONST_CLASS_JUMBO_resolve
7962     SET_VREG  %eax rINST               # vBBBB<- rResClasses[AAAAAAAA]
7963     ADVANCE_PC 4
7964     GOTO_NEXT_R %ecx
7965
7966 /* This is the less common path, so we'll redo some work
7967    here rather than force spills on the common path */
7968 .LOP_CONST_CLASS_JUMBO_resolve:
7969     movl     rSELF,%eax
7970     EXPORT_PC
7971     movl     offThread_method(%eax),%eax # eax<- self->method
7972     movl     $1,OUT_ARG2(%esp)        # true
7973     movl     2(rPC),%ecx               # ecx<- AAAAAAAA
7974     movl     offMethod_clazz(%eax),%eax
7975     movl     %ecx,OUT_ARG1(%esp)
7976     movl     %eax,OUT_ARG0(%esp)
7977     SPILL(rIBASE)
7978     call     dvmResolveClass           # go resolve
7979     UNSPILL(rIBASE)
7980     testl    %eax,%eax                 # failed?
7981     je       common_exceptionThrown
7982     FETCH_INST_OPCODE 4 %ecx
7983     SET_VREG %eax rINST
7984     ADVANCE_PC 4
7985     GOTO_NEXT_R %ecx
7986
7987 /* ------------------------------ */
7988 .L_OP_CHECK_CAST_JUMBO: /* 0x101 */
7989 /* File: x86/OP_CHECK_CAST_JUMBO.S */
7990     /*
7991      * Check to see if a cast from one class to another is allowed.
7992      */
7993     /* check-cast/jumbo vBBBB, class@AAAAAAAA */
7994     movl      rSELF,%ecx
7995     GET_VREG_R  rINST,rINST             # rINST<- vBBBB (object)
7996     movl      2(rPC),%eax               # eax<- AAAAAAAA
7997     movl      offThread_methodClassDex(%ecx),%ecx # ecx<- pDvmDex
7998     testl     rINST,rINST               # is oject null?
7999     movl      offDvmDex_pResClasses(%ecx),%ecx # ecx<- pDvmDex->pResClasses
8000     je        .LOP_CHECK_CAST_JUMBO_okay          # null obj, cast always succeeds
8001     movl      (%ecx,%eax,4),%eax        # eax<- resolved class
8002     movl      offObject_clazz(rINST),%ecx # ecx<- obj->clazz
8003     testl     %eax,%eax                 # have we resolved this before?
8004     je        .LOP_CHECK_CAST_JUMBO_resolve       # no, go do it now
8005 .LOP_CHECK_CAST_JUMBO_resolved:
8006     cmpl      %eax,%ecx                 # same class (trivial success)?
8007     jne       .LOP_CHECK_CAST_JUMBO_fullcheck     # no, do full check
8008 .LOP_CHECK_CAST_JUMBO_okay:
8009     FETCH_INST_OPCODE 4 %ecx
8010     ADVANCE_PC 4
8011     GOTO_NEXT_R %ecx
8012
8013     /*
8014      * Trivial test failed, need to perform full check.  This is common.
8015      *  ecx holds obj->clazz
8016      *  eax holds class resolved from AAAAAAAA
8017      *  rINST holds object
8018      */
8019 .LOP_CHECK_CAST_JUMBO_fullcheck:
8020     movl    %eax,sReg0                 # we'll need the desired class on failure
8021     movl    %eax,OUT_ARG1(%esp)
8022     movl    %ecx,OUT_ARG0(%esp)
8023     SPILL(rIBASE)
8024     call    dvmInstanceofNonTrivial    # eax<- boolean result
8025     UNSPILL(rIBASE)
8026     testl   %eax,%eax                  # failed?
8027     jne     .LOP_CHECK_CAST_JUMBO_okay           # no, success
8028
8029     # A cast has failed.  We need to throw a ClassCastException.
8030     EXPORT_PC
8031     movl    offObject_clazz(rINST),%eax
8032     movl    %eax,OUT_ARG0(%esp)                 # arg0<- obj->clazz
8033     movl    sReg0,%ecx
8034     movl    %ecx,OUT_ARG1(%esp)                 # arg1<- desired class
8035     call    dvmThrowClassCastException
8036     jmp     common_exceptionThrown
8037
8038     /*
8039      * Resolution required.  This is the least-likely path, and we're
8040      * going to have to recreate some data.
8041      *
8042      *  rINST holds object
8043      */
8044 .LOP_CHECK_CAST_JUMBO_resolve:
8045     movl    rSELF,%ecx
8046     EXPORT_PC
8047     movl    2(rPC),%eax                # eax<- AAAAAAAA
8048     movl    offThread_method(%ecx),%ecx  # ecx<- self->method
8049     movl    %eax,OUT_ARG1(%esp)        # arg1<- AAAAAAAA
8050     movl    offMethod_clazz(%ecx),%ecx # ecx<- metho->clazz
8051     movl    $0,OUT_ARG2(%esp)         # arg2<- false
8052     movl    %ecx,OUT_ARG0(%esp)        # arg0<- method->clazz
8053     SPILL(rIBASE)
8054     call    dvmResolveClass            # eax<- resolved ClassObject ptr
8055     UNSPILL(rIBASE)
8056     testl   %eax,%eax                  # got null?
8057     je      common_exceptionThrown     # yes, handle exception
8058     movl    offObject_clazz(rINST),%ecx  # ecx<- obj->clazz
8059     jmp     .LOP_CHECK_CAST_JUMBO_resolved       # pick up where we left off
8060
8061 /* ------------------------------ */
8062 .L_OP_INSTANCE_OF_JUMBO: /* 0x102 */
8063 /* File: x86/OP_INSTANCE_OF_JUMBO.S */
8064     /*
8065      * Check to see if an object reference is an instance of a class.
8066      *
8067      * Most common situation is a non-null object, being compared against
8068      * an already-resolved class.
8069      */
8070     /* instance-of/jumbo vBBBB, vCCCC, class@AAAAAAAA */
8071     movzwl  8(rPC),%eax                 # eax<- CCCC
8072     GET_VREG_R %eax %eax                # eax<- vCCCC (obj)
8073     movl    rSELF,%ecx
8074     testl   %eax,%eax                   # object null?
8075     movl    offThread_methodClassDex(%ecx),%ecx  # ecx<- pDvmDex
8076     SPILL(rIBASE)                       # preserve rIBASE
8077     je      .LOP_INSTANCE_OF_JUMBO_store           # null obj, not instance, store it
8078     movl    2(rPC),rIBASE               # edx<- AAAAAAAA
8079     movl    offDvmDex_pResClasses(%ecx),%ecx # ecx<- pDvmDex->pResClasses
8080     movl    (%ecx,rIBASE,4),%ecx        # ecx<- resolved class
8081     movl    offObject_clazz(%eax),%eax  # eax<- obj->clazz
8082     testl   %ecx,%ecx                   # have we resolved this before?
8083     je      .LOP_INSTANCE_OF_JUMBO_resolve         # not resolved, do it now
8084 .LOP_INSTANCE_OF_JUMBO_resolved:  # eax<- obj->clazz, ecx<- resolved class
8085     cmpl    %eax,%ecx                   # same class (trivial success)?
8086     je      .LOP_INSTANCE_OF_JUMBO_trivial         # yes, trivial finish
8087     /*
8088      * Trivial test failed, need to perform full check.  This is common.
8089      *  eax holds obj->clazz
8090      *  ecx holds class resolved from BBBB
8091      *  rINST has BA
8092      */
8093     movl    %eax,OUT_ARG0(%esp)
8094     movl    %ecx,OUT_ARG1(%esp)
8095     call    dvmInstanceofNonTrivial     # eax<- boolean result
8096     # fall through to OP_INSTANCE_OF_JUMBO_store
8097
8098     /*
8099      * eax holds boolean result
8100      * rINST holds BBBB
8101      */
8102 .LOP_INSTANCE_OF_JUMBO_store:
8103     FETCH_INST_OPCODE 5 %ecx
8104     UNSPILL(rIBASE)
8105     ADVANCE_PC 5
8106     SET_VREG %eax rINST                 # vBBBB<- eax
8107     GOTO_NEXT_R %ecx
8108
8109     /*
8110      * Trivial test succeeded, save and bail.
8111      *  r9 holds BBBB
8112      */
8113 .LOP_INSTANCE_OF_JUMBO_trivial:
8114     FETCH_INST_OPCODE 5 %ecx
8115     UNSPILL(rIBASE)
8116     ADVANCE_PC 5
8117     movl    $1,%eax
8118     SET_VREG %eax rINST                 # vBBBB<- true
8119     GOTO_NEXT_R %ecx
8120
8121     /*
8122      * Resolution required.  This is the least-likely path.
8123      *
8124      *  edx holds AAAAAAAA
8125      */
8126 .LOP_INSTANCE_OF_JUMBO_resolve:
8127     movl    rIBASE,OUT_ARG1(%esp)       # arg1<- AAAAAAAA
8128     movl    rSELF,%ecx
8129     movl    offThread_method(%ecx),%ecx
8130     movl    $1,OUT_ARG2(%esp)          # arg2<- true
8131     movl    offMethod_clazz(%ecx),%ecx  # ecx<- method->clazz
8132     EXPORT_PC
8133     movl    %ecx,OUT_ARG0(%esp)         # arg0<- method->clazz
8134     call    dvmResolveClass             # eax<- resolved ClassObject ptr
8135     testl   %eax,%eax                   # success?
8136     je      common_exceptionThrown      # no, handle exception
8137 /* Now, we need to sync up with fast path.  We need eax to
8138  * hold the obj->clazz, and ecx to hold the resolved class
8139  */
8140     movl    %eax,%ecx                   # ecx<- resolved class
8141     movzwl  8(rPC),%eax                 # eax<- CCCC
8142     GET_VREG_R %eax %eax                # eax<- vCCCC (obj)
8143     movl    offObject_clazz(%eax),%eax  # eax<- obj->clazz
8144     jmp     .LOP_INSTANCE_OF_JUMBO_resolved
8145
8146 /* ------------------------------ */
8147 .L_OP_NEW_INSTANCE_JUMBO: /* 0x103 */
8148 /* File: x86/OP_NEW_INSTANCE_JUMBO.S */
8149     /*
8150      * Create a new instance of a class.
8151      */
8152     /* new-instance/jumbo vBBBB, class@AAAAAAAA */
8153     movl      rSELF,%ecx
8154     movl      2(rPC),%eax               # eax<- AAAAAAAA
8155     movl      offThread_methodClassDex(%ecx),%ecx  # ecx<- pDvmDex
8156     movl      offDvmDex_pResClasses(%ecx),%ecx # ecx<- pDvmDex->pResClasses
8157     EXPORT_PC
8158     movl      (%ecx,%eax,4),%ecx        # ecx<- resolved class
8159     SPILL(rIBASE)
8160     testl     %ecx,%ecx                 # resolved?
8161     je        .LOP_NEW_INSTANCE_JUMBO_resolve       # no, go do it
8162 .LOP_NEW_INSTANCE_JUMBO_resolved:  # on entry, ecx<- class
8163     cmpb      $CLASS_INITIALIZED,offClassObject_status(%ecx)
8164     jne       .LOP_NEW_INSTANCE_JUMBO_needinit
8165 .LOP_NEW_INSTANCE_JUMBO_initialized:  # on entry, ecx<- class
8166     movl      $ALLOC_DONT_TRACK,OUT_ARG1(%esp)
8167     movl     %ecx,OUT_ARG0(%esp)
8168     call     dvmAllocObject             # eax<- new object
8169     UNSPILL(rIBASE)
8170     FETCH_INST_OPCODE 4 %ecx
8171     testl    %eax,%eax                  # success?
8172     je       common_exceptionThrown     # no, bail out
8173     SET_VREG %eax rINST
8174     ADVANCE_PC 4
8175     GOTO_NEXT_R %ecx
8176
8177     /*
8178      * Class initialization required.
8179      *
8180      *  ecx holds class object
8181      */
8182 .LOP_NEW_INSTANCE_JUMBO_needinit:
8183     SPILL_TMP1(%ecx)                    # save object
8184     movl    %ecx,OUT_ARG0(%esp)
8185     call    dvmInitClass                # initialize class
8186     UNSPILL_TMP1(%ecx)                  # restore object
8187     testl   %eax,%eax                   # success?
8188     jne     .LOP_NEW_INSTANCE_JUMBO_initialized     # success, continue
8189     jmp     common_exceptionThrown      # go deal with init exception
8190
8191     /*
8192      * Resolution required.  This is the least-likely path.
8193      *
8194      */
8195 .LOP_NEW_INSTANCE_JUMBO_resolve:
8196     movl    rSELF,%ecx
8197     movl    2(rPC),%eax                 # eax<- AAAAAAAA
8198     movl    offThread_method(%ecx),%ecx   # ecx<- self->method
8199     movl    %eax,OUT_ARG1(%esp)
8200     movl    offMethod_clazz(%ecx),%ecx  # ecx<- method->clazz
8201     movl    $0,OUT_ARG2(%esp)
8202     movl    %ecx,OUT_ARG0(%esp)
8203     call    dvmResolveClass             # call(clazz,off,flags)
8204     movl    %eax,%ecx                   # ecx<- resolved ClassObject ptr
8205     testl   %ecx,%ecx                   # success?
8206     jne     .LOP_NEW_INSTANCE_JUMBO_resolved        # good to go
8207     jmp     common_exceptionThrown      # no, handle exception
8208
8209 /* ------------------------------ */
8210 .L_OP_NEW_ARRAY_JUMBO: /* 0x104 */
8211 /* File: x86/OP_NEW_ARRAY_JUMBO.S */
8212     /*
8213      * Allocate an array of objects, specified with the array class
8214      * and a count.
8215      *
8216      * The verifier guarantees that this is an array class, so we don't
8217      * check for it here.
8218      */
8219     /* new-array/jumbo vBBBB, vCCCC, class@AAAAAAAA */
8220     movl    rSELF,%ecx
8221     EXPORT_PC
8222     movl    offThread_methodClassDex(%ecx),%ecx # ecx<- pDvmDex
8223     movl    2(rPC),%eax                       # eax<- AAAAAAAA
8224     movl    offDvmDex_pResClasses(%ecx),%ecx  # ecx<- pDvmDex->pResClasses
8225     SPILL(rIBASE)
8226     movl    (%ecx,%eax,4),%ecx                # ecx<- resolved class
8227     movzwl  8(rPC),%eax                       # eax<- CCCC
8228     GET_VREG_R %eax %eax                      # eax<- vCCCC (array length)
8229     testl   %eax,%eax
8230     js      common_errNegativeArraySize       # bail, passing len in eax
8231     testl   %ecx,%ecx                         # already resolved?
8232     jne     .LOP_NEW_ARRAY_JUMBO_finish                # yes, fast path
8233     /*
8234      * Resolve class.  (This is an uncommon case.)
8235      *  ecx holds class (null here)
8236      *  eax holds array length (vCCCC)
8237      */
8238     movl    rSELF,%ecx
8239     SPILL_TMP1(%eax)                   # save array length
8240     movl    offThread_method(%ecx),%ecx  # ecx<- self->method
8241     movl    2(rPC),%eax                # eax<- AAAAAAAA
8242     movl    offMethod_clazz(%ecx),%ecx # ecx<- method->clazz
8243     movl    %eax,OUT_ARG1(%esp)
8244     movl    $0,OUT_ARG2(%esp)
8245     movl    %ecx,OUT_ARG0(%esp)
8246     call    dvmResolveClass            # eax<- call(clazz,ref,flag)
8247     movl    %eax,%ecx
8248     UNSPILL_TMP1(%eax)
8249     testl   %ecx,%ecx                  # successful resolution?
8250     je      common_exceptionThrown     # no, bail.
8251 # fall through to OP_NEW_ARRAY_JUMBO_finish
8252
8253     /*
8254      * Finish allocation
8255      *
8256      * ecx holds class
8257      * eax holds array length (vCCCC)
8258      */
8259 .LOP_NEW_ARRAY_JUMBO_finish:
8260     movl    %ecx,OUT_ARG0(%esp)
8261     movl    %eax,OUT_ARG1(%esp)
8262     movl    $ALLOC_DONT_TRACK,OUT_ARG2(%esp)
8263     call    dvmAllocArrayByClass    # eax<- call(clazz,length,flags)
8264     UNSPILL(rIBASE)
8265     FETCH_INST_OPCODE 5 %ecx
8266     testl   %eax,%eax               # failed?
8267     je      common_exceptionThrown  # yup - go handle
8268     SET_VREG %eax rINST
8269     ADVANCE_PC 5
8270     GOTO_NEXT_R %ecx
8271
8272 /* ------------------------------ */
8273 .L_OP_FILLED_NEW_ARRAY_JUMBO: /* 0x105 */
8274 /* File: x86/OP_FILLED_NEW_ARRAY_JUMBO.S */
8275     /*
8276      * Create a new array with elements filled from registers.
8277      */
8278     /* filled-new-array/jumbo {vCCCC..v(CCCC+BBBB-1)}, type@AAAAAAAA */
8279     movl    rSELF,%eax
8280     movl    offThread_methodClassDex(%eax),%eax # eax<- pDvmDex
8281     movl    2(rPC),%ecx                       # ecx<- AAAAAAAA
8282     movl    offDvmDex_pResClasses(%eax),%eax  # eax<- pDvmDex->pResClasses
8283     movl    (%eax,%ecx,4),%eax                # eax<- resolved class
8284     EXPORT_PC
8285     testl   %eax,%eax                         # already resolved?
8286     jne     .LOP_FILLED_NEW_ARRAY_JUMBO_continue              # yes, continue
8287     # less frequent path, so we'll redo some work
8288     movl    rSELF,%eax
8289     movl    $0,OUT_ARG2(%esp)                # arg2<- false
8290     movl    %ecx,OUT_ARG1(%esp)               # arg1<- AAAAAAAA
8291     movl    offThread_method(%eax),%eax         # eax<- self->method
8292     movl    offMethod_clazz(%eax),%eax        # eax<- method->clazz
8293     movl    %eax,OUT_ARG0(%esp)               # arg0<- clazz
8294     SPILL(rIBASE)
8295     call    dvmResolveClass                   # eax<- call(clazz,ref,flag)
8296     UNSPILL(rIBASE)
8297     testl   %eax,%eax                         # null?
8298     je      common_exceptionThrown            # yes, handle it
8299
8300        # note: fall through to .LOP_FILLED_NEW_ARRAY_JUMBO_continue
8301
8302     /*
8303      * On entry:
8304      *    eax holds array class [r0]
8305      *    ecx is scratch
8306      */
8307 .LOP_FILLED_NEW_ARRAY_JUMBO_continue:
8308     movl    offClassObject_descriptor(%eax),%ecx  # ecx<- arrayClass->descriptor
8309     movl    $ALLOC_DONT_TRACK,OUT_ARG2(%esp)     # arg2<- flags
8310     movzbl  1(%ecx),%ecx                          # ecx<- descriptor[1]
8311     movl    %eax,OUT_ARG0(%esp)                   # arg0<- arrayClass
8312     movl    rSELF,%eax
8313     cmpb    $'I',%cl                             # supported?
8314     je      1f
8315     cmpb    $'L',%cl
8316     je      1f
8317     cmpb    $'[',%cl
8318     jne      .LOP_FILLED_NEW_ARRAY_JUMBO_notimpl                  # no, not handled yet
8319 1:
8320     movl    %ecx,offThread_retval+4(%eax)           # save type
8321     movl    rINST,OUT_ARG1(%esp)                  # arg1<- BBBB (length)
8322     SPILL(rIBASE)
8323     call    dvmAllocArrayByClass     # eax<- call(arrayClass, length, flags)
8324     UNSPILL(rIBASE)
8325     movl    rSELF,%ecx
8326     testl   %eax,%eax                             # alloc successful?
8327     je      common_exceptionThrown                # no, handle exception
8328     movl    %eax,offThread_retval(%ecx)             # retval.l<- new array
8329     movzwl  8(rPC),%ecx                           # ecx<- CCCC
8330     leal    offArrayObject_contents(%eax),%eax    # eax<- newArray->contents
8331
8332 /* at this point:
8333  *     eax is pointer to tgt
8334  *     rINST is length
8335  *     ecx is CCCC
8336  *  We now need to copy values from registers into the array
8337  */
8338
8339     # set up src pointer
8340     SPILL_TMP2(%esi)
8341     SPILL_TMP3(%edi)
8342     leal    (rFP,%ecx,4),%esi # set up src ptr
8343     movl    %eax,%edi         # set up dst ptr
8344     movl    rINST,%ecx        # load count register
8345     rep
8346     movsd
8347     UNSPILL_TMP2(%esi)
8348     UNSPILL_TMP3(%edi)
8349     movl    rSELF,%ecx
8350     movl    offThread_retval+4(%ecx),%eax      # eax<- type
8351
8352     cmpb    $'I',%al                        # Int array?
8353     je      5f                               # skip card mark if so
8354     movl    offThread_retval(%ecx),%eax        # eax<- object head
8355     movl    offThread_cardTable(%ecx),%ecx     # card table base
8356     shrl    $GC_CARD_SHIFT,%eax             # convert to card num
8357     movb    %cl,(%ecx,%eax)                  # mark card based on object head
8358 5:
8359     FETCH_INST_OPCODE 5 %ecx
8360     ADVANCE_PC 5
8361     GOTO_NEXT_R %ecx
8362
8363
8364     /*
8365      * Throw an exception indicating that we have not implemented this
8366      * mode of filled-new-array.
8367      */
8368 .LOP_FILLED_NEW_ARRAY_JUMBO_notimpl:
8369     movl    $.LstrFilledNewArrayNotImplA,%eax
8370     movl    %eax,OUT_ARG0(%esp)
8371     call    dvmThrowInternalError
8372     jmp     common_exceptionThrown
8373
8374 /* ------------------------------ */
8375 .L_OP_IGET_JUMBO: /* 0x106 */
8376 /* File: x86/OP_IGET_JUMBO.S */
8377     /*
8378      * Jumbo 32-bit instance field get.
8379      *
8380      * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
8381      *      iget-char/jumbo, iget-short/jumbo
8382      */
8383     /* exop vBBBB, vCCCC, field@AAAAAAAA */
8384     movl    rSELF,%ecx
8385     SPILL(rIBASE)                               # preserve rIBASE
8386     movl    2(rPC),rIBASE                       # rIBASE<- AAAAAAAA
8387     movl    offThread_methodClassDex(%ecx),%eax # eax<- DvmDex
8388     movzwl  8(rPC),%ecx                         # ecx<- CCCC
8389     movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
8390     GET_VREG_R %ecx %ecx                        # ecx<- fp[CCCC], the object ptr
8391     movl    (%eax,rIBASE,4),%eax                # resolved entry
8392     testl   %eax,%eax                           # is resolved entry null?
8393     jne     .LOP_IGET_JUMBO_finish                  # no, already resolved
8394     movl    rIBASE,OUT_ARG1(%esp)               # needed by dvmResolveInstField
8395     movl    rSELF,rIBASE
8396     EXPORT_PC
8397     movl    offThread_method(rIBASE),rIBASE     # rIBASE<- current method
8398     movl    offMethod_clazz(rIBASE),rIBASE      # rIBASE<- method->clazz
8399     SPILL_TMP1(%ecx)                            # save obj pointer across call
8400     movl    rIBASE,OUT_ARG0(%esp)               # pass in method->clazz
8401     call    dvmResolveInstField                 #  ... to dvmResolveInstField
8402     UNSPILL_TMP1(%ecx)
8403     testl   %eax,%eax                           #  returns InstrField ptr
8404     jne     .LOP_IGET_JUMBO_finish
8405     jmp     common_exceptionThrown
8406
8407 .LOP_IGET_JUMBO_finish:
8408     /*
8409      * Currently:
8410      *   eax holds resolved field
8411      *   ecx holds object
8412      *   rINST holds BBBB
8413      */
8414     movl    offInstField_byteOffset(%eax),%eax  # eax<- byte offset of field
8415     testl   %ecx,%ecx                           # object null?
8416     je      common_errNullObject                # object was null
8417     movl   (%ecx,%eax,1),%ecx                  # ecx<- obj.field (8/16/32 bits)
8418     FETCH_INST_OPCODE 5 %eax
8419     UNSPILL(rIBASE)                             # restore rIBASE
8420     SET_VREG %ecx rINST
8421     ADVANCE_PC 5
8422     GOTO_NEXT_R %eax
8423
8424 /* ------------------------------ */
8425 .L_OP_IGET_WIDE_JUMBO: /* 0x107 */
8426 /* File: x86/OP_IGET_WIDE_JUMBO.S */
8427     /*
8428      * Jumbo 64-bit instance field get.
8429      */
8430     /* iget-wide/jumbo vBBBB, vCCCC, field@AAAA */
8431     movl    rSELF,%ecx
8432     SPILL(rIBASE)                               # preserve rIBASE
8433     movl    2(rPC),rIBASE                       # rIBASE<- AAAAAAAA
8434     movl    offThread_methodClassDex(%ecx),%eax # eax<- DvmDex
8435     movzwl  8(rPC),%ecx                         # ecx<- CCCC
8436     movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
8437     GET_VREG_R %ecx %ecx                        # ecx<- fp[CCCC], the object ptr
8438     movl    (%eax,rIBASE,4),%eax                # resolved entry
8439     testl   %eax,%eax                           # is resolved entry null?
8440     jne     .LOP_IGET_WIDE_JUMBO_finish                  # no, already resolved
8441     movl    rIBASE,OUT_ARG1(%esp)               # for dvmResolveInstField
8442     movl    rSELF,rIBASE
8443     EXPORT_PC
8444     movl    offThread_method(rIBASE),rIBASE     # rIBASE<- current method
8445     movl    offMethod_clazz(rIBASE),rIBASE      # rIBASE<- method->clazz
8446     SPILL_TMP1(%ecx)                            # save objpointer across call
8447     movl    rPC,OUT_ARG0(%esp)                  # pass in method->clazz
8448     call    dvmResolveInstField                 #  ... to dvmResolveInstField
8449     UNSPILL_TMP1(%ecx)
8450     testl   %eax,%eax                           # returns InstrField ptr
8451     jne     .LOP_IGET_WIDE_JUMBO_finish
8452     jmp     common_exceptionThrown
8453
8454 .LOP_IGET_WIDE_JUMBO_finish:
8455     /*
8456      * Currently:
8457      *   eax holds resolved field
8458      *   ecx holds object
8459      *   rINST holds BBBB
8460      */
8461     movl    offInstField_byteOffset(%eax),%eax  # eax<- byte offset of field
8462     testl   %ecx,%ecx                           # object null?
8463     je      common_errNullObject                # object was null
8464     leal    (%ecx,%eax,1),%eax                  # eax<- address of field
8465     movl    (%eax),%ecx                         # ecx<- lsw
8466     movl    4(%eax),%eax                        # eax<- msw
8467     SET_VREG_WORD %ecx rINST 0
8468     FETCH_INST_OPCODE 5 %ecx
8469     UNSPILL(rIBASE)                             # restore rIBASE
8470     SET_VREG_WORD %eax rINST 1
8471     ADVANCE_PC 5
8472     GOTO_NEXT_R %ecx
8473
8474 /* ------------------------------ */
8475 .L_OP_IGET_OBJECT_JUMBO: /* 0x108 */
8476 /* File: x86/OP_IGET_OBJECT_JUMBO.S */
8477 /* File: x86/OP_IGET_JUMBO.S */
8478     /*
8479      * Jumbo 32-bit instance field get.
8480      *
8481      * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
8482      *      iget-char/jumbo, iget-short/jumbo
8483      */
8484     /* exop vBBBB, vCCCC, field@AAAAAAAA */
8485     movl    rSELF,%ecx
8486     SPILL(rIBASE)                               # preserve rIBASE
8487     movl    2(rPC),rIBASE                       # rIBASE<- AAAAAAAA
8488     movl    offThread_methodClassDex(%ecx),%eax # eax<- DvmDex
8489     movzwl  8(rPC),%ecx                         # ecx<- CCCC
8490     movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
8491     GET_VREG_R %ecx %ecx                        # ecx<- fp[CCCC], the object ptr
8492     movl    (%eax,rIBASE,4),%eax                # resolved entry
8493     testl   %eax,%eax                           # is resolved entry null?
8494     jne     .LOP_IGET_OBJECT_JUMBO_finish                  # no, already resolved
8495     movl    rIBASE,OUT_ARG1(%esp)               # needed by dvmResolveInstField
8496     movl    rSELF,rIBASE
8497     EXPORT_PC
8498     movl    offThread_method(rIBASE),rIBASE     # rIBASE<- current method
8499     movl    offMethod_clazz(rIBASE),rIBASE      # rIBASE<- method->clazz
8500     SPILL_TMP1(%ecx)                            # save obj pointer across call
8501     movl    rIBASE,OUT_ARG0(%esp)               # pass in method->clazz
8502     call    dvmResolveInstField                 #  ... to dvmResolveInstField
8503     UNSPILL_TMP1(%ecx)
8504     testl   %eax,%eax                           #  returns InstrField ptr
8505     jne     .LOP_IGET_OBJECT_JUMBO_finish
8506     jmp     common_exceptionThrown
8507
8508 .LOP_IGET_OBJECT_JUMBO_finish:
8509     /*
8510      * Currently:
8511      *   eax holds resolved field
8512      *   ecx holds object
8513      *   rINST holds BBBB
8514      */
8515     movl    offInstField_byteOffset(%eax),%eax  # eax<- byte offset of field
8516     testl   %ecx,%ecx                           # object null?
8517     je      common_errNullObject                # object was null
8518     movl   (%ecx,%eax,1),%ecx                  # ecx<- obj.field (8/16/32 bits)
8519     FETCH_INST_OPCODE 5 %eax
8520     UNSPILL(rIBASE)                             # restore rIBASE
8521     SET_VREG %ecx rINST
8522     ADVANCE_PC 5
8523     GOTO_NEXT_R %eax
8524
8525
8526 /* ------------------------------ */
8527 .L_OP_IGET_BOOLEAN_JUMBO: /* 0x109 */
8528 /* File: x86/OP_IGET_BOOLEAN_JUMBO.S */
8529 /* File: x86/OP_IGET_JUMBO.S */
8530     /*
8531      * Jumbo 32-bit instance field get.
8532      *
8533      * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
8534      *      iget-char/jumbo, iget-short/jumbo
8535      */
8536     /* exop vBBBB, vCCCC, field@AAAAAAAA */
8537     movl    rSELF,%ecx
8538     SPILL(rIBASE)                               # preserve rIBASE
8539     movl    2(rPC),rIBASE                       # rIBASE<- AAAAAAAA
8540     movl    offThread_methodClassDex(%ecx),%eax # eax<- DvmDex
8541     movzwl  8(rPC),%ecx                         # ecx<- CCCC
8542     movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
8543     GET_VREG_R %ecx %ecx                        # ecx<- fp[CCCC], the object ptr
8544     movl    (%eax,rIBASE,4),%eax                # resolved entry
8545     testl   %eax,%eax                           # is resolved entry null?
8546     jne     .LOP_IGET_BOOLEAN_JUMBO_finish                  # no, already resolved
8547     movl    rIBASE,OUT_ARG1(%esp)               # needed by dvmResolveInstField
8548     movl    rSELF,rIBASE
8549     EXPORT_PC
8550     movl    offThread_method(rIBASE),rIBASE     # rIBASE<- current method
8551     movl    offMethod_clazz(rIBASE),rIBASE      # rIBASE<- method->clazz
8552     SPILL_TMP1(%ecx)                            # save obj pointer across call
8553     movl    rIBASE,OUT_ARG0(%esp)               # pass in method->clazz
8554     call    dvmResolveInstField                 #  ... to dvmResolveInstField
8555     UNSPILL_TMP1(%ecx)
8556     testl   %eax,%eax                           #  returns InstrField ptr
8557     jne     .LOP_IGET_BOOLEAN_JUMBO_finish
8558     jmp     common_exceptionThrown
8559
8560 .LOP_IGET_BOOLEAN_JUMBO_finish:
8561     /*
8562      * Currently:
8563      *   eax holds resolved field
8564      *   ecx holds object
8565      *   rINST holds BBBB
8566      */
8567     movl    offInstField_byteOffset(%eax),%eax  # eax<- byte offset of field
8568     testl   %ecx,%ecx                           # object null?
8569     je      common_errNullObject                # object was null
8570     movzbl   (%ecx,%eax,1),%ecx                  # ecx<- obj.field (8/16/32 bits)
8571     FETCH_INST_OPCODE 5 %eax
8572     UNSPILL(rIBASE)                             # restore rIBASE
8573     SET_VREG %ecx rINST
8574     ADVANCE_PC 5
8575     GOTO_NEXT_R %eax
8576
8577
8578 /* ------------------------------ */
8579 .L_OP_IGET_BYTE_JUMBO: /* 0x10a */
8580 /* File: x86/OP_IGET_BYTE_JUMBO.S */
8581 /* File: x86/OP_IGET_JUMBO.S */
8582     /*
8583      * Jumbo 32-bit instance field get.
8584      *
8585      * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
8586      *      iget-char/jumbo, iget-short/jumbo
8587      */
8588     /* exop vBBBB, vCCCC, field@AAAAAAAA */
8589     movl    rSELF,%ecx
8590     SPILL(rIBASE)                               # preserve rIBASE
8591     movl    2(rPC),rIBASE                       # rIBASE<- AAAAAAAA
8592     movl    offThread_methodClassDex(%ecx),%eax # eax<- DvmDex
8593     movzwl  8(rPC),%ecx                         # ecx<- CCCC
8594     movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
8595     GET_VREG_R %ecx %ecx                        # ecx<- fp[CCCC], the object ptr
8596     movl    (%eax,rIBASE,4),%eax                # resolved entry
8597     testl   %eax,%eax                           # is resolved entry null?
8598     jne     .LOP_IGET_BYTE_JUMBO_finish                  # no, already resolved
8599     movl    rIBASE,OUT_ARG1(%esp)               # needed by dvmResolveInstField
8600     movl    rSELF,rIBASE
8601     EXPORT_PC
8602     movl    offThread_method(rIBASE),rIBASE     # rIBASE<- current method
8603     movl    offMethod_clazz(rIBASE),rIBASE      # rIBASE<- method->clazz
8604     SPILL_TMP1(%ecx)                            # save obj pointer across call
8605     movl    rIBASE,OUT_ARG0(%esp)               # pass in method->clazz
8606     call    dvmResolveInstField                 #  ... to dvmResolveInstField
8607     UNSPILL_TMP1(%ecx)
8608     testl   %eax,%eax                           #  returns InstrField ptr
8609     jne     .LOP_IGET_BYTE_JUMBO_finish
8610     jmp     common_exceptionThrown
8611
8612 .LOP_IGET_BYTE_JUMBO_finish:
8613     /*
8614      * Currently:
8615      *   eax holds resolved field
8616      *   ecx holds object
8617      *   rINST holds BBBB
8618      */
8619     movl    offInstField_byteOffset(%eax),%eax  # eax<- byte offset of field
8620     testl   %ecx,%ecx                           # object null?
8621     je      common_errNullObject                # object was null
8622     movsbl   (%ecx,%eax,1),%ecx                  # ecx<- obj.field (8/16/32 bits)
8623     FETCH_INST_OPCODE 5 %eax
8624     UNSPILL(rIBASE)                             # restore rIBASE
8625     SET_VREG %ecx rINST
8626     ADVANCE_PC 5
8627     GOTO_NEXT_R %eax
8628
8629
8630 /* ------------------------------ */
8631 .L_OP_IGET_CHAR_JUMBO: /* 0x10b */
8632 /* File: x86/OP_IGET_CHAR_JUMBO.S */
8633 /* File: x86/OP_IGET_JUMBO.S */
8634     /*
8635      * Jumbo 32-bit instance field get.
8636      *
8637      * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
8638      *      iget-char/jumbo, iget-short/jumbo
8639      */
8640     /* exop vBBBB, vCCCC, field@AAAAAAAA */
8641     movl    rSELF,%ecx
8642     SPILL(rIBASE)                               # preserve rIBASE
8643     movl    2(rPC),rIBASE                       # rIBASE<- AAAAAAAA
8644     movl    offThread_methodClassDex(%ecx),%eax # eax<- DvmDex
8645     movzwl  8(rPC),%ecx                         # ecx<- CCCC
8646     movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
8647     GET_VREG_R %ecx %ecx                        # ecx<- fp[CCCC], the object ptr
8648     movl    (%eax,rIBASE,4),%eax                # resolved entry
8649     testl   %eax,%eax                           # is resolved entry null?
8650     jne     .LOP_IGET_CHAR_JUMBO_finish                  # no, already resolved
8651     movl    rIBASE,OUT_ARG1(%esp)               # needed by dvmResolveInstField
8652     movl    rSELF,rIBASE
8653     EXPORT_PC
8654     movl    offThread_method(rIBASE),rIBASE     # rIBASE<- current method
8655     movl    offMethod_clazz(rIBASE),rIBASE      # rIBASE<- method->clazz
8656     SPILL_TMP1(%ecx)                            # save obj pointer across call
8657     movl    rIBASE,OUT_ARG0(%esp)               # pass in method->clazz
8658     call    dvmResolveInstField                 #  ... to dvmResolveInstField
8659     UNSPILL_TMP1(%ecx)
8660     testl   %eax,%eax                           #  returns InstrField ptr
8661     jne     .LOP_IGET_CHAR_JUMBO_finish
8662     jmp     common_exceptionThrown
8663
8664 .LOP_IGET_CHAR_JUMBO_finish:
8665     /*
8666      * Currently:
8667      *   eax holds resolved field
8668      *   ecx holds object
8669      *   rINST holds BBBB
8670      */
8671     movl    offInstField_byteOffset(%eax),%eax  # eax<- byte offset of field
8672     testl   %ecx,%ecx                           # object null?
8673     je      common_errNullObject                # object was null
8674     movzwl   (%ecx,%eax,1),%ecx                  # ecx<- obj.field (8/16/32 bits)
8675     FETCH_INST_OPCODE 5 %eax
8676     UNSPILL(rIBASE)                             # restore rIBASE
8677     SET_VREG %ecx rINST
8678     ADVANCE_PC 5
8679     GOTO_NEXT_R %eax
8680
8681
8682 /* ------------------------------ */
8683 .L_OP_IGET_SHORT_JUMBO: /* 0x10c */
8684 /* File: x86/OP_IGET_SHORT_JUMBO.S */
8685 /* File: x86/OP_IGET_JUMBO.S */
8686     /*
8687      * Jumbo 32-bit instance field get.
8688      *
8689      * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
8690      *      iget-char/jumbo, iget-short/jumbo
8691      */
8692     /* exop vBBBB, vCCCC, field@AAAAAAAA */
8693     movl    rSELF,%ecx
8694     SPILL(rIBASE)                               # preserve rIBASE
8695     movl    2(rPC),rIBASE                       # rIBASE<- AAAAAAAA
8696     movl    offThread_methodClassDex(%ecx),%eax # eax<- DvmDex
8697     movzwl  8(rPC),%ecx                         # ecx<- CCCC
8698     movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
8699     GET_VREG_R %ecx %ecx                        # ecx<- fp[CCCC], the object ptr
8700     movl    (%eax,rIBASE,4),%eax                # resolved entry
8701     testl   %eax,%eax                           # is resolved entry null?
8702     jne     .LOP_IGET_SHORT_JUMBO_finish                  # no, already resolved
8703     movl    rIBASE,OUT_ARG1(%esp)               # needed by dvmResolveInstField
8704     movl    rSELF,rIBASE
8705     EXPORT_PC
8706     movl    offThread_method(rIBASE),rIBASE     # rIBASE<- current method
8707     movl    offMethod_clazz(rIBASE),rIBASE      # rIBASE<- method->clazz
8708     SPILL_TMP1(%ecx)                            # save obj pointer across call
8709     movl    rIBASE,OUT_ARG0(%esp)               # pass in method->clazz
8710     call    dvmResolveInstField                 #  ... to dvmResolveInstField
8711     UNSPILL_TMP1(%ecx)
8712     testl   %eax,%eax                           #  returns InstrField ptr
8713     jne     .LOP_IGET_SHORT_JUMBO_finish
8714     jmp     common_exceptionThrown
8715
8716 .LOP_IGET_SHORT_JUMBO_finish:
8717     /*
8718      * Currently:
8719      *   eax holds resolved field
8720      *   ecx holds object
8721      *   rINST holds BBBB
8722      */
8723     movl    offInstField_byteOffset(%eax),%eax  # eax<- byte offset of field
8724     testl   %ecx,%ecx                           # object null?
8725     je      common_errNullObject                # object was null
8726     movswl   (%ecx,%eax,1),%ecx                  # ecx<- obj.field (8/16/32 bits)
8727     FETCH_INST_OPCODE 5 %eax
8728     UNSPILL(rIBASE)                             # restore rIBASE
8729     SET_VREG %ecx rINST
8730     ADVANCE_PC 5
8731     GOTO_NEXT_R %eax
8732
8733
8734 /* ------------------------------ */
8735 .L_OP_IPUT_JUMBO: /* 0x10d */
8736 /* File: x86/OP_IPUT_JUMBO.S */
8737     /*
8738      * Jumbo 32-bit instance field put.
8739      *
8740      * for: iput/jumbo, iput-object/jumbo, iput-boolean/jumbo, iput-byte/jumbo,
8741             iput-char/jumbo, iput-short/jumbo
8742      */
8743     /* exop vBBBB, vCCCC, field@AAAAAAAA */
8744     movl    rSELF,%ecx
8745     SPILL(rIBASE)
8746     movl    2(rPC),rIBASE                       # rIBASE<- AAAAAAAA
8747     movl    offThread_methodClassDex(%ecx),%eax # eax<- DvmDex
8748     movzwl  8(rPC),%ecx                         # ecx<- CCCC
8749     movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
8750     GET_VREG_R %ecx %ecx                        # ecx<- fp[CCCC], the object ptr
8751     movl    (%eax,rIBASE,4),%eax                # resolved entry
8752     testl   %eax,%eax                           # is resolved entry null?
8753     jne     .LOP_IPUT_JUMBO_finish                  # no, already resolved
8754     movl    rIBASE,OUT_ARG1(%esp)
8755     movl    rSELF,rIBASE
8756     EXPORT_PC
8757     movl    offThread_method(rIBASE),rIBASE     # rIBASE<- current method
8758     movl    offMethod_clazz(rIBASE),rIBASE      # rIBASE<- method->clazz
8759     SPILL_TMP1(%ecx)                            # save obj pointer across call
8760     movl    rIBASE,OUT_ARG0(%esp)               # pass in method->clazz
8761     call    dvmResolveInstField                 #  ... to dvmResolveInstField
8762     UNSPILL_TMP1(%ecx)
8763     testl   %eax,%eax                           # returns InstrField ptr
8764     jne     .LOP_IPUT_JUMBO_finish
8765     jmp     common_exceptionThrown
8766
8767 .LOP_IPUT_JUMBO_finish:
8768     /*
8769      * Currently:
8770      *   eax holds resolved field
8771      *   ecx holds object
8772      *   rINST holds BBBB
8773      */
8774     GET_VREG_R rINST rINST                       # rINST<- v[BBBB]
8775     movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
8776     testl   %ecx,%ecx                            # object null?
8777     je      common_errNullObject                 # object was null
8778     movl   rINST,(%ecx,%eax,1)            # obj.field <- v[BBBB](8/16/32 bits)
8779     FETCH_INST_OPCODE 5 %ecx
8780     UNSPILL(rIBASE)
8781     ADVANCE_PC 5
8782     GOTO_NEXT_R %ecx
8783
8784 /* ------------------------------ */
8785 .L_OP_IPUT_WIDE_JUMBO: /* 0x10e */
8786 /* File: x86/OP_IPUT_WIDE_JUMBO.S */
8787     /*
8788      * Jumbo 64-bit instance field put.
8789      */
8790     /* iput-wide/jumbo vBBBB, vCCCC, field@AAAAAAAA */
8791     movl    rSELF,%ecx
8792     SPILL(rIBASE)
8793     movl    2(rPC),rIBASE                       # rIBASE<- AAAAAAAA
8794     movl    offThread_methodClassDex(%ecx),%eax # eax<- DvmDex
8795     movzwl  8(rPC),%ecx                         # ecx<- CCCC
8796     movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
8797     GET_VREG_R %ecx %ecx                        # ecx<- fp[CCCC], the object ptr
8798     movl    (%eax,rIBASE,4),%eax                # resolved entry
8799     testl   %eax,%eax                           # is resolved entry null?
8800     jne     .LOP_IPUT_WIDE_JUMBO_finish                  # no, already resolved
8801     movl    rIBASE,OUT_ARG1(%esp)
8802     movl    rSELF,rIBASE
8803     EXPORT_PC
8804     movl    offThread_method(rIBASE),rIBASE     # rIBASE<- current method
8805     movl    offMethod_clazz(rIBASE),rIBASE      # rIBASE<- method->clazz
8806     SPILL_TMP1(%ecx)                            # save obj pointer across call
8807     movl    rIBASE,OUT_ARG0(%esp)               # pass in method->clazz
8808     call    dvmResolveInstField                 #  ... to dvmResolveInstField
8809     UNSPILL_TMP1(%ecx)
8810     testl   %eax,%eax                           #  ... which returns InstrField ptr
8811     jne     .LOP_IPUT_WIDE_JUMBO_finish
8812     jmp     common_exceptionThrown
8813
8814 .LOP_IPUT_WIDE_JUMBO_finish:
8815     /*
8816      * Currently:
8817      *   eax holds resolved field
8818      *   ecx holds object
8819      *   rIBASE is scratch, but needs to be unspilled
8820      *   rINST holds BBBB
8821      */
8822     movl    offInstField_byteOffset(%eax),%eax  # eax<- byte offset of field
8823     testl   %ecx,%ecx                           # object null?
8824     je      common_errNullObject                # object was null
8825     leal    (%ecx,%eax,1),%eax                  # eax<- address of field
8826     GET_VREG_WORD %ecx rINST 0                  # ecx<- lsw
8827     GET_VREG_WORD rINST rINST 1                 # rINST<- msw
8828     movl    rINST,4(%eax)
8829     movl    %ecx,(%eax)
8830     FETCH_INST_OPCODE 5 %ecx
8831     UNSPILL(rIBASE)
8832     ADVANCE_PC 5
8833     GOTO_NEXT_R %ecx
8834
8835 /* ------------------------------ */
8836 .L_OP_IPUT_OBJECT_JUMBO: /* 0x10f */
8837 /* File: x86/OP_IPUT_OBJECT_JUMBO.S */
8838     /*
8839      * Jumbo object field put.
8840      */
8841     /* iput-object/jumbo vBBBB, vCCCC, field@AAAAAAAA */
8842     movl    rSELF,%ecx
8843     SPILL(rIBASE)
8844     movl    2(rPC),rIBASE                       # rIBASE<- AAAAAAAA
8845     movl    offThread_methodClassDex(%ecx),%eax # eax<- DvmDex
8846     movzwl  8(rPC),%ecx                         # ecx<- CCCC
8847     movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
8848     GET_VREG_R %ecx %ecx                        # ecx<- fp[CCCC], the object ptr
8849     movl    (%eax,rIBASE,4),%eax                  # resolved entry
8850     testl   %eax,%eax                           # is resolved entry null?
8851     jne     .LOP_IPUT_OBJECT_JUMBO_finish                  # no, already resolved
8852     movl    rIBASE,OUT_ARG1(%esp)
8853     movl    rSELF,rIBASE
8854     EXPORT_PC
8855     movl    offThread_method(rIBASE),rIBASE     # rIBASE<- current method
8856     movl    offMethod_clazz(rIBASE),rIBASE      # rIBASE<- method->clazz
8857     SPILL_TMP1(%ecx)                            # save obj pointer across call
8858     movl    rIBASE,OUT_ARG0(%esp)               # pass in method->clazz
8859     call    dvmResolveInstField                 #  ... to dvmResolveInstField
8860     UNSPILL_TMP1(%ecx)
8861     testl   %eax,%eax                           # returns InstrField ptr
8862     jne     .LOP_IPUT_OBJECT_JUMBO_finish
8863     jmp     common_exceptionThrown
8864
8865 .LOP_IPUT_OBJECT_JUMBO_finish:
8866     /*
8867      * Currently:
8868      *   eax holds resolved field
8869      *   ecx holds object
8870      *   rIBASE is scratch, but needs to be unspilled
8871      *   rINST holds BBBB
8872      */
8873     GET_VREG_R rINST rINST                      # rINST<- v[BBBB]
8874     movl    offInstField_byteOffset(%eax),%eax  # eax<- byte offset of field
8875     testl   %ecx,%ecx                           # object null?
8876     je      common_errNullObject                # object was null
8877     movl    rINST,(%ecx,%eax)      # obj.field <- v[BBBB](8/16/32 bits)
8878     movl    rSELF,%eax
8879     testl   rINST,rINST                         # stored a NULL?
8880     movl    offThread_cardTable(%eax),%eax      # get card table base
8881     je      1f                                  # skip card mark if null store
8882     shrl    $GC_CARD_SHIFT,%ecx                # object head to card number
8883     movb    %al,(%eax,%ecx)                     # mark card using object head
8884 1:
8885     FETCH_INST_OPCODE 5 %ecx
8886     UNSPILL(rIBASE)
8887     ADVANCE_PC 5
8888     GOTO_NEXT_R %ecx
8889
8890 /* ------------------------------ */
8891 .L_OP_IPUT_BOOLEAN_JUMBO: /* 0x110 */
8892 /* File: x86/OP_IPUT_BOOLEAN_JUMBO.S */
8893 /* File: x86/OP_IPUT_JUMBO.S */
8894     /*
8895      * Jumbo 32-bit instance field put.
8896      *
8897      * for: iput/jumbo, iput-object/jumbo, iput-boolean/jumbo, iput-byte/jumbo,
8898             iput-char/jumbo, iput-short/jumbo
8899      */
8900     /* exop vBBBB, vCCCC, field@AAAAAAAA */
8901     movl    rSELF,%ecx
8902     SPILL(rIBASE)
8903     movl    2(rPC),rIBASE                       # rIBASE<- AAAAAAAA
8904     movl    offThread_methodClassDex(%ecx),%eax # eax<- DvmDex
8905     movzwl  8(rPC),%ecx                         # ecx<- CCCC
8906     movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
8907     GET_VREG_R %ecx %ecx                        # ecx<- fp[CCCC], the object ptr
8908     movl    (%eax,rIBASE,4),%eax                # resolved entry
8909     testl   %eax,%eax                           # is resolved entry null?
8910     jne     .LOP_IPUT_BOOLEAN_JUMBO_finish                  # no, already resolved
8911     movl    rIBASE,OUT_ARG1(%esp)
8912     movl    rSELF,rIBASE
8913     EXPORT_PC
8914     movl    offThread_method(rIBASE),rIBASE     # rIBASE<- current method
8915     movl    offMethod_clazz(rIBASE),rIBASE      # rIBASE<- method->clazz
8916     SPILL_TMP1(%ecx)                            # save obj pointer across call
8917     movl    rIBASE,OUT_ARG0(%esp)               # pass in method->clazz
8918     call    dvmResolveInstField                 #  ... to dvmResolveInstField
8919     UNSPILL_TMP1(%ecx)
8920     testl   %eax,%eax                           # returns InstrField ptr
8921     jne     .LOP_IPUT_BOOLEAN_JUMBO_finish
8922     jmp     common_exceptionThrown
8923
8924 .LOP_IPUT_BOOLEAN_JUMBO_finish:
8925     /*
8926      * Currently:
8927      *   eax holds resolved field
8928      *   ecx holds object
8929      *   rINST holds BBBB
8930      */
8931     GET_VREG_R rINST rINST                       # rINST<- v[BBBB]
8932     movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
8933     testl   %ecx,%ecx                            # object null?
8934     je      common_errNullObject                 # object was null
8935     movb   rINSTbl,(%ecx,%eax,1)            # obj.field <- v[BBBB](8/16/32 bits)
8936     FETCH_INST_OPCODE 5 %ecx
8937     UNSPILL(rIBASE)
8938     ADVANCE_PC 5
8939     GOTO_NEXT_R %ecx
8940
8941
8942 /* ------------------------------ */
8943 .L_OP_IPUT_BYTE_JUMBO: /* 0x111 */
8944 /* File: x86/OP_IPUT_BYTE_JUMBO.S */
8945 /* File: x86/OP_IPUT_JUMBO.S */
8946     /*
8947      * Jumbo 32-bit instance field put.
8948      *
8949      * for: iput/jumbo, iput-object/jumbo, iput-boolean/jumbo, iput-byte/jumbo,
8950             iput-char/jumbo, iput-short/jumbo
8951      */
8952     /* exop vBBBB, vCCCC, field@AAAAAAAA */
8953     movl    rSELF,%ecx
8954     SPILL(rIBASE)
8955     movl    2(rPC),rIBASE                       # rIBASE<- AAAAAAAA
8956     movl    offThread_methodClassDex(%ecx),%eax # eax<- DvmDex
8957     movzwl  8(rPC),%ecx                         # ecx<- CCCC
8958     movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
8959     GET_VREG_R %ecx %ecx                        # ecx<- fp[CCCC], the object ptr
8960     movl    (%eax,rIBASE,4),%eax                # resolved entry
8961     testl   %eax,%eax                           # is resolved entry null?
8962     jne     .LOP_IPUT_BYTE_JUMBO_finish                  # no, already resolved
8963     movl    rIBASE,OUT_ARG1(%esp)
8964     movl    rSELF,rIBASE
8965     EXPORT_PC
8966     movl    offThread_method(rIBASE),rIBASE     # rIBASE<- current method
8967     movl    offMethod_clazz(rIBASE),rIBASE      # rIBASE<- method->clazz
8968     SPILL_TMP1(%ecx)                            # save obj pointer across call
8969     movl    rIBASE,OUT_ARG0(%esp)               # pass in method->clazz
8970     call    dvmResolveInstField                 #  ... to dvmResolveInstField
8971     UNSPILL_TMP1(%ecx)
8972     testl   %eax,%eax                           # returns InstrField ptr
8973     jne     .LOP_IPUT_BYTE_JUMBO_finish
8974     jmp     common_exceptionThrown
8975
8976 .LOP_IPUT_BYTE_JUMBO_finish:
8977     /*
8978      * Currently:
8979      *   eax holds resolved field
8980      *   ecx holds object
8981      *   rINST holds BBBB
8982      */
8983     GET_VREG_R rINST rINST                       # rINST<- v[BBBB]
8984     movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
8985     testl   %ecx,%ecx                            # object null?
8986     je      common_errNullObject                 # object was null
8987     movb   rINSTbl,(%ecx,%eax,1)            # obj.field <- v[BBBB](8/16/32 bits)
8988     FETCH_INST_OPCODE 5 %ecx
8989     UNSPILL(rIBASE)
8990     ADVANCE_PC 5
8991     GOTO_NEXT_R %ecx
8992
8993
8994 /* ------------------------------ */
8995 .L_OP_IPUT_CHAR_JUMBO: /* 0x112 */
8996 /* File: x86/OP_IPUT_CHAR_JUMBO.S */
8997 /* File: x86/OP_IPUT_JUMBO.S */
8998     /*
8999      * Jumbo 32-bit instance field put.
9000      *
9001      * for: iput/jumbo, iput-object/jumbo, iput-boolean/jumbo, iput-byte/jumbo,
9002             iput-char/jumbo, iput-short/jumbo
9003      */
9004     /* exop vBBBB, vCCCC, field@AAAAAAAA */
9005     movl    rSELF,%ecx
9006     SPILL(rIBASE)
9007     movl    2(rPC),rIBASE                       # rIBASE<- AAAAAAAA
9008     movl    offThread_methodClassDex(%ecx),%eax # eax<- DvmDex
9009     movzwl  8(rPC),%ecx                         # ecx<- CCCC
9010     movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
9011     GET_VREG_R %ecx %ecx                        # ecx<- fp[CCCC], the object ptr
9012     movl    (%eax,rIBASE,4),%eax                # resolved entry
9013     testl   %eax,%eax                           # is resolved entry null?
9014     jne     .LOP_IPUT_CHAR_JUMBO_finish                  # no, already resolved
9015     movl    rIBASE,OUT_ARG1(%esp)
9016     movl    rSELF,rIBASE
9017     EXPORT_PC
9018     movl    offThread_method(rIBASE),rIBASE     # rIBASE<- current method
9019     movl    offMethod_clazz(rIBASE),rIBASE      # rIBASE<- method->clazz
9020     SPILL_TMP1(%ecx)                            # save obj pointer across call
9021     movl    rIBASE,OUT_ARG0(%esp)               # pass in method->clazz
9022     call    dvmResolveInstField                 #  ... to dvmResolveInstField
9023     UNSPILL_TMP1(%ecx)
9024     testl   %eax,%eax                           # returns InstrField ptr
9025     jne     .LOP_IPUT_CHAR_JUMBO_finish
9026     jmp     common_exceptionThrown
9027
9028 .LOP_IPUT_CHAR_JUMBO_finish:
9029     /*
9030      * Currently:
9031      *   eax holds resolved field
9032      *   ecx holds object
9033      *   rINST holds BBBB
9034      */
9035     GET_VREG_R rINST rINST                       # rINST<- v[BBBB]
9036     movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
9037     testl   %ecx,%ecx                            # object null?
9038     je      common_errNullObject                 # object was null
9039     movw   rINSTw,(%ecx,%eax,1)            # obj.field <- v[BBBB](8/16/32 bits)
9040     FETCH_INST_OPCODE 5 %ecx
9041     UNSPILL(rIBASE)
9042     ADVANCE_PC 5
9043     GOTO_NEXT_R %ecx
9044
9045
9046 /* ------------------------------ */
9047 .L_OP_IPUT_SHORT_JUMBO: /* 0x113 */
9048 /* File: x86/OP_IPUT_SHORT_JUMBO.S */
9049 /* File: x86/OP_IPUT_JUMBO.S */
9050     /*
9051      * Jumbo 32-bit instance field put.
9052      *
9053      * for: iput/jumbo, iput-object/jumbo, iput-boolean/jumbo, iput-byte/jumbo,
9054             iput-char/jumbo, iput-short/jumbo
9055      */
9056     /* exop vBBBB, vCCCC, field@AAAAAAAA */
9057     movl    rSELF,%ecx
9058     SPILL(rIBASE)
9059     movl    2(rPC),rIBASE                       # rIBASE<- AAAAAAAA
9060     movl    offThread_methodClassDex(%ecx),%eax # eax<- DvmDex
9061     movzwl  8(rPC),%ecx                         # ecx<- CCCC
9062     movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
9063     GET_VREG_R %ecx %ecx                        # ecx<- fp[CCCC], the object ptr
9064     movl    (%eax,rIBASE,4),%eax                # resolved entry
9065     testl   %eax,%eax                           # is resolved entry null?
9066     jne     .LOP_IPUT_SHORT_JUMBO_finish                  # no, already resolved
9067     movl    rIBASE,OUT_ARG1(%esp)
9068     movl    rSELF,rIBASE
9069     EXPORT_PC
9070     movl    offThread_method(rIBASE),rIBASE     # rIBASE<- current method
9071     movl    offMethod_clazz(rIBASE),rIBASE      # rIBASE<- method->clazz
9072     SPILL_TMP1(%ecx)                            # save obj pointer across call
9073     movl    rIBASE,OUT_ARG0(%esp)               # pass in method->clazz
9074     call    dvmResolveInstField                 #  ... to dvmResolveInstField
9075     UNSPILL_TMP1(%ecx)
9076     testl   %eax,%eax                           # returns InstrField ptr
9077     jne     .LOP_IPUT_SHORT_JUMBO_finish
9078     jmp     common_exceptionThrown
9079
9080 .LOP_IPUT_SHORT_JUMBO_finish:
9081     /*
9082      * Currently:
9083      *   eax holds resolved field
9084      *   ecx holds object
9085      *   rINST holds BBBB
9086      */
9087     GET_VREG_R rINST rINST                       # rINST<- v[BBBB]
9088     movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
9089     testl   %ecx,%ecx                            # object null?
9090     je      common_errNullObject                 # object was null
9091     movw   rINSTw,(%ecx,%eax,1)            # obj.field <- v[BBBB](8/16/32 bits)
9092     FETCH_INST_OPCODE 5 %ecx
9093     UNSPILL(rIBASE)
9094     ADVANCE_PC 5
9095     GOTO_NEXT_R %ecx
9096
9097
9098 /* ------------------------------ */
9099 .L_OP_SGET_JUMBO: /* 0x114 */
9100 /* File: x86/OP_SGET_JUMBO.S */
9101     /*
9102      * Jumbo 32-bit SGET handler.
9103      *
9104      * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
9105      *      sget-char/jumbo, sget-short/jumbo
9106      */
9107     /* exop vBBBB, field@AAAAAAAA */
9108     movl      rSELF,%ecx
9109     movl      offThread_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
9110     movl      2(rPC),%eax                        # eax<- field ref AAAAAAAA
9111     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
9112     movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
9113     testl     %eax,%eax                          # resolved entry null?
9114     je        .LOP_SGET_JUMBO_resolve                # if not, make it so
9115 .LOP_SGET_JUMBO_finish:     # field ptr in eax
9116     movl      offStaticField_value(%eax),%eax
9117     FETCH_INST_OPCODE 4 %ecx
9118     ADVANCE_PC 4
9119     SET_VREG %eax rINST
9120     GOTO_NEXT_R %ecx
9121
9122     /*
9123      * Go resolve the field
9124      */
9125 .LOP_SGET_JUMBO_resolve:
9126     movl     rSELF,%ecx
9127     movl     2(rPC),%eax                        # eax<- field ref AAAAAAAA
9128     movl     offThread_method(%ecx),%ecx          # ecx<- current method
9129     EXPORT_PC                                   # could throw, need to export
9130     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
9131     movl     %eax,OUT_ARG1(%esp)
9132     movl     %ecx,OUT_ARG0(%esp)
9133     SPILL(rIBASE)
9134     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
9135     UNSPILL(rIBASE)
9136     testl    %eax,%eax
9137     jne      .LOP_SGET_JUMBO_finish                 # success, continue
9138     jmp      common_exceptionThrown             # no, handle exception
9139
9140 /* ------------------------------ */
9141 .L_OP_SGET_WIDE_JUMBO: /* 0x115 */
9142 /* File: x86/OP_SGET_WIDE_JUMBO.S */
9143     /*
9144      * Jumbo 64-bit SGET handler.
9145      *
9146      */
9147     /* sget-wide/jumbo vBBBB, field@AAAAAAAA */
9148     movl      rSELF,%ecx
9149     movl      offThread_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
9150     movl      2(rPC),%eax                        # eax<- field ref AAAAAAAA
9151     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
9152     movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
9153     testl     %eax,%eax                          # resolved entry null?
9154     je        .LOP_SGET_WIDE_JUMBO_resolve                # if not, make it so
9155 .LOP_SGET_WIDE_JUMBO_finish:     # field ptr in eax
9156     movl      offStaticField_value(%eax),%ecx    # ecx<- lsw
9157     movl      4+offStaticField_value(%eax),%eax  # eax<- msw
9158     SET_VREG_WORD %ecx rINST 0
9159     FETCH_INST_OPCODE 2 %ecx
9160     SET_VREG_WORD %eax rINST 1
9161     ADVANCE_PC 2
9162     GOTO_NEXT_R %ecx
9163
9164     /*
9165      * Go resolve the field
9166      */
9167 .LOP_SGET_WIDE_JUMBO_resolve:
9168     movl     rSELF,%ecx
9169     movl     2(rPC),%eax                        # eax<- field ref AAAAAAAA
9170     movl     offThread_method(%ecx),%ecx          # ecx<- current method
9171     EXPORT_PC                                   # could throw, need to export
9172     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
9173     movl     %eax,OUT_ARG1(%esp)
9174     movl     %ecx,OUT_ARG0(%esp)
9175     SPILL(rIBASE)
9176     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
9177     UNSPILL(rIBASE)
9178     testl    %eax,%eax
9179     jne      .LOP_SGET_WIDE_JUMBO_finish                 # success, continue
9180     jmp      common_exceptionThrown             # no, handle exception
9181
9182 /* ------------------------------ */
9183 .L_OP_SGET_OBJECT_JUMBO: /* 0x116 */
9184 /* File: x86/OP_SGET_OBJECT_JUMBO.S */
9185 /* File: x86/OP_SGET_JUMBO.S */
9186     /*
9187      * Jumbo 32-bit SGET handler.
9188      *
9189      * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
9190      *      sget-char/jumbo, sget-short/jumbo
9191      */
9192     /* exop vBBBB, field@AAAAAAAA */
9193     movl      rSELF,%ecx
9194     movl      offThread_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
9195     movl      2(rPC),%eax                        # eax<- field ref AAAAAAAA
9196     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
9197     movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
9198     testl     %eax,%eax                          # resolved entry null?
9199     je        .LOP_SGET_OBJECT_JUMBO_resolve                # if not, make it so
9200 .LOP_SGET_OBJECT_JUMBO_finish:     # field ptr in eax
9201     movl      offStaticField_value(%eax),%eax
9202     FETCH_INST_OPCODE 4 %ecx
9203     ADVANCE_PC 4
9204     SET_VREG %eax rINST
9205     GOTO_NEXT_R %ecx
9206
9207     /*
9208      * Go resolve the field
9209      */
9210 .LOP_SGET_OBJECT_JUMBO_resolve:
9211     movl     rSELF,%ecx
9212     movl     2(rPC),%eax                        # eax<- field ref AAAAAAAA
9213     movl     offThread_method(%ecx),%ecx          # ecx<- current method
9214     EXPORT_PC                                   # could throw, need to export
9215     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
9216     movl     %eax,OUT_ARG1(%esp)
9217     movl     %ecx,OUT_ARG0(%esp)
9218     SPILL(rIBASE)
9219     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
9220     UNSPILL(rIBASE)
9221     testl    %eax,%eax
9222     jne      .LOP_SGET_OBJECT_JUMBO_finish                 # success, continue
9223     jmp      common_exceptionThrown             # no, handle exception
9224
9225
9226 /* ------------------------------ */
9227 .L_OP_SGET_BOOLEAN_JUMBO: /* 0x117 */
9228 /* File: x86/OP_SGET_BOOLEAN_JUMBO.S */
9229 /* File: x86/OP_SGET_JUMBO.S */
9230     /*
9231      * Jumbo 32-bit SGET handler.
9232      *
9233      * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
9234      *      sget-char/jumbo, sget-short/jumbo
9235      */
9236     /* exop vBBBB, field@AAAAAAAA */
9237     movl      rSELF,%ecx
9238     movl      offThread_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
9239     movl      2(rPC),%eax                        # eax<- field ref AAAAAAAA
9240     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
9241     movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
9242     testl     %eax,%eax                          # resolved entry null?
9243     je        .LOP_SGET_BOOLEAN_JUMBO_resolve                # if not, make it so
9244 .LOP_SGET_BOOLEAN_JUMBO_finish:     # field ptr in eax
9245     movl      offStaticField_value(%eax),%eax
9246     FETCH_INST_OPCODE 4 %ecx
9247     ADVANCE_PC 4
9248     SET_VREG %eax rINST
9249     GOTO_NEXT_R %ecx
9250
9251     /*
9252      * Go resolve the field
9253      */
9254 .LOP_SGET_BOOLEAN_JUMBO_resolve:
9255     movl     rSELF,%ecx
9256     movl     2(rPC),%eax                        # eax<- field ref AAAAAAAA
9257     movl     offThread_method(%ecx),%ecx          # ecx<- current method
9258     EXPORT_PC                                   # could throw, need to export
9259     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
9260     movl     %eax,OUT_ARG1(%esp)
9261     movl     %ecx,OUT_ARG0(%esp)
9262     SPILL(rIBASE)
9263     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
9264     UNSPILL(rIBASE)
9265     testl    %eax,%eax
9266     jne      .LOP_SGET_BOOLEAN_JUMBO_finish                 # success, continue
9267     jmp      common_exceptionThrown             # no, handle exception
9268
9269
9270 /* ------------------------------ */
9271 .L_OP_SGET_BYTE_JUMBO: /* 0x118 */
9272 /* File: x86/OP_SGET_BYTE_JUMBO.S */
9273 /* File: x86/OP_SGET_JUMBO.S */
9274     /*
9275      * Jumbo 32-bit SGET handler.
9276      *
9277      * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
9278      *      sget-char/jumbo, sget-short/jumbo
9279      */
9280     /* exop vBBBB, field@AAAAAAAA */
9281     movl      rSELF,%ecx
9282     movl      offThread_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
9283     movl      2(rPC),%eax                        # eax<- field ref AAAAAAAA
9284     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
9285     movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
9286     testl     %eax,%eax                          # resolved entry null?
9287     je        .LOP_SGET_BYTE_JUMBO_resolve                # if not, make it so
9288 .LOP_SGET_BYTE_JUMBO_finish:     # field ptr in eax
9289     movl      offStaticField_value(%eax),%eax
9290     FETCH_INST_OPCODE 4 %ecx
9291     ADVANCE_PC 4
9292     SET_VREG %eax rINST
9293     GOTO_NEXT_R %ecx
9294
9295     /*
9296      * Go resolve the field
9297      */
9298 .LOP_SGET_BYTE_JUMBO_resolve:
9299     movl     rSELF,%ecx
9300     movl     2(rPC),%eax                        # eax<- field ref AAAAAAAA
9301     movl     offThread_method(%ecx),%ecx          # ecx<- current method
9302     EXPORT_PC                                   # could throw, need to export
9303     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
9304     movl     %eax,OUT_ARG1(%esp)
9305     movl     %ecx,OUT_ARG0(%esp)
9306     SPILL(rIBASE)
9307     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
9308     UNSPILL(rIBASE)
9309     testl    %eax,%eax
9310     jne      .LOP_SGET_BYTE_JUMBO_finish                 # success, continue
9311     jmp      common_exceptionThrown             # no, handle exception
9312
9313
9314 /* ------------------------------ */
9315 .L_OP_SGET_CHAR_JUMBO: /* 0x119 */
9316 /* File: x86/OP_SGET_CHAR_JUMBO.S */
9317 /* File: x86/OP_SGET_JUMBO.S */
9318     /*
9319      * Jumbo 32-bit SGET handler.
9320      *
9321      * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
9322      *      sget-char/jumbo, sget-short/jumbo
9323      */
9324     /* exop vBBBB, field@AAAAAAAA */
9325     movl      rSELF,%ecx
9326     movl      offThread_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
9327     movl      2(rPC),%eax                        # eax<- field ref AAAAAAAA
9328     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
9329     movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
9330     testl     %eax,%eax                          # resolved entry null?
9331     je        .LOP_SGET_CHAR_JUMBO_resolve                # if not, make it so
9332 .LOP_SGET_CHAR_JUMBO_finish:     # field ptr in eax
9333     movl      offStaticField_value(%eax),%eax
9334     FETCH_INST_OPCODE 4 %ecx
9335     ADVANCE_PC 4
9336     SET_VREG %eax rINST
9337     GOTO_NEXT_R %ecx
9338
9339     /*
9340      * Go resolve the field
9341      */
9342 .LOP_SGET_CHAR_JUMBO_resolve:
9343     movl     rSELF,%ecx
9344     movl     2(rPC),%eax                        # eax<- field ref AAAAAAAA
9345     movl     offThread_method(%ecx),%ecx          # ecx<- current method
9346     EXPORT_PC                                   # could throw, need to export
9347     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
9348     movl     %eax,OUT_ARG1(%esp)
9349     movl     %ecx,OUT_ARG0(%esp)
9350     SPILL(rIBASE)
9351     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
9352     UNSPILL(rIBASE)
9353     testl    %eax,%eax
9354     jne      .LOP_SGET_CHAR_JUMBO_finish                 # success, continue
9355     jmp      common_exceptionThrown             # no, handle exception
9356
9357
9358 /* ------------------------------ */
9359 .L_OP_SGET_SHORT_JUMBO: /* 0x11a */
9360 /* File: x86/OP_SGET_SHORT_JUMBO.S */
9361 /* File: x86/OP_SGET_JUMBO.S */
9362     /*
9363      * Jumbo 32-bit SGET handler.
9364      *
9365      * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
9366      *      sget-char/jumbo, sget-short/jumbo
9367      */
9368     /* exop vBBBB, field@AAAAAAAA */
9369     movl      rSELF,%ecx
9370     movl      offThread_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
9371     movl      2(rPC),%eax                        # eax<- field ref AAAAAAAA
9372     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
9373     movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
9374     testl     %eax,%eax                          # resolved entry null?
9375     je        .LOP_SGET_SHORT_JUMBO_resolve                # if not, make it so
9376 .LOP_SGET_SHORT_JUMBO_finish:     # field ptr in eax
9377     movl      offStaticField_value(%eax),%eax
9378     FETCH_INST_OPCODE 4 %ecx
9379     ADVANCE_PC 4
9380     SET_VREG %eax rINST
9381     GOTO_NEXT_R %ecx
9382
9383     /*
9384      * Go resolve the field
9385      */
9386 .LOP_SGET_SHORT_JUMBO_resolve:
9387     movl     rSELF,%ecx
9388     movl     2(rPC),%eax                        # eax<- field ref AAAAAAAA
9389     movl     offThread_method(%ecx),%ecx          # ecx<- current method
9390     EXPORT_PC                                   # could throw, need to export
9391     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
9392     movl     %eax,OUT_ARG1(%esp)
9393     movl     %ecx,OUT_ARG0(%esp)
9394     SPILL(rIBASE)
9395     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
9396     UNSPILL(rIBASE)
9397     testl    %eax,%eax
9398     jne      .LOP_SGET_SHORT_JUMBO_finish                 # success, continue
9399     jmp      common_exceptionThrown             # no, handle exception
9400
9401
9402 /* ------------------------------ */
9403 .L_OP_SPUT_JUMBO: /* 0x11b */
9404 /* File: x86/OP_SPUT_JUMBO.S */
9405     /*
9406      * Jumbo 32-bit SPUT handler.
9407      *
9408      * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
9409      *      sput-short/jumbo
9410      */
9411     /* exop vBBBB, field@AAAAAAAA */
9412     movl      rSELF,%ecx
9413     movl      offThread_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
9414     movl      2(rPC),%eax                        # eax<- field ref AAAAAAAA
9415     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
9416     movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
9417     testl     %eax,%eax                          # resolved entry null?
9418     je        .LOP_SPUT_JUMBO_resolve                # if not, make it so
9419 .LOP_SPUT_JUMBO_finish:     # field ptr in eax
9420     GET_VREG_R  rINST rINST
9421     FETCH_INST_OPCODE 4 %ecx
9422     ADVANCE_PC 4
9423     movl      rINST,offStaticField_value(%eax)
9424     GOTO_NEXT_R %ecx
9425
9426     /*
9427      * Go resolve the field
9428      */
9429 .LOP_SPUT_JUMBO_resolve:
9430     movl     rSELF,%ecx
9431     movl     2(rPC),%eax                        # eax<- field ref AAAAAAAA
9432     movl     offThread_method(%ecx),%ecx          # ecx<- current method
9433     EXPORT_PC                                   # could throw, need to export
9434     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
9435     movl     %eax,OUT_ARG1(%esp)
9436     movl     %ecx,OUT_ARG0(%esp)
9437     SPILL(rIBASE)
9438     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
9439     UNSPILL(rIBASE)
9440     testl    %eax,%eax
9441     jne      .LOP_SPUT_JUMBO_finish                 # success, continue
9442     jmp      common_exceptionThrown             # no, handle exception
9443
9444 /* ------------------------------ */
9445 .L_OP_SPUT_WIDE_JUMBO: /* 0x11c */
9446 /* File: x86/OP_SPUT_WIDE_JUMBO.S */
9447     /*
9448      * Jumbo 64-bit SPUT handler.
9449      */
9450     /* sput-wide/jumbo vBBBB, field@AAAAAAAA */
9451     movl      rSELF,%ecx
9452     movl      offThread_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
9453     movl      2(rPC),%eax                        # eax<- field ref AAAAAAAA
9454     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
9455     movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
9456     testl     %eax,%eax                          # resolved entry null?
9457     je        .LOP_SPUT_WIDE_JUMBO_resolve                # if not, make it so
9458 .LOP_SPUT_WIDE_JUMBO_finish:     # field ptr in eax
9459     GET_VREG_WORD %ecx rINST 0                  # ecx<- lsw
9460     GET_VREG_WORD rINST rINST 1                 # rINST<- msw
9461     movl      %ecx,offStaticField_value(%eax)
9462     FETCH_INST_OPCODE 4 %ecx
9463     movl      rINST,4+offStaticField_value(%eax)
9464     ADVANCE_PC 4
9465     GOTO_NEXT_R %ecx
9466
9467     /*
9468      * Go resolve the field
9469      */
9470 .LOP_SPUT_WIDE_JUMBO_resolve:
9471     movl     rSELF,%ecx
9472     movl     2(rPC),%eax                        # eax<- field ref AAAAAAAA
9473     movl     offThread_method(%ecx),%ecx          # ecx<- current method
9474     EXPORT_PC                                   # could throw, need to export
9475     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
9476     movl     %eax,OUT_ARG1(%esp)
9477     movl     %ecx,OUT_ARG0(%esp)
9478     SPILL(rIBASE)
9479     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
9480     UNSPILL(rIBASE)
9481     testl    %eax,%eax
9482     jne      .LOP_SPUT_WIDE_JUMBO_finish                 # success, continue
9483     jmp      common_exceptionThrown             # no, handle exception
9484
9485 /* ------------------------------ */
9486 .L_OP_SPUT_OBJECT_JUMBO: /* 0x11d */
9487 /* File: x86/OP_SPUT_OBJECT_JUMBO.S */
9488     /*
9489      * Jumbo SPUT object handler.
9490      */
9491     /* sput-object/jumbo vBBBB, field@AAAAAAAA */
9492     movl      rSELF,%ecx
9493     movl      2(rPC),%eax                        # eax<- field ref AAAAAAAA
9494     movl      offThread_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
9495     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
9496     movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField
9497     testl     %eax,%eax                          # resolved entry null?
9498     je        .LOP_SPUT_OBJECT_JUMBO_resolve                # if not, make it so
9499 .LOP_SPUT_OBJECT_JUMBO_finish:                              # field ptr in eax
9500     GET_VREG_R  %ecx rINST
9501     movl      %ecx,offStaticField_value(%eax)    # do the store
9502     testl     %ecx,%ecx                          # stored null object ptr?
9503     je        1f                                 # skip card mark if null
9504     movl      rSELF,%ecx
9505     movl      offField_clazz(%eax),%eax          # eax<- method->clazz
9506     movl      offThread_cardTable(%ecx),%ecx       # get card table base
9507     shrl      $GC_CARD_SHIFT,%eax               # head to card number
9508     movb      %cl,(%ecx,%eax)                    # mark card
9509 1:
9510     FETCH_INST_OPCODE 4 %ecx
9511     ADVANCE_PC 4
9512     GOTO_NEXT_R %ecx
9513
9514 .LOP_SPUT_OBJECT_JUMBO_resolve:
9515     movl     rSELF,%ecx
9516     movl     2(rPC),%eax                        # eax<- field ref AAAAAAAA
9517     movl     offThread_method(%ecx),%ecx          # ecx<- current method
9518     EXPORT_PC                                   # could throw, need to export
9519     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
9520     movl     %eax,OUT_ARG1(%esp)
9521     movl     %ecx,OUT_ARG0(%esp)
9522     SPILL(rIBASE)
9523     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
9524     UNSPILL(rIBASE)
9525     testl    %eax,%eax
9526     jne      .LOP_SPUT_OBJECT_JUMBO_finish                 # success, continue
9527     jmp      common_exceptionThrown             # no, handle exception
9528
9529 /* ------------------------------ */
9530 .L_OP_SPUT_BOOLEAN_JUMBO: /* 0x11e */
9531 /* File: x86/OP_SPUT_BOOLEAN_JUMBO.S */
9532 /* File: x86/OP_SPUT_JUMBO.S */
9533     /*
9534      * Jumbo 32-bit SPUT handler.
9535      *
9536      * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
9537      *      sput-short/jumbo
9538      */
9539     /* exop vBBBB, field@AAAAAAAA */
9540     movl      rSELF,%ecx
9541     movl      offThread_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
9542     movl      2(rPC),%eax                        # eax<- field ref AAAAAAAA
9543     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
9544     movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
9545     testl     %eax,%eax                          # resolved entry null?
9546     je        .LOP_SPUT_BOOLEAN_JUMBO_resolve                # if not, make it so
9547 .LOP_SPUT_BOOLEAN_JUMBO_finish:     # field ptr in eax
9548     GET_VREG_R  rINST rINST
9549     FETCH_INST_OPCODE 4 %ecx
9550     ADVANCE_PC 4
9551     movl      rINST,offStaticField_value(%eax)
9552     GOTO_NEXT_R %ecx
9553
9554     /*
9555      * Go resolve the field
9556      */
9557 .LOP_SPUT_BOOLEAN_JUMBO_resolve:
9558     movl     rSELF,%ecx
9559     movl     2(rPC),%eax                        # eax<- field ref AAAAAAAA
9560     movl     offThread_method(%ecx),%ecx          # ecx<- current method
9561     EXPORT_PC                                   # could throw, need to export
9562     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
9563     movl     %eax,OUT_ARG1(%esp)
9564     movl     %ecx,OUT_ARG0(%esp)
9565     SPILL(rIBASE)
9566     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
9567     UNSPILL(rIBASE)
9568     testl    %eax,%eax
9569     jne      .LOP_SPUT_BOOLEAN_JUMBO_finish                 # success, continue
9570     jmp      common_exceptionThrown             # no, handle exception
9571
9572
9573 /* ------------------------------ */
9574 .L_OP_SPUT_BYTE_JUMBO: /* 0x11f */
9575 /* File: x86/OP_SPUT_BYTE_JUMBO.S */
9576 /* File: x86/OP_SPUT_JUMBO.S */
9577     /*
9578      * Jumbo 32-bit SPUT handler.
9579      *
9580      * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
9581      *      sput-short/jumbo
9582      */
9583     /* exop vBBBB, field@AAAAAAAA */
9584     movl      rSELF,%ecx
9585     movl      offThread_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
9586     movl      2(rPC),%eax                        # eax<- field ref AAAAAAAA
9587     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
9588     movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
9589     testl     %eax,%eax                          # resolved entry null?
9590     je        .LOP_SPUT_BYTE_JUMBO_resolve                # if not, make it so
9591 .LOP_SPUT_BYTE_JUMBO_finish:     # field ptr in eax
9592     GET_VREG_R  rINST rINST
9593     FETCH_INST_OPCODE 4 %ecx
9594     ADVANCE_PC 4
9595     movl      rINST,offStaticField_value(%eax)
9596     GOTO_NEXT_R %ecx
9597
9598     /*
9599      * Go resolve the field
9600      */
9601 .LOP_SPUT_BYTE_JUMBO_resolve:
9602     movl     rSELF,%ecx
9603     movl     2(rPC),%eax                        # eax<- field ref AAAAAAAA
9604     movl     offThread_method(%ecx),%ecx          # ecx<- current method
9605     EXPORT_PC                                   # could throw, need to export
9606     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
9607     movl     %eax,OUT_ARG1(%esp)
9608     movl     %ecx,OUT_ARG0(%esp)
9609     SPILL(rIBASE)
9610     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
9611     UNSPILL(rIBASE)
9612     testl    %eax,%eax
9613     jne      .LOP_SPUT_BYTE_JUMBO_finish                 # success, continue
9614     jmp      common_exceptionThrown             # no, handle exception
9615
9616
9617 /* ------------------------------ */
9618 .L_OP_SPUT_CHAR_JUMBO: /* 0x120 */
9619 /* File: x86/OP_SPUT_CHAR_JUMBO.S */
9620 /* File: x86/OP_SPUT_JUMBO.S */
9621     /*
9622      * Jumbo 32-bit SPUT handler.
9623      *
9624      * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
9625      *      sput-short/jumbo
9626      */
9627     /* exop vBBBB, field@AAAAAAAA */
9628     movl      rSELF,%ecx
9629     movl      offThread_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
9630     movl      2(rPC),%eax                        # eax<- field ref AAAAAAAA
9631     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
9632     movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
9633     testl     %eax,%eax                          # resolved entry null?
9634     je        .LOP_SPUT_CHAR_JUMBO_resolve                # if not, make it so
9635 .LOP_SPUT_CHAR_JUMBO_finish:     # field ptr in eax
9636     GET_VREG_R  rINST rINST
9637     FETCH_INST_OPCODE 4 %ecx
9638     ADVANCE_PC 4
9639     movl      rINST,offStaticField_value(%eax)
9640     GOTO_NEXT_R %ecx
9641
9642     /*
9643      * Go resolve the field
9644      */
9645 .LOP_SPUT_CHAR_JUMBO_resolve:
9646     movl     rSELF,%ecx
9647     movl     2(rPC),%eax                        # eax<- field ref AAAAAAAA
9648     movl     offThread_method(%ecx),%ecx          # ecx<- current method
9649     EXPORT_PC                                   # could throw, need to export
9650     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
9651     movl     %eax,OUT_ARG1(%esp)
9652     movl     %ecx,OUT_ARG0(%esp)
9653     SPILL(rIBASE)
9654     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
9655     UNSPILL(rIBASE)
9656     testl    %eax,%eax
9657     jne      .LOP_SPUT_CHAR_JUMBO_finish                 # success, continue
9658     jmp      common_exceptionThrown             # no, handle exception
9659
9660
9661 /* ------------------------------ */
9662 .L_OP_SPUT_SHORT_JUMBO: /* 0x121 */
9663 /* File: x86/OP_SPUT_SHORT_JUMBO.S */
9664 /* File: x86/OP_SPUT_JUMBO.S */
9665     /*
9666      * Jumbo 32-bit SPUT handler.
9667      *
9668      * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
9669      *      sput-short/jumbo
9670      */
9671     /* exop vBBBB, field@AAAAAAAA */
9672     movl      rSELF,%ecx
9673     movl      offThread_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
9674     movl      2(rPC),%eax                        # eax<- field ref AAAAAAAA
9675     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
9676     movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
9677     testl     %eax,%eax                          # resolved entry null?
9678     je        .LOP_SPUT_SHORT_JUMBO_resolve                # if not, make it so
9679 .LOP_SPUT_SHORT_JUMBO_finish:     # field ptr in eax
9680     GET_VREG_R  rINST rINST
9681     FETCH_INST_OPCODE 4 %ecx
9682     ADVANCE_PC 4
9683     movl      rINST,offStaticField_value(%eax)
9684     GOTO_NEXT_R %ecx
9685
9686     /*
9687      * Go resolve the field
9688      */
9689 .LOP_SPUT_SHORT_JUMBO_resolve:
9690     movl     rSELF,%ecx
9691     movl     2(rPC),%eax                        # eax<- field ref AAAAAAAA
9692     movl     offThread_method(%ecx),%ecx          # ecx<- current method
9693     EXPORT_PC                                   # could throw, need to export
9694     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
9695     movl     %eax,OUT_ARG1(%esp)
9696     movl     %ecx,OUT_ARG0(%esp)
9697     SPILL(rIBASE)
9698     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
9699     UNSPILL(rIBASE)
9700     testl    %eax,%eax
9701     jne      .LOP_SPUT_SHORT_JUMBO_finish                 # success, continue
9702     jmp      common_exceptionThrown             # no, handle exception
9703
9704
9705 /* ------------------------------ */
9706 .L_OP_INVOKE_VIRTUAL_JUMBO: /* 0x122 */
9707 /* File: x86/OP_INVOKE_VIRTUAL_JUMBO.S */
9708     /*
9709      * Handle a jumbo virtual method call.
9710      */
9711     /* invoke-virtual/jumbo vBBBB, {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
9712     movl      rSELF,%eax
9713     movl      2(rPC),%ecx                 # ecx<- AAAAAAAA
9714     movl      offThread_methodClassDex(%eax),%eax  # eax<- pDvmDex
9715     EXPORT_PC
9716     movl      offDvmDex_pResMethods(%eax),%eax   # eax<- pDvmDex->pResMethods
9717     movl      (%eax,%ecx,4),%eax          # eax<- resolved baseMethod
9718     testl     %eax,%eax                   # already resolved?
9719     jne       .LOP_INVOKE_VIRTUAL_JUMBO_continue        # yes, continue
9720     movl      rSELF,%eax
9721     movl      %ecx,OUT_ARG1(%esp)         # arg1<- ref
9722     movl      offThread_method(%eax),%eax   # eax<- self->method
9723     movl      offMethod_clazz(%eax),%eax  # ecx<- method->clazz
9724     movl      %eax,OUT_ARG0(%esp)         # arg0<- clazz
9725     movl      $METHOD_VIRTUAL,OUT_ARG2(%esp) # arg2<- flags
9726     call      dvmResolveMethod            # eax<- call(clazz, ref, flags)
9727     testl     %eax,%eax                   # got null?
9728     jne       .LOP_INVOKE_VIRTUAL_JUMBO_continue        # no, continue
9729     jmp       common_exceptionThrown      # yes, handle exception
9730
9731     /* At this point:
9732      *   eax = resolved base method
9733      *   ecx = scratch
9734      */
9735 .LOP_INVOKE_VIRTUAL_JUMBO_continue:
9736     movzwl    8(rPC),%ecx               # ecx<- CCCC
9737     GET_VREG_R  %ecx %ecx               # ecx<- "this"
9738     movzwl    offMethod_methodIndex(%eax),%eax  # eax<- baseMethod->methodIndex
9739     testl     %ecx,%ecx                 # null this?
9740     je        common_errNullObject      # go if so
9741     movl      offObject_clazz(%ecx),%ecx  # ecx<- thisPtr->clazz
9742     movl      offClassObject_vtable(%ecx),%ecx # ecx<- thisPtr->clazz->vtable
9743     movl      (%ecx,%eax,4),%eax        # eax<- vtable[methodIndex]
9744     jmp       common_invokeMethodJumbo
9745
9746 /* ------------------------------ */
9747 .L_OP_INVOKE_SUPER_JUMBO: /* 0x123 */
9748 /* File: x86/OP_INVOKE_SUPER_JUMBO.S */
9749     /*
9750      * Handle a jumbo "super" method call.
9751      */
9752     /* invoke-super/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
9753     movl      rSELF,rINST
9754     movl      2(rPC),%eax               # eax<- AAAAAAAA
9755     movl      offThread_methodClassDex(rINST),%ecx # ecx<- pDvmDex
9756     EXPORT_PC
9757     movl      offDvmDex_pResMethods(%ecx),%ecx # ecx<- pDvmDex->pResMethods
9758     movl      (%ecx,%eax,4),%ecx        # ecx<- resolved baseMethod
9759     movl      offThread_method(rINST),%eax # eax<- method
9760     movzwl    8(rPC),rINST              # rINST<- CCCC
9761     GET_VREG_R  rINST rINST             # rINST<- "this" ptr
9762     testl     rINST,rINST               # null "this"?
9763     je        common_errNullObject      # yes, throw
9764     movl      offMethod_clazz(%eax),%eax # eax<- method->clazz
9765     testl     %ecx,%ecx                 # already resolved?
9766     je       .LOP_INVOKE_SUPER_JUMBO_resolve
9767     /*
9768      * At this point:
9769      *  ecx = resolved base method [r0]
9770      *  eax = method->clazz [r9]
9771      */
9772 .LOP_INVOKE_SUPER_JUMBO_continue:
9773     movl    offClassObject_super(%eax),%eax   # eax<- method->clazz->super
9774     movzwl  offMethod_methodIndex(%ecx),%ecx  # ecx<- baseMthod->methodIndex
9775     cmpl    offClassObject_vtableCount(%eax),%ecx # compare(methodIndex,vtableCount)
9776     jae     .LOP_INVOKE_SUPER_JUMBO_nsm           # method not present in superclass
9777     movl    offClassObject_vtable(%eax),%eax   # eax<- ...clazz->super->vtable
9778     movl    (%eax,%ecx,4),%eax        # eax<- vtable[methodIndex]
9779     jmp     common_invokeMethodJumbo
9780
9781
9782     /* At this point:
9783      * ecx = null (needs to be resolved base method)
9784      * eax = method->clazz
9785     */
9786 .LOP_INVOKE_SUPER_JUMBO_resolve:
9787     SPILL_TMP1(%eax)                    # method->clazz
9788     movl    %eax,OUT_ARG0(%esp)         # arg0<- method->clazz
9789     movl    2(rPC),%ecx                 # ecx<- AAAAAAAA
9790     movl    $METHOD_VIRTUAL,OUT_ARG2(%esp)  # arg2<- resolver method type
9791     movl    %ecx,OUT_ARG1(%esp)         # arg1<- ref
9792     call    dvmResolveMethod            # eax<- call(clazz, ref, flags)
9793     testl   %eax,%eax                   # got null?
9794     movl    %eax,%ecx                   # ecx<- resolved base method
9795     UNSPILL_TMP1(%eax)                  # restore method->clazz
9796     jne     .LOP_INVOKE_SUPER_JUMBO_continue        # good to go - continue
9797     jmp     common_exceptionThrown      # handle exception
9798
9799     /*
9800      * Throw a NoSuchMethodError with the method name as the message.
9801      *  ecx = resolved base method
9802      */
9803 .LOP_INVOKE_SUPER_JUMBO_nsm:
9804     movl    offMethod_name(%ecx),%eax
9805     jmp     common_errNoSuchMethod
9806
9807 /* ------------------------------ */
9808 .L_OP_INVOKE_DIRECT_JUMBO: /* 0x124 */
9809 /* File: x86/OP_INVOKE_DIRECT_JUMBO.S */
9810     /*
9811      * Handle a jumbo direct method call.
9812      *
9813      * (We could defer the "is 'this' pointer null" test to the common
9814      * method invocation code, and use a flag to indicate that static
9815      * calls don't count.  If we do this as part of copying the arguments
9816      * out we could avoiding loading the first arg twice.)
9817      */
9818     /* invoke-direct/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
9819     movl      rSELF,%ecx
9820     movl      2(rPC),%eax              # eax<- AAAAAAAA
9821     movl      offThread_methodClassDex(%ecx),%ecx # ecx<- pDvmDex
9822     EXPORT_PC
9823     movl      offDvmDex_pResMethods(%ecx),%ecx  # ecx<- pDvmDex->pResMethods
9824     movzwl    8(rPC),rIBASE            # rIBASE<- CCCC
9825     movl      (%ecx,%eax,4),%eax       # eax<- resolved methodToCall
9826     testl     %eax,%eax                # already resolved?
9827     GET_VREG_R  %ecx rIBASE            # ecx<- "this" ptr
9828     je        .LOP_INVOKE_DIRECT_JUMBO_resolve      # not resolved, do it now
9829 .LOP_INVOKE_DIRECT_JUMBO_finish:
9830     testl     %ecx,%ecx                # null "this"?
9831     jne       common_invokeMethodJumbo # no, continue on
9832     jmp       common_errNullObject
9833
9834     /*
9835      * On entry:
9836      *   TMP_SPILL  <- "this" register
9837      * Things a bit ugly on this path, but it's the less
9838      * frequent one.  We'll have to do some reloading.
9839      */
9840 .LOP_INVOKE_DIRECT_JUMBO_resolve:
9841      SPILL_TMP1(%ecx)
9842      movl     rSELF,%ecx
9843      movl     offThread_method(%ecx),%ecx  # ecx<- self->method
9844      movl     2(rPC),%eax      # reference AAAAAAAA
9845      movl     offMethod_clazz(%ecx),%ecx # ecx<- method->clazz
9846      movl     $METHOD_DIRECT,OUT_ARG2(%esp)
9847      movl     %eax,OUT_ARG1(%esp)
9848      movl     %ecx,OUT_ARG0(%esp)
9849      call     dvmResolveMethod # eax<- call(clazz, ref, flags)
9850      UNSPILL_TMP1(%ecx)
9851      testl    %eax,%eax
9852      jne      .LOP_INVOKE_DIRECT_JUMBO_finish
9853      jmp      common_exceptionThrown
9854
9855 /* ------------------------------ */
9856 .L_OP_INVOKE_STATIC_JUMBO: /* 0x125 */
9857 /* File: x86/OP_INVOKE_STATIC_JUMBO.S */
9858     /*
9859      * Handle a jumbo static method call.
9860      */
9861     /* invoke-static/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
9862     movl      rSELF,%ecx
9863     movl      2(rPC),%eax               # eax<- AAAAAAAA
9864     movl      offThread_methodClassDex(%ecx),%ecx # ecx<- pDvmDex
9865     EXPORT_PC
9866     movl      offDvmDex_pResMethods(%ecx),%ecx  # ecx<- pDvmDex->pResMethods
9867     movl      (%ecx,%eax,4),%eax        # eax<- resolved methodToCall
9868     testl     %eax,%eax
9869     jne       common_invokeMethodJumbo
9870     movl      rSELF,%ecx
9871     movl      offThread_method(%ecx),%ecx # ecx<- self->method
9872     movl      2(rPC),%eax               # eax<- AAAAAAAA
9873     movl      offMethod_clazz(%ecx),%ecx# ecx<- method->clazz
9874     movl      %eax,OUT_ARG1(%esp)       # arg1<- AAAAAAAA
9875     movl      %ecx,OUT_ARG0(%esp)       # arg0<- clazz
9876     movl      $METHOD_STATIC,%eax
9877     movl      %eax,OUT_ARG2(%esp)       # arg2<- flags
9878     call      dvmResolveMethod          # call(clazz,ref,flags)
9879     testl     %eax,%eax                 # got null?
9880     jne       common_invokeMethodJumbo
9881     jmp       common_exceptionThrown
9882
9883 /* ------------------------------ */
9884 .L_OP_INVOKE_INTERFACE_JUMBO: /* 0x126 */
9885 /* File: x86/OP_INVOKE_INTERFACE_JUMBO.S */
9886     /*
9887      * Handle a jumbo interface method call.
9888      */
9889     /* invoke-interface/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
9890     movzwl     8(rPC),%eax              # eax<- CCCC
9891     movl       rSELF,%ecx
9892     GET_VREG_R   %eax %eax              # eax<- "this"
9893     EXPORT_PC
9894     testl      %eax,%eax                # null this?
9895     je         common_errNullObject     # yes, fail
9896     movl       offObject_clazz(%eax),%eax# eax<- thisPtr->clazz
9897     movl       %eax,OUT_ARG0(%esp)                 # arg0<- class
9898     movl       offThread_methodClassDex(%ecx),%eax   # eax<- methodClassDex
9899     movl       offThread_method(%ecx),%ecx           # ecx<- method
9900     movl       %eax,OUT_ARG3(%esp)                 # arg3<- dex
9901     movl       2(rPC),%eax                         # eax<- AAAAAAAA
9902     movl       %ecx,OUT_ARG2(%esp)                 # arg2<- method
9903     movl       %eax,OUT_ARG1(%esp)                 # arg1<- AAAAAAAA
9904     call       dvmFindInterfaceMethodInCache # eax<- call(class, ref, method, dex)
9905     testl      %eax,%eax
9906     je         common_exceptionThrown
9907     jmp        common_invokeMethodJumbo
9908
9909 /* ------------------------------ */
9910 .L_OP_UNUSED_27FF: /* 0x127 */
9911 /* File: x86/OP_UNUSED_27FF.S */
9912 /* File: x86/unused.S */
9913     jmp     common_abort
9914
9915
9916 /* ------------------------------ */
9917 .L_OP_UNUSED_28FF: /* 0x128 */
9918 /* File: x86/OP_UNUSED_28FF.S */
9919 /* File: x86/unused.S */
9920     jmp     common_abort
9921
9922
9923 /* ------------------------------ */
9924 .L_OP_UNUSED_29FF: /* 0x129 */
9925 /* File: x86/OP_UNUSED_29FF.S */
9926 /* File: x86/unused.S */
9927     jmp     common_abort
9928
9929
9930 /* ------------------------------ */
9931 .L_OP_UNUSED_2AFF: /* 0x12a */
9932 /* File: x86/OP_UNUSED_2AFF.S */
9933 /* File: x86/unused.S */
9934     jmp     common_abort
9935
9936
9937 /* ------------------------------ */
9938 .L_OP_UNUSED_2BFF: /* 0x12b */
9939 /* File: x86/OP_UNUSED_2BFF.S */
9940 /* File: x86/unused.S */
9941     jmp     common_abort
9942
9943
9944 /* ------------------------------ */
9945 .L_OP_UNUSED_2CFF: /* 0x12c */
9946 /* File: x86/OP_UNUSED_2CFF.S */
9947 /* File: x86/unused.S */
9948     jmp     common_abort
9949
9950
9951 /* ------------------------------ */
9952 .L_OP_UNUSED_2DFF: /* 0x12d */
9953 /* File: x86/OP_UNUSED_2DFF.S */
9954 /* File: x86/unused.S */
9955     jmp     common_abort
9956
9957
9958 /* ------------------------------ */
9959 .L_OP_UNUSED_2EFF: /* 0x12e */
9960 /* File: x86/OP_UNUSED_2EFF.S */
9961 /* File: x86/unused.S */
9962     jmp     common_abort
9963
9964
9965 /* ------------------------------ */
9966 .L_OP_UNUSED_2FFF: /* 0x12f */
9967 /* File: x86/OP_UNUSED_2FFF.S */
9968 /* File: x86/unused.S */
9969     jmp     common_abort
9970
9971
9972 /* ------------------------------ */
9973 .L_OP_UNUSED_30FF: /* 0x130 */
9974 /* File: x86/OP_UNUSED_30FF.S */
9975 /* File: x86/unused.S */
9976     jmp     common_abort
9977
9978
9979 /* ------------------------------ */
9980 .L_OP_UNUSED_31FF: /* 0x131 */
9981 /* File: x86/OP_UNUSED_31FF.S */
9982 /* File: x86/unused.S */
9983     jmp     common_abort
9984
9985
9986 /* ------------------------------ */
9987 .L_OP_UNUSED_32FF: /* 0x132 */
9988 /* File: x86/OP_UNUSED_32FF.S */
9989 /* File: x86/unused.S */
9990     jmp     common_abort
9991
9992
9993 /* ------------------------------ */
9994 .L_OP_UNUSED_33FF: /* 0x133 */
9995 /* File: x86/OP_UNUSED_33FF.S */
9996 /* File: x86/unused.S */
9997     jmp     common_abort
9998
9999
10000 /* ------------------------------ */
10001 .L_OP_UNUSED_34FF: /* 0x134 */
10002 /* File: x86/OP_UNUSED_34FF.S */
10003 /* File: x86/unused.S */
10004     jmp     common_abort
10005
10006
10007 /* ------------------------------ */
10008 .L_OP_UNUSED_35FF: /* 0x135 */
10009 /* File: x86/OP_UNUSED_35FF.S */
10010 /* File: x86/unused.S */
10011     jmp     common_abort
10012
10013
10014 /* ------------------------------ */
10015 .L_OP_UNUSED_36FF: /* 0x136 */
10016 /* File: x86/OP_UNUSED_36FF.S */
10017 /* File: x86/unused.S */
10018     jmp     common_abort
10019
10020
10021 /* ------------------------------ */
10022 .L_OP_UNUSED_37FF: /* 0x137 */
10023 /* File: x86/OP_UNUSED_37FF.S */
10024 /* File: x86/unused.S */
10025     jmp     common_abort
10026
10027
10028 /* ------------------------------ */
10029 .L_OP_UNUSED_38FF: /* 0x138 */
10030 /* File: x86/OP_UNUSED_38FF.S */
10031 /* File: x86/unused.S */
10032     jmp     common_abort
10033
10034
10035 /* ------------------------------ */
10036 .L_OP_UNUSED_39FF: /* 0x139 */
10037 /* File: x86/OP_UNUSED_39FF.S */
10038 /* File: x86/unused.S */
10039     jmp     common_abort
10040
10041
10042 /* ------------------------------ */
10043 .L_OP_UNUSED_3AFF: /* 0x13a */
10044 /* File: x86/OP_UNUSED_3AFF.S */
10045 /* File: x86/unused.S */
10046     jmp     common_abort
10047
10048
10049 /* ------------------------------ */
10050 .L_OP_UNUSED_3BFF: /* 0x13b */
10051 /* File: x86/OP_UNUSED_3BFF.S */
10052 /* File: x86/unused.S */
10053     jmp     common_abort
10054
10055
10056 /* ------------------------------ */
10057 .L_OP_UNUSED_3CFF: /* 0x13c */
10058 /* File: x86/OP_UNUSED_3CFF.S */
10059 /* File: x86/unused.S */
10060     jmp     common_abort
10061
10062
10063 /* ------------------------------ */
10064 .L_OP_UNUSED_3DFF: /* 0x13d */
10065 /* File: x86/OP_UNUSED_3DFF.S */
10066 /* File: x86/unused.S */
10067     jmp     common_abort
10068
10069
10070 /* ------------------------------ */
10071 .L_OP_UNUSED_3EFF: /* 0x13e */
10072 /* File: x86/OP_UNUSED_3EFF.S */
10073 /* File: x86/unused.S */
10074     jmp     common_abort
10075
10076
10077 /* ------------------------------ */
10078 .L_OP_UNUSED_3FFF: /* 0x13f */
10079 /* File: x86/OP_UNUSED_3FFF.S */
10080 /* File: x86/unused.S */
10081     jmp     common_abort
10082
10083
10084 /* ------------------------------ */
10085 .L_OP_UNUSED_40FF: /* 0x140 */
10086 /* File: x86/OP_UNUSED_40FF.S */
10087 /* File: x86/unused.S */
10088     jmp     common_abort
10089
10090
10091 /* ------------------------------ */
10092 .L_OP_UNUSED_41FF: /* 0x141 */
10093 /* File: x86/OP_UNUSED_41FF.S */
10094 /* File: x86/unused.S */
10095     jmp     common_abort
10096
10097
10098 /* ------------------------------ */
10099 .L_OP_UNUSED_42FF: /* 0x142 */
10100 /* File: x86/OP_UNUSED_42FF.S */
10101 /* File: x86/unused.S */
10102     jmp     common_abort
10103
10104
10105 /* ------------------------------ */
10106 .L_OP_UNUSED_43FF: /* 0x143 */
10107 /* File: x86/OP_UNUSED_43FF.S */
10108 /* File: x86/unused.S */
10109     jmp     common_abort
10110
10111
10112 /* ------------------------------ */
10113 .L_OP_UNUSED_44FF: /* 0x144 */
10114 /* File: x86/OP_UNUSED_44FF.S */
10115 /* File: x86/unused.S */
10116     jmp     common_abort
10117
10118
10119 /* ------------------------------ */
10120 .L_OP_UNUSED_45FF: /* 0x145 */
10121 /* File: x86/OP_UNUSED_45FF.S */
10122 /* File: x86/unused.S */
10123     jmp     common_abort
10124
10125
10126 /* ------------------------------ */
10127 .L_OP_UNUSED_46FF: /* 0x146 */
10128 /* File: x86/OP_UNUSED_46FF.S */
10129 /* File: x86/unused.S */
10130     jmp     common_abort
10131
10132
10133 /* ------------------------------ */
10134 .L_OP_UNUSED_47FF: /* 0x147 */
10135 /* File: x86/OP_UNUSED_47FF.S */
10136 /* File: x86/unused.S */
10137     jmp     common_abort
10138
10139
10140 /* ------------------------------ */
10141 .L_OP_UNUSED_48FF: /* 0x148 */
10142 /* File: x86/OP_UNUSED_48FF.S */
10143 /* File: x86/unused.S */
10144     jmp     common_abort
10145
10146
10147 /* ------------------------------ */
10148 .L_OP_UNUSED_49FF: /* 0x149 */
10149 /* File: x86/OP_UNUSED_49FF.S */
10150 /* File: x86/unused.S */
10151     jmp     common_abort
10152
10153
10154 /* ------------------------------ */
10155 .L_OP_UNUSED_4AFF: /* 0x14a */
10156 /* File: x86/OP_UNUSED_4AFF.S */
10157 /* File: x86/unused.S */
10158     jmp     common_abort
10159
10160
10161 /* ------------------------------ */
10162 .L_OP_UNUSED_4BFF: /* 0x14b */
10163 /* File: x86/OP_UNUSED_4BFF.S */
10164 /* File: x86/unused.S */
10165     jmp     common_abort
10166
10167
10168 /* ------------------------------ */
10169 .L_OP_UNUSED_4CFF: /* 0x14c */
10170 /* File: x86/OP_UNUSED_4CFF.S */
10171 /* File: x86/unused.S */
10172     jmp     common_abort
10173
10174
10175 /* ------------------------------ */
10176 .L_OP_UNUSED_4DFF: /* 0x14d */
10177 /* File: x86/OP_UNUSED_4DFF.S */
10178 /* File: x86/unused.S */
10179     jmp     common_abort
10180
10181
10182 /* ------------------------------ */
10183 .L_OP_UNUSED_4EFF: /* 0x14e */
10184 /* File: x86/OP_UNUSED_4EFF.S */
10185 /* File: x86/unused.S */
10186     jmp     common_abort
10187
10188
10189 /* ------------------------------ */
10190 .L_OP_UNUSED_4FFF: /* 0x14f */
10191 /* File: x86/OP_UNUSED_4FFF.S */
10192 /* File: x86/unused.S */
10193     jmp     common_abort
10194
10195
10196 /* ------------------------------ */
10197 .L_OP_UNUSED_50FF: /* 0x150 */
10198 /* File: x86/OP_UNUSED_50FF.S */
10199 /* File: x86/unused.S */
10200     jmp     common_abort
10201
10202
10203 /* ------------------------------ */
10204 .L_OP_UNUSED_51FF: /* 0x151 */
10205 /* File: x86/OP_UNUSED_51FF.S */
10206 /* File: x86/unused.S */
10207     jmp     common_abort
10208
10209
10210 /* ------------------------------ */
10211 .L_OP_UNUSED_52FF: /* 0x152 */
10212 /* File: x86/OP_UNUSED_52FF.S */
10213 /* File: x86/unused.S */
10214     jmp     common_abort
10215
10216
10217 /* ------------------------------ */
10218 .L_OP_UNUSED_53FF: /* 0x153 */
10219 /* File: x86/OP_UNUSED_53FF.S */
10220 /* File: x86/unused.S */
10221     jmp     common_abort
10222
10223
10224 /* ------------------------------ */
10225 .L_OP_UNUSED_54FF: /* 0x154 */
10226 /* File: x86/OP_UNUSED_54FF.S */
10227 /* File: x86/unused.S */
10228     jmp     common_abort
10229
10230
10231 /* ------------------------------ */
10232 .L_OP_UNUSED_55FF: /* 0x155 */
10233 /* File: x86/OP_UNUSED_55FF.S */
10234 /* File: x86/unused.S */
10235     jmp     common_abort
10236
10237
10238 /* ------------------------------ */
10239 .L_OP_UNUSED_56FF: /* 0x156 */
10240 /* File: x86/OP_UNUSED_56FF.S */
10241 /* File: x86/unused.S */
10242     jmp     common_abort
10243
10244
10245 /* ------------------------------ */
10246 .L_OP_UNUSED_57FF: /* 0x157 */
10247 /* File: x86/OP_UNUSED_57FF.S */
10248 /* File: x86/unused.S */
10249     jmp     common_abort
10250
10251
10252 /* ------------------------------ */
10253 .L_OP_UNUSED_58FF: /* 0x158 */
10254 /* File: x86/OP_UNUSED_58FF.S */
10255 /* File: x86/unused.S */
10256     jmp     common_abort
10257
10258
10259 /* ------------------------------ */
10260 .L_OP_UNUSED_59FF: /* 0x159 */
10261 /* File: x86/OP_UNUSED_59FF.S */
10262 /* File: x86/unused.S */
10263     jmp     common_abort
10264
10265
10266 /* ------------------------------ */
10267 .L_OP_UNUSED_5AFF: /* 0x15a */
10268 /* File: x86/OP_UNUSED_5AFF.S */
10269 /* File: x86/unused.S */
10270     jmp     common_abort
10271
10272
10273 /* ------------------------------ */
10274 .L_OP_UNUSED_5BFF: /* 0x15b */
10275 /* File: x86/OP_UNUSED_5BFF.S */
10276 /* File: x86/unused.S */
10277     jmp     common_abort
10278
10279
10280 /* ------------------------------ */
10281 .L_OP_UNUSED_5CFF: /* 0x15c */
10282 /* File: x86/OP_UNUSED_5CFF.S */
10283 /* File: x86/unused.S */
10284     jmp     common_abort
10285
10286
10287 /* ------------------------------ */
10288 .L_OP_UNUSED_5DFF: /* 0x15d */
10289 /* File: x86/OP_UNUSED_5DFF.S */
10290 /* File: x86/unused.S */
10291     jmp     common_abort
10292
10293
10294 /* ------------------------------ */
10295 .L_OP_UNUSED_5EFF: /* 0x15e */
10296 /* File: x86/OP_UNUSED_5EFF.S */
10297 /* File: x86/unused.S */
10298     jmp     common_abort
10299
10300
10301 /* ------------------------------ */
10302 .L_OP_UNUSED_5FFF: /* 0x15f */
10303 /* File: x86/OP_UNUSED_5FFF.S */
10304 /* File: x86/unused.S */
10305     jmp     common_abort
10306
10307
10308 /* ------------------------------ */
10309 .L_OP_UNUSED_60FF: /* 0x160 */
10310 /* File: x86/OP_UNUSED_60FF.S */
10311 /* File: x86/unused.S */
10312     jmp     common_abort
10313
10314
10315 /* ------------------------------ */
10316 .L_OP_UNUSED_61FF: /* 0x161 */
10317 /* File: x86/OP_UNUSED_61FF.S */
10318 /* File: x86/unused.S */
10319     jmp     common_abort
10320
10321
10322 /* ------------------------------ */
10323 .L_OP_UNUSED_62FF: /* 0x162 */
10324 /* File: x86/OP_UNUSED_62FF.S */
10325 /* File: x86/unused.S */
10326     jmp     common_abort
10327
10328
10329 /* ------------------------------ */
10330 .L_OP_UNUSED_63FF: /* 0x163 */
10331 /* File: x86/OP_UNUSED_63FF.S */
10332 /* File: x86/unused.S */
10333     jmp     common_abort
10334
10335
10336 /* ------------------------------ */
10337 .L_OP_UNUSED_64FF: /* 0x164 */
10338 /* File: x86/OP_UNUSED_64FF.S */
10339 /* File: x86/unused.S */
10340     jmp     common_abort
10341
10342
10343 /* ------------------------------ */
10344 .L_OP_UNUSED_65FF: /* 0x165 */
10345 /* File: x86/OP_UNUSED_65FF.S */
10346 /* File: x86/unused.S */
10347     jmp     common_abort
10348
10349
10350 /* ------------------------------ */
10351 .L_OP_UNUSED_66FF: /* 0x166 */
10352 /* File: x86/OP_UNUSED_66FF.S */
10353 /* File: x86/unused.S */
10354     jmp     common_abort
10355
10356
10357 /* ------------------------------ */
10358 .L_OP_UNUSED_67FF: /* 0x167 */
10359 /* File: x86/OP_UNUSED_67FF.S */
10360 /* File: x86/unused.S */
10361     jmp     common_abort
10362
10363
10364 /* ------------------------------ */
10365 .L_OP_UNUSED_68FF: /* 0x168 */
10366 /* File: x86/OP_UNUSED_68FF.S */
10367 /* File: x86/unused.S */
10368     jmp     common_abort
10369
10370
10371 /* ------------------------------ */
10372 .L_OP_UNUSED_69FF: /* 0x169 */
10373 /* File: x86/OP_UNUSED_69FF.S */
10374 /* File: x86/unused.S */
10375     jmp     common_abort
10376
10377
10378 /* ------------------------------ */
10379 .L_OP_UNUSED_6AFF: /* 0x16a */
10380 /* File: x86/OP_UNUSED_6AFF.S */
10381 /* File: x86/unused.S */
10382     jmp     common_abort
10383
10384
10385 /* ------------------------------ */
10386 .L_OP_UNUSED_6BFF: /* 0x16b */
10387 /* File: x86/OP_UNUSED_6BFF.S */
10388 /* File: x86/unused.S */
10389     jmp     common_abort
10390
10391
10392 /* ------------------------------ */
10393 .L_OP_UNUSED_6CFF: /* 0x16c */
10394 /* File: x86/OP_UNUSED_6CFF.S */
10395 /* File: x86/unused.S */
10396     jmp     common_abort
10397
10398
10399 /* ------------------------------ */
10400 .L_OP_UNUSED_6DFF: /* 0x16d */
10401 /* File: x86/OP_UNUSED_6DFF.S */
10402 /* File: x86/unused.S */
10403     jmp     common_abort
10404
10405
10406 /* ------------------------------ */
10407 .L_OP_UNUSED_6EFF: /* 0x16e */
10408 /* File: x86/OP_UNUSED_6EFF.S */
10409 /* File: x86/unused.S */
10410     jmp     common_abort
10411
10412
10413 /* ------------------------------ */
10414 .L_OP_UNUSED_6FFF: /* 0x16f */
10415 /* File: x86/OP_UNUSED_6FFF.S */
10416 /* File: x86/unused.S */
10417     jmp     common_abort
10418
10419
10420 /* ------------------------------ */
10421 .L_OP_UNUSED_70FF: /* 0x170 */
10422 /* File: x86/OP_UNUSED_70FF.S */
10423 /* File: x86/unused.S */
10424     jmp     common_abort
10425
10426
10427 /* ------------------------------ */
10428 .L_OP_UNUSED_71FF: /* 0x171 */
10429 /* File: x86/OP_UNUSED_71FF.S */
10430 /* File: x86/unused.S */
10431     jmp     common_abort
10432
10433
10434 /* ------------------------------ */
10435 .L_OP_UNUSED_72FF: /* 0x172 */
10436 /* File: x86/OP_UNUSED_72FF.S */
10437 /* File: x86/unused.S */
10438     jmp     common_abort
10439
10440
10441 /* ------------------------------ */
10442 .L_OP_UNUSED_73FF: /* 0x173 */
10443 /* File: x86/OP_UNUSED_73FF.S */
10444 /* File: x86/unused.S */
10445     jmp     common_abort
10446
10447
10448 /* ------------------------------ */
10449 .L_OP_UNUSED_74FF: /* 0x174 */
10450 /* File: x86/OP_UNUSED_74FF.S */
10451 /* File: x86/unused.S */
10452     jmp     common_abort
10453
10454
10455 /* ------------------------------ */
10456 .L_OP_UNUSED_75FF: /* 0x175 */
10457 /* File: x86/OP_UNUSED_75FF.S */
10458 /* File: x86/unused.S */
10459     jmp     common_abort
10460
10461
10462 /* ------------------------------ */
10463 .L_OP_UNUSED_76FF: /* 0x176 */
10464 /* File: x86/OP_UNUSED_76FF.S */
10465 /* File: x86/unused.S */
10466     jmp     common_abort
10467
10468
10469 /* ------------------------------ */
10470 .L_OP_UNUSED_77FF: /* 0x177 */
10471 /* File: x86/OP_UNUSED_77FF.S */
10472 /* File: x86/unused.S */
10473     jmp     common_abort
10474
10475
10476 /* ------------------------------ */
10477 .L_OP_UNUSED_78FF: /* 0x178 */
10478 /* File: x86/OP_UNUSED_78FF.S */
10479 /* File: x86/unused.S */
10480     jmp     common_abort
10481
10482
10483 /* ------------------------------ */
10484 .L_OP_UNUSED_79FF: /* 0x179 */
10485 /* File: x86/OP_UNUSED_79FF.S */
10486 /* File: x86/unused.S */
10487     jmp     common_abort
10488
10489
10490 /* ------------------------------ */
10491 .L_OP_UNUSED_7AFF: /* 0x17a */
10492 /* File: x86/OP_UNUSED_7AFF.S */
10493 /* File: x86/unused.S */
10494     jmp     common_abort
10495
10496
10497 /* ------------------------------ */
10498 .L_OP_UNUSED_7BFF: /* 0x17b */
10499 /* File: x86/OP_UNUSED_7BFF.S */
10500 /* File: x86/unused.S */
10501     jmp     common_abort
10502
10503
10504 /* ------------------------------ */
10505 .L_OP_UNUSED_7CFF: /* 0x17c */
10506 /* File: x86/OP_UNUSED_7CFF.S */
10507 /* File: x86/unused.S */
10508     jmp     common_abort
10509
10510
10511 /* ------------------------------ */
10512 .L_OP_UNUSED_7DFF: /* 0x17d */
10513 /* File: x86/OP_UNUSED_7DFF.S */
10514 /* File: x86/unused.S */
10515     jmp     common_abort
10516
10517
10518 /* ------------------------------ */
10519 .L_OP_UNUSED_7EFF: /* 0x17e */
10520 /* File: x86/OP_UNUSED_7EFF.S */
10521 /* File: x86/unused.S */
10522     jmp     common_abort
10523
10524
10525 /* ------------------------------ */
10526 .L_OP_UNUSED_7FFF: /* 0x17f */
10527 /* File: x86/OP_UNUSED_7FFF.S */
10528 /* File: x86/unused.S */
10529     jmp     common_abort
10530
10531
10532 /* ------------------------------ */
10533 .L_OP_UNUSED_80FF: /* 0x180 */
10534 /* File: x86/OP_UNUSED_80FF.S */
10535 /* File: x86/unused.S */
10536     jmp     common_abort
10537
10538
10539 /* ------------------------------ */
10540 .L_OP_UNUSED_81FF: /* 0x181 */
10541 /* File: x86/OP_UNUSED_81FF.S */
10542 /* File: x86/unused.S */
10543     jmp     common_abort
10544
10545
10546 /* ------------------------------ */
10547 .L_OP_UNUSED_82FF: /* 0x182 */
10548 /* File: x86/OP_UNUSED_82FF.S */
10549 /* File: x86/unused.S */
10550     jmp     common_abort
10551
10552
10553 /* ------------------------------ */
10554 .L_OP_UNUSED_83FF: /* 0x183 */
10555 /* File: x86/OP_UNUSED_83FF.S */
10556 /* File: x86/unused.S */
10557     jmp     common_abort
10558
10559
10560 /* ------------------------------ */
10561 .L_OP_UNUSED_84FF: /* 0x184 */
10562 /* File: x86/OP_UNUSED_84FF.S */
10563 /* File: x86/unused.S */
10564     jmp     common_abort
10565
10566
10567 /* ------------------------------ */
10568 .L_OP_UNUSED_85FF: /* 0x185 */
10569 /* File: x86/OP_UNUSED_85FF.S */
10570 /* File: x86/unused.S */
10571     jmp     common_abort
10572
10573
10574 /* ------------------------------ */
10575 .L_OP_UNUSED_86FF: /* 0x186 */
10576 /* File: x86/OP_UNUSED_86FF.S */
10577 /* File: x86/unused.S */
10578     jmp     common_abort
10579
10580
10581 /* ------------------------------ */
10582 .L_OP_UNUSED_87FF: /* 0x187 */
10583 /* File: x86/OP_UNUSED_87FF.S */
10584 /* File: x86/unused.S */
10585     jmp     common_abort
10586
10587
10588 /* ------------------------------ */
10589 .L_OP_UNUSED_88FF: /* 0x188 */
10590 /* File: x86/OP_UNUSED_88FF.S */
10591 /* File: x86/unused.S */
10592     jmp     common_abort
10593
10594
10595 /* ------------------------------ */
10596 .L_OP_UNUSED_89FF: /* 0x189 */
10597 /* File: x86/OP_UNUSED_89FF.S */
10598 /* File: x86/unused.S */
10599     jmp     common_abort
10600
10601
10602 /* ------------------------------ */
10603 .L_OP_UNUSED_8AFF: /* 0x18a */
10604 /* File: x86/OP_UNUSED_8AFF.S */
10605 /* File: x86/unused.S */
10606     jmp     common_abort
10607
10608
10609 /* ------------------------------ */
10610 .L_OP_UNUSED_8BFF: /* 0x18b */
10611 /* File: x86/OP_UNUSED_8BFF.S */
10612 /* File: x86/unused.S */
10613     jmp     common_abort
10614
10615
10616 /* ------------------------------ */
10617 .L_OP_UNUSED_8CFF: /* 0x18c */
10618 /* File: x86/OP_UNUSED_8CFF.S */
10619 /* File: x86/unused.S */
10620     jmp     common_abort
10621
10622
10623 /* ------------------------------ */
10624 .L_OP_UNUSED_8DFF: /* 0x18d */
10625 /* File: x86/OP_UNUSED_8DFF.S */
10626 /* File: x86/unused.S */
10627     jmp     common_abort
10628
10629
10630 /* ------------------------------ */
10631 .L_OP_UNUSED_8EFF: /* 0x18e */
10632 /* File: x86/OP_UNUSED_8EFF.S */
10633 /* File: x86/unused.S */
10634     jmp     common_abort
10635
10636
10637 /* ------------------------------ */
10638 .L_OP_UNUSED_8FFF: /* 0x18f */
10639 /* File: x86/OP_UNUSED_8FFF.S */
10640 /* File: x86/unused.S */
10641     jmp     common_abort
10642
10643
10644 /* ------------------------------ */
10645 .L_OP_UNUSED_90FF: /* 0x190 */
10646 /* File: x86/OP_UNUSED_90FF.S */
10647 /* File: x86/unused.S */
10648     jmp     common_abort
10649
10650
10651 /* ------------------------------ */
10652 .L_OP_UNUSED_91FF: /* 0x191 */
10653 /* File: x86/OP_UNUSED_91FF.S */
10654 /* File: x86/unused.S */
10655     jmp     common_abort
10656
10657
10658 /* ------------------------------ */
10659 .L_OP_UNUSED_92FF: /* 0x192 */
10660 /* File: x86/OP_UNUSED_92FF.S */
10661 /* File: x86/unused.S */
10662     jmp     common_abort
10663
10664
10665 /* ------------------------------ */
10666 .L_OP_UNUSED_93FF: /* 0x193 */
10667 /* File: x86/OP_UNUSED_93FF.S */
10668 /* File: x86/unused.S */
10669     jmp     common_abort
10670
10671
10672 /* ------------------------------ */
10673 .L_OP_UNUSED_94FF: /* 0x194 */
10674 /* File: x86/OP_UNUSED_94FF.S */
10675 /* File: x86/unused.S */
10676     jmp     common_abort
10677
10678
10679 /* ------------------------------ */
10680 .L_OP_UNUSED_95FF: /* 0x195 */
10681 /* File: x86/OP_UNUSED_95FF.S */
10682 /* File: x86/unused.S */
10683     jmp     common_abort
10684
10685
10686 /* ------------------------------ */
10687 .L_OP_UNUSED_96FF: /* 0x196 */
10688 /* File: x86/OP_UNUSED_96FF.S */
10689 /* File: x86/unused.S */
10690     jmp     common_abort
10691
10692
10693 /* ------------------------------ */
10694 .L_OP_UNUSED_97FF: /* 0x197 */
10695 /* File: x86/OP_UNUSED_97FF.S */
10696 /* File: x86/unused.S */
10697     jmp     common_abort
10698
10699
10700 /* ------------------------------ */
10701 .L_OP_UNUSED_98FF: /* 0x198 */
10702 /* File: x86/OP_UNUSED_98FF.S */
10703 /* File: x86/unused.S */
10704     jmp     common_abort
10705
10706
10707 /* ------------------------------ */
10708 .L_OP_UNUSED_99FF: /* 0x199 */
10709 /* File: x86/OP_UNUSED_99FF.S */
10710 /* File: x86/unused.S */
10711     jmp     common_abort
10712
10713
10714 /* ------------------------------ */
10715 .L_OP_UNUSED_9AFF: /* 0x19a */
10716 /* File: x86/OP_UNUSED_9AFF.S */
10717 /* File: x86/unused.S */
10718     jmp     common_abort
10719
10720
10721 /* ------------------------------ */
10722 .L_OP_UNUSED_9BFF: /* 0x19b */
10723 /* File: x86/OP_UNUSED_9BFF.S */
10724 /* File: x86/unused.S */
10725     jmp     common_abort
10726
10727
10728 /* ------------------------------ */
10729 .L_OP_UNUSED_9CFF: /* 0x19c */
10730 /* File: x86/OP_UNUSED_9CFF.S */
10731 /* File: x86/unused.S */
10732     jmp     common_abort
10733
10734
10735 /* ------------------------------ */
10736 .L_OP_UNUSED_9DFF: /* 0x19d */
10737 /* File: x86/OP_UNUSED_9DFF.S */
10738 /* File: x86/unused.S */
10739     jmp     common_abort
10740
10741
10742 /* ------------------------------ */
10743 .L_OP_UNUSED_9EFF: /* 0x19e */
10744 /* File: x86/OP_UNUSED_9EFF.S */
10745 /* File: x86/unused.S */
10746     jmp     common_abort
10747
10748
10749 /* ------------------------------ */
10750 .L_OP_UNUSED_9FFF: /* 0x19f */
10751 /* File: x86/OP_UNUSED_9FFF.S */
10752 /* File: x86/unused.S */
10753     jmp     common_abort
10754
10755
10756 /* ------------------------------ */
10757 .L_OP_UNUSED_A0FF: /* 0x1a0 */
10758 /* File: x86/OP_UNUSED_A0FF.S */
10759 /* File: x86/unused.S */
10760     jmp     common_abort
10761
10762
10763 /* ------------------------------ */
10764 .L_OP_UNUSED_A1FF: /* 0x1a1 */
10765 /* File: x86/OP_UNUSED_A1FF.S */
10766 /* File: x86/unused.S */
10767     jmp     common_abort
10768
10769
10770 /* ------------------------------ */
10771 .L_OP_UNUSED_A2FF: /* 0x1a2 */
10772 /* File: x86/OP_UNUSED_A2FF.S */
10773 /* File: x86/unused.S */
10774     jmp     common_abort
10775
10776
10777 /* ------------------------------ */
10778 .L_OP_UNUSED_A3FF: /* 0x1a3 */
10779 /* File: x86/OP_UNUSED_A3FF.S */
10780 /* File: x86/unused.S */
10781     jmp     common_abort
10782
10783
10784 /* ------------------------------ */
10785 .L_OP_UNUSED_A4FF: /* 0x1a4 */
10786 /* File: x86/OP_UNUSED_A4FF.S */
10787 /* File: x86/unused.S */
10788     jmp     common_abort
10789
10790
10791 /* ------------------------------ */
10792 .L_OP_UNUSED_A5FF: /* 0x1a5 */
10793 /* File: x86/OP_UNUSED_A5FF.S */
10794 /* File: x86/unused.S */
10795     jmp     common_abort
10796
10797
10798 /* ------------------------------ */
10799 .L_OP_UNUSED_A6FF: /* 0x1a6 */
10800 /* File: x86/OP_UNUSED_A6FF.S */
10801 /* File: x86/unused.S */
10802     jmp     common_abort
10803
10804
10805 /* ------------------------------ */
10806 .L_OP_UNUSED_A7FF: /* 0x1a7 */
10807 /* File: x86/OP_UNUSED_A7FF.S */
10808 /* File: x86/unused.S */
10809     jmp     common_abort
10810
10811
10812 /* ------------------------------ */
10813 .L_OP_UNUSED_A8FF: /* 0x1a8 */
10814 /* File: x86/OP_UNUSED_A8FF.S */
10815 /* File: x86/unused.S */
10816     jmp     common_abort
10817
10818
10819 /* ------------------------------ */
10820 .L_OP_UNUSED_A9FF: /* 0x1a9 */
10821 /* File: x86/OP_UNUSED_A9FF.S */
10822 /* File: x86/unused.S */
10823     jmp     common_abort
10824
10825
10826 /* ------------------------------ */
10827 .L_OP_UNUSED_AAFF: /* 0x1aa */
10828 /* File: x86/OP_UNUSED_AAFF.S */
10829 /* File: x86/unused.S */
10830     jmp     common_abort
10831
10832
10833 /* ------------------------------ */
10834 .L_OP_UNUSED_ABFF: /* 0x1ab */
10835 /* File: x86/OP_UNUSED_ABFF.S */
10836 /* File: x86/unused.S */
10837     jmp     common_abort
10838
10839
10840 /* ------------------------------ */
10841 .L_OP_UNUSED_ACFF: /* 0x1ac */
10842 /* File: x86/OP_UNUSED_ACFF.S */
10843 /* File: x86/unused.S */
10844     jmp     common_abort
10845
10846
10847 /* ------------------------------ */
10848 .L_OP_UNUSED_ADFF: /* 0x1ad */
10849 /* File: x86/OP_UNUSED_ADFF.S */
10850 /* File: x86/unused.S */
10851     jmp     common_abort
10852
10853
10854 /* ------------------------------ */
10855 .L_OP_UNUSED_AEFF: /* 0x1ae */
10856 /* File: x86/OP_UNUSED_AEFF.S */
10857 /* File: x86/unused.S */
10858     jmp     common_abort
10859
10860
10861 /* ------------------------------ */
10862 .L_OP_UNUSED_AFFF: /* 0x1af */
10863 /* File: x86/OP_UNUSED_AFFF.S */
10864 /* File: x86/unused.S */
10865     jmp     common_abort
10866
10867
10868 /* ------------------------------ */
10869 .L_OP_UNUSED_B0FF: /* 0x1b0 */
10870 /* File: x86/OP_UNUSED_B0FF.S */
10871 /* File: x86/unused.S */
10872     jmp     common_abort
10873
10874
10875 /* ------------------------------ */
10876 .L_OP_UNUSED_B1FF: /* 0x1b1 */
10877 /* File: x86/OP_UNUSED_B1FF.S */
10878 /* File: x86/unused.S */
10879     jmp     common_abort
10880
10881
10882 /* ------------------------------ */
10883 .L_OP_UNUSED_B2FF: /* 0x1b2 */
10884 /* File: x86/OP_UNUSED_B2FF.S */
10885 /* File: x86/unused.S */
10886     jmp     common_abort
10887
10888
10889 /* ------------------------------ */
10890 .L_OP_UNUSED_B3FF: /* 0x1b3 */
10891 /* File: x86/OP_UNUSED_B3FF.S */
10892 /* File: x86/unused.S */
10893     jmp     common_abort
10894
10895
10896 /* ------------------------------ */
10897 .L_OP_UNUSED_B4FF: /* 0x1b4 */
10898 /* File: x86/OP_UNUSED_B4FF.S */
10899 /* File: x86/unused.S */
10900     jmp     common_abort
10901
10902
10903 /* ------------------------------ */
10904 .L_OP_UNUSED_B5FF: /* 0x1b5 */
10905 /* File: x86/OP_UNUSED_B5FF.S */
10906 /* File: x86/unused.S */
10907     jmp     common_abort
10908
10909
10910 /* ------------------------------ */
10911 .L_OP_UNUSED_B6FF: /* 0x1b6 */
10912 /* File: x86/OP_UNUSED_B6FF.S */
10913 /* File: x86/unused.S */
10914     jmp     common_abort
10915
10916
10917 /* ------------------------------ */
10918 .L_OP_UNUSED_B7FF: /* 0x1b7 */
10919 /* File: x86/OP_UNUSED_B7FF.S */
10920 /* File: x86/unused.S */
10921     jmp     common_abort
10922
10923
10924 /* ------------------------------ */
10925 .L_OP_UNUSED_B8FF: /* 0x1b8 */
10926 /* File: x86/OP_UNUSED_B8FF.S */
10927 /* File: x86/unused.S */
10928     jmp     common_abort
10929
10930
10931 /* ------------------------------ */
10932 .L_OP_UNUSED_B9FF: /* 0x1b9 */
10933 /* File: x86/OP_UNUSED_B9FF.S */
10934 /* File: x86/unused.S */
10935     jmp     common_abort
10936
10937
10938 /* ------------------------------ */
10939 .L_OP_UNUSED_BAFF: /* 0x1ba */
10940 /* File: x86/OP_UNUSED_BAFF.S */
10941 /* File: x86/unused.S */
10942     jmp     common_abort
10943
10944
10945 /* ------------------------------ */
10946 .L_OP_UNUSED_BBFF: /* 0x1bb */
10947 /* File: x86/OP_UNUSED_BBFF.S */
10948 /* File: x86/unused.S */
10949     jmp     common_abort
10950
10951
10952 /* ------------------------------ */
10953 .L_OP_UNUSED_BCFF: /* 0x1bc */
10954 /* File: x86/OP_UNUSED_BCFF.S */
10955 /* File: x86/unused.S */
10956     jmp     common_abort
10957
10958
10959 /* ------------------------------ */
10960 .L_OP_UNUSED_BDFF: /* 0x1bd */
10961 /* File: x86/OP_UNUSED_BDFF.S */
10962 /* File: x86/unused.S */
10963     jmp     common_abort
10964
10965
10966 /* ------------------------------ */
10967 .L_OP_UNUSED_BEFF: /* 0x1be */
10968 /* File: x86/OP_UNUSED_BEFF.S */
10969 /* File: x86/unused.S */
10970     jmp     common_abort
10971
10972
10973 /* ------------------------------ */
10974 .L_OP_UNUSED_BFFF: /* 0x1bf */
10975 /* File: x86/OP_UNUSED_BFFF.S */
10976 /* File: x86/unused.S */
10977     jmp     common_abort
10978
10979
10980 /* ------------------------------ */
10981 .L_OP_UNUSED_C0FF: /* 0x1c0 */
10982 /* File: x86/OP_UNUSED_C0FF.S */
10983 /* File: x86/unused.S */
10984     jmp     common_abort
10985
10986
10987 /* ------------------------------ */
10988 .L_OP_UNUSED_C1FF: /* 0x1c1 */
10989 /* File: x86/OP_UNUSED_C1FF.S */
10990 /* File: x86/unused.S */
10991     jmp     common_abort
10992
10993
10994 /* ------------------------------ */
10995 .L_OP_UNUSED_C2FF: /* 0x1c2 */
10996 /* File: x86/OP_UNUSED_C2FF.S */
10997 /* File: x86/unused.S */
10998     jmp     common_abort
10999
11000
11001 /* ------------------------------ */
11002 .L_OP_UNUSED_C3FF: /* 0x1c3 */
11003 /* File: x86/OP_UNUSED_C3FF.S */
11004 /* File: x86/unused.S */
11005     jmp     common_abort
11006
11007
11008 /* ------------------------------ */
11009 .L_OP_UNUSED_C4FF: /* 0x1c4 */
11010 /* File: x86/OP_UNUSED_C4FF.S */
11011 /* File: x86/unused.S */
11012     jmp     common_abort
11013
11014
11015 /* ------------------------------ */
11016 .L_OP_UNUSED_C5FF: /* 0x1c5 */
11017 /* File: x86/OP_UNUSED_C5FF.S */
11018 /* File: x86/unused.S */
11019     jmp     common_abort
11020
11021
11022 /* ------------------------------ */
11023 .L_OP_UNUSED_C6FF: /* 0x1c6 */
11024 /* File: x86/OP_UNUSED_C6FF.S */
11025 /* File: x86/unused.S */
11026     jmp     common_abort
11027
11028
11029 /* ------------------------------ */
11030 .L_OP_UNUSED_C7FF: /* 0x1c7 */
11031 /* File: x86/OP_UNUSED_C7FF.S */
11032 /* File: x86/unused.S */
11033     jmp     common_abort
11034
11035
11036 /* ------------------------------ */
11037 .L_OP_UNUSED_C8FF: /* 0x1c8 */
11038 /* File: x86/OP_UNUSED_C8FF.S */
11039 /* File: x86/unused.S */
11040     jmp     common_abort
11041
11042
11043 /* ------------------------------ */
11044 .L_OP_UNUSED_C9FF: /* 0x1c9 */
11045 /* File: x86/OP_UNUSED_C9FF.S */
11046 /* File: x86/unused.S */
11047     jmp     common_abort
11048
11049
11050 /* ------------------------------ */
11051 .L_OP_UNUSED_CAFF: /* 0x1ca */
11052 /* File: x86/OP_UNUSED_CAFF.S */
11053 /* File: x86/unused.S */
11054     jmp     common_abort
11055
11056
11057 /* ------------------------------ */
11058 .L_OP_UNUSED_CBFF: /* 0x1cb */
11059 /* File: x86/OP_UNUSED_CBFF.S */
11060 /* File: x86/unused.S */
11061     jmp     common_abort
11062
11063
11064 /* ------------------------------ */
11065 .L_OP_UNUSED_CCFF: /* 0x1cc */
11066 /* File: x86/OP_UNUSED_CCFF.S */
11067 /* File: x86/unused.S */
11068     jmp     common_abort
11069
11070
11071 /* ------------------------------ */
11072 .L_OP_UNUSED_CDFF: /* 0x1cd */
11073 /* File: x86/OP_UNUSED_CDFF.S */
11074 /* File: x86/unused.S */
11075     jmp     common_abort
11076
11077
11078 /* ------------------------------ */
11079 .L_OP_UNUSED_CEFF: /* 0x1ce */
11080 /* File: x86/OP_UNUSED_CEFF.S */
11081 /* File: x86/unused.S */
11082     jmp     common_abort
11083
11084
11085 /* ------------------------------ */
11086 .L_OP_UNUSED_CFFF: /* 0x1cf */
11087 /* File: x86/OP_UNUSED_CFFF.S */
11088 /* File: x86/unused.S */
11089     jmp     common_abort
11090
11091
11092 /* ------------------------------ */
11093 .L_OP_UNUSED_D0FF: /* 0x1d0 */
11094 /* File: x86/OP_UNUSED_D0FF.S */
11095 /* File: x86/unused.S */
11096     jmp     common_abort
11097
11098
11099 /* ------------------------------ */
11100 .L_OP_UNUSED_D1FF: /* 0x1d1 */
11101 /* File: x86/OP_UNUSED_D1FF.S */
11102 /* File: x86/unused.S */
11103     jmp     common_abort
11104
11105
11106 /* ------------------------------ */
11107 .L_OP_UNUSED_D2FF: /* 0x1d2 */
11108 /* File: x86/OP_UNUSED_D2FF.S */
11109 /* File: x86/unused.S */
11110     jmp     common_abort
11111
11112
11113 /* ------------------------------ */
11114 .L_OP_UNUSED_D3FF: /* 0x1d3 */
11115 /* File: x86/OP_UNUSED_D3FF.S */
11116 /* File: x86/unused.S */
11117     jmp     common_abort
11118
11119
11120 /* ------------------------------ */
11121 .L_OP_UNUSED_D4FF: /* 0x1d4 */
11122 /* File: x86/OP_UNUSED_D4FF.S */
11123 /* File: x86/unused.S */
11124     jmp     common_abort
11125
11126
11127 /* ------------------------------ */
11128 .L_OP_UNUSED_D5FF: /* 0x1d5 */
11129 /* File: x86/OP_UNUSED_D5FF.S */
11130 /* File: x86/unused.S */
11131     jmp     common_abort
11132
11133
11134 /* ------------------------------ */
11135 .L_OP_UNUSED_D6FF: /* 0x1d6 */
11136 /* File: x86/OP_UNUSED_D6FF.S */
11137 /* File: x86/unused.S */
11138     jmp     common_abort
11139
11140
11141 /* ------------------------------ */
11142 .L_OP_UNUSED_D7FF: /* 0x1d7 */
11143 /* File: x86/OP_UNUSED_D7FF.S */
11144 /* File: x86/unused.S */
11145     jmp     common_abort
11146
11147
11148 /* ------------------------------ */
11149 .L_OP_UNUSED_D8FF: /* 0x1d8 */
11150 /* File: x86/OP_UNUSED_D8FF.S */
11151 /* File: x86/unused.S */
11152     jmp     common_abort
11153
11154
11155 /* ------------------------------ */
11156 .L_OP_UNUSED_D9FF: /* 0x1d9 */
11157 /* File: x86/OP_UNUSED_D9FF.S */
11158 /* File: x86/unused.S */
11159     jmp     common_abort
11160
11161
11162 /* ------------------------------ */
11163 .L_OP_UNUSED_DAFF: /* 0x1da */
11164 /* File: x86/OP_UNUSED_DAFF.S */
11165 /* File: x86/unused.S */
11166     jmp     common_abort
11167
11168
11169 /* ------------------------------ */
11170 .L_OP_UNUSED_DBFF: /* 0x1db */
11171 /* File: x86/OP_UNUSED_DBFF.S */
11172 /* File: x86/unused.S */
11173     jmp     common_abort
11174
11175
11176 /* ------------------------------ */
11177 .L_OP_UNUSED_DCFF: /* 0x1dc */
11178 /* File: x86/OP_UNUSED_DCFF.S */
11179 /* File: x86/unused.S */
11180     jmp     common_abort
11181
11182
11183 /* ------------------------------ */
11184 .L_OP_UNUSED_DDFF: /* 0x1dd */
11185 /* File: x86/OP_UNUSED_DDFF.S */
11186 /* File: x86/unused.S */
11187     jmp     common_abort
11188
11189
11190 /* ------------------------------ */
11191 .L_OP_UNUSED_DEFF: /* 0x1de */
11192 /* File: x86/OP_UNUSED_DEFF.S */
11193 /* File: x86/unused.S */
11194     jmp     common_abort
11195
11196
11197 /* ------------------------------ */
11198 .L_OP_UNUSED_DFFF: /* 0x1df */
11199 /* File: x86/OP_UNUSED_DFFF.S */
11200 /* File: x86/unused.S */
11201     jmp     common_abort
11202
11203
11204 /* ------------------------------ */
11205 .L_OP_UNUSED_E0FF: /* 0x1e0 */
11206 /* File: x86/OP_UNUSED_E0FF.S */
11207 /* File: x86/unused.S */
11208     jmp     common_abort
11209
11210
11211 /* ------------------------------ */
11212 .L_OP_UNUSED_E1FF: /* 0x1e1 */
11213 /* File: x86/OP_UNUSED_E1FF.S */
11214 /* File: x86/unused.S */
11215     jmp     common_abort
11216
11217
11218 /* ------------------------------ */
11219 .L_OP_UNUSED_E2FF: /* 0x1e2 */
11220 /* File: x86/OP_UNUSED_E2FF.S */
11221 /* File: x86/unused.S */
11222     jmp     common_abort
11223
11224
11225 /* ------------------------------ */
11226 .L_OP_UNUSED_E3FF: /* 0x1e3 */
11227 /* File: x86/OP_UNUSED_E3FF.S */
11228 /* File: x86/unused.S */
11229     jmp     common_abort
11230
11231
11232 /* ------------------------------ */
11233 .L_OP_UNUSED_E4FF: /* 0x1e4 */
11234 /* File: x86/OP_UNUSED_E4FF.S */
11235 /* File: x86/unused.S */
11236     jmp     common_abort
11237
11238
11239 /* ------------------------------ */
11240 .L_OP_UNUSED_E5FF: /* 0x1e5 */
11241 /* File: x86/OP_UNUSED_E5FF.S */
11242 /* File: x86/unused.S */
11243     jmp     common_abort
11244
11245
11246 /* ------------------------------ */
11247 .L_OP_UNUSED_E6FF: /* 0x1e6 */
11248 /* File: x86/OP_UNUSED_E6FF.S */
11249 /* File: x86/unused.S */
11250     jmp     common_abort
11251
11252
11253 /* ------------------------------ */
11254 .L_OP_UNUSED_E7FF: /* 0x1e7 */
11255 /* File: x86/OP_UNUSED_E7FF.S */
11256 /* File: x86/unused.S */
11257     jmp     common_abort
11258
11259
11260 /* ------------------------------ */
11261 .L_OP_UNUSED_E8FF: /* 0x1e8 */
11262 /* File: x86/OP_UNUSED_E8FF.S */
11263 /* File: x86/unused.S */
11264     jmp     common_abort
11265
11266
11267 /* ------------------------------ */
11268 .L_OP_UNUSED_E9FF: /* 0x1e9 */
11269 /* File: x86/OP_UNUSED_E9FF.S */
11270 /* File: x86/unused.S */
11271     jmp     common_abort
11272
11273
11274 /* ------------------------------ */
11275 .L_OP_UNUSED_EAFF: /* 0x1ea */
11276 /* File: x86/OP_UNUSED_EAFF.S */
11277 /* File: x86/unused.S */
11278     jmp     common_abort
11279
11280
11281 /* ------------------------------ */
11282 .L_OP_UNUSED_EBFF: /* 0x1eb */
11283 /* File: x86/OP_UNUSED_EBFF.S */
11284 /* File: x86/unused.S */
11285     jmp     common_abort
11286
11287
11288 /* ------------------------------ */
11289 .L_OP_UNUSED_ECFF: /* 0x1ec */
11290 /* File: x86/OP_UNUSED_ECFF.S */
11291 /* File: x86/unused.S */
11292     jmp     common_abort
11293
11294
11295 /* ------------------------------ */
11296 .L_OP_UNUSED_EDFF: /* 0x1ed */
11297 /* File: x86/OP_UNUSED_EDFF.S */
11298 /* File: x86/unused.S */
11299     jmp     common_abort
11300
11301
11302 /* ------------------------------ */
11303 .L_OP_UNUSED_EEFF: /* 0x1ee */
11304 /* File: x86/OP_UNUSED_EEFF.S */
11305 /* File: x86/unused.S */
11306     jmp     common_abort
11307
11308
11309 /* ------------------------------ */
11310 .L_OP_UNUSED_EFFF: /* 0x1ef */
11311 /* File: x86/OP_UNUSED_EFFF.S */
11312 /* File: x86/unused.S */
11313     jmp     common_abort
11314
11315
11316 /* ------------------------------ */
11317 .L_OP_UNUSED_F0FF: /* 0x1f0 */
11318 /* File: x86/OP_UNUSED_F0FF.S */
11319 /* File: x86/unused.S */
11320     jmp     common_abort
11321
11322
11323 /* ------------------------------ */
11324 .L_OP_UNUSED_F1FF: /* 0x1f1 */
11325 /* File: x86/OP_UNUSED_F1FF.S */
11326 /* File: x86/unused.S */
11327     jmp     common_abort
11328
11329
11330 /* ------------------------------ */
11331 .L_OP_UNUSED_F2FF: /* 0x1f2 */
11332 /* File: x86/OP_UNUSED_F2FF.S */
11333 /* File: x86/unused.S */
11334     jmp     common_abort
11335
11336
11337 /* ------------------------------ */
11338 .L_OP_UNUSED_F3FF: /* 0x1f3 */
11339 /* File: x86/OP_UNUSED_F3FF.S */
11340 /* File: x86/unused.S */
11341     jmp     common_abort
11342
11343
11344 /* ------------------------------ */
11345 .L_OP_UNUSED_F4FF: /* 0x1f4 */
11346 /* File: x86/OP_UNUSED_F4FF.S */
11347 /* File: x86/unused.S */
11348     jmp     common_abort
11349
11350
11351 /* ------------------------------ */
11352 .L_OP_UNUSED_F5FF: /* 0x1f5 */
11353 /* File: x86/OP_UNUSED_F5FF.S */
11354 /* File: x86/unused.S */
11355     jmp     common_abort
11356
11357
11358 /* ------------------------------ */
11359 .L_OP_UNUSED_F6FF: /* 0x1f6 */
11360 /* File: x86/OP_UNUSED_F6FF.S */
11361 /* File: x86/unused.S */
11362     jmp     common_abort
11363
11364
11365 /* ------------------------------ */
11366 .L_OP_UNUSED_F7FF: /* 0x1f7 */
11367 /* File: x86/OP_UNUSED_F7FF.S */
11368 /* File: x86/unused.S */
11369     jmp     common_abort
11370
11371
11372 /* ------------------------------ */
11373 .L_OP_UNUSED_F8FF: /* 0x1f8 */
11374 /* File: x86/OP_UNUSED_F8FF.S */
11375 /* File: x86/unused.S */
11376     jmp     common_abort
11377
11378
11379 /* ------------------------------ */
11380 .L_OP_UNUSED_F9FF: /* 0x1f9 */
11381 /* File: x86/OP_UNUSED_F9FF.S */
11382 /* File: x86/unused.S */
11383     jmp     common_abort
11384
11385
11386 /* ------------------------------ */
11387 .L_OP_UNUSED_FAFF: /* 0x1fa */
11388 /* File: x86/OP_UNUSED_FAFF.S */
11389 /* File: x86/unused.S */
11390     jmp     common_abort
11391
11392
11393 /* ------------------------------ */
11394 .L_OP_UNUSED_FBFF: /* 0x1fb */
11395 /* File: x86/OP_UNUSED_FBFF.S */
11396 /* File: x86/unused.S */
11397     jmp     common_abort
11398
11399
11400 /* ------------------------------ */
11401 .L_OP_UNUSED_FCFF: /* 0x1fc */
11402 /* File: x86/OP_UNUSED_FCFF.S */
11403 /* File: x86/unused.S */
11404     jmp     common_abort
11405
11406
11407 /* ------------------------------ */
11408 .L_OP_UNUSED_FDFF: /* 0x1fd */
11409 /* File: x86/OP_UNUSED_FDFF.S */
11410 /* File: x86/unused.S */
11411     jmp     common_abort
11412
11413
11414 /* ------------------------------ */
11415 .L_OP_UNUSED_FEFF: /* 0x1fe */
11416 /* File: x86/OP_UNUSED_FEFF.S */
11417 /* File: x86/unused.S */
11418     jmp     common_abort
11419
11420
11421 /* ------------------------------ */
11422 .L_OP_THROW_VERIFICATION_ERROR_JUMBO: /* 0x1ff */
11423 /* File: x86/OP_THROW_VERIFICATION_ERROR_JUMBO.S */
11424     /*
11425      * Handle a jumbo throw-verification-error instruction.  This throws an
11426      * exception for an error discovered during verification.  The
11427      * exception is indicated by BBBB, with some detail provided by AAAAAAAA.
11428      */
11429     /* exop BBBB, ref@AAAAAAAA */
11430     movl     rSELF,%ecx
11431     movl     2(rPC),%eax                     # eax<- AAAAAAAA
11432     movl     offThread_method(%ecx),%ecx       # ecx<- self->method
11433     EXPORT_PC
11434     movl     %eax,OUT_ARG2(%esp)             # arg2<- AAAAAAAA
11435     movl     rINST,OUT_ARG1(%esp)            # arg1<- BBBB
11436     movl     %ecx,OUT_ARG0(%esp)             # arg0<- method
11437     call     dvmThrowVerificationError       # call(method, kind, ref)
11438     jmp      common_exceptionThrown          # handle exception
11439
11440     .size   dvmAsmInstructionStartCode, .-dvmAsmInstructionStartCode
11441     .global dvmAsmInstructionEndCode
11442 dvmAsmInstructionEndCode:
11443
11444     .global dvmAsmAltInstructionStartCode
11445     .type   dvmAsmAltInstructionStartCode, %function
11446 dvmAsmAltInstructionStartCode:
11447     .text
11448
11449 /* ------------------------------ */
11450 .L_ALT_OP_NOP: /* 0x00 */
11451 /* File: x86/alt_stub.S */
11452 /*
11453  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
11454  * any interesting requests and then jump to the real instruction
11455  * handler.  Unlike the Arm handler, we can't do this as a tail call
11456  * because rIBASE is caller save and we need to reload it.
11457  */
11458     movl   rSELF, %eax
11459     movl   rPC, OUT_ARG0(%esp)
11460     movl   %eax, OUT_ARG1(%esp)
11461     call   dvmCheckInst                            # (dPC, self)
11462     movl   rSELF, %ecx
11463     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
11464     jmp    *dvmAsmInstructionStart+(0*4)
11465
11466 /* ------------------------------ */
11467 .L_ALT_OP_MOVE: /* 0x01 */
11468 /* File: x86/alt_stub.S */
11469 /*
11470  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
11471  * any interesting requests and then jump to the real instruction
11472  * handler.  Unlike the Arm handler, we can't do this as a tail call
11473  * because rIBASE is caller save and we need to reload it.
11474  */
11475     movl   rSELF, %eax
11476     movl   rPC, OUT_ARG0(%esp)
11477     movl   %eax, OUT_ARG1(%esp)
11478     call   dvmCheckInst                            # (dPC, self)
11479     movl   rSELF, %ecx
11480     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
11481     jmp    *dvmAsmInstructionStart+(1*4)
11482
11483 /* ------------------------------ */
11484 .L_ALT_OP_MOVE_FROM16: /* 0x02 */
11485 /* File: x86/alt_stub.S */
11486 /*
11487  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
11488  * any interesting requests and then jump to the real instruction
11489  * handler.  Unlike the Arm handler, we can't do this as a tail call
11490  * because rIBASE is caller save and we need to reload it.
11491  */
11492     movl   rSELF, %eax
11493     movl   rPC, OUT_ARG0(%esp)
11494     movl   %eax, OUT_ARG1(%esp)
11495     call   dvmCheckInst                            # (dPC, self)
11496     movl   rSELF, %ecx
11497     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
11498     jmp    *dvmAsmInstructionStart+(2*4)
11499
11500 /* ------------------------------ */
11501 .L_ALT_OP_MOVE_16: /* 0x03 */
11502 /* File: x86/alt_stub.S */
11503 /*
11504  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
11505  * any interesting requests and then jump to the real instruction
11506  * handler.  Unlike the Arm handler, we can't do this as a tail call
11507  * because rIBASE is caller save and we need to reload it.
11508  */
11509     movl   rSELF, %eax
11510     movl   rPC, OUT_ARG0(%esp)
11511     movl   %eax, OUT_ARG1(%esp)
11512     call   dvmCheckInst                            # (dPC, self)
11513     movl   rSELF, %ecx
11514     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
11515     jmp    *dvmAsmInstructionStart+(3*4)
11516
11517 /* ------------------------------ */
11518 .L_ALT_OP_MOVE_WIDE: /* 0x04 */
11519 /* File: x86/alt_stub.S */
11520 /*
11521  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
11522  * any interesting requests and then jump to the real instruction
11523  * handler.  Unlike the Arm handler, we can't do this as a tail call
11524  * because rIBASE is caller save and we need to reload it.
11525  */
11526     movl   rSELF, %eax
11527     movl   rPC, OUT_ARG0(%esp)
11528     movl   %eax, OUT_ARG1(%esp)
11529     call   dvmCheckInst                            # (dPC, self)
11530     movl   rSELF, %ecx
11531     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
11532     jmp    *dvmAsmInstructionStart+(4*4)
11533
11534 /* ------------------------------ */
11535 .L_ALT_OP_MOVE_WIDE_FROM16: /* 0x05 */
11536 /* File: x86/alt_stub.S */
11537 /*
11538  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
11539  * any interesting requests and then jump to the real instruction
11540  * handler.  Unlike the Arm handler, we can't do this as a tail call
11541  * because rIBASE is caller save and we need to reload it.
11542  */
11543     movl   rSELF, %eax
11544     movl   rPC, OUT_ARG0(%esp)
11545     movl   %eax, OUT_ARG1(%esp)
11546     call   dvmCheckInst                            # (dPC, self)
11547     movl   rSELF, %ecx
11548     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
11549     jmp    *dvmAsmInstructionStart+(5*4)
11550
11551 /* ------------------------------ */
11552 .L_ALT_OP_MOVE_WIDE_16: /* 0x06 */
11553 /* File: x86/alt_stub.S */
11554 /*
11555  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
11556  * any interesting requests and then jump to the real instruction
11557  * handler.  Unlike the Arm handler, we can't do this as a tail call
11558  * because rIBASE is caller save and we need to reload it.
11559  */
11560     movl   rSELF, %eax
11561     movl   rPC, OUT_ARG0(%esp)
11562     movl   %eax, OUT_ARG1(%esp)
11563     call   dvmCheckInst                            # (dPC, self)
11564     movl   rSELF, %ecx
11565     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
11566     jmp    *dvmAsmInstructionStart+(6*4)
11567
11568 /* ------------------------------ */
11569 .L_ALT_OP_MOVE_OBJECT: /* 0x07 */
11570 /* File: x86/alt_stub.S */
11571 /*
11572  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
11573  * any interesting requests and then jump to the real instruction
11574  * handler.  Unlike the Arm handler, we can't do this as a tail call
11575  * because rIBASE is caller save and we need to reload it.
11576  */
11577     movl   rSELF, %eax
11578     movl   rPC, OUT_ARG0(%esp)
11579     movl   %eax, OUT_ARG1(%esp)
11580     call   dvmCheckInst                            # (dPC, self)
11581     movl   rSELF, %ecx
11582     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
11583     jmp    *dvmAsmInstructionStart+(7*4)
11584
11585 /* ------------------------------ */
11586 .L_ALT_OP_MOVE_OBJECT_FROM16: /* 0x08 */
11587 /* File: x86/alt_stub.S */
11588 /*
11589  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
11590  * any interesting requests and then jump to the real instruction
11591  * handler.  Unlike the Arm handler, we can't do this as a tail call
11592  * because rIBASE is caller save and we need to reload it.
11593  */
11594     movl   rSELF, %eax
11595     movl   rPC, OUT_ARG0(%esp)
11596     movl   %eax, OUT_ARG1(%esp)
11597     call   dvmCheckInst                            # (dPC, self)
11598     movl   rSELF, %ecx
11599     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
11600     jmp    *dvmAsmInstructionStart+(8*4)
11601
11602 /* ------------------------------ */
11603 .L_ALT_OP_MOVE_OBJECT_16: /* 0x09 */
11604 /* File: x86/alt_stub.S */
11605 /*
11606  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
11607  * any interesting requests and then jump to the real instruction
11608  * handler.  Unlike the Arm handler, we can't do this as a tail call
11609  * because rIBASE is caller save and we need to reload it.
11610  */
11611     movl   rSELF, %eax
11612     movl   rPC, OUT_ARG0(%esp)
11613     movl   %eax, OUT_ARG1(%esp)
11614     call   dvmCheckInst                            # (dPC, self)
11615     movl   rSELF, %ecx
11616     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
11617     jmp    *dvmAsmInstructionStart+(9*4)
11618
11619 /* ------------------------------ */
11620 .L_ALT_OP_MOVE_RESULT: /* 0x0a */
11621 /* File: x86/alt_stub.S */
11622 /*
11623  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
11624  * any interesting requests and then jump to the real instruction
11625  * handler.  Unlike the Arm handler, we can't do this as a tail call
11626  * because rIBASE is caller save and we need to reload it.
11627  */
11628     movl   rSELF, %eax
11629     movl   rPC, OUT_ARG0(%esp)
11630     movl   %eax, OUT_ARG1(%esp)
11631     call   dvmCheckInst                            # (dPC, self)
11632     movl   rSELF, %ecx
11633     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
11634     jmp    *dvmAsmInstructionStart+(10*4)
11635
11636 /* ------------------------------ */
11637 .L_ALT_OP_MOVE_RESULT_WIDE: /* 0x0b */
11638 /* File: x86/alt_stub.S */
11639 /*
11640  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
11641  * any interesting requests and then jump to the real instruction
11642  * handler.  Unlike the Arm handler, we can't do this as a tail call
11643  * because rIBASE is caller save and we need to reload it.
11644  */
11645     movl   rSELF, %eax
11646     movl   rPC, OUT_ARG0(%esp)
11647     movl   %eax, OUT_ARG1(%esp)
11648     call   dvmCheckInst                            # (dPC, self)
11649     movl   rSELF, %ecx
11650     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
11651     jmp    *dvmAsmInstructionStart+(11*4)
11652
11653 /* ------------------------------ */
11654 .L_ALT_OP_MOVE_RESULT_OBJECT: /* 0x0c */
11655 /* File: x86/alt_stub.S */
11656 /*
11657  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
11658  * any interesting requests and then jump to the real instruction
11659  * handler.  Unlike the Arm handler, we can't do this as a tail call
11660  * because rIBASE is caller save and we need to reload it.
11661  */
11662     movl   rSELF, %eax
11663     movl   rPC, OUT_ARG0(%esp)
11664     movl   %eax, OUT_ARG1(%esp)
11665     call   dvmCheckInst                            # (dPC, self)
11666     movl   rSELF, %ecx
11667     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
11668     jmp    *dvmAsmInstructionStart+(12*4)
11669
11670 /* ------------------------------ */
11671 .L_ALT_OP_MOVE_EXCEPTION: /* 0x0d */
11672 /* File: x86/alt_stub.S */
11673 /*
11674  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
11675  * any interesting requests and then jump to the real instruction
11676  * handler.  Unlike the Arm handler, we can't do this as a tail call
11677  * because rIBASE is caller save and we need to reload it.
11678  */
11679     movl   rSELF, %eax
11680     movl   rPC, OUT_ARG0(%esp)
11681     movl   %eax, OUT_ARG1(%esp)
11682     call   dvmCheckInst                            # (dPC, self)
11683     movl   rSELF, %ecx
11684     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
11685     jmp    *dvmAsmInstructionStart+(13*4)
11686
11687 /* ------------------------------ */
11688 .L_ALT_OP_RETURN_VOID: /* 0x0e */
11689 /* File: x86/alt_stub.S */
11690 /*
11691  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
11692  * any interesting requests and then jump to the real instruction
11693  * handler.  Unlike the Arm handler, we can't do this as a tail call
11694  * because rIBASE is caller save and we need to reload it.
11695  */
11696     movl   rSELF, %eax
11697     movl   rPC, OUT_ARG0(%esp)
11698     movl   %eax, OUT_ARG1(%esp)
11699     call   dvmCheckInst                            # (dPC, self)
11700     movl   rSELF, %ecx
11701     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
11702     jmp    *dvmAsmInstructionStart+(14*4)
11703
11704 /* ------------------------------ */
11705 .L_ALT_OP_RETURN: /* 0x0f */
11706 /* File: x86/alt_stub.S */
11707 /*
11708  * Inter-instruction transfer stub.  Call out to dvmCheckInst 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     movl   rSELF, %eax
11714     movl   rPC, OUT_ARG0(%esp)
11715     movl   %eax, OUT_ARG1(%esp)
11716     call   dvmCheckInst                            # (dPC, self)
11717     movl   rSELF, %ecx
11718     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
11719     jmp    *dvmAsmInstructionStart+(15*4)
11720
11721 /* ------------------------------ */
11722 .L_ALT_OP_RETURN_WIDE: /* 0x10 */
11723 /* File: x86/alt_stub.S */
11724 /*
11725  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
11726  * any interesting requests and then jump to the real instruction
11727  * handler.  Unlike the Arm handler, we can't do this as a tail call
11728  * because rIBASE is caller save and we need to reload it.
11729  */
11730     movl   rSELF, %eax
11731     movl   rPC, OUT_ARG0(%esp)
11732     movl   %eax, OUT_ARG1(%esp)
11733     call   dvmCheckInst                            # (dPC, self)
11734     movl   rSELF, %ecx
11735     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
11736     jmp    *dvmAsmInstructionStart+(16*4)
11737
11738 /* ------------------------------ */
11739 .L_ALT_OP_RETURN_OBJECT: /* 0x11 */
11740 /* File: x86/alt_stub.S */
11741 /*
11742  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
11743  * any interesting requests and then jump to the real instruction
11744  * handler.  Unlike the Arm handler, we can't do this as a tail call
11745  * because rIBASE is caller save and we need to reload it.
11746  */
11747     movl   rSELF, %eax
11748     movl   rPC, OUT_ARG0(%esp)
11749     movl   %eax, OUT_ARG1(%esp)
11750     call   dvmCheckInst                            # (dPC, self)
11751     movl   rSELF, %ecx
11752     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
11753     jmp    *dvmAsmInstructionStart+(17*4)
11754
11755 /* ------------------------------ */
11756 .L_ALT_OP_CONST_4: /* 0x12 */
11757 /* File: x86/alt_stub.S */
11758 /*
11759  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
11760  * any interesting requests and then jump to the real instruction
11761  * handler.  Unlike the Arm handler, we can't do this as a tail call
11762  * because rIBASE is caller save and we need to reload it.
11763  */
11764     movl   rSELF, %eax
11765     movl   rPC, OUT_ARG0(%esp)
11766     movl   %eax, OUT_ARG1(%esp)
11767     call   dvmCheckInst                            # (dPC, self)
11768     movl   rSELF, %ecx
11769     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
11770     jmp    *dvmAsmInstructionStart+(18*4)
11771
11772 /* ------------------------------ */
11773 .L_ALT_OP_CONST_16: /* 0x13 */
11774 /* File: x86/alt_stub.S */
11775 /*
11776  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
11777  * any interesting requests and then jump to the real instruction
11778  * handler.  Unlike the Arm handler, we can't do this as a tail call
11779  * because rIBASE is caller save and we need to reload it.
11780  */
11781     movl   rSELF, %eax
11782     movl   rPC, OUT_ARG0(%esp)
11783     movl   %eax, OUT_ARG1(%esp)
11784     call   dvmCheckInst                            # (dPC, self)
11785     movl   rSELF, %ecx
11786     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
11787     jmp    *dvmAsmInstructionStart+(19*4)
11788
11789 /* ------------------------------ */
11790 .L_ALT_OP_CONST: /* 0x14 */
11791 /* File: x86/alt_stub.S */
11792 /*
11793  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
11794  * any interesting requests and then jump to the real instruction
11795  * handler.  Unlike the Arm handler, we can't do this as a tail call
11796  * because rIBASE is caller save and we need to reload it.
11797  */
11798     movl   rSELF, %eax
11799     movl   rPC, OUT_ARG0(%esp)
11800     movl   %eax, OUT_ARG1(%esp)
11801     call   dvmCheckInst                            # (dPC, self)
11802     movl   rSELF, %ecx
11803     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
11804     jmp    *dvmAsmInstructionStart+(20*4)
11805
11806 /* ------------------------------ */
11807 .L_ALT_OP_CONST_HIGH16: /* 0x15 */
11808 /* File: x86/alt_stub.S */
11809 /*
11810  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
11811  * any interesting requests and then jump to the real instruction
11812  * handler.  Unlike the Arm handler, we can't do this as a tail call
11813  * because rIBASE is caller save and we need to reload it.
11814  */
11815     movl   rSELF, %eax
11816     movl   rPC, OUT_ARG0(%esp)
11817     movl   %eax, OUT_ARG1(%esp)
11818     call   dvmCheckInst                            # (dPC, self)
11819     movl   rSELF, %ecx
11820     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
11821     jmp    *dvmAsmInstructionStart+(21*4)
11822
11823 /* ------------------------------ */
11824 .L_ALT_OP_CONST_WIDE_16: /* 0x16 */
11825 /* File: x86/alt_stub.S */
11826 /*
11827  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
11828  * any interesting requests and then jump to the real instruction
11829  * handler.  Unlike the Arm handler, we can't do this as a tail call
11830  * because rIBASE is caller save and we need to reload it.
11831  */
11832     movl   rSELF, %eax
11833     movl   rPC, OUT_ARG0(%esp)
11834     movl   %eax, OUT_ARG1(%esp)
11835     call   dvmCheckInst                            # (dPC, self)
11836     movl   rSELF, %ecx
11837     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
11838     jmp    *dvmAsmInstructionStart+(22*4)
11839
11840 /* ------------------------------ */
11841 .L_ALT_OP_CONST_WIDE_32: /* 0x17 */
11842 /* File: x86/alt_stub.S */
11843 /*
11844  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
11845  * any interesting requests and then jump to the real instruction
11846  * handler.  Unlike the Arm handler, we can't do this as a tail call
11847  * because rIBASE is caller save and we need to reload it.
11848  */
11849     movl   rSELF, %eax
11850     movl   rPC, OUT_ARG0(%esp)
11851     movl   %eax, OUT_ARG1(%esp)
11852     call   dvmCheckInst                            # (dPC, self)
11853     movl   rSELF, %ecx
11854     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
11855     jmp    *dvmAsmInstructionStart+(23*4)
11856
11857 /* ------------------------------ */
11858 .L_ALT_OP_CONST_WIDE: /* 0x18 */
11859 /* File: x86/alt_stub.S */
11860 /*
11861  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
11862  * any interesting requests and then jump to the real instruction
11863  * handler.  Unlike the Arm handler, we can't do this as a tail call
11864  * because rIBASE is caller save and we need to reload it.
11865  */
11866     movl   rSELF, %eax
11867     movl   rPC, OUT_ARG0(%esp)
11868     movl   %eax, OUT_ARG1(%esp)
11869     call   dvmCheckInst                            # (dPC, self)
11870     movl   rSELF, %ecx
11871     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
11872     jmp    *dvmAsmInstructionStart+(24*4)
11873
11874 /* ------------------------------ */
11875 .L_ALT_OP_CONST_WIDE_HIGH16: /* 0x19 */
11876 /* File: x86/alt_stub.S */
11877 /*
11878  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
11879  * any interesting requests and then jump to the real instruction
11880  * handler.  Unlike the Arm handler, we can't do this as a tail call
11881  * because rIBASE is caller save and we need to reload it.
11882  */
11883     movl   rSELF, %eax
11884     movl   rPC, OUT_ARG0(%esp)
11885     movl   %eax, OUT_ARG1(%esp)
11886     call   dvmCheckInst                            # (dPC, self)
11887     movl   rSELF, %ecx
11888     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
11889     jmp    *dvmAsmInstructionStart+(25*4)
11890
11891 /* ------------------------------ */
11892 .L_ALT_OP_CONST_STRING: /* 0x1a */
11893 /* File: x86/alt_stub.S */
11894 /*
11895  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
11896  * any interesting requests and then jump to the real instruction
11897  * handler.  Unlike the Arm handler, we can't do this as a tail call
11898  * because rIBASE is caller save and we need to reload it.
11899  */
11900     movl   rSELF, %eax
11901     movl   rPC, OUT_ARG0(%esp)
11902     movl   %eax, OUT_ARG1(%esp)
11903     call   dvmCheckInst                            # (dPC, self)
11904     movl   rSELF, %ecx
11905     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
11906     jmp    *dvmAsmInstructionStart+(26*4)
11907
11908 /* ------------------------------ */
11909 .L_ALT_OP_CONST_STRING_JUMBO: /* 0x1b */
11910 /* File: x86/alt_stub.S */
11911 /*
11912  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
11913  * any interesting requests and then jump to the real instruction
11914  * handler.  Unlike the Arm handler, we can't do this as a tail call
11915  * because rIBASE is caller save and we need to reload it.
11916  */
11917     movl   rSELF, %eax
11918     movl   rPC, OUT_ARG0(%esp)
11919     movl   %eax, OUT_ARG1(%esp)
11920     call   dvmCheckInst                            # (dPC, self)
11921     movl   rSELF, %ecx
11922     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
11923     jmp    *dvmAsmInstructionStart+(27*4)
11924
11925 /* ------------------------------ */
11926 .L_ALT_OP_CONST_CLASS: /* 0x1c */
11927 /* File: x86/alt_stub.S */
11928 /*
11929  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
11930  * any interesting requests and then jump to the real instruction
11931  * handler.  Unlike the Arm handler, we can't do this as a tail call
11932  * because rIBASE is caller save and we need to reload it.
11933  */
11934     movl   rSELF, %eax
11935     movl   rPC, OUT_ARG0(%esp)
11936     movl   %eax, OUT_ARG1(%esp)
11937     call   dvmCheckInst                            # (dPC, self)
11938     movl   rSELF, %ecx
11939     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
11940     jmp    *dvmAsmInstructionStart+(28*4)
11941
11942 /* ------------------------------ */
11943 .L_ALT_OP_MONITOR_ENTER: /* 0x1d */
11944 /* File: x86/alt_stub.S */
11945 /*
11946  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
11947  * any interesting requests and then jump to the real instruction
11948  * handler.  Unlike the Arm handler, we can't do this as a tail call
11949  * because rIBASE is caller save and we need to reload it.
11950  */
11951     movl   rSELF, %eax
11952     movl   rPC, OUT_ARG0(%esp)
11953     movl   %eax, OUT_ARG1(%esp)
11954     call   dvmCheckInst                            # (dPC, self)
11955     movl   rSELF, %ecx
11956     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
11957     jmp    *dvmAsmInstructionStart+(29*4)
11958
11959 /* ------------------------------ */
11960 .L_ALT_OP_MONITOR_EXIT: /* 0x1e */
11961 /* File: x86/alt_stub.S */
11962 /*
11963  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
11964  * any interesting requests and then jump to the real instruction
11965  * handler.  Unlike the Arm handler, we can't do this as a tail call
11966  * because rIBASE is caller save and we need to reload it.
11967  */
11968     movl   rSELF, %eax
11969     movl   rPC, OUT_ARG0(%esp)
11970     movl   %eax, OUT_ARG1(%esp)
11971     call   dvmCheckInst                            # (dPC, self)
11972     movl   rSELF, %ecx
11973     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
11974     jmp    *dvmAsmInstructionStart+(30*4)
11975
11976 /* ------------------------------ */
11977 .L_ALT_OP_CHECK_CAST: /* 0x1f */
11978 /* File: x86/alt_stub.S */
11979 /*
11980  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
11981  * any interesting requests and then jump to the real instruction
11982  * handler.  Unlike the Arm handler, we can't do this as a tail call
11983  * because rIBASE is caller save and we need to reload it.
11984  */
11985     movl   rSELF, %eax
11986     movl   rPC, OUT_ARG0(%esp)
11987     movl   %eax, OUT_ARG1(%esp)
11988     call   dvmCheckInst                            # (dPC, self)
11989     movl   rSELF, %ecx
11990     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
11991     jmp    *dvmAsmInstructionStart+(31*4)
11992
11993 /* ------------------------------ */
11994 .L_ALT_OP_INSTANCE_OF: /* 0x20 */
11995 /* File: x86/alt_stub.S */
11996 /*
11997  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
11998  * any interesting requests and then jump to the real instruction
11999  * handler.  Unlike the Arm handler, we can't do this as a tail call
12000  * because rIBASE is caller save and we need to reload it.
12001  */
12002     movl   rSELF, %eax
12003     movl   rPC, OUT_ARG0(%esp)
12004     movl   %eax, OUT_ARG1(%esp)
12005     call   dvmCheckInst                            # (dPC, self)
12006     movl   rSELF, %ecx
12007     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12008     jmp    *dvmAsmInstructionStart+(32*4)
12009
12010 /* ------------------------------ */
12011 .L_ALT_OP_ARRAY_LENGTH: /* 0x21 */
12012 /* File: x86/alt_stub.S */
12013 /*
12014  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12015  * any interesting requests and then jump to the real instruction
12016  * handler.  Unlike the Arm handler, we can't do this as a tail call
12017  * because rIBASE is caller save and we need to reload it.
12018  */
12019     movl   rSELF, %eax
12020     movl   rPC, OUT_ARG0(%esp)
12021     movl   %eax, OUT_ARG1(%esp)
12022     call   dvmCheckInst                            # (dPC, self)
12023     movl   rSELF, %ecx
12024     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12025     jmp    *dvmAsmInstructionStart+(33*4)
12026
12027 /* ------------------------------ */
12028 .L_ALT_OP_NEW_INSTANCE: /* 0x22 */
12029 /* File: x86/alt_stub.S */
12030 /*
12031  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12032  * any interesting requests and then jump to the real instruction
12033  * handler.  Unlike the Arm handler, we can't do this as a tail call
12034  * because rIBASE is caller save and we need to reload it.
12035  */
12036     movl   rSELF, %eax
12037     movl   rPC, OUT_ARG0(%esp)
12038     movl   %eax, OUT_ARG1(%esp)
12039     call   dvmCheckInst                            # (dPC, self)
12040     movl   rSELF, %ecx
12041     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12042     jmp    *dvmAsmInstructionStart+(34*4)
12043
12044 /* ------------------------------ */
12045 .L_ALT_OP_NEW_ARRAY: /* 0x23 */
12046 /* File: x86/alt_stub.S */
12047 /*
12048  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12049  * any interesting requests and then jump to the real instruction
12050  * handler.  Unlike the Arm handler, we can't do this as a tail call
12051  * because rIBASE is caller save and we need to reload it.
12052  */
12053     movl   rSELF, %eax
12054     movl   rPC, OUT_ARG0(%esp)
12055     movl   %eax, OUT_ARG1(%esp)
12056     call   dvmCheckInst                            # (dPC, self)
12057     movl   rSELF, %ecx
12058     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12059     jmp    *dvmAsmInstructionStart+(35*4)
12060
12061 /* ------------------------------ */
12062 .L_ALT_OP_FILLED_NEW_ARRAY: /* 0x24 */
12063 /* File: x86/alt_stub.S */
12064 /*
12065  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12066  * any interesting requests and then jump to the real instruction
12067  * handler.  Unlike the Arm handler, we can't do this as a tail call
12068  * because rIBASE is caller save and we need to reload it.
12069  */
12070     movl   rSELF, %eax
12071     movl   rPC, OUT_ARG0(%esp)
12072     movl   %eax, OUT_ARG1(%esp)
12073     call   dvmCheckInst                            # (dPC, self)
12074     movl   rSELF, %ecx
12075     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12076     jmp    *dvmAsmInstructionStart+(36*4)
12077
12078 /* ------------------------------ */
12079 .L_ALT_OP_FILLED_NEW_ARRAY_RANGE: /* 0x25 */
12080 /* File: x86/alt_stub.S */
12081 /*
12082  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12083  * any interesting requests and then jump to the real instruction
12084  * handler.  Unlike the Arm handler, we can't do this as a tail call
12085  * because rIBASE is caller save and we need to reload it.
12086  */
12087     movl   rSELF, %eax
12088     movl   rPC, OUT_ARG0(%esp)
12089     movl   %eax, OUT_ARG1(%esp)
12090     call   dvmCheckInst                            # (dPC, self)
12091     movl   rSELF, %ecx
12092     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12093     jmp    *dvmAsmInstructionStart+(37*4)
12094
12095 /* ------------------------------ */
12096 .L_ALT_OP_FILL_ARRAY_DATA: /* 0x26 */
12097 /* File: x86/alt_stub.S */
12098 /*
12099  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12100  * any interesting requests and then jump to the real instruction
12101  * handler.  Unlike the Arm handler, we can't do this as a tail call
12102  * because rIBASE is caller save and we need to reload it.
12103  */
12104     movl   rSELF, %eax
12105     movl   rPC, OUT_ARG0(%esp)
12106     movl   %eax, OUT_ARG1(%esp)
12107     call   dvmCheckInst                            # (dPC, self)
12108     movl   rSELF, %ecx
12109     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12110     jmp    *dvmAsmInstructionStart+(38*4)
12111
12112 /* ------------------------------ */
12113 .L_ALT_OP_THROW: /* 0x27 */
12114 /* File: x86/alt_stub.S */
12115 /*
12116  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12117  * any interesting requests and then jump to the real instruction
12118  * handler.  Unlike the Arm handler, we can't do this as a tail call
12119  * because rIBASE is caller save and we need to reload it.
12120  */
12121     movl   rSELF, %eax
12122     movl   rPC, OUT_ARG0(%esp)
12123     movl   %eax, OUT_ARG1(%esp)
12124     call   dvmCheckInst                            # (dPC, self)
12125     movl   rSELF, %ecx
12126     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12127     jmp    *dvmAsmInstructionStart+(39*4)
12128
12129 /* ------------------------------ */
12130 .L_ALT_OP_GOTO: /* 0x28 */
12131 /* File: x86/alt_stub.S */
12132 /*
12133  * Inter-instruction transfer stub.  Call out to dvmCheckInst 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     movl   rSELF, %eax
12139     movl   rPC, OUT_ARG0(%esp)
12140     movl   %eax, OUT_ARG1(%esp)
12141     call   dvmCheckInst                            # (dPC, self)
12142     movl   rSELF, %ecx
12143     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12144     jmp    *dvmAsmInstructionStart+(40*4)
12145
12146 /* ------------------------------ */
12147 .L_ALT_OP_GOTO_16: /* 0x29 */
12148 /* File: x86/alt_stub.S */
12149 /*
12150  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12151  * any interesting requests and then jump to the real instruction
12152  * handler.  Unlike the Arm handler, we can't do this as a tail call
12153  * because rIBASE is caller save and we need to reload it.
12154  */
12155     movl   rSELF, %eax
12156     movl   rPC, OUT_ARG0(%esp)
12157     movl   %eax, OUT_ARG1(%esp)
12158     call   dvmCheckInst                            # (dPC, self)
12159     movl   rSELF, %ecx
12160     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12161     jmp    *dvmAsmInstructionStart+(41*4)
12162
12163 /* ------------------------------ */
12164 .L_ALT_OP_GOTO_32: /* 0x2a */
12165 /* File: x86/alt_stub.S */
12166 /*
12167  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12168  * any interesting requests and then jump to the real instruction
12169  * handler.  Unlike the Arm handler, we can't do this as a tail call
12170  * because rIBASE is caller save and we need to reload it.
12171  */
12172     movl   rSELF, %eax
12173     movl   rPC, OUT_ARG0(%esp)
12174     movl   %eax, OUT_ARG1(%esp)
12175     call   dvmCheckInst                            # (dPC, self)
12176     movl   rSELF, %ecx
12177     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12178     jmp    *dvmAsmInstructionStart+(42*4)
12179
12180 /* ------------------------------ */
12181 .L_ALT_OP_PACKED_SWITCH: /* 0x2b */
12182 /* File: x86/alt_stub.S */
12183 /*
12184  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12185  * any interesting requests and then jump to the real instruction
12186  * handler.  Unlike the Arm handler, we can't do this as a tail call
12187  * because rIBASE is caller save and we need to reload it.
12188  */
12189     movl   rSELF, %eax
12190     movl   rPC, OUT_ARG0(%esp)
12191     movl   %eax, OUT_ARG1(%esp)
12192     call   dvmCheckInst                            # (dPC, self)
12193     movl   rSELF, %ecx
12194     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12195     jmp    *dvmAsmInstructionStart+(43*4)
12196
12197 /* ------------------------------ */
12198 .L_ALT_OP_SPARSE_SWITCH: /* 0x2c */
12199 /* File: x86/alt_stub.S */
12200 /*
12201  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12202  * any interesting requests and then jump to the real instruction
12203  * handler.  Unlike the Arm handler, we can't do this as a tail call
12204  * because rIBASE is caller save and we need to reload it.
12205  */
12206     movl   rSELF, %eax
12207     movl   rPC, OUT_ARG0(%esp)
12208     movl   %eax, OUT_ARG1(%esp)
12209     call   dvmCheckInst                            # (dPC, self)
12210     movl   rSELF, %ecx
12211     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12212     jmp    *dvmAsmInstructionStart+(44*4)
12213
12214 /* ------------------------------ */
12215 .L_ALT_OP_CMPL_FLOAT: /* 0x2d */
12216 /* File: x86/alt_stub.S */
12217 /*
12218  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12219  * any interesting requests and then jump to the real instruction
12220  * handler.  Unlike the Arm handler, we can't do this as a tail call
12221  * because rIBASE is caller save and we need to reload it.
12222  */
12223     movl   rSELF, %eax
12224     movl   rPC, OUT_ARG0(%esp)
12225     movl   %eax, OUT_ARG1(%esp)
12226     call   dvmCheckInst                            # (dPC, self)
12227     movl   rSELF, %ecx
12228     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12229     jmp    *dvmAsmInstructionStart+(45*4)
12230
12231 /* ------------------------------ */
12232 .L_ALT_OP_CMPG_FLOAT: /* 0x2e */
12233 /* File: x86/alt_stub.S */
12234 /*
12235  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12236  * any interesting requests and then jump to the real instruction
12237  * handler.  Unlike the Arm handler, we can't do this as a tail call
12238  * because rIBASE is caller save and we need to reload it.
12239  */
12240     movl   rSELF, %eax
12241     movl   rPC, OUT_ARG0(%esp)
12242     movl   %eax, OUT_ARG1(%esp)
12243     call   dvmCheckInst                            # (dPC, self)
12244     movl   rSELF, %ecx
12245     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12246     jmp    *dvmAsmInstructionStart+(46*4)
12247
12248 /* ------------------------------ */
12249 .L_ALT_OP_CMPL_DOUBLE: /* 0x2f */
12250 /* File: x86/alt_stub.S */
12251 /*
12252  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12253  * any interesting requests and then jump to the real instruction
12254  * handler.  Unlike the Arm handler, we can't do this as a tail call
12255  * because rIBASE is caller save and we need to reload it.
12256  */
12257     movl   rSELF, %eax
12258     movl   rPC, OUT_ARG0(%esp)
12259     movl   %eax, OUT_ARG1(%esp)
12260     call   dvmCheckInst                            # (dPC, self)
12261     movl   rSELF, %ecx
12262     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12263     jmp    *dvmAsmInstructionStart+(47*4)
12264
12265 /* ------------------------------ */
12266 .L_ALT_OP_CMPG_DOUBLE: /* 0x30 */
12267 /* File: x86/alt_stub.S */
12268 /*
12269  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12270  * any interesting requests and then jump to the real instruction
12271  * handler.  Unlike the Arm handler, we can't do this as a tail call
12272  * because rIBASE is caller save and we need to reload it.
12273  */
12274     movl   rSELF, %eax
12275     movl   rPC, OUT_ARG0(%esp)
12276     movl   %eax, OUT_ARG1(%esp)
12277     call   dvmCheckInst                            # (dPC, self)
12278     movl   rSELF, %ecx
12279     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12280     jmp    *dvmAsmInstructionStart+(48*4)
12281
12282 /* ------------------------------ */
12283 .L_ALT_OP_CMP_LONG: /* 0x31 */
12284 /* File: x86/alt_stub.S */
12285 /*
12286  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12287  * any interesting requests and then jump to the real instruction
12288  * handler.  Unlike the Arm handler, we can't do this as a tail call
12289  * because rIBASE is caller save and we need to reload it.
12290  */
12291     movl   rSELF, %eax
12292     movl   rPC, OUT_ARG0(%esp)
12293     movl   %eax, OUT_ARG1(%esp)
12294     call   dvmCheckInst                            # (dPC, self)
12295     movl   rSELF, %ecx
12296     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12297     jmp    *dvmAsmInstructionStart+(49*4)
12298
12299 /* ------------------------------ */
12300 .L_ALT_OP_IF_EQ: /* 0x32 */
12301 /* File: x86/alt_stub.S */
12302 /*
12303  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12304  * any interesting requests and then jump to the real instruction
12305  * handler.  Unlike the Arm handler, we can't do this as a tail call
12306  * because rIBASE is caller save and we need to reload it.
12307  */
12308     movl   rSELF, %eax
12309     movl   rPC, OUT_ARG0(%esp)
12310     movl   %eax, OUT_ARG1(%esp)
12311     call   dvmCheckInst                            # (dPC, self)
12312     movl   rSELF, %ecx
12313     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12314     jmp    *dvmAsmInstructionStart+(50*4)
12315
12316 /* ------------------------------ */
12317 .L_ALT_OP_IF_NE: /* 0x33 */
12318 /* File: x86/alt_stub.S */
12319 /*
12320  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12321  * any interesting requests and then jump to the real instruction
12322  * handler.  Unlike the Arm handler, we can't do this as a tail call
12323  * because rIBASE is caller save and we need to reload it.
12324  */
12325     movl   rSELF, %eax
12326     movl   rPC, OUT_ARG0(%esp)
12327     movl   %eax, OUT_ARG1(%esp)
12328     call   dvmCheckInst                            # (dPC, self)
12329     movl   rSELF, %ecx
12330     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12331     jmp    *dvmAsmInstructionStart+(51*4)
12332
12333 /* ------------------------------ */
12334 .L_ALT_OP_IF_LT: /* 0x34 */
12335 /* File: x86/alt_stub.S */
12336 /*
12337  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12338  * any interesting requests and then jump to the real instruction
12339  * handler.  Unlike the Arm handler, we can't do this as a tail call
12340  * because rIBASE is caller save and we need to reload it.
12341  */
12342     movl   rSELF, %eax
12343     movl   rPC, OUT_ARG0(%esp)
12344     movl   %eax, OUT_ARG1(%esp)
12345     call   dvmCheckInst                            # (dPC, self)
12346     movl   rSELF, %ecx
12347     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12348     jmp    *dvmAsmInstructionStart+(52*4)
12349
12350 /* ------------------------------ */
12351 .L_ALT_OP_IF_GE: /* 0x35 */
12352 /* File: x86/alt_stub.S */
12353 /*
12354  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12355  * any interesting requests and then jump to the real instruction
12356  * handler.  Unlike the Arm handler, we can't do this as a tail call
12357  * because rIBASE is caller save and we need to reload it.
12358  */
12359     movl   rSELF, %eax
12360     movl   rPC, OUT_ARG0(%esp)
12361     movl   %eax, OUT_ARG1(%esp)
12362     call   dvmCheckInst                            # (dPC, self)
12363     movl   rSELF, %ecx
12364     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12365     jmp    *dvmAsmInstructionStart+(53*4)
12366
12367 /* ------------------------------ */
12368 .L_ALT_OP_IF_GT: /* 0x36 */
12369 /* File: x86/alt_stub.S */
12370 /*
12371  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12372  * any interesting requests and then jump to the real instruction
12373  * handler.  Unlike the Arm handler, we can't do this as a tail call
12374  * because rIBASE is caller save and we need to reload it.
12375  */
12376     movl   rSELF, %eax
12377     movl   rPC, OUT_ARG0(%esp)
12378     movl   %eax, OUT_ARG1(%esp)
12379     call   dvmCheckInst                            # (dPC, self)
12380     movl   rSELF, %ecx
12381     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12382     jmp    *dvmAsmInstructionStart+(54*4)
12383
12384 /* ------------------------------ */
12385 .L_ALT_OP_IF_LE: /* 0x37 */
12386 /* File: x86/alt_stub.S */
12387 /*
12388  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12389  * any interesting requests and then jump to the real instruction
12390  * handler.  Unlike the Arm handler, we can't do this as a tail call
12391  * because rIBASE is caller save and we need to reload it.
12392  */
12393     movl   rSELF, %eax
12394     movl   rPC, OUT_ARG0(%esp)
12395     movl   %eax, OUT_ARG1(%esp)
12396     call   dvmCheckInst                            # (dPC, self)
12397     movl   rSELF, %ecx
12398     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12399     jmp    *dvmAsmInstructionStart+(55*4)
12400
12401 /* ------------------------------ */
12402 .L_ALT_OP_IF_EQZ: /* 0x38 */
12403 /* File: x86/alt_stub.S */
12404 /*
12405  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12406  * any interesting requests and then jump to the real instruction
12407  * handler.  Unlike the Arm handler, we can't do this as a tail call
12408  * because rIBASE is caller save and we need to reload it.
12409  */
12410     movl   rSELF, %eax
12411     movl   rPC, OUT_ARG0(%esp)
12412     movl   %eax, OUT_ARG1(%esp)
12413     call   dvmCheckInst                            # (dPC, self)
12414     movl   rSELF, %ecx
12415     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12416     jmp    *dvmAsmInstructionStart+(56*4)
12417
12418 /* ------------------------------ */
12419 .L_ALT_OP_IF_NEZ: /* 0x39 */
12420 /* File: x86/alt_stub.S */
12421 /*
12422  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12423  * any interesting requests and then jump to the real instruction
12424  * handler.  Unlike the Arm handler, we can't do this as a tail call
12425  * because rIBASE is caller save and we need to reload it.
12426  */
12427     movl   rSELF, %eax
12428     movl   rPC, OUT_ARG0(%esp)
12429     movl   %eax, OUT_ARG1(%esp)
12430     call   dvmCheckInst                            # (dPC, self)
12431     movl   rSELF, %ecx
12432     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12433     jmp    *dvmAsmInstructionStart+(57*4)
12434
12435 /* ------------------------------ */
12436 .L_ALT_OP_IF_LTZ: /* 0x3a */
12437 /* File: x86/alt_stub.S */
12438 /*
12439  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12440  * any interesting requests and then jump to the real instruction
12441  * handler.  Unlike the Arm handler, we can't do this as a tail call
12442  * because rIBASE is caller save and we need to reload it.
12443  */
12444     movl   rSELF, %eax
12445     movl   rPC, OUT_ARG0(%esp)
12446     movl   %eax, OUT_ARG1(%esp)
12447     call   dvmCheckInst                            # (dPC, self)
12448     movl   rSELF, %ecx
12449     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12450     jmp    *dvmAsmInstructionStart+(58*4)
12451
12452 /* ------------------------------ */
12453 .L_ALT_OP_IF_GEZ: /* 0x3b */
12454 /* File: x86/alt_stub.S */
12455 /*
12456  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12457  * any interesting requests and then jump to the real instruction
12458  * handler.  Unlike the Arm handler, we can't do this as a tail call
12459  * because rIBASE is caller save and we need to reload it.
12460  */
12461     movl   rSELF, %eax
12462     movl   rPC, OUT_ARG0(%esp)
12463     movl   %eax, OUT_ARG1(%esp)
12464     call   dvmCheckInst                            # (dPC, self)
12465     movl   rSELF, %ecx
12466     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12467     jmp    *dvmAsmInstructionStart+(59*4)
12468
12469 /* ------------------------------ */
12470 .L_ALT_OP_IF_GTZ: /* 0x3c */
12471 /* File: x86/alt_stub.S */
12472 /*
12473  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12474  * any interesting requests and then jump to the real instruction
12475  * handler.  Unlike the Arm handler, we can't do this as a tail call
12476  * because rIBASE is caller save and we need to reload it.
12477  */
12478     movl   rSELF, %eax
12479     movl   rPC, OUT_ARG0(%esp)
12480     movl   %eax, OUT_ARG1(%esp)
12481     call   dvmCheckInst                            # (dPC, self)
12482     movl   rSELF, %ecx
12483     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12484     jmp    *dvmAsmInstructionStart+(60*4)
12485
12486 /* ------------------------------ */
12487 .L_ALT_OP_IF_LEZ: /* 0x3d */
12488 /* File: x86/alt_stub.S */
12489 /*
12490  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12491  * any interesting requests and then jump to the real instruction
12492  * handler.  Unlike the Arm handler, we can't do this as a tail call
12493  * because rIBASE is caller save and we need to reload it.
12494  */
12495     movl   rSELF, %eax
12496     movl   rPC, OUT_ARG0(%esp)
12497     movl   %eax, OUT_ARG1(%esp)
12498     call   dvmCheckInst                            # (dPC, self)
12499     movl   rSELF, %ecx
12500     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12501     jmp    *dvmAsmInstructionStart+(61*4)
12502
12503 /* ------------------------------ */
12504 .L_ALT_OP_UNUSED_3E: /* 0x3e */
12505 /* File: x86/alt_stub.S */
12506 /*
12507  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12508  * any interesting requests and then jump to the real instruction
12509  * handler.  Unlike the Arm handler, we can't do this as a tail call
12510  * because rIBASE is caller save and we need to reload it.
12511  */
12512     movl   rSELF, %eax
12513     movl   rPC, OUT_ARG0(%esp)
12514     movl   %eax, OUT_ARG1(%esp)
12515     call   dvmCheckInst                            # (dPC, self)
12516     movl   rSELF, %ecx
12517     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12518     jmp    *dvmAsmInstructionStart+(62*4)
12519
12520 /* ------------------------------ */
12521 .L_ALT_OP_UNUSED_3F: /* 0x3f */
12522 /* File: x86/alt_stub.S */
12523 /*
12524  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12525  * any interesting requests and then jump to the real instruction
12526  * handler.  Unlike the Arm handler, we can't do this as a tail call
12527  * because rIBASE is caller save and we need to reload it.
12528  */
12529     movl   rSELF, %eax
12530     movl   rPC, OUT_ARG0(%esp)
12531     movl   %eax, OUT_ARG1(%esp)
12532     call   dvmCheckInst                            # (dPC, self)
12533     movl   rSELF, %ecx
12534     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12535     jmp    *dvmAsmInstructionStart+(63*4)
12536
12537 /* ------------------------------ */
12538 .L_ALT_OP_UNUSED_40: /* 0x40 */
12539 /* File: x86/alt_stub.S */
12540 /*
12541  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12542  * any interesting requests and then jump to the real instruction
12543  * handler.  Unlike the Arm handler, we can't do this as a tail call
12544  * because rIBASE is caller save and we need to reload it.
12545  */
12546     movl   rSELF, %eax
12547     movl   rPC, OUT_ARG0(%esp)
12548     movl   %eax, OUT_ARG1(%esp)
12549     call   dvmCheckInst                            # (dPC, self)
12550     movl   rSELF, %ecx
12551     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12552     jmp    *dvmAsmInstructionStart+(64*4)
12553
12554 /* ------------------------------ */
12555 .L_ALT_OP_UNUSED_41: /* 0x41 */
12556 /* File: x86/alt_stub.S */
12557 /*
12558  * Inter-instruction transfer stub.  Call out to dvmCheckInst 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     movl   rSELF, %eax
12564     movl   rPC, OUT_ARG0(%esp)
12565     movl   %eax, OUT_ARG1(%esp)
12566     call   dvmCheckInst                            # (dPC, self)
12567     movl   rSELF, %ecx
12568     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12569     jmp    *dvmAsmInstructionStart+(65*4)
12570
12571 /* ------------------------------ */
12572 .L_ALT_OP_UNUSED_42: /* 0x42 */
12573 /* File: x86/alt_stub.S */
12574 /*
12575  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12576  * any interesting requests and then jump to the real instruction
12577  * handler.  Unlike the Arm handler, we can't do this as a tail call
12578  * because rIBASE is caller save and we need to reload it.
12579  */
12580     movl   rSELF, %eax
12581     movl   rPC, OUT_ARG0(%esp)
12582     movl   %eax, OUT_ARG1(%esp)
12583     call   dvmCheckInst                            # (dPC, self)
12584     movl   rSELF, %ecx
12585     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12586     jmp    *dvmAsmInstructionStart+(66*4)
12587
12588 /* ------------------------------ */
12589 .L_ALT_OP_UNUSED_43: /* 0x43 */
12590 /* File: x86/alt_stub.S */
12591 /*
12592  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12593  * any interesting requests and then jump to the real instruction
12594  * handler.  Unlike the Arm handler, we can't do this as a tail call
12595  * because rIBASE is caller save and we need to reload it.
12596  */
12597     movl   rSELF, %eax
12598     movl   rPC, OUT_ARG0(%esp)
12599     movl   %eax, OUT_ARG1(%esp)
12600     call   dvmCheckInst                            # (dPC, self)
12601     movl   rSELF, %ecx
12602     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12603     jmp    *dvmAsmInstructionStart+(67*4)
12604
12605 /* ------------------------------ */
12606 .L_ALT_OP_AGET: /* 0x44 */
12607 /* File: x86/alt_stub.S */
12608 /*
12609  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12610  * any interesting requests and then jump to the real instruction
12611  * handler.  Unlike the Arm handler, we can't do this as a tail call
12612  * because rIBASE is caller save and we need to reload it.
12613  */
12614     movl   rSELF, %eax
12615     movl   rPC, OUT_ARG0(%esp)
12616     movl   %eax, OUT_ARG1(%esp)
12617     call   dvmCheckInst                            # (dPC, self)
12618     movl   rSELF, %ecx
12619     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12620     jmp    *dvmAsmInstructionStart+(68*4)
12621
12622 /* ------------------------------ */
12623 .L_ALT_OP_AGET_WIDE: /* 0x45 */
12624 /* File: x86/alt_stub.S */
12625 /*
12626  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12627  * any interesting requests and then jump to the real instruction
12628  * handler.  Unlike the Arm handler, we can't do this as a tail call
12629  * because rIBASE is caller save and we need to reload it.
12630  */
12631     movl   rSELF, %eax
12632     movl   rPC, OUT_ARG0(%esp)
12633     movl   %eax, OUT_ARG1(%esp)
12634     call   dvmCheckInst                            # (dPC, self)
12635     movl   rSELF, %ecx
12636     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12637     jmp    *dvmAsmInstructionStart+(69*4)
12638
12639 /* ------------------------------ */
12640 .L_ALT_OP_AGET_OBJECT: /* 0x46 */
12641 /* File: x86/alt_stub.S */
12642 /*
12643  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12644  * any interesting requests and then jump to the real instruction
12645  * handler.  Unlike the Arm handler, we can't do this as a tail call
12646  * because rIBASE is caller save and we need to reload it.
12647  */
12648     movl   rSELF, %eax
12649     movl   rPC, OUT_ARG0(%esp)
12650     movl   %eax, OUT_ARG1(%esp)
12651     call   dvmCheckInst                            # (dPC, self)
12652     movl   rSELF, %ecx
12653     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12654     jmp    *dvmAsmInstructionStart+(70*4)
12655
12656 /* ------------------------------ */
12657 .L_ALT_OP_AGET_BOOLEAN: /* 0x47 */
12658 /* File: x86/alt_stub.S */
12659 /*
12660  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12661  * any interesting requests and then jump to the real instruction
12662  * handler.  Unlike the Arm handler, we can't do this as a tail call
12663  * because rIBASE is caller save and we need to reload it.
12664  */
12665     movl   rSELF, %eax
12666     movl   rPC, OUT_ARG0(%esp)
12667     movl   %eax, OUT_ARG1(%esp)
12668     call   dvmCheckInst                            # (dPC, self)
12669     movl   rSELF, %ecx
12670     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12671     jmp    *dvmAsmInstructionStart+(71*4)
12672
12673 /* ------------------------------ */
12674 .L_ALT_OP_AGET_BYTE: /* 0x48 */
12675 /* File: x86/alt_stub.S */
12676 /*
12677  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12678  * any interesting requests and then jump to the real instruction
12679  * handler.  Unlike the Arm handler, we can't do this as a tail call
12680  * because rIBASE is caller save and we need to reload it.
12681  */
12682     movl   rSELF, %eax
12683     movl   rPC, OUT_ARG0(%esp)
12684     movl   %eax, OUT_ARG1(%esp)
12685     call   dvmCheckInst                            # (dPC, self)
12686     movl   rSELF, %ecx
12687     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12688     jmp    *dvmAsmInstructionStart+(72*4)
12689
12690 /* ------------------------------ */
12691 .L_ALT_OP_AGET_CHAR: /* 0x49 */
12692 /* File: x86/alt_stub.S */
12693 /*
12694  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12695  * any interesting requests and then jump to the real instruction
12696  * handler.  Unlike the Arm handler, we can't do this as a tail call
12697  * because rIBASE is caller save and we need to reload it.
12698  */
12699     movl   rSELF, %eax
12700     movl   rPC, OUT_ARG0(%esp)
12701     movl   %eax, OUT_ARG1(%esp)
12702     call   dvmCheckInst                            # (dPC, self)
12703     movl   rSELF, %ecx
12704     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12705     jmp    *dvmAsmInstructionStart+(73*4)
12706
12707 /* ------------------------------ */
12708 .L_ALT_OP_AGET_SHORT: /* 0x4a */
12709 /* File: x86/alt_stub.S */
12710 /*
12711  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12712  * any interesting requests and then jump to the real instruction
12713  * handler.  Unlike the Arm handler, we can't do this as a tail call
12714  * because rIBASE is caller save and we need to reload it.
12715  */
12716     movl   rSELF, %eax
12717     movl   rPC, OUT_ARG0(%esp)
12718     movl   %eax, OUT_ARG1(%esp)
12719     call   dvmCheckInst                            # (dPC, self)
12720     movl   rSELF, %ecx
12721     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12722     jmp    *dvmAsmInstructionStart+(74*4)
12723
12724 /* ------------------------------ */
12725 .L_ALT_OP_APUT: /* 0x4b */
12726 /* File: x86/alt_stub.S */
12727 /*
12728  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12729  * any interesting requests and then jump to the real instruction
12730  * handler.  Unlike the Arm handler, we can't do this as a tail call
12731  * because rIBASE is caller save and we need to reload it.
12732  */
12733     movl   rSELF, %eax
12734     movl   rPC, OUT_ARG0(%esp)
12735     movl   %eax, OUT_ARG1(%esp)
12736     call   dvmCheckInst                            # (dPC, self)
12737     movl   rSELF, %ecx
12738     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12739     jmp    *dvmAsmInstructionStart+(75*4)
12740
12741 /* ------------------------------ */
12742 .L_ALT_OP_APUT_WIDE: /* 0x4c */
12743 /* File: x86/alt_stub.S */
12744 /*
12745  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12746  * any interesting requests and then jump to the real instruction
12747  * handler.  Unlike the Arm handler, we can't do this as a tail call
12748  * because rIBASE is caller save and we need to reload it.
12749  */
12750     movl   rSELF, %eax
12751     movl   rPC, OUT_ARG0(%esp)
12752     movl   %eax, OUT_ARG1(%esp)
12753     call   dvmCheckInst                            # (dPC, self)
12754     movl   rSELF, %ecx
12755     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12756     jmp    *dvmAsmInstructionStart+(76*4)
12757
12758 /* ------------------------------ */
12759 .L_ALT_OP_APUT_OBJECT: /* 0x4d */
12760 /* File: x86/alt_stub.S */
12761 /*
12762  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12763  * any interesting requests and then jump to the real instruction
12764  * handler.  Unlike the Arm handler, we can't do this as a tail call
12765  * because rIBASE is caller save and we need to reload it.
12766  */
12767     movl   rSELF, %eax
12768     movl   rPC, OUT_ARG0(%esp)
12769     movl   %eax, OUT_ARG1(%esp)
12770     call   dvmCheckInst                            # (dPC, self)
12771     movl   rSELF, %ecx
12772     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12773     jmp    *dvmAsmInstructionStart+(77*4)
12774
12775 /* ------------------------------ */
12776 .L_ALT_OP_APUT_BOOLEAN: /* 0x4e */
12777 /* File: x86/alt_stub.S */
12778 /*
12779  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12780  * any interesting requests and then jump to the real instruction
12781  * handler.  Unlike the Arm handler, we can't do this as a tail call
12782  * because rIBASE is caller save and we need to reload it.
12783  */
12784     movl   rSELF, %eax
12785     movl   rPC, OUT_ARG0(%esp)
12786     movl   %eax, OUT_ARG1(%esp)
12787     call   dvmCheckInst                            # (dPC, self)
12788     movl   rSELF, %ecx
12789     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12790     jmp    *dvmAsmInstructionStart+(78*4)
12791
12792 /* ------------------------------ */
12793 .L_ALT_OP_APUT_BYTE: /* 0x4f */
12794 /* File: x86/alt_stub.S */
12795 /*
12796  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12797  * any interesting requests and then jump to the real instruction
12798  * handler.  Unlike the Arm handler, we can't do this as a tail call
12799  * because rIBASE is caller save and we need to reload it.
12800  */
12801     movl   rSELF, %eax
12802     movl   rPC, OUT_ARG0(%esp)
12803     movl   %eax, OUT_ARG1(%esp)
12804     call   dvmCheckInst                            # (dPC, self)
12805     movl   rSELF, %ecx
12806     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12807     jmp    *dvmAsmInstructionStart+(79*4)
12808
12809 /* ------------------------------ */
12810 .L_ALT_OP_APUT_CHAR: /* 0x50 */
12811 /* File: x86/alt_stub.S */
12812 /*
12813  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12814  * any interesting requests and then jump to the real instruction
12815  * handler.  Unlike the Arm handler, we can't do this as a tail call
12816  * because rIBASE is caller save and we need to reload it.
12817  */
12818     movl   rSELF, %eax
12819     movl   rPC, OUT_ARG0(%esp)
12820     movl   %eax, OUT_ARG1(%esp)
12821     call   dvmCheckInst                            # (dPC, self)
12822     movl   rSELF, %ecx
12823     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12824     jmp    *dvmAsmInstructionStart+(80*4)
12825
12826 /* ------------------------------ */
12827 .L_ALT_OP_APUT_SHORT: /* 0x51 */
12828 /* File: x86/alt_stub.S */
12829 /*
12830  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12831  * any interesting requests and then jump to the real instruction
12832  * handler.  Unlike the Arm handler, we can't do this as a tail call
12833  * because rIBASE is caller save and we need to reload it.
12834  */
12835     movl   rSELF, %eax
12836     movl   rPC, OUT_ARG0(%esp)
12837     movl   %eax, OUT_ARG1(%esp)
12838     call   dvmCheckInst                            # (dPC, self)
12839     movl   rSELF, %ecx
12840     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12841     jmp    *dvmAsmInstructionStart+(81*4)
12842
12843 /* ------------------------------ */
12844 .L_ALT_OP_IGET: /* 0x52 */
12845 /* File: x86/alt_stub.S */
12846 /*
12847  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12848  * any interesting requests and then jump to the real instruction
12849  * handler.  Unlike the Arm handler, we can't do this as a tail call
12850  * because rIBASE is caller save and we need to reload it.
12851  */
12852     movl   rSELF, %eax
12853     movl   rPC, OUT_ARG0(%esp)
12854     movl   %eax, OUT_ARG1(%esp)
12855     call   dvmCheckInst                            # (dPC, self)
12856     movl   rSELF, %ecx
12857     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12858     jmp    *dvmAsmInstructionStart+(82*4)
12859
12860 /* ------------------------------ */
12861 .L_ALT_OP_IGET_WIDE: /* 0x53 */
12862 /* File: x86/alt_stub.S */
12863 /*
12864  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12865  * any interesting requests and then jump to the real instruction
12866  * handler.  Unlike the Arm handler, we can't do this as a tail call
12867  * because rIBASE is caller save and we need to reload it.
12868  */
12869     movl   rSELF, %eax
12870     movl   rPC, OUT_ARG0(%esp)
12871     movl   %eax, OUT_ARG1(%esp)
12872     call   dvmCheckInst                            # (dPC, self)
12873     movl   rSELF, %ecx
12874     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12875     jmp    *dvmAsmInstructionStart+(83*4)
12876
12877 /* ------------------------------ */
12878 .L_ALT_OP_IGET_OBJECT: /* 0x54 */
12879 /* File: x86/alt_stub.S */
12880 /*
12881  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12882  * any interesting requests and then jump to the real instruction
12883  * handler.  Unlike the Arm handler, we can't do this as a tail call
12884  * because rIBASE is caller save and we need to reload it.
12885  */
12886     movl   rSELF, %eax
12887     movl   rPC, OUT_ARG0(%esp)
12888     movl   %eax, OUT_ARG1(%esp)
12889     call   dvmCheckInst                            # (dPC, self)
12890     movl   rSELF, %ecx
12891     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12892     jmp    *dvmAsmInstructionStart+(84*4)
12893
12894 /* ------------------------------ */
12895 .L_ALT_OP_IGET_BOOLEAN: /* 0x55 */
12896 /* File: x86/alt_stub.S */
12897 /*
12898  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12899  * any interesting requests and then jump to the real instruction
12900  * handler.  Unlike the Arm handler, we can't do this as a tail call
12901  * because rIBASE is caller save and we need to reload it.
12902  */
12903     movl   rSELF, %eax
12904     movl   rPC, OUT_ARG0(%esp)
12905     movl   %eax, OUT_ARG1(%esp)
12906     call   dvmCheckInst                            # (dPC, self)
12907     movl   rSELF, %ecx
12908     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12909     jmp    *dvmAsmInstructionStart+(85*4)
12910
12911 /* ------------------------------ */
12912 .L_ALT_OP_IGET_BYTE: /* 0x56 */
12913 /* File: x86/alt_stub.S */
12914 /*
12915  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12916  * any interesting requests and then jump to the real instruction
12917  * handler.  Unlike the Arm handler, we can't do this as a tail call
12918  * because rIBASE is caller save and we need to reload it.
12919  */
12920     movl   rSELF, %eax
12921     movl   rPC, OUT_ARG0(%esp)
12922     movl   %eax, OUT_ARG1(%esp)
12923     call   dvmCheckInst                            # (dPC, self)
12924     movl   rSELF, %ecx
12925     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12926     jmp    *dvmAsmInstructionStart+(86*4)
12927
12928 /* ------------------------------ */
12929 .L_ALT_OP_IGET_CHAR: /* 0x57 */
12930 /* File: x86/alt_stub.S */
12931 /*
12932  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12933  * any interesting requests and then jump to the real instruction
12934  * handler.  Unlike the Arm handler, we can't do this as a tail call
12935  * because rIBASE is caller save and we need to reload it.
12936  */
12937     movl   rSELF, %eax
12938     movl   rPC, OUT_ARG0(%esp)
12939     movl   %eax, OUT_ARG1(%esp)
12940     call   dvmCheckInst                            # (dPC, self)
12941     movl   rSELF, %ecx
12942     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12943     jmp    *dvmAsmInstructionStart+(87*4)
12944
12945 /* ------------------------------ */
12946 .L_ALT_OP_IGET_SHORT: /* 0x58 */
12947 /* File: x86/alt_stub.S */
12948 /*
12949  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12950  * any interesting requests and then jump to the real instruction
12951  * handler.  Unlike the Arm handler, we can't do this as a tail call
12952  * because rIBASE is caller save and we need to reload it.
12953  */
12954     movl   rSELF, %eax
12955     movl   rPC, OUT_ARG0(%esp)
12956     movl   %eax, OUT_ARG1(%esp)
12957     call   dvmCheckInst                            # (dPC, self)
12958     movl   rSELF, %ecx
12959     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12960     jmp    *dvmAsmInstructionStart+(88*4)
12961
12962 /* ------------------------------ */
12963 .L_ALT_OP_IPUT: /* 0x59 */
12964 /* File: x86/alt_stub.S */
12965 /*
12966  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12967  * any interesting requests and then jump to the real instruction
12968  * handler.  Unlike the Arm handler, we can't do this as a tail call
12969  * because rIBASE is caller save and we need to reload it.
12970  */
12971     movl   rSELF, %eax
12972     movl   rPC, OUT_ARG0(%esp)
12973     movl   %eax, OUT_ARG1(%esp)
12974     call   dvmCheckInst                            # (dPC, self)
12975     movl   rSELF, %ecx
12976     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12977     jmp    *dvmAsmInstructionStart+(89*4)
12978
12979 /* ------------------------------ */
12980 .L_ALT_OP_IPUT_WIDE: /* 0x5a */
12981 /* File: x86/alt_stub.S */
12982 /*
12983  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
12984  * any interesting requests and then jump to the real instruction
12985  * handler.  Unlike the Arm handler, we can't do this as a tail call
12986  * because rIBASE is caller save and we need to reload it.
12987  */
12988     movl   rSELF, %eax
12989     movl   rPC, OUT_ARG0(%esp)
12990     movl   %eax, OUT_ARG1(%esp)
12991     call   dvmCheckInst                            # (dPC, self)
12992     movl   rSELF, %ecx
12993     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
12994     jmp    *dvmAsmInstructionStart+(90*4)
12995
12996 /* ------------------------------ */
12997 .L_ALT_OP_IPUT_OBJECT: /* 0x5b */
12998 /* File: x86/alt_stub.S */
12999 /*
13000  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13001  * any interesting requests and then jump to the real instruction
13002  * handler.  Unlike the Arm handler, we can't do this as a tail call
13003  * because rIBASE is caller save and we need to reload it.
13004  */
13005     movl   rSELF, %eax
13006     movl   rPC, OUT_ARG0(%esp)
13007     movl   %eax, OUT_ARG1(%esp)
13008     call   dvmCheckInst                            # (dPC, self)
13009     movl   rSELF, %ecx
13010     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13011     jmp    *dvmAsmInstructionStart+(91*4)
13012
13013 /* ------------------------------ */
13014 .L_ALT_OP_IPUT_BOOLEAN: /* 0x5c */
13015 /* File: x86/alt_stub.S */
13016 /*
13017  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13018  * any interesting requests and then jump to the real instruction
13019  * handler.  Unlike the Arm handler, we can't do this as a tail call
13020  * because rIBASE is caller save and we need to reload it.
13021  */
13022     movl   rSELF, %eax
13023     movl   rPC, OUT_ARG0(%esp)
13024     movl   %eax, OUT_ARG1(%esp)
13025     call   dvmCheckInst                            # (dPC, self)
13026     movl   rSELF, %ecx
13027     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13028     jmp    *dvmAsmInstructionStart+(92*4)
13029
13030 /* ------------------------------ */
13031 .L_ALT_OP_IPUT_BYTE: /* 0x5d */
13032 /* File: x86/alt_stub.S */
13033 /*
13034  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13035  * any interesting requests and then jump to the real instruction
13036  * handler.  Unlike the Arm handler, we can't do this as a tail call
13037  * because rIBASE is caller save and we need to reload it.
13038  */
13039     movl   rSELF, %eax
13040     movl   rPC, OUT_ARG0(%esp)
13041     movl   %eax, OUT_ARG1(%esp)
13042     call   dvmCheckInst                            # (dPC, self)
13043     movl   rSELF, %ecx
13044     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13045     jmp    *dvmAsmInstructionStart+(93*4)
13046
13047 /* ------------------------------ */
13048 .L_ALT_OP_IPUT_CHAR: /* 0x5e */
13049 /* File: x86/alt_stub.S */
13050 /*
13051  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13052  * any interesting requests and then jump to the real instruction
13053  * handler.  Unlike the Arm handler, we can't do this as a tail call
13054  * because rIBASE is caller save and we need to reload it.
13055  */
13056     movl   rSELF, %eax
13057     movl   rPC, OUT_ARG0(%esp)
13058     movl   %eax, OUT_ARG1(%esp)
13059     call   dvmCheckInst                            # (dPC, self)
13060     movl   rSELF, %ecx
13061     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13062     jmp    *dvmAsmInstructionStart+(94*4)
13063
13064 /* ------------------------------ */
13065 .L_ALT_OP_IPUT_SHORT: /* 0x5f */
13066 /* File: x86/alt_stub.S */
13067 /*
13068  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13069  * any interesting requests and then jump to the real instruction
13070  * handler.  Unlike the Arm handler, we can't do this as a tail call
13071  * because rIBASE is caller save and we need to reload it.
13072  */
13073     movl   rSELF, %eax
13074     movl   rPC, OUT_ARG0(%esp)
13075     movl   %eax, OUT_ARG1(%esp)
13076     call   dvmCheckInst                            # (dPC, self)
13077     movl   rSELF, %ecx
13078     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13079     jmp    *dvmAsmInstructionStart+(95*4)
13080
13081 /* ------------------------------ */
13082 .L_ALT_OP_SGET: /* 0x60 */
13083 /* File: x86/alt_stub.S */
13084 /*
13085  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13086  * any interesting requests and then jump to the real instruction
13087  * handler.  Unlike the Arm handler, we can't do this as a tail call
13088  * because rIBASE is caller save and we need to reload it.
13089  */
13090     movl   rSELF, %eax
13091     movl   rPC, OUT_ARG0(%esp)
13092     movl   %eax, OUT_ARG1(%esp)
13093     call   dvmCheckInst                            # (dPC, self)
13094     movl   rSELF, %ecx
13095     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13096     jmp    *dvmAsmInstructionStart+(96*4)
13097
13098 /* ------------------------------ */
13099 .L_ALT_OP_SGET_WIDE: /* 0x61 */
13100 /* File: x86/alt_stub.S */
13101 /*
13102  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13103  * any interesting requests and then jump to the real instruction
13104  * handler.  Unlike the Arm handler, we can't do this as a tail call
13105  * because rIBASE is caller save and we need to reload it.
13106  */
13107     movl   rSELF, %eax
13108     movl   rPC, OUT_ARG0(%esp)
13109     movl   %eax, OUT_ARG1(%esp)
13110     call   dvmCheckInst                            # (dPC, self)
13111     movl   rSELF, %ecx
13112     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13113     jmp    *dvmAsmInstructionStart+(97*4)
13114
13115 /* ------------------------------ */
13116 .L_ALT_OP_SGET_OBJECT: /* 0x62 */
13117 /* File: x86/alt_stub.S */
13118 /*
13119  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13120  * any interesting requests and then jump to the real instruction
13121  * handler.  Unlike the Arm handler, we can't do this as a tail call
13122  * because rIBASE is caller save and we need to reload it.
13123  */
13124     movl   rSELF, %eax
13125     movl   rPC, OUT_ARG0(%esp)
13126     movl   %eax, OUT_ARG1(%esp)
13127     call   dvmCheckInst                            # (dPC, self)
13128     movl   rSELF, %ecx
13129     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13130     jmp    *dvmAsmInstructionStart+(98*4)
13131
13132 /* ------------------------------ */
13133 .L_ALT_OP_SGET_BOOLEAN: /* 0x63 */
13134 /* File: x86/alt_stub.S */
13135 /*
13136  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13137  * any interesting requests and then jump to the real instruction
13138  * handler.  Unlike the Arm handler, we can't do this as a tail call
13139  * because rIBASE is caller save and we need to reload it.
13140  */
13141     movl   rSELF, %eax
13142     movl   rPC, OUT_ARG0(%esp)
13143     movl   %eax, OUT_ARG1(%esp)
13144     call   dvmCheckInst                            # (dPC, self)
13145     movl   rSELF, %ecx
13146     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13147     jmp    *dvmAsmInstructionStart+(99*4)
13148
13149 /* ------------------------------ */
13150 .L_ALT_OP_SGET_BYTE: /* 0x64 */
13151 /* File: x86/alt_stub.S */
13152 /*
13153  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13154  * any interesting requests and then jump to the real instruction
13155  * handler.  Unlike the Arm handler, we can't do this as a tail call
13156  * because rIBASE is caller save and we need to reload it.
13157  */
13158     movl   rSELF, %eax
13159     movl   rPC, OUT_ARG0(%esp)
13160     movl   %eax, OUT_ARG1(%esp)
13161     call   dvmCheckInst                            # (dPC, self)
13162     movl   rSELF, %ecx
13163     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13164     jmp    *dvmAsmInstructionStart+(100*4)
13165
13166 /* ------------------------------ */
13167 .L_ALT_OP_SGET_CHAR: /* 0x65 */
13168 /* File: x86/alt_stub.S */
13169 /*
13170  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13171  * any interesting requests and then jump to the real instruction
13172  * handler.  Unlike the Arm handler, we can't do this as a tail call
13173  * because rIBASE is caller save and we need to reload it.
13174  */
13175     movl   rSELF, %eax
13176     movl   rPC, OUT_ARG0(%esp)
13177     movl   %eax, OUT_ARG1(%esp)
13178     call   dvmCheckInst                            # (dPC, self)
13179     movl   rSELF, %ecx
13180     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13181     jmp    *dvmAsmInstructionStart+(101*4)
13182
13183 /* ------------------------------ */
13184 .L_ALT_OP_SGET_SHORT: /* 0x66 */
13185 /* File: x86/alt_stub.S */
13186 /*
13187  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13188  * any interesting requests and then jump to the real instruction
13189  * handler.  Unlike the Arm handler, we can't do this as a tail call
13190  * because rIBASE is caller save and we need to reload it.
13191  */
13192     movl   rSELF, %eax
13193     movl   rPC, OUT_ARG0(%esp)
13194     movl   %eax, OUT_ARG1(%esp)
13195     call   dvmCheckInst                            # (dPC, self)
13196     movl   rSELF, %ecx
13197     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13198     jmp    *dvmAsmInstructionStart+(102*4)
13199
13200 /* ------------------------------ */
13201 .L_ALT_OP_SPUT: /* 0x67 */
13202 /* File: x86/alt_stub.S */
13203 /*
13204  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13205  * any interesting requests and then jump to the real instruction
13206  * handler.  Unlike the Arm handler, we can't do this as a tail call
13207  * because rIBASE is caller save and we need to reload it.
13208  */
13209     movl   rSELF, %eax
13210     movl   rPC, OUT_ARG0(%esp)
13211     movl   %eax, OUT_ARG1(%esp)
13212     call   dvmCheckInst                            # (dPC, self)
13213     movl   rSELF, %ecx
13214     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13215     jmp    *dvmAsmInstructionStart+(103*4)
13216
13217 /* ------------------------------ */
13218 .L_ALT_OP_SPUT_WIDE: /* 0x68 */
13219 /* File: x86/alt_stub.S */
13220 /*
13221  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13222  * any interesting requests and then jump to the real instruction
13223  * handler.  Unlike the Arm handler, we can't do this as a tail call
13224  * because rIBASE is caller save and we need to reload it.
13225  */
13226     movl   rSELF, %eax
13227     movl   rPC, OUT_ARG0(%esp)
13228     movl   %eax, OUT_ARG1(%esp)
13229     call   dvmCheckInst                            # (dPC, self)
13230     movl   rSELF, %ecx
13231     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13232     jmp    *dvmAsmInstructionStart+(104*4)
13233
13234 /* ------------------------------ */
13235 .L_ALT_OP_SPUT_OBJECT: /* 0x69 */
13236 /* File: x86/alt_stub.S */
13237 /*
13238  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13239  * any interesting requests and then jump to the real instruction
13240  * handler.  Unlike the Arm handler, we can't do this as a tail call
13241  * because rIBASE is caller save and we need to reload it.
13242  */
13243     movl   rSELF, %eax
13244     movl   rPC, OUT_ARG0(%esp)
13245     movl   %eax, OUT_ARG1(%esp)
13246     call   dvmCheckInst                            # (dPC, self)
13247     movl   rSELF, %ecx
13248     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13249     jmp    *dvmAsmInstructionStart+(105*4)
13250
13251 /* ------------------------------ */
13252 .L_ALT_OP_SPUT_BOOLEAN: /* 0x6a */
13253 /* File: x86/alt_stub.S */
13254 /*
13255  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13256  * any interesting requests and then jump to the real instruction
13257  * handler.  Unlike the Arm handler, we can't do this as a tail call
13258  * because rIBASE is caller save and we need to reload it.
13259  */
13260     movl   rSELF, %eax
13261     movl   rPC, OUT_ARG0(%esp)
13262     movl   %eax, OUT_ARG1(%esp)
13263     call   dvmCheckInst                            # (dPC, self)
13264     movl   rSELF, %ecx
13265     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13266     jmp    *dvmAsmInstructionStart+(106*4)
13267
13268 /* ------------------------------ */
13269 .L_ALT_OP_SPUT_BYTE: /* 0x6b */
13270 /* File: x86/alt_stub.S */
13271 /*
13272  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13273  * any interesting requests and then jump to the real instruction
13274  * handler.  Unlike the Arm handler, we can't do this as a tail call
13275  * because rIBASE is caller save and we need to reload it.
13276  */
13277     movl   rSELF, %eax
13278     movl   rPC, OUT_ARG0(%esp)
13279     movl   %eax, OUT_ARG1(%esp)
13280     call   dvmCheckInst                            # (dPC, self)
13281     movl   rSELF, %ecx
13282     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13283     jmp    *dvmAsmInstructionStart+(107*4)
13284
13285 /* ------------------------------ */
13286 .L_ALT_OP_SPUT_CHAR: /* 0x6c */
13287 /* File: x86/alt_stub.S */
13288 /*
13289  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13290  * any interesting requests and then jump to the real instruction
13291  * handler.  Unlike the Arm handler, we can't do this as a tail call
13292  * because rIBASE is caller save and we need to reload it.
13293  */
13294     movl   rSELF, %eax
13295     movl   rPC, OUT_ARG0(%esp)
13296     movl   %eax, OUT_ARG1(%esp)
13297     call   dvmCheckInst                            # (dPC, self)
13298     movl   rSELF, %ecx
13299     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13300     jmp    *dvmAsmInstructionStart+(108*4)
13301
13302 /* ------------------------------ */
13303 .L_ALT_OP_SPUT_SHORT: /* 0x6d */
13304 /* File: x86/alt_stub.S */
13305 /*
13306  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13307  * any interesting requests and then jump to the real instruction
13308  * handler.  Unlike the Arm handler, we can't do this as a tail call
13309  * because rIBASE is caller save and we need to reload it.
13310  */
13311     movl   rSELF, %eax
13312     movl   rPC, OUT_ARG0(%esp)
13313     movl   %eax, OUT_ARG1(%esp)
13314     call   dvmCheckInst                            # (dPC, self)
13315     movl   rSELF, %ecx
13316     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13317     jmp    *dvmAsmInstructionStart+(109*4)
13318
13319 /* ------------------------------ */
13320 .L_ALT_OP_INVOKE_VIRTUAL: /* 0x6e */
13321 /* File: x86/alt_stub.S */
13322 /*
13323  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13324  * any interesting requests and then jump to the real instruction
13325  * handler.  Unlike the Arm handler, we can't do this as a tail call
13326  * because rIBASE is caller save and we need to reload it.
13327  */
13328     movl   rSELF, %eax
13329     movl   rPC, OUT_ARG0(%esp)
13330     movl   %eax, OUT_ARG1(%esp)
13331     call   dvmCheckInst                            # (dPC, self)
13332     movl   rSELF, %ecx
13333     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13334     jmp    *dvmAsmInstructionStart+(110*4)
13335
13336 /* ------------------------------ */
13337 .L_ALT_OP_INVOKE_SUPER: /* 0x6f */
13338 /* File: x86/alt_stub.S */
13339 /*
13340  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13341  * any interesting requests and then jump to the real instruction
13342  * handler.  Unlike the Arm handler, we can't do this as a tail call
13343  * because rIBASE is caller save and we need to reload it.
13344  */
13345     movl   rSELF, %eax
13346     movl   rPC, OUT_ARG0(%esp)
13347     movl   %eax, OUT_ARG1(%esp)
13348     call   dvmCheckInst                            # (dPC, self)
13349     movl   rSELF, %ecx
13350     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13351     jmp    *dvmAsmInstructionStart+(111*4)
13352
13353 /* ------------------------------ */
13354 .L_ALT_OP_INVOKE_DIRECT: /* 0x70 */
13355 /* File: x86/alt_stub.S */
13356 /*
13357  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13358  * any interesting requests and then jump to the real instruction
13359  * handler.  Unlike the Arm handler, we can't do this as a tail call
13360  * because rIBASE is caller save and we need to reload it.
13361  */
13362     movl   rSELF, %eax
13363     movl   rPC, OUT_ARG0(%esp)
13364     movl   %eax, OUT_ARG1(%esp)
13365     call   dvmCheckInst                            # (dPC, self)
13366     movl   rSELF, %ecx
13367     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13368     jmp    *dvmAsmInstructionStart+(112*4)
13369
13370 /* ------------------------------ */
13371 .L_ALT_OP_INVOKE_STATIC: /* 0x71 */
13372 /* File: x86/alt_stub.S */
13373 /*
13374  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13375  * any interesting requests and then jump to the real instruction
13376  * handler.  Unlike the Arm handler, we can't do this as a tail call
13377  * because rIBASE is caller save and we need to reload it.
13378  */
13379     movl   rSELF, %eax
13380     movl   rPC, OUT_ARG0(%esp)
13381     movl   %eax, OUT_ARG1(%esp)
13382     call   dvmCheckInst                            # (dPC, self)
13383     movl   rSELF, %ecx
13384     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13385     jmp    *dvmAsmInstructionStart+(113*4)
13386
13387 /* ------------------------------ */
13388 .L_ALT_OP_INVOKE_INTERFACE: /* 0x72 */
13389 /* File: x86/alt_stub.S */
13390 /*
13391  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13392  * any interesting requests and then jump to the real instruction
13393  * handler.  Unlike the Arm handler, we can't do this as a tail call
13394  * because rIBASE is caller save and we need to reload it.
13395  */
13396     movl   rSELF, %eax
13397     movl   rPC, OUT_ARG0(%esp)
13398     movl   %eax, OUT_ARG1(%esp)
13399     call   dvmCheckInst                            # (dPC, self)
13400     movl   rSELF, %ecx
13401     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13402     jmp    *dvmAsmInstructionStart+(114*4)
13403
13404 /* ------------------------------ */
13405 .L_ALT_OP_UNUSED_73: /* 0x73 */
13406 /* File: x86/alt_stub.S */
13407 /*
13408  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13409  * any interesting requests and then jump to the real instruction
13410  * handler.  Unlike the Arm handler, we can't do this as a tail call
13411  * because rIBASE is caller save and we need to reload it.
13412  */
13413     movl   rSELF, %eax
13414     movl   rPC, OUT_ARG0(%esp)
13415     movl   %eax, OUT_ARG1(%esp)
13416     call   dvmCheckInst                            # (dPC, self)
13417     movl   rSELF, %ecx
13418     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13419     jmp    *dvmAsmInstructionStart+(115*4)
13420
13421 /* ------------------------------ */
13422 .L_ALT_OP_INVOKE_VIRTUAL_RANGE: /* 0x74 */
13423 /* File: x86/alt_stub.S */
13424 /*
13425  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13426  * any interesting requests and then jump to the real instruction
13427  * handler.  Unlike the Arm handler, we can't do this as a tail call
13428  * because rIBASE is caller save and we need to reload it.
13429  */
13430     movl   rSELF, %eax
13431     movl   rPC, OUT_ARG0(%esp)
13432     movl   %eax, OUT_ARG1(%esp)
13433     call   dvmCheckInst                            # (dPC, self)
13434     movl   rSELF, %ecx
13435     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13436     jmp    *dvmAsmInstructionStart+(116*4)
13437
13438 /* ------------------------------ */
13439 .L_ALT_OP_INVOKE_SUPER_RANGE: /* 0x75 */
13440 /* File: x86/alt_stub.S */
13441 /*
13442  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13443  * any interesting requests and then jump to the real instruction
13444  * handler.  Unlike the Arm handler, we can't do this as a tail call
13445  * because rIBASE is caller save and we need to reload it.
13446  */
13447     movl   rSELF, %eax
13448     movl   rPC, OUT_ARG0(%esp)
13449     movl   %eax, OUT_ARG1(%esp)
13450     call   dvmCheckInst                            # (dPC, self)
13451     movl   rSELF, %ecx
13452     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13453     jmp    *dvmAsmInstructionStart+(117*4)
13454
13455 /* ------------------------------ */
13456 .L_ALT_OP_INVOKE_DIRECT_RANGE: /* 0x76 */
13457 /* File: x86/alt_stub.S */
13458 /*
13459  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13460  * any interesting requests and then jump to the real instruction
13461  * handler.  Unlike the Arm handler, we can't do this as a tail call
13462  * because rIBASE is caller save and we need to reload it.
13463  */
13464     movl   rSELF, %eax
13465     movl   rPC, OUT_ARG0(%esp)
13466     movl   %eax, OUT_ARG1(%esp)
13467     call   dvmCheckInst                            # (dPC, self)
13468     movl   rSELF, %ecx
13469     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13470     jmp    *dvmAsmInstructionStart+(118*4)
13471
13472 /* ------------------------------ */
13473 .L_ALT_OP_INVOKE_STATIC_RANGE: /* 0x77 */
13474 /* File: x86/alt_stub.S */
13475 /*
13476  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13477  * any interesting requests and then jump to the real instruction
13478  * handler.  Unlike the Arm handler, we can't do this as a tail call
13479  * because rIBASE is caller save and we need to reload it.
13480  */
13481     movl   rSELF, %eax
13482     movl   rPC, OUT_ARG0(%esp)
13483     movl   %eax, OUT_ARG1(%esp)
13484     call   dvmCheckInst                            # (dPC, self)
13485     movl   rSELF, %ecx
13486     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13487     jmp    *dvmAsmInstructionStart+(119*4)
13488
13489 /* ------------------------------ */
13490 .L_ALT_OP_INVOKE_INTERFACE_RANGE: /* 0x78 */
13491 /* File: x86/alt_stub.S */
13492 /*
13493  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13494  * any interesting requests and then jump to the real instruction
13495  * handler.  Unlike the Arm handler, we can't do this as a tail call
13496  * because rIBASE is caller save and we need to reload it.
13497  */
13498     movl   rSELF, %eax
13499     movl   rPC, OUT_ARG0(%esp)
13500     movl   %eax, OUT_ARG1(%esp)
13501     call   dvmCheckInst                            # (dPC, self)
13502     movl   rSELF, %ecx
13503     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13504     jmp    *dvmAsmInstructionStart+(120*4)
13505
13506 /* ------------------------------ */
13507 .L_ALT_OP_UNUSED_79: /* 0x79 */
13508 /* File: x86/alt_stub.S */
13509 /*
13510  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13511  * any interesting requests and then jump to the real instruction
13512  * handler.  Unlike the Arm handler, we can't do this as a tail call
13513  * because rIBASE is caller save and we need to reload it.
13514  */
13515     movl   rSELF, %eax
13516     movl   rPC, OUT_ARG0(%esp)
13517     movl   %eax, OUT_ARG1(%esp)
13518     call   dvmCheckInst                            # (dPC, self)
13519     movl   rSELF, %ecx
13520     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13521     jmp    *dvmAsmInstructionStart+(121*4)
13522
13523 /* ------------------------------ */
13524 .L_ALT_OP_UNUSED_7A: /* 0x7a */
13525 /* File: x86/alt_stub.S */
13526 /*
13527  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13528  * any interesting requests and then jump to the real instruction
13529  * handler.  Unlike the Arm handler, we can't do this as a tail call
13530  * because rIBASE is caller save and we need to reload it.
13531  */
13532     movl   rSELF, %eax
13533     movl   rPC, OUT_ARG0(%esp)
13534     movl   %eax, OUT_ARG1(%esp)
13535     call   dvmCheckInst                            # (dPC, self)
13536     movl   rSELF, %ecx
13537     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13538     jmp    *dvmAsmInstructionStart+(122*4)
13539
13540 /* ------------------------------ */
13541 .L_ALT_OP_NEG_INT: /* 0x7b */
13542 /* File: x86/alt_stub.S */
13543 /*
13544  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13545  * any interesting requests and then jump to the real instruction
13546  * handler.  Unlike the Arm handler, we can't do this as a tail call
13547  * because rIBASE is caller save and we need to reload it.
13548  */
13549     movl   rSELF, %eax
13550     movl   rPC, OUT_ARG0(%esp)
13551     movl   %eax, OUT_ARG1(%esp)
13552     call   dvmCheckInst                            # (dPC, self)
13553     movl   rSELF, %ecx
13554     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13555     jmp    *dvmAsmInstructionStart+(123*4)
13556
13557 /* ------------------------------ */
13558 .L_ALT_OP_NOT_INT: /* 0x7c */
13559 /* File: x86/alt_stub.S */
13560 /*
13561  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13562  * any interesting requests and then jump to the real instruction
13563  * handler.  Unlike the Arm handler, we can't do this as a tail call
13564  * because rIBASE is caller save and we need to reload it.
13565  */
13566     movl   rSELF, %eax
13567     movl   rPC, OUT_ARG0(%esp)
13568     movl   %eax, OUT_ARG1(%esp)
13569     call   dvmCheckInst                            # (dPC, self)
13570     movl   rSELF, %ecx
13571     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13572     jmp    *dvmAsmInstructionStart+(124*4)
13573
13574 /* ------------------------------ */
13575 .L_ALT_OP_NEG_LONG: /* 0x7d */
13576 /* File: x86/alt_stub.S */
13577 /*
13578  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13579  * any interesting requests and then jump to the real instruction
13580  * handler.  Unlike the Arm handler, we can't do this as a tail call
13581  * because rIBASE is caller save and we need to reload it.
13582  */
13583     movl   rSELF, %eax
13584     movl   rPC, OUT_ARG0(%esp)
13585     movl   %eax, OUT_ARG1(%esp)
13586     call   dvmCheckInst                            # (dPC, self)
13587     movl   rSELF, %ecx
13588     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13589     jmp    *dvmAsmInstructionStart+(125*4)
13590
13591 /* ------------------------------ */
13592 .L_ALT_OP_NOT_LONG: /* 0x7e */
13593 /* File: x86/alt_stub.S */
13594 /*
13595  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13596  * any interesting requests and then jump to the real instruction
13597  * handler.  Unlike the Arm handler, we can't do this as a tail call
13598  * because rIBASE is caller save and we need to reload it.
13599  */
13600     movl   rSELF, %eax
13601     movl   rPC, OUT_ARG0(%esp)
13602     movl   %eax, OUT_ARG1(%esp)
13603     call   dvmCheckInst                            # (dPC, self)
13604     movl   rSELF, %ecx
13605     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13606     jmp    *dvmAsmInstructionStart+(126*4)
13607
13608 /* ------------------------------ */
13609 .L_ALT_OP_NEG_FLOAT: /* 0x7f */
13610 /* File: x86/alt_stub.S */
13611 /*
13612  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13613  * any interesting requests and then jump to the real instruction
13614  * handler.  Unlike the Arm handler, we can't do this as a tail call
13615  * because rIBASE is caller save and we need to reload it.
13616  */
13617     movl   rSELF, %eax
13618     movl   rPC, OUT_ARG0(%esp)
13619     movl   %eax, OUT_ARG1(%esp)
13620     call   dvmCheckInst                            # (dPC, self)
13621     movl   rSELF, %ecx
13622     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13623     jmp    *dvmAsmInstructionStart+(127*4)
13624
13625 /* ------------------------------ */
13626 .L_ALT_OP_NEG_DOUBLE: /* 0x80 */
13627 /* File: x86/alt_stub.S */
13628 /*
13629  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13630  * any interesting requests and then jump to the real instruction
13631  * handler.  Unlike the Arm handler, we can't do this as a tail call
13632  * because rIBASE is caller save and we need to reload it.
13633  */
13634     movl   rSELF, %eax
13635     movl   rPC, OUT_ARG0(%esp)
13636     movl   %eax, OUT_ARG1(%esp)
13637     call   dvmCheckInst                            # (dPC, self)
13638     movl   rSELF, %ecx
13639     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13640     jmp    *dvmAsmInstructionStart+(128*4)
13641
13642 /* ------------------------------ */
13643 .L_ALT_OP_INT_TO_LONG: /* 0x81 */
13644 /* File: x86/alt_stub.S */
13645 /*
13646  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13647  * any interesting requests and then jump to the real instruction
13648  * handler.  Unlike the Arm handler, we can't do this as a tail call
13649  * because rIBASE is caller save and we need to reload it.
13650  */
13651     movl   rSELF, %eax
13652     movl   rPC, OUT_ARG0(%esp)
13653     movl   %eax, OUT_ARG1(%esp)
13654     call   dvmCheckInst                            # (dPC, self)
13655     movl   rSELF, %ecx
13656     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13657     jmp    *dvmAsmInstructionStart+(129*4)
13658
13659 /* ------------------------------ */
13660 .L_ALT_OP_INT_TO_FLOAT: /* 0x82 */
13661 /* File: x86/alt_stub.S */
13662 /*
13663  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13664  * any interesting requests and then jump to the real instruction
13665  * handler.  Unlike the Arm handler, we can't do this as a tail call
13666  * because rIBASE is caller save and we need to reload it.
13667  */
13668     movl   rSELF, %eax
13669     movl   rPC, OUT_ARG0(%esp)
13670     movl   %eax, OUT_ARG1(%esp)
13671     call   dvmCheckInst                            # (dPC, self)
13672     movl   rSELF, %ecx
13673     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13674     jmp    *dvmAsmInstructionStart+(130*4)
13675
13676 /* ------------------------------ */
13677 .L_ALT_OP_INT_TO_DOUBLE: /* 0x83 */
13678 /* File: x86/alt_stub.S */
13679 /*
13680  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13681  * any interesting requests and then jump to the real instruction
13682  * handler.  Unlike the Arm handler, we can't do this as a tail call
13683  * because rIBASE is caller save and we need to reload it.
13684  */
13685     movl   rSELF, %eax
13686     movl   rPC, OUT_ARG0(%esp)
13687     movl   %eax, OUT_ARG1(%esp)
13688     call   dvmCheckInst                            # (dPC, self)
13689     movl   rSELF, %ecx
13690     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13691     jmp    *dvmAsmInstructionStart+(131*4)
13692
13693 /* ------------------------------ */
13694 .L_ALT_OP_LONG_TO_INT: /* 0x84 */
13695 /* File: x86/alt_stub.S */
13696 /*
13697  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13698  * any interesting requests and then jump to the real instruction
13699  * handler.  Unlike the Arm handler, we can't do this as a tail call
13700  * because rIBASE is caller save and we need to reload it.
13701  */
13702     movl   rSELF, %eax
13703     movl   rPC, OUT_ARG0(%esp)
13704     movl   %eax, OUT_ARG1(%esp)
13705     call   dvmCheckInst                            # (dPC, self)
13706     movl   rSELF, %ecx
13707     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13708     jmp    *dvmAsmInstructionStart+(132*4)
13709
13710 /* ------------------------------ */
13711 .L_ALT_OP_LONG_TO_FLOAT: /* 0x85 */
13712 /* File: x86/alt_stub.S */
13713 /*
13714  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13715  * any interesting requests and then jump to the real instruction
13716  * handler.  Unlike the Arm handler, we can't do this as a tail call
13717  * because rIBASE is caller save and we need to reload it.
13718  */
13719     movl   rSELF, %eax
13720     movl   rPC, OUT_ARG0(%esp)
13721     movl   %eax, OUT_ARG1(%esp)
13722     call   dvmCheckInst                            # (dPC, self)
13723     movl   rSELF, %ecx
13724     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13725     jmp    *dvmAsmInstructionStart+(133*4)
13726
13727 /* ------------------------------ */
13728 .L_ALT_OP_LONG_TO_DOUBLE: /* 0x86 */
13729 /* File: x86/alt_stub.S */
13730 /*
13731  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13732  * any interesting requests and then jump to the real instruction
13733  * handler.  Unlike the Arm handler, we can't do this as a tail call
13734  * because rIBASE is caller save and we need to reload it.
13735  */
13736     movl   rSELF, %eax
13737     movl   rPC, OUT_ARG0(%esp)
13738     movl   %eax, OUT_ARG1(%esp)
13739     call   dvmCheckInst                            # (dPC, self)
13740     movl   rSELF, %ecx
13741     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13742     jmp    *dvmAsmInstructionStart+(134*4)
13743
13744 /* ------------------------------ */
13745 .L_ALT_OP_FLOAT_TO_INT: /* 0x87 */
13746 /* File: x86/alt_stub.S */
13747 /*
13748  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13749  * any interesting requests and then jump to the real instruction
13750  * handler.  Unlike the Arm handler, we can't do this as a tail call
13751  * because rIBASE is caller save and we need to reload it.
13752  */
13753     movl   rSELF, %eax
13754     movl   rPC, OUT_ARG0(%esp)
13755     movl   %eax, OUT_ARG1(%esp)
13756     call   dvmCheckInst                            # (dPC, self)
13757     movl   rSELF, %ecx
13758     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13759     jmp    *dvmAsmInstructionStart+(135*4)
13760
13761 /* ------------------------------ */
13762 .L_ALT_OP_FLOAT_TO_LONG: /* 0x88 */
13763 /* File: x86/alt_stub.S */
13764 /*
13765  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13766  * any interesting requests and then jump to the real instruction
13767  * handler.  Unlike the Arm handler, we can't do this as a tail call
13768  * because rIBASE is caller save and we need to reload it.
13769  */
13770     movl   rSELF, %eax
13771     movl   rPC, OUT_ARG0(%esp)
13772     movl   %eax, OUT_ARG1(%esp)
13773     call   dvmCheckInst                            # (dPC, self)
13774     movl   rSELF, %ecx
13775     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13776     jmp    *dvmAsmInstructionStart+(136*4)
13777
13778 /* ------------------------------ */
13779 .L_ALT_OP_FLOAT_TO_DOUBLE: /* 0x89 */
13780 /* File: x86/alt_stub.S */
13781 /*
13782  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13783  * any interesting requests and then jump to the real instruction
13784  * handler.  Unlike the Arm handler, we can't do this as a tail call
13785  * because rIBASE is caller save and we need to reload it.
13786  */
13787     movl   rSELF, %eax
13788     movl   rPC, OUT_ARG0(%esp)
13789     movl   %eax, OUT_ARG1(%esp)
13790     call   dvmCheckInst                            # (dPC, self)
13791     movl   rSELF, %ecx
13792     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13793     jmp    *dvmAsmInstructionStart+(137*4)
13794
13795 /* ------------------------------ */
13796 .L_ALT_OP_DOUBLE_TO_INT: /* 0x8a */
13797 /* File: x86/alt_stub.S */
13798 /*
13799  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13800  * any interesting requests and then jump to the real instruction
13801  * handler.  Unlike the Arm handler, we can't do this as a tail call
13802  * because rIBASE is caller save and we need to reload it.
13803  */
13804     movl   rSELF, %eax
13805     movl   rPC, OUT_ARG0(%esp)
13806     movl   %eax, OUT_ARG1(%esp)
13807     call   dvmCheckInst                            # (dPC, self)
13808     movl   rSELF, %ecx
13809     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13810     jmp    *dvmAsmInstructionStart+(138*4)
13811
13812 /* ------------------------------ */
13813 .L_ALT_OP_DOUBLE_TO_LONG: /* 0x8b */
13814 /* File: x86/alt_stub.S */
13815 /*
13816  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13817  * any interesting requests and then jump to the real instruction
13818  * handler.  Unlike the Arm handler, we can't do this as a tail call
13819  * because rIBASE is caller save and we need to reload it.
13820  */
13821     movl   rSELF, %eax
13822     movl   rPC, OUT_ARG0(%esp)
13823     movl   %eax, OUT_ARG1(%esp)
13824     call   dvmCheckInst                            # (dPC, self)
13825     movl   rSELF, %ecx
13826     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13827     jmp    *dvmAsmInstructionStart+(139*4)
13828
13829 /* ------------------------------ */
13830 .L_ALT_OP_DOUBLE_TO_FLOAT: /* 0x8c */
13831 /* File: x86/alt_stub.S */
13832 /*
13833  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13834  * any interesting requests and then jump to the real instruction
13835  * handler.  Unlike the Arm handler, we can't do this as a tail call
13836  * because rIBASE is caller save and we need to reload it.
13837  */
13838     movl   rSELF, %eax
13839     movl   rPC, OUT_ARG0(%esp)
13840     movl   %eax, OUT_ARG1(%esp)
13841     call   dvmCheckInst                            # (dPC, self)
13842     movl   rSELF, %ecx
13843     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13844     jmp    *dvmAsmInstructionStart+(140*4)
13845
13846 /* ------------------------------ */
13847 .L_ALT_OP_INT_TO_BYTE: /* 0x8d */
13848 /* File: x86/alt_stub.S */
13849 /*
13850  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13851  * any interesting requests and then jump to the real instruction
13852  * handler.  Unlike the Arm handler, we can't do this as a tail call
13853  * because rIBASE is caller save and we need to reload it.
13854  */
13855     movl   rSELF, %eax
13856     movl   rPC, OUT_ARG0(%esp)
13857     movl   %eax, OUT_ARG1(%esp)
13858     call   dvmCheckInst                            # (dPC, self)
13859     movl   rSELF, %ecx
13860     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13861     jmp    *dvmAsmInstructionStart+(141*4)
13862
13863 /* ------------------------------ */
13864 .L_ALT_OP_INT_TO_CHAR: /* 0x8e */
13865 /* File: x86/alt_stub.S */
13866 /*
13867  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13868  * any interesting requests and then jump to the real instruction
13869  * handler.  Unlike the Arm handler, we can't do this as a tail call
13870  * because rIBASE is caller save and we need to reload it.
13871  */
13872     movl   rSELF, %eax
13873     movl   rPC, OUT_ARG0(%esp)
13874     movl   %eax, OUT_ARG1(%esp)
13875     call   dvmCheckInst                            # (dPC, self)
13876     movl   rSELF, %ecx
13877     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13878     jmp    *dvmAsmInstructionStart+(142*4)
13879
13880 /* ------------------------------ */
13881 .L_ALT_OP_INT_TO_SHORT: /* 0x8f */
13882 /* File: x86/alt_stub.S */
13883 /*
13884  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13885  * any interesting requests and then jump to the real instruction
13886  * handler.  Unlike the Arm handler, we can't do this as a tail call
13887  * because rIBASE is caller save and we need to reload it.
13888  */
13889     movl   rSELF, %eax
13890     movl   rPC, OUT_ARG0(%esp)
13891     movl   %eax, OUT_ARG1(%esp)
13892     call   dvmCheckInst                            # (dPC, self)
13893     movl   rSELF, %ecx
13894     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13895     jmp    *dvmAsmInstructionStart+(143*4)
13896
13897 /* ------------------------------ */
13898 .L_ALT_OP_ADD_INT: /* 0x90 */
13899 /* File: x86/alt_stub.S */
13900 /*
13901  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13902  * any interesting requests and then jump to the real instruction
13903  * handler.  Unlike the Arm handler, we can't do this as a tail call
13904  * because rIBASE is caller save and we need to reload it.
13905  */
13906     movl   rSELF, %eax
13907     movl   rPC, OUT_ARG0(%esp)
13908     movl   %eax, OUT_ARG1(%esp)
13909     call   dvmCheckInst                            # (dPC, self)
13910     movl   rSELF, %ecx
13911     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13912     jmp    *dvmAsmInstructionStart+(144*4)
13913
13914 /* ------------------------------ */
13915 .L_ALT_OP_SUB_INT: /* 0x91 */
13916 /* File: x86/alt_stub.S */
13917 /*
13918  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13919  * any interesting requests and then jump to the real instruction
13920  * handler.  Unlike the Arm handler, we can't do this as a tail call
13921  * because rIBASE is caller save and we need to reload it.
13922  */
13923     movl   rSELF, %eax
13924     movl   rPC, OUT_ARG0(%esp)
13925     movl   %eax, OUT_ARG1(%esp)
13926     call   dvmCheckInst                            # (dPC, self)
13927     movl   rSELF, %ecx
13928     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13929     jmp    *dvmAsmInstructionStart+(145*4)
13930
13931 /* ------------------------------ */
13932 .L_ALT_OP_MUL_INT: /* 0x92 */
13933 /* File: x86/alt_stub.S */
13934 /*
13935  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13936  * any interesting requests and then jump to the real instruction
13937  * handler.  Unlike the Arm handler, we can't do this as a tail call
13938  * because rIBASE is caller save and we need to reload it.
13939  */
13940     movl   rSELF, %eax
13941     movl   rPC, OUT_ARG0(%esp)
13942     movl   %eax, OUT_ARG1(%esp)
13943     call   dvmCheckInst                            # (dPC, self)
13944     movl   rSELF, %ecx
13945     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13946     jmp    *dvmAsmInstructionStart+(146*4)
13947
13948 /* ------------------------------ */
13949 .L_ALT_OP_DIV_INT: /* 0x93 */
13950 /* File: x86/alt_stub.S */
13951 /*
13952  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13953  * any interesting requests and then jump to the real instruction
13954  * handler.  Unlike the Arm handler, we can't do this as a tail call
13955  * because rIBASE is caller save and we need to reload it.
13956  */
13957     movl   rSELF, %eax
13958     movl   rPC, OUT_ARG0(%esp)
13959     movl   %eax, OUT_ARG1(%esp)
13960     call   dvmCheckInst                            # (dPC, self)
13961     movl   rSELF, %ecx
13962     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13963     jmp    *dvmAsmInstructionStart+(147*4)
13964
13965 /* ------------------------------ */
13966 .L_ALT_OP_REM_INT: /* 0x94 */
13967 /* File: x86/alt_stub.S */
13968 /*
13969  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13970  * any interesting requests and then jump to the real instruction
13971  * handler.  Unlike the Arm handler, we can't do this as a tail call
13972  * because rIBASE is caller save and we need to reload it.
13973  */
13974     movl   rSELF, %eax
13975     movl   rPC, OUT_ARG0(%esp)
13976     movl   %eax, OUT_ARG1(%esp)
13977     call   dvmCheckInst                            # (dPC, self)
13978     movl   rSELF, %ecx
13979     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13980     jmp    *dvmAsmInstructionStart+(148*4)
13981
13982 /* ------------------------------ */
13983 .L_ALT_OP_AND_INT: /* 0x95 */
13984 /* File: x86/alt_stub.S */
13985 /*
13986  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
13987  * any interesting requests and then jump to the real instruction
13988  * handler.  Unlike the Arm handler, we can't do this as a tail call
13989  * because rIBASE is caller save and we need to reload it.
13990  */
13991     movl   rSELF, %eax
13992     movl   rPC, OUT_ARG0(%esp)
13993     movl   %eax, OUT_ARG1(%esp)
13994     call   dvmCheckInst                            # (dPC, self)
13995     movl   rSELF, %ecx
13996     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
13997     jmp    *dvmAsmInstructionStart+(149*4)
13998
13999 /* ------------------------------ */
14000 .L_ALT_OP_OR_INT: /* 0x96 */
14001 /* File: x86/alt_stub.S */
14002 /*
14003  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14004  * any interesting requests and then jump to the real instruction
14005  * handler.  Unlike the Arm handler, we can't do this as a tail call
14006  * because rIBASE is caller save and we need to reload it.
14007  */
14008     movl   rSELF, %eax
14009     movl   rPC, OUT_ARG0(%esp)
14010     movl   %eax, OUT_ARG1(%esp)
14011     call   dvmCheckInst                            # (dPC, self)
14012     movl   rSELF, %ecx
14013     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14014     jmp    *dvmAsmInstructionStart+(150*4)
14015
14016 /* ------------------------------ */
14017 .L_ALT_OP_XOR_INT: /* 0x97 */
14018 /* File: x86/alt_stub.S */
14019 /*
14020  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14021  * any interesting requests and then jump to the real instruction
14022  * handler.  Unlike the Arm handler, we can't do this as a tail call
14023  * because rIBASE is caller save and we need to reload it.
14024  */
14025     movl   rSELF, %eax
14026     movl   rPC, OUT_ARG0(%esp)
14027     movl   %eax, OUT_ARG1(%esp)
14028     call   dvmCheckInst                            # (dPC, self)
14029     movl   rSELF, %ecx
14030     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14031     jmp    *dvmAsmInstructionStart+(151*4)
14032
14033 /* ------------------------------ */
14034 .L_ALT_OP_SHL_INT: /* 0x98 */
14035 /* File: x86/alt_stub.S */
14036 /*
14037  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14038  * any interesting requests and then jump to the real instruction
14039  * handler.  Unlike the Arm handler, we can't do this as a tail call
14040  * because rIBASE is caller save and we need to reload it.
14041  */
14042     movl   rSELF, %eax
14043     movl   rPC, OUT_ARG0(%esp)
14044     movl   %eax, OUT_ARG1(%esp)
14045     call   dvmCheckInst                            # (dPC, self)
14046     movl   rSELF, %ecx
14047     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14048     jmp    *dvmAsmInstructionStart+(152*4)
14049
14050 /* ------------------------------ */
14051 .L_ALT_OP_SHR_INT: /* 0x99 */
14052 /* File: x86/alt_stub.S */
14053 /*
14054  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14055  * any interesting requests and then jump to the real instruction
14056  * handler.  Unlike the Arm handler, we can't do this as a tail call
14057  * because rIBASE is caller save and we need to reload it.
14058  */
14059     movl   rSELF, %eax
14060     movl   rPC, OUT_ARG0(%esp)
14061     movl   %eax, OUT_ARG1(%esp)
14062     call   dvmCheckInst                            # (dPC, self)
14063     movl   rSELF, %ecx
14064     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14065     jmp    *dvmAsmInstructionStart+(153*4)
14066
14067 /* ------------------------------ */
14068 .L_ALT_OP_USHR_INT: /* 0x9a */
14069 /* File: x86/alt_stub.S */
14070 /*
14071  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14072  * any interesting requests and then jump to the real instruction
14073  * handler.  Unlike the Arm handler, we can't do this as a tail call
14074  * because rIBASE is caller save and we need to reload it.
14075  */
14076     movl   rSELF, %eax
14077     movl   rPC, OUT_ARG0(%esp)
14078     movl   %eax, OUT_ARG1(%esp)
14079     call   dvmCheckInst                            # (dPC, self)
14080     movl   rSELF, %ecx
14081     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14082     jmp    *dvmAsmInstructionStart+(154*4)
14083
14084 /* ------------------------------ */
14085 .L_ALT_OP_ADD_LONG: /* 0x9b */
14086 /* File: x86/alt_stub.S */
14087 /*
14088  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14089  * any interesting requests and then jump to the real instruction
14090  * handler.  Unlike the Arm handler, we can't do this as a tail call
14091  * because rIBASE is caller save and we need to reload it.
14092  */
14093     movl   rSELF, %eax
14094     movl   rPC, OUT_ARG0(%esp)
14095     movl   %eax, OUT_ARG1(%esp)
14096     call   dvmCheckInst                            # (dPC, self)
14097     movl   rSELF, %ecx
14098     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14099     jmp    *dvmAsmInstructionStart+(155*4)
14100
14101 /* ------------------------------ */
14102 .L_ALT_OP_SUB_LONG: /* 0x9c */
14103 /* File: x86/alt_stub.S */
14104 /*
14105  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14106  * any interesting requests and then jump to the real instruction
14107  * handler.  Unlike the Arm handler, we can't do this as a tail call
14108  * because rIBASE is caller save and we need to reload it.
14109  */
14110     movl   rSELF, %eax
14111     movl   rPC, OUT_ARG0(%esp)
14112     movl   %eax, OUT_ARG1(%esp)
14113     call   dvmCheckInst                            # (dPC, self)
14114     movl   rSELF, %ecx
14115     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14116     jmp    *dvmAsmInstructionStart+(156*4)
14117
14118 /* ------------------------------ */
14119 .L_ALT_OP_MUL_LONG: /* 0x9d */
14120 /* File: x86/alt_stub.S */
14121 /*
14122  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14123  * any interesting requests and then jump to the real instruction
14124  * handler.  Unlike the Arm handler, we can't do this as a tail call
14125  * because rIBASE is caller save and we need to reload it.
14126  */
14127     movl   rSELF, %eax
14128     movl   rPC, OUT_ARG0(%esp)
14129     movl   %eax, OUT_ARG1(%esp)
14130     call   dvmCheckInst                            # (dPC, self)
14131     movl   rSELF, %ecx
14132     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14133     jmp    *dvmAsmInstructionStart+(157*4)
14134
14135 /* ------------------------------ */
14136 .L_ALT_OP_DIV_LONG: /* 0x9e */
14137 /* File: x86/alt_stub.S */
14138 /*
14139  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14140  * any interesting requests and then jump to the real instruction
14141  * handler.  Unlike the Arm handler, we can't do this as a tail call
14142  * because rIBASE is caller save and we need to reload it.
14143  */
14144     movl   rSELF, %eax
14145     movl   rPC, OUT_ARG0(%esp)
14146     movl   %eax, OUT_ARG1(%esp)
14147     call   dvmCheckInst                            # (dPC, self)
14148     movl   rSELF, %ecx
14149     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14150     jmp    *dvmAsmInstructionStart+(158*4)
14151
14152 /* ------------------------------ */
14153 .L_ALT_OP_REM_LONG: /* 0x9f */
14154 /* File: x86/alt_stub.S */
14155 /*
14156  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14157  * any interesting requests and then jump to the real instruction
14158  * handler.  Unlike the Arm handler, we can't do this as a tail call
14159  * because rIBASE is caller save and we need to reload it.
14160  */
14161     movl   rSELF, %eax
14162     movl   rPC, OUT_ARG0(%esp)
14163     movl   %eax, OUT_ARG1(%esp)
14164     call   dvmCheckInst                            # (dPC, self)
14165     movl   rSELF, %ecx
14166     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14167     jmp    *dvmAsmInstructionStart+(159*4)
14168
14169 /* ------------------------------ */
14170 .L_ALT_OP_AND_LONG: /* 0xa0 */
14171 /* File: x86/alt_stub.S */
14172 /*
14173  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14174  * any interesting requests and then jump to the real instruction
14175  * handler.  Unlike the Arm handler, we can't do this as a tail call
14176  * because rIBASE is caller save and we need to reload it.
14177  */
14178     movl   rSELF, %eax
14179     movl   rPC, OUT_ARG0(%esp)
14180     movl   %eax, OUT_ARG1(%esp)
14181     call   dvmCheckInst                            # (dPC, self)
14182     movl   rSELF, %ecx
14183     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14184     jmp    *dvmAsmInstructionStart+(160*4)
14185
14186 /* ------------------------------ */
14187 .L_ALT_OP_OR_LONG: /* 0xa1 */
14188 /* File: x86/alt_stub.S */
14189 /*
14190  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14191  * any interesting requests and then jump to the real instruction
14192  * handler.  Unlike the Arm handler, we can't do this as a tail call
14193  * because rIBASE is caller save and we need to reload it.
14194  */
14195     movl   rSELF, %eax
14196     movl   rPC, OUT_ARG0(%esp)
14197     movl   %eax, OUT_ARG1(%esp)
14198     call   dvmCheckInst                            # (dPC, self)
14199     movl   rSELF, %ecx
14200     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14201     jmp    *dvmAsmInstructionStart+(161*4)
14202
14203 /* ------------------------------ */
14204 .L_ALT_OP_XOR_LONG: /* 0xa2 */
14205 /* File: x86/alt_stub.S */
14206 /*
14207  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14208  * any interesting requests and then jump to the real instruction
14209  * handler.  Unlike the Arm handler, we can't do this as a tail call
14210  * because rIBASE is caller save and we need to reload it.
14211  */
14212     movl   rSELF, %eax
14213     movl   rPC, OUT_ARG0(%esp)
14214     movl   %eax, OUT_ARG1(%esp)
14215     call   dvmCheckInst                            # (dPC, self)
14216     movl   rSELF, %ecx
14217     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14218     jmp    *dvmAsmInstructionStart+(162*4)
14219
14220 /* ------------------------------ */
14221 .L_ALT_OP_SHL_LONG: /* 0xa3 */
14222 /* File: x86/alt_stub.S */
14223 /*
14224  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14225  * any interesting requests and then jump to the real instruction
14226  * handler.  Unlike the Arm handler, we can't do this as a tail call
14227  * because rIBASE is caller save and we need to reload it.
14228  */
14229     movl   rSELF, %eax
14230     movl   rPC, OUT_ARG0(%esp)
14231     movl   %eax, OUT_ARG1(%esp)
14232     call   dvmCheckInst                            # (dPC, self)
14233     movl   rSELF, %ecx
14234     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14235     jmp    *dvmAsmInstructionStart+(163*4)
14236
14237 /* ------------------------------ */
14238 .L_ALT_OP_SHR_LONG: /* 0xa4 */
14239 /* File: x86/alt_stub.S */
14240 /*
14241  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14242  * any interesting requests and then jump to the real instruction
14243  * handler.  Unlike the Arm handler, we can't do this as a tail call
14244  * because rIBASE is caller save and we need to reload it.
14245  */
14246     movl   rSELF, %eax
14247     movl   rPC, OUT_ARG0(%esp)
14248     movl   %eax, OUT_ARG1(%esp)
14249     call   dvmCheckInst                            # (dPC, self)
14250     movl   rSELF, %ecx
14251     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14252     jmp    *dvmAsmInstructionStart+(164*4)
14253
14254 /* ------------------------------ */
14255 .L_ALT_OP_USHR_LONG: /* 0xa5 */
14256 /* File: x86/alt_stub.S */
14257 /*
14258  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14259  * any interesting requests and then jump to the real instruction
14260  * handler.  Unlike the Arm handler, we can't do this as a tail call
14261  * because rIBASE is caller save and we need to reload it.
14262  */
14263     movl   rSELF, %eax
14264     movl   rPC, OUT_ARG0(%esp)
14265     movl   %eax, OUT_ARG1(%esp)
14266     call   dvmCheckInst                            # (dPC, self)
14267     movl   rSELF, %ecx
14268     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14269     jmp    *dvmAsmInstructionStart+(165*4)
14270
14271 /* ------------------------------ */
14272 .L_ALT_OP_ADD_FLOAT: /* 0xa6 */
14273 /* File: x86/alt_stub.S */
14274 /*
14275  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14276  * any interesting requests and then jump to the real instruction
14277  * handler.  Unlike the Arm handler, we can't do this as a tail call
14278  * because rIBASE is caller save and we need to reload it.
14279  */
14280     movl   rSELF, %eax
14281     movl   rPC, OUT_ARG0(%esp)
14282     movl   %eax, OUT_ARG1(%esp)
14283     call   dvmCheckInst                            # (dPC, self)
14284     movl   rSELF, %ecx
14285     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14286     jmp    *dvmAsmInstructionStart+(166*4)
14287
14288 /* ------------------------------ */
14289 .L_ALT_OP_SUB_FLOAT: /* 0xa7 */
14290 /* File: x86/alt_stub.S */
14291 /*
14292  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14293  * any interesting requests and then jump to the real instruction
14294  * handler.  Unlike the Arm handler, we can't do this as a tail call
14295  * because rIBASE is caller save and we need to reload it.
14296  */
14297     movl   rSELF, %eax
14298     movl   rPC, OUT_ARG0(%esp)
14299     movl   %eax, OUT_ARG1(%esp)
14300     call   dvmCheckInst                            # (dPC, self)
14301     movl   rSELF, %ecx
14302     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14303     jmp    *dvmAsmInstructionStart+(167*4)
14304
14305 /* ------------------------------ */
14306 .L_ALT_OP_MUL_FLOAT: /* 0xa8 */
14307 /* File: x86/alt_stub.S */
14308 /*
14309  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14310  * any interesting requests and then jump to the real instruction
14311  * handler.  Unlike the Arm handler, we can't do this as a tail call
14312  * because rIBASE is caller save and we need to reload it.
14313  */
14314     movl   rSELF, %eax
14315     movl   rPC, OUT_ARG0(%esp)
14316     movl   %eax, OUT_ARG1(%esp)
14317     call   dvmCheckInst                            # (dPC, self)
14318     movl   rSELF, %ecx
14319     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14320     jmp    *dvmAsmInstructionStart+(168*4)
14321
14322 /* ------------------------------ */
14323 .L_ALT_OP_DIV_FLOAT: /* 0xa9 */
14324 /* File: x86/alt_stub.S */
14325 /*
14326  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14327  * any interesting requests and then jump to the real instruction
14328  * handler.  Unlike the Arm handler, we can't do this as a tail call
14329  * because rIBASE is caller save and we need to reload it.
14330  */
14331     movl   rSELF, %eax
14332     movl   rPC, OUT_ARG0(%esp)
14333     movl   %eax, OUT_ARG1(%esp)
14334     call   dvmCheckInst                            # (dPC, self)
14335     movl   rSELF, %ecx
14336     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14337     jmp    *dvmAsmInstructionStart+(169*4)
14338
14339 /* ------------------------------ */
14340 .L_ALT_OP_REM_FLOAT: /* 0xaa */
14341 /* File: x86/alt_stub.S */
14342 /*
14343  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14344  * any interesting requests and then jump to the real instruction
14345  * handler.  Unlike the Arm handler, we can't do this as a tail call
14346  * because rIBASE is caller save and we need to reload it.
14347  */
14348     movl   rSELF, %eax
14349     movl   rPC, OUT_ARG0(%esp)
14350     movl   %eax, OUT_ARG1(%esp)
14351     call   dvmCheckInst                            # (dPC, self)
14352     movl   rSELF, %ecx
14353     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14354     jmp    *dvmAsmInstructionStart+(170*4)
14355
14356 /* ------------------------------ */
14357 .L_ALT_OP_ADD_DOUBLE: /* 0xab */
14358 /* File: x86/alt_stub.S */
14359 /*
14360  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14361  * any interesting requests and then jump to the real instruction
14362  * handler.  Unlike the Arm handler, we can't do this as a tail call
14363  * because rIBASE is caller save and we need to reload it.
14364  */
14365     movl   rSELF, %eax
14366     movl   rPC, OUT_ARG0(%esp)
14367     movl   %eax, OUT_ARG1(%esp)
14368     call   dvmCheckInst                            # (dPC, self)
14369     movl   rSELF, %ecx
14370     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14371     jmp    *dvmAsmInstructionStart+(171*4)
14372
14373 /* ------------------------------ */
14374 .L_ALT_OP_SUB_DOUBLE: /* 0xac */
14375 /* File: x86/alt_stub.S */
14376 /*
14377  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14378  * any interesting requests and then jump to the real instruction
14379  * handler.  Unlike the Arm handler, we can't do this as a tail call
14380  * because rIBASE is caller save and we need to reload it.
14381  */
14382     movl   rSELF, %eax
14383     movl   rPC, OUT_ARG0(%esp)
14384     movl   %eax, OUT_ARG1(%esp)
14385     call   dvmCheckInst                            # (dPC, self)
14386     movl   rSELF, %ecx
14387     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14388     jmp    *dvmAsmInstructionStart+(172*4)
14389
14390 /* ------------------------------ */
14391 .L_ALT_OP_MUL_DOUBLE: /* 0xad */
14392 /* File: x86/alt_stub.S */
14393 /*
14394  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14395  * any interesting requests and then jump to the real instruction
14396  * handler.  Unlike the Arm handler, we can't do this as a tail call
14397  * because rIBASE is caller save and we need to reload it.
14398  */
14399     movl   rSELF, %eax
14400     movl   rPC, OUT_ARG0(%esp)
14401     movl   %eax, OUT_ARG1(%esp)
14402     call   dvmCheckInst                            # (dPC, self)
14403     movl   rSELF, %ecx
14404     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14405     jmp    *dvmAsmInstructionStart+(173*4)
14406
14407 /* ------------------------------ */
14408 .L_ALT_OP_DIV_DOUBLE: /* 0xae */
14409 /* File: x86/alt_stub.S */
14410 /*
14411  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14412  * any interesting requests and then jump to the real instruction
14413  * handler.  Unlike the Arm handler, we can't do this as a tail call
14414  * because rIBASE is caller save and we need to reload it.
14415  */
14416     movl   rSELF, %eax
14417     movl   rPC, OUT_ARG0(%esp)
14418     movl   %eax, OUT_ARG1(%esp)
14419     call   dvmCheckInst                            # (dPC, self)
14420     movl   rSELF, %ecx
14421     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14422     jmp    *dvmAsmInstructionStart+(174*4)
14423
14424 /* ------------------------------ */
14425 .L_ALT_OP_REM_DOUBLE: /* 0xaf */
14426 /* File: x86/alt_stub.S */
14427 /*
14428  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14429  * any interesting requests and then jump to the real instruction
14430  * handler.  Unlike the Arm handler, we can't do this as a tail call
14431  * because rIBASE is caller save and we need to reload it.
14432  */
14433     movl   rSELF, %eax
14434     movl   rPC, OUT_ARG0(%esp)
14435     movl   %eax, OUT_ARG1(%esp)
14436     call   dvmCheckInst                            # (dPC, self)
14437     movl   rSELF, %ecx
14438     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14439     jmp    *dvmAsmInstructionStart+(175*4)
14440
14441 /* ------------------------------ */
14442 .L_ALT_OP_ADD_INT_2ADDR: /* 0xb0 */
14443 /* File: x86/alt_stub.S */
14444 /*
14445  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14446  * any interesting requests and then jump to the real instruction
14447  * handler.  Unlike the Arm handler, we can't do this as a tail call
14448  * because rIBASE is caller save and we need to reload it.
14449  */
14450     movl   rSELF, %eax
14451     movl   rPC, OUT_ARG0(%esp)
14452     movl   %eax, OUT_ARG1(%esp)
14453     call   dvmCheckInst                            # (dPC, self)
14454     movl   rSELF, %ecx
14455     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14456     jmp    *dvmAsmInstructionStart+(176*4)
14457
14458 /* ------------------------------ */
14459 .L_ALT_OP_SUB_INT_2ADDR: /* 0xb1 */
14460 /* File: x86/alt_stub.S */
14461 /*
14462  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14463  * any interesting requests and then jump to the real instruction
14464  * handler.  Unlike the Arm handler, we can't do this as a tail call
14465  * because rIBASE is caller save and we need to reload it.
14466  */
14467     movl   rSELF, %eax
14468     movl   rPC, OUT_ARG0(%esp)
14469     movl   %eax, OUT_ARG1(%esp)
14470     call   dvmCheckInst                            # (dPC, self)
14471     movl   rSELF, %ecx
14472     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14473     jmp    *dvmAsmInstructionStart+(177*4)
14474
14475 /* ------------------------------ */
14476 .L_ALT_OP_MUL_INT_2ADDR: /* 0xb2 */
14477 /* File: x86/alt_stub.S */
14478 /*
14479  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14480  * any interesting requests and then jump to the real instruction
14481  * handler.  Unlike the Arm handler, we can't do this as a tail call
14482  * because rIBASE is caller save and we need to reload it.
14483  */
14484     movl   rSELF, %eax
14485     movl   rPC, OUT_ARG0(%esp)
14486     movl   %eax, OUT_ARG1(%esp)
14487     call   dvmCheckInst                            # (dPC, self)
14488     movl   rSELF, %ecx
14489     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14490     jmp    *dvmAsmInstructionStart+(178*4)
14491
14492 /* ------------------------------ */
14493 .L_ALT_OP_DIV_INT_2ADDR: /* 0xb3 */
14494 /* File: x86/alt_stub.S */
14495 /*
14496  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14497  * any interesting requests and then jump to the real instruction
14498  * handler.  Unlike the Arm handler, we can't do this as a tail call
14499  * because rIBASE is caller save and we need to reload it.
14500  */
14501     movl   rSELF, %eax
14502     movl   rPC, OUT_ARG0(%esp)
14503     movl   %eax, OUT_ARG1(%esp)
14504     call   dvmCheckInst                            # (dPC, self)
14505     movl   rSELF, %ecx
14506     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14507     jmp    *dvmAsmInstructionStart+(179*4)
14508
14509 /* ------------------------------ */
14510 .L_ALT_OP_REM_INT_2ADDR: /* 0xb4 */
14511 /* File: x86/alt_stub.S */
14512 /*
14513  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14514  * any interesting requests and then jump to the real instruction
14515  * handler.  Unlike the Arm handler, we can't do this as a tail call
14516  * because rIBASE is caller save and we need to reload it.
14517  */
14518     movl   rSELF, %eax
14519     movl   rPC, OUT_ARG0(%esp)
14520     movl   %eax, OUT_ARG1(%esp)
14521     call   dvmCheckInst                            # (dPC, self)
14522     movl   rSELF, %ecx
14523     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14524     jmp    *dvmAsmInstructionStart+(180*4)
14525
14526 /* ------------------------------ */
14527 .L_ALT_OP_AND_INT_2ADDR: /* 0xb5 */
14528 /* File: x86/alt_stub.S */
14529 /*
14530  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14531  * any interesting requests and then jump to the real instruction
14532  * handler.  Unlike the Arm handler, we can't do this as a tail call
14533  * because rIBASE is caller save and we need to reload it.
14534  */
14535     movl   rSELF, %eax
14536     movl   rPC, OUT_ARG0(%esp)
14537     movl   %eax, OUT_ARG1(%esp)
14538     call   dvmCheckInst                            # (dPC, self)
14539     movl   rSELF, %ecx
14540     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14541     jmp    *dvmAsmInstructionStart+(181*4)
14542
14543 /* ------------------------------ */
14544 .L_ALT_OP_OR_INT_2ADDR: /* 0xb6 */
14545 /* File: x86/alt_stub.S */
14546 /*
14547  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14548  * any interesting requests and then jump to the real instruction
14549  * handler.  Unlike the Arm handler, we can't do this as a tail call
14550  * because rIBASE is caller save and we need to reload it.
14551  */
14552     movl   rSELF, %eax
14553     movl   rPC, OUT_ARG0(%esp)
14554     movl   %eax, OUT_ARG1(%esp)
14555     call   dvmCheckInst                            # (dPC, self)
14556     movl   rSELF, %ecx
14557     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14558     jmp    *dvmAsmInstructionStart+(182*4)
14559
14560 /* ------------------------------ */
14561 .L_ALT_OP_XOR_INT_2ADDR: /* 0xb7 */
14562 /* File: x86/alt_stub.S */
14563 /*
14564  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14565  * any interesting requests and then jump to the real instruction
14566  * handler.  Unlike the Arm handler, we can't do this as a tail call
14567  * because rIBASE is caller save and we need to reload it.
14568  */
14569     movl   rSELF, %eax
14570     movl   rPC, OUT_ARG0(%esp)
14571     movl   %eax, OUT_ARG1(%esp)
14572     call   dvmCheckInst                            # (dPC, self)
14573     movl   rSELF, %ecx
14574     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14575     jmp    *dvmAsmInstructionStart+(183*4)
14576
14577 /* ------------------------------ */
14578 .L_ALT_OP_SHL_INT_2ADDR: /* 0xb8 */
14579 /* File: x86/alt_stub.S */
14580 /*
14581  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14582  * any interesting requests and then jump to the real instruction
14583  * handler.  Unlike the Arm handler, we can't do this as a tail call
14584  * because rIBASE is caller save and we need to reload it.
14585  */
14586     movl   rSELF, %eax
14587     movl   rPC, OUT_ARG0(%esp)
14588     movl   %eax, OUT_ARG1(%esp)
14589     call   dvmCheckInst                            # (dPC, self)
14590     movl   rSELF, %ecx
14591     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14592     jmp    *dvmAsmInstructionStart+(184*4)
14593
14594 /* ------------------------------ */
14595 .L_ALT_OP_SHR_INT_2ADDR: /* 0xb9 */
14596 /* File: x86/alt_stub.S */
14597 /*
14598  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14599  * any interesting requests and then jump to the real instruction
14600  * handler.  Unlike the Arm handler, we can't do this as a tail call
14601  * because rIBASE is caller save and we need to reload it.
14602  */
14603     movl   rSELF, %eax
14604     movl   rPC, OUT_ARG0(%esp)
14605     movl   %eax, OUT_ARG1(%esp)
14606     call   dvmCheckInst                            # (dPC, self)
14607     movl   rSELF, %ecx
14608     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14609     jmp    *dvmAsmInstructionStart+(185*4)
14610
14611 /* ------------------------------ */
14612 .L_ALT_OP_USHR_INT_2ADDR: /* 0xba */
14613 /* File: x86/alt_stub.S */
14614 /*
14615  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14616  * any interesting requests and then jump to the real instruction
14617  * handler.  Unlike the Arm handler, we can't do this as a tail call
14618  * because rIBASE is caller save and we need to reload it.
14619  */
14620     movl   rSELF, %eax
14621     movl   rPC, OUT_ARG0(%esp)
14622     movl   %eax, OUT_ARG1(%esp)
14623     call   dvmCheckInst                            # (dPC, self)
14624     movl   rSELF, %ecx
14625     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14626     jmp    *dvmAsmInstructionStart+(186*4)
14627
14628 /* ------------------------------ */
14629 .L_ALT_OP_ADD_LONG_2ADDR: /* 0xbb */
14630 /* File: x86/alt_stub.S */
14631 /*
14632  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14633  * any interesting requests and then jump to the real instruction
14634  * handler.  Unlike the Arm handler, we can't do this as a tail call
14635  * because rIBASE is caller save and we need to reload it.
14636  */
14637     movl   rSELF, %eax
14638     movl   rPC, OUT_ARG0(%esp)
14639     movl   %eax, OUT_ARG1(%esp)
14640     call   dvmCheckInst                            # (dPC, self)
14641     movl   rSELF, %ecx
14642     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14643     jmp    *dvmAsmInstructionStart+(187*4)
14644
14645 /* ------------------------------ */
14646 .L_ALT_OP_SUB_LONG_2ADDR: /* 0xbc */
14647 /* File: x86/alt_stub.S */
14648 /*
14649  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14650  * any interesting requests and then jump to the real instruction
14651  * handler.  Unlike the Arm handler, we can't do this as a tail call
14652  * because rIBASE is caller save and we need to reload it.
14653  */
14654     movl   rSELF, %eax
14655     movl   rPC, OUT_ARG0(%esp)
14656     movl   %eax, OUT_ARG1(%esp)
14657     call   dvmCheckInst                            # (dPC, self)
14658     movl   rSELF, %ecx
14659     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14660     jmp    *dvmAsmInstructionStart+(188*4)
14661
14662 /* ------------------------------ */
14663 .L_ALT_OP_MUL_LONG_2ADDR: /* 0xbd */
14664 /* File: x86/alt_stub.S */
14665 /*
14666  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14667  * any interesting requests and then jump to the real instruction
14668  * handler.  Unlike the Arm handler, we can't do this as a tail call
14669  * because rIBASE is caller save and we need to reload it.
14670  */
14671     movl   rSELF, %eax
14672     movl   rPC, OUT_ARG0(%esp)
14673     movl   %eax, OUT_ARG1(%esp)
14674     call   dvmCheckInst                            # (dPC, self)
14675     movl   rSELF, %ecx
14676     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14677     jmp    *dvmAsmInstructionStart+(189*4)
14678
14679 /* ------------------------------ */
14680 .L_ALT_OP_DIV_LONG_2ADDR: /* 0xbe */
14681 /* File: x86/alt_stub.S */
14682 /*
14683  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14684  * any interesting requests and then jump to the real instruction
14685  * handler.  Unlike the Arm handler, we can't do this as a tail call
14686  * because rIBASE is caller save and we need to reload it.
14687  */
14688     movl   rSELF, %eax
14689     movl   rPC, OUT_ARG0(%esp)
14690     movl   %eax, OUT_ARG1(%esp)
14691     call   dvmCheckInst                            # (dPC, self)
14692     movl   rSELF, %ecx
14693     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14694     jmp    *dvmAsmInstructionStart+(190*4)
14695
14696 /* ------------------------------ */
14697 .L_ALT_OP_REM_LONG_2ADDR: /* 0xbf */
14698 /* File: x86/alt_stub.S */
14699 /*
14700  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14701  * any interesting requests and then jump to the real instruction
14702  * handler.  Unlike the Arm handler, we can't do this as a tail call
14703  * because rIBASE is caller save and we need to reload it.
14704  */
14705     movl   rSELF, %eax
14706     movl   rPC, OUT_ARG0(%esp)
14707     movl   %eax, OUT_ARG1(%esp)
14708     call   dvmCheckInst                            # (dPC, self)
14709     movl   rSELF, %ecx
14710     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14711     jmp    *dvmAsmInstructionStart+(191*4)
14712
14713 /* ------------------------------ */
14714 .L_ALT_OP_AND_LONG_2ADDR: /* 0xc0 */
14715 /* File: x86/alt_stub.S */
14716 /*
14717  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14718  * any interesting requests and then jump to the real instruction
14719  * handler.  Unlike the Arm handler, we can't do this as a tail call
14720  * because rIBASE is caller save and we need to reload it.
14721  */
14722     movl   rSELF, %eax
14723     movl   rPC, OUT_ARG0(%esp)
14724     movl   %eax, OUT_ARG1(%esp)
14725     call   dvmCheckInst                            # (dPC, self)
14726     movl   rSELF, %ecx
14727     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14728     jmp    *dvmAsmInstructionStart+(192*4)
14729
14730 /* ------------------------------ */
14731 .L_ALT_OP_OR_LONG_2ADDR: /* 0xc1 */
14732 /* File: x86/alt_stub.S */
14733 /*
14734  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14735  * any interesting requests and then jump to the real instruction
14736  * handler.  Unlike the Arm handler, we can't do this as a tail call
14737  * because rIBASE is caller save and we need to reload it.
14738  */
14739     movl   rSELF, %eax
14740     movl   rPC, OUT_ARG0(%esp)
14741     movl   %eax, OUT_ARG1(%esp)
14742     call   dvmCheckInst                            # (dPC, self)
14743     movl   rSELF, %ecx
14744     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14745     jmp    *dvmAsmInstructionStart+(193*4)
14746
14747 /* ------------------------------ */
14748 .L_ALT_OP_XOR_LONG_2ADDR: /* 0xc2 */
14749 /* File: x86/alt_stub.S */
14750 /*
14751  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14752  * any interesting requests and then jump to the real instruction
14753  * handler.  Unlike the Arm handler, we can't do this as a tail call
14754  * because rIBASE is caller save and we need to reload it.
14755  */
14756     movl   rSELF, %eax
14757     movl   rPC, OUT_ARG0(%esp)
14758     movl   %eax, OUT_ARG1(%esp)
14759     call   dvmCheckInst                            # (dPC, self)
14760     movl   rSELF, %ecx
14761     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14762     jmp    *dvmAsmInstructionStart+(194*4)
14763
14764 /* ------------------------------ */
14765 .L_ALT_OP_SHL_LONG_2ADDR: /* 0xc3 */
14766 /* File: x86/alt_stub.S */
14767 /*
14768  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14769  * any interesting requests and then jump to the real instruction
14770  * handler.  Unlike the Arm handler, we can't do this as a tail call
14771  * because rIBASE is caller save and we need to reload it.
14772  */
14773     movl   rSELF, %eax
14774     movl   rPC, OUT_ARG0(%esp)
14775     movl   %eax, OUT_ARG1(%esp)
14776     call   dvmCheckInst                            # (dPC, self)
14777     movl   rSELF, %ecx
14778     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14779     jmp    *dvmAsmInstructionStart+(195*4)
14780
14781 /* ------------------------------ */
14782 .L_ALT_OP_SHR_LONG_2ADDR: /* 0xc4 */
14783 /* File: x86/alt_stub.S */
14784 /*
14785  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14786  * any interesting requests and then jump to the real instruction
14787  * handler.  Unlike the Arm handler, we can't do this as a tail call
14788  * because rIBASE is caller save and we need to reload it.
14789  */
14790     movl   rSELF, %eax
14791     movl   rPC, OUT_ARG0(%esp)
14792     movl   %eax, OUT_ARG1(%esp)
14793     call   dvmCheckInst                            # (dPC, self)
14794     movl   rSELF, %ecx
14795     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14796     jmp    *dvmAsmInstructionStart+(196*4)
14797
14798 /* ------------------------------ */
14799 .L_ALT_OP_USHR_LONG_2ADDR: /* 0xc5 */
14800 /* File: x86/alt_stub.S */
14801 /*
14802  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14803  * any interesting requests and then jump to the real instruction
14804  * handler.  Unlike the Arm handler, we can't do this as a tail call
14805  * because rIBASE is caller save and we need to reload it.
14806  */
14807     movl   rSELF, %eax
14808     movl   rPC, OUT_ARG0(%esp)
14809     movl   %eax, OUT_ARG1(%esp)
14810     call   dvmCheckInst                            # (dPC, self)
14811     movl   rSELF, %ecx
14812     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14813     jmp    *dvmAsmInstructionStart+(197*4)
14814
14815 /* ------------------------------ */
14816 .L_ALT_OP_ADD_FLOAT_2ADDR: /* 0xc6 */
14817 /* File: x86/alt_stub.S */
14818 /*
14819  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14820  * any interesting requests and then jump to the real instruction
14821  * handler.  Unlike the Arm handler, we can't do this as a tail call
14822  * because rIBASE is caller save and we need to reload it.
14823  */
14824     movl   rSELF, %eax
14825     movl   rPC, OUT_ARG0(%esp)
14826     movl   %eax, OUT_ARG1(%esp)
14827     call   dvmCheckInst                            # (dPC, self)
14828     movl   rSELF, %ecx
14829     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14830     jmp    *dvmAsmInstructionStart+(198*4)
14831
14832 /* ------------------------------ */
14833 .L_ALT_OP_SUB_FLOAT_2ADDR: /* 0xc7 */
14834 /* File: x86/alt_stub.S */
14835 /*
14836  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14837  * any interesting requests and then jump to the real instruction
14838  * handler.  Unlike the Arm handler, we can't do this as a tail call
14839  * because rIBASE is caller save and we need to reload it.
14840  */
14841     movl   rSELF, %eax
14842     movl   rPC, OUT_ARG0(%esp)
14843     movl   %eax, OUT_ARG1(%esp)
14844     call   dvmCheckInst                            # (dPC, self)
14845     movl   rSELF, %ecx
14846     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14847     jmp    *dvmAsmInstructionStart+(199*4)
14848
14849 /* ------------------------------ */
14850 .L_ALT_OP_MUL_FLOAT_2ADDR: /* 0xc8 */
14851 /* File: x86/alt_stub.S */
14852 /*
14853  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14854  * any interesting requests and then jump to the real instruction
14855  * handler.  Unlike the Arm handler, we can't do this as a tail call
14856  * because rIBASE is caller save and we need to reload it.
14857  */
14858     movl   rSELF, %eax
14859     movl   rPC, OUT_ARG0(%esp)
14860     movl   %eax, OUT_ARG1(%esp)
14861     call   dvmCheckInst                            # (dPC, self)
14862     movl   rSELF, %ecx
14863     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14864     jmp    *dvmAsmInstructionStart+(200*4)
14865
14866 /* ------------------------------ */
14867 .L_ALT_OP_DIV_FLOAT_2ADDR: /* 0xc9 */
14868 /* File: x86/alt_stub.S */
14869 /*
14870  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14871  * any interesting requests and then jump to the real instruction
14872  * handler.  Unlike the Arm handler, we can't do this as a tail call
14873  * because rIBASE is caller save and we need to reload it.
14874  */
14875     movl   rSELF, %eax
14876     movl   rPC, OUT_ARG0(%esp)
14877     movl   %eax, OUT_ARG1(%esp)
14878     call   dvmCheckInst                            # (dPC, self)
14879     movl   rSELF, %ecx
14880     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14881     jmp    *dvmAsmInstructionStart+(201*4)
14882
14883 /* ------------------------------ */
14884 .L_ALT_OP_REM_FLOAT_2ADDR: /* 0xca */
14885 /* File: x86/alt_stub.S */
14886 /*
14887  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14888  * any interesting requests and then jump to the real instruction
14889  * handler.  Unlike the Arm handler, we can't do this as a tail call
14890  * because rIBASE is caller save and we need to reload it.
14891  */
14892     movl   rSELF, %eax
14893     movl   rPC, OUT_ARG0(%esp)
14894     movl   %eax, OUT_ARG1(%esp)
14895     call   dvmCheckInst                            # (dPC, self)
14896     movl   rSELF, %ecx
14897     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14898     jmp    *dvmAsmInstructionStart+(202*4)
14899
14900 /* ------------------------------ */
14901 .L_ALT_OP_ADD_DOUBLE_2ADDR: /* 0xcb */
14902 /* File: x86/alt_stub.S */
14903 /*
14904  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14905  * any interesting requests and then jump to the real instruction
14906  * handler.  Unlike the Arm handler, we can't do this as a tail call
14907  * because rIBASE is caller save and we need to reload it.
14908  */
14909     movl   rSELF, %eax
14910     movl   rPC, OUT_ARG0(%esp)
14911     movl   %eax, OUT_ARG1(%esp)
14912     call   dvmCheckInst                            # (dPC, self)
14913     movl   rSELF, %ecx
14914     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14915     jmp    *dvmAsmInstructionStart+(203*4)
14916
14917 /* ------------------------------ */
14918 .L_ALT_OP_SUB_DOUBLE_2ADDR: /* 0xcc */
14919 /* File: x86/alt_stub.S */
14920 /*
14921  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14922  * any interesting requests and then jump to the real instruction
14923  * handler.  Unlike the Arm handler, we can't do this as a tail call
14924  * because rIBASE is caller save and we need to reload it.
14925  */
14926     movl   rSELF, %eax
14927     movl   rPC, OUT_ARG0(%esp)
14928     movl   %eax, OUT_ARG1(%esp)
14929     call   dvmCheckInst                            # (dPC, self)
14930     movl   rSELF, %ecx
14931     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14932     jmp    *dvmAsmInstructionStart+(204*4)
14933
14934 /* ------------------------------ */
14935 .L_ALT_OP_MUL_DOUBLE_2ADDR: /* 0xcd */
14936 /* File: x86/alt_stub.S */
14937 /*
14938  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14939  * any interesting requests and then jump to the real instruction
14940  * handler.  Unlike the Arm handler, we can't do this as a tail call
14941  * because rIBASE is caller save and we need to reload it.
14942  */
14943     movl   rSELF, %eax
14944     movl   rPC, OUT_ARG0(%esp)
14945     movl   %eax, OUT_ARG1(%esp)
14946     call   dvmCheckInst                            # (dPC, self)
14947     movl   rSELF, %ecx
14948     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14949     jmp    *dvmAsmInstructionStart+(205*4)
14950
14951 /* ------------------------------ */
14952 .L_ALT_OP_DIV_DOUBLE_2ADDR: /* 0xce */
14953 /* File: x86/alt_stub.S */
14954 /*
14955  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14956  * any interesting requests and then jump to the real instruction
14957  * handler.  Unlike the Arm handler, we can't do this as a tail call
14958  * because rIBASE is caller save and we need to reload it.
14959  */
14960     movl   rSELF, %eax
14961     movl   rPC, OUT_ARG0(%esp)
14962     movl   %eax, OUT_ARG1(%esp)
14963     call   dvmCheckInst                            # (dPC, self)
14964     movl   rSELF, %ecx
14965     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14966     jmp    *dvmAsmInstructionStart+(206*4)
14967
14968 /* ------------------------------ */
14969 .L_ALT_OP_REM_DOUBLE_2ADDR: /* 0xcf */
14970 /* File: x86/alt_stub.S */
14971 /*
14972  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14973  * any interesting requests and then jump to the real instruction
14974  * handler.  Unlike the Arm handler, we can't do this as a tail call
14975  * because rIBASE is caller save and we need to reload it.
14976  */
14977     movl   rSELF, %eax
14978     movl   rPC, OUT_ARG0(%esp)
14979     movl   %eax, OUT_ARG1(%esp)
14980     call   dvmCheckInst                            # (dPC, self)
14981     movl   rSELF, %ecx
14982     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
14983     jmp    *dvmAsmInstructionStart+(207*4)
14984
14985 /* ------------------------------ */
14986 .L_ALT_OP_ADD_INT_LIT16: /* 0xd0 */
14987 /* File: x86/alt_stub.S */
14988 /*
14989  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
14990  * any interesting requests and then jump to the real instruction
14991  * handler.  Unlike the Arm handler, we can't do this as a tail call
14992  * because rIBASE is caller save and we need to reload it.
14993  */
14994     movl   rSELF, %eax
14995     movl   rPC, OUT_ARG0(%esp)
14996     movl   %eax, OUT_ARG1(%esp)
14997     call   dvmCheckInst                            # (dPC, self)
14998     movl   rSELF, %ecx
14999     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15000     jmp    *dvmAsmInstructionStart+(208*4)
15001
15002 /* ------------------------------ */
15003 .L_ALT_OP_RSUB_INT: /* 0xd1 */
15004 /* File: x86/alt_stub.S */
15005 /*
15006  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15007  * any interesting requests and then jump to the real instruction
15008  * handler.  Unlike the Arm handler, we can't do this as a tail call
15009  * because rIBASE is caller save and we need to reload it.
15010  */
15011     movl   rSELF, %eax
15012     movl   rPC, OUT_ARG0(%esp)
15013     movl   %eax, OUT_ARG1(%esp)
15014     call   dvmCheckInst                            # (dPC, self)
15015     movl   rSELF, %ecx
15016     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15017     jmp    *dvmAsmInstructionStart+(209*4)
15018
15019 /* ------------------------------ */
15020 .L_ALT_OP_MUL_INT_LIT16: /* 0xd2 */
15021 /* File: x86/alt_stub.S */
15022 /*
15023  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15024  * any interesting requests and then jump to the real instruction
15025  * handler.  Unlike the Arm handler, we can't do this as a tail call
15026  * because rIBASE is caller save and we need to reload it.
15027  */
15028     movl   rSELF, %eax
15029     movl   rPC, OUT_ARG0(%esp)
15030     movl   %eax, OUT_ARG1(%esp)
15031     call   dvmCheckInst                            # (dPC, self)
15032     movl   rSELF, %ecx
15033     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15034     jmp    *dvmAsmInstructionStart+(210*4)
15035
15036 /* ------------------------------ */
15037 .L_ALT_OP_DIV_INT_LIT16: /* 0xd3 */
15038 /* File: x86/alt_stub.S */
15039 /*
15040  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15041  * any interesting requests and then jump to the real instruction
15042  * handler.  Unlike the Arm handler, we can't do this as a tail call
15043  * because rIBASE is caller save and we need to reload it.
15044  */
15045     movl   rSELF, %eax
15046     movl   rPC, OUT_ARG0(%esp)
15047     movl   %eax, OUT_ARG1(%esp)
15048     call   dvmCheckInst                            # (dPC, self)
15049     movl   rSELF, %ecx
15050     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15051     jmp    *dvmAsmInstructionStart+(211*4)
15052
15053 /* ------------------------------ */
15054 .L_ALT_OP_REM_INT_LIT16: /* 0xd4 */
15055 /* File: x86/alt_stub.S */
15056 /*
15057  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15058  * any interesting requests and then jump to the real instruction
15059  * handler.  Unlike the Arm handler, we can't do this as a tail call
15060  * because rIBASE is caller save and we need to reload it.
15061  */
15062     movl   rSELF, %eax
15063     movl   rPC, OUT_ARG0(%esp)
15064     movl   %eax, OUT_ARG1(%esp)
15065     call   dvmCheckInst                            # (dPC, self)
15066     movl   rSELF, %ecx
15067     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15068     jmp    *dvmAsmInstructionStart+(212*4)
15069
15070 /* ------------------------------ */
15071 .L_ALT_OP_AND_INT_LIT16: /* 0xd5 */
15072 /* File: x86/alt_stub.S */
15073 /*
15074  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15075  * any interesting requests and then jump to the real instruction
15076  * handler.  Unlike the Arm handler, we can't do this as a tail call
15077  * because rIBASE is caller save and we need to reload it.
15078  */
15079     movl   rSELF, %eax
15080     movl   rPC, OUT_ARG0(%esp)
15081     movl   %eax, OUT_ARG1(%esp)
15082     call   dvmCheckInst                            # (dPC, self)
15083     movl   rSELF, %ecx
15084     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15085     jmp    *dvmAsmInstructionStart+(213*4)
15086
15087 /* ------------------------------ */
15088 .L_ALT_OP_OR_INT_LIT16: /* 0xd6 */
15089 /* File: x86/alt_stub.S */
15090 /*
15091  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15092  * any interesting requests and then jump to the real instruction
15093  * handler.  Unlike the Arm handler, we can't do this as a tail call
15094  * because rIBASE is caller save and we need to reload it.
15095  */
15096     movl   rSELF, %eax
15097     movl   rPC, OUT_ARG0(%esp)
15098     movl   %eax, OUT_ARG1(%esp)
15099     call   dvmCheckInst                            # (dPC, self)
15100     movl   rSELF, %ecx
15101     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15102     jmp    *dvmAsmInstructionStart+(214*4)
15103
15104 /* ------------------------------ */
15105 .L_ALT_OP_XOR_INT_LIT16: /* 0xd7 */
15106 /* File: x86/alt_stub.S */
15107 /*
15108  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15109  * any interesting requests and then jump to the real instruction
15110  * handler.  Unlike the Arm handler, we can't do this as a tail call
15111  * because rIBASE is caller save and we need to reload it.
15112  */
15113     movl   rSELF, %eax
15114     movl   rPC, OUT_ARG0(%esp)
15115     movl   %eax, OUT_ARG1(%esp)
15116     call   dvmCheckInst                            # (dPC, self)
15117     movl   rSELF, %ecx
15118     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15119     jmp    *dvmAsmInstructionStart+(215*4)
15120
15121 /* ------------------------------ */
15122 .L_ALT_OP_ADD_INT_LIT8: /* 0xd8 */
15123 /* File: x86/alt_stub.S */
15124 /*
15125  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15126  * any interesting requests and then jump to the real instruction
15127  * handler.  Unlike the Arm handler, we can't do this as a tail call
15128  * because rIBASE is caller save and we need to reload it.
15129  */
15130     movl   rSELF, %eax
15131     movl   rPC, OUT_ARG0(%esp)
15132     movl   %eax, OUT_ARG1(%esp)
15133     call   dvmCheckInst                            # (dPC, self)
15134     movl   rSELF, %ecx
15135     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15136     jmp    *dvmAsmInstructionStart+(216*4)
15137
15138 /* ------------------------------ */
15139 .L_ALT_OP_RSUB_INT_LIT8: /* 0xd9 */
15140 /* File: x86/alt_stub.S */
15141 /*
15142  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15143  * any interesting requests and then jump to the real instruction
15144  * handler.  Unlike the Arm handler, we can't do this as a tail call
15145  * because rIBASE is caller save and we need to reload it.
15146  */
15147     movl   rSELF, %eax
15148     movl   rPC, OUT_ARG0(%esp)
15149     movl   %eax, OUT_ARG1(%esp)
15150     call   dvmCheckInst                            # (dPC, self)
15151     movl   rSELF, %ecx
15152     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15153     jmp    *dvmAsmInstructionStart+(217*4)
15154
15155 /* ------------------------------ */
15156 .L_ALT_OP_MUL_INT_LIT8: /* 0xda */
15157 /* File: x86/alt_stub.S */
15158 /*
15159  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15160  * any interesting requests and then jump to the real instruction
15161  * handler.  Unlike the Arm handler, we can't do this as a tail call
15162  * because rIBASE is caller save and we need to reload it.
15163  */
15164     movl   rSELF, %eax
15165     movl   rPC, OUT_ARG0(%esp)
15166     movl   %eax, OUT_ARG1(%esp)
15167     call   dvmCheckInst                            # (dPC, self)
15168     movl   rSELF, %ecx
15169     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15170     jmp    *dvmAsmInstructionStart+(218*4)
15171
15172 /* ------------------------------ */
15173 .L_ALT_OP_DIV_INT_LIT8: /* 0xdb */
15174 /* File: x86/alt_stub.S */
15175 /*
15176  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15177  * any interesting requests and then jump to the real instruction
15178  * handler.  Unlike the Arm handler, we can't do this as a tail call
15179  * because rIBASE is caller save and we need to reload it.
15180  */
15181     movl   rSELF, %eax
15182     movl   rPC, OUT_ARG0(%esp)
15183     movl   %eax, OUT_ARG1(%esp)
15184     call   dvmCheckInst                            # (dPC, self)
15185     movl   rSELF, %ecx
15186     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15187     jmp    *dvmAsmInstructionStart+(219*4)
15188
15189 /* ------------------------------ */
15190 .L_ALT_OP_REM_INT_LIT8: /* 0xdc */
15191 /* File: x86/alt_stub.S */
15192 /*
15193  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15194  * any interesting requests and then jump to the real instruction
15195  * handler.  Unlike the Arm handler, we can't do this as a tail call
15196  * because rIBASE is caller save and we need to reload it.
15197  */
15198     movl   rSELF, %eax
15199     movl   rPC, OUT_ARG0(%esp)
15200     movl   %eax, OUT_ARG1(%esp)
15201     call   dvmCheckInst                            # (dPC, self)
15202     movl   rSELF, %ecx
15203     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15204     jmp    *dvmAsmInstructionStart+(220*4)
15205
15206 /* ------------------------------ */
15207 .L_ALT_OP_AND_INT_LIT8: /* 0xdd */
15208 /* File: x86/alt_stub.S */
15209 /*
15210  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15211  * any interesting requests and then jump to the real instruction
15212  * handler.  Unlike the Arm handler, we can't do this as a tail call
15213  * because rIBASE is caller save and we need to reload it.
15214  */
15215     movl   rSELF, %eax
15216     movl   rPC, OUT_ARG0(%esp)
15217     movl   %eax, OUT_ARG1(%esp)
15218     call   dvmCheckInst                            # (dPC, self)
15219     movl   rSELF, %ecx
15220     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15221     jmp    *dvmAsmInstructionStart+(221*4)
15222
15223 /* ------------------------------ */
15224 .L_ALT_OP_OR_INT_LIT8: /* 0xde */
15225 /* File: x86/alt_stub.S */
15226 /*
15227  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15228  * any interesting requests and then jump to the real instruction
15229  * handler.  Unlike the Arm handler, we can't do this as a tail call
15230  * because rIBASE is caller save and we need to reload it.
15231  */
15232     movl   rSELF, %eax
15233     movl   rPC, OUT_ARG0(%esp)
15234     movl   %eax, OUT_ARG1(%esp)
15235     call   dvmCheckInst                            # (dPC, self)
15236     movl   rSELF, %ecx
15237     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15238     jmp    *dvmAsmInstructionStart+(222*4)
15239
15240 /* ------------------------------ */
15241 .L_ALT_OP_XOR_INT_LIT8: /* 0xdf */
15242 /* File: x86/alt_stub.S */
15243 /*
15244  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15245  * any interesting requests and then jump to the real instruction
15246  * handler.  Unlike the Arm handler, we can't do this as a tail call
15247  * because rIBASE is caller save and we need to reload it.
15248  */
15249     movl   rSELF, %eax
15250     movl   rPC, OUT_ARG0(%esp)
15251     movl   %eax, OUT_ARG1(%esp)
15252     call   dvmCheckInst                            # (dPC, self)
15253     movl   rSELF, %ecx
15254     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15255     jmp    *dvmAsmInstructionStart+(223*4)
15256
15257 /* ------------------------------ */
15258 .L_ALT_OP_SHL_INT_LIT8: /* 0xe0 */
15259 /* File: x86/alt_stub.S */
15260 /*
15261  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15262  * any interesting requests and then jump to the real instruction
15263  * handler.  Unlike the Arm handler, we can't do this as a tail call
15264  * because rIBASE is caller save and we need to reload it.
15265  */
15266     movl   rSELF, %eax
15267     movl   rPC, OUT_ARG0(%esp)
15268     movl   %eax, OUT_ARG1(%esp)
15269     call   dvmCheckInst                            # (dPC, self)
15270     movl   rSELF, %ecx
15271     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15272     jmp    *dvmAsmInstructionStart+(224*4)
15273
15274 /* ------------------------------ */
15275 .L_ALT_OP_SHR_INT_LIT8: /* 0xe1 */
15276 /* File: x86/alt_stub.S */
15277 /*
15278  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15279  * any interesting requests and then jump to the real instruction
15280  * handler.  Unlike the Arm handler, we can't do this as a tail call
15281  * because rIBASE is caller save and we need to reload it.
15282  */
15283     movl   rSELF, %eax
15284     movl   rPC, OUT_ARG0(%esp)
15285     movl   %eax, OUT_ARG1(%esp)
15286     call   dvmCheckInst                            # (dPC, self)
15287     movl   rSELF, %ecx
15288     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15289     jmp    *dvmAsmInstructionStart+(225*4)
15290
15291 /* ------------------------------ */
15292 .L_ALT_OP_USHR_INT_LIT8: /* 0xe2 */
15293 /* File: x86/alt_stub.S */
15294 /*
15295  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15296  * any interesting requests and then jump to the real instruction
15297  * handler.  Unlike the Arm handler, we can't do this as a tail call
15298  * because rIBASE is caller save and we need to reload it.
15299  */
15300     movl   rSELF, %eax
15301     movl   rPC, OUT_ARG0(%esp)
15302     movl   %eax, OUT_ARG1(%esp)
15303     call   dvmCheckInst                            # (dPC, self)
15304     movl   rSELF, %ecx
15305     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15306     jmp    *dvmAsmInstructionStart+(226*4)
15307
15308 /* ------------------------------ */
15309 .L_ALT_OP_IGET_VOLATILE: /* 0xe3 */
15310 /* File: x86/alt_stub.S */
15311 /*
15312  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15313  * any interesting requests and then jump to the real instruction
15314  * handler.  Unlike the Arm handler, we can't do this as a tail call
15315  * because rIBASE is caller save and we need to reload it.
15316  */
15317     movl   rSELF, %eax
15318     movl   rPC, OUT_ARG0(%esp)
15319     movl   %eax, OUT_ARG1(%esp)
15320     call   dvmCheckInst                            # (dPC, self)
15321     movl   rSELF, %ecx
15322     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15323     jmp    *dvmAsmInstructionStart+(227*4)
15324
15325 /* ------------------------------ */
15326 .L_ALT_OP_IPUT_VOLATILE: /* 0xe4 */
15327 /* File: x86/alt_stub.S */
15328 /*
15329  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15330  * any interesting requests and then jump to the real instruction
15331  * handler.  Unlike the Arm handler, we can't do this as a tail call
15332  * because rIBASE is caller save and we need to reload it.
15333  */
15334     movl   rSELF, %eax
15335     movl   rPC, OUT_ARG0(%esp)
15336     movl   %eax, OUT_ARG1(%esp)
15337     call   dvmCheckInst                            # (dPC, self)
15338     movl   rSELF, %ecx
15339     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15340     jmp    *dvmAsmInstructionStart+(228*4)
15341
15342 /* ------------------------------ */
15343 .L_ALT_OP_SGET_VOLATILE: /* 0xe5 */
15344 /* File: x86/alt_stub.S */
15345 /*
15346  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15347  * any interesting requests and then jump to the real instruction
15348  * handler.  Unlike the Arm handler, we can't do this as a tail call
15349  * because rIBASE is caller save and we need to reload it.
15350  */
15351     movl   rSELF, %eax
15352     movl   rPC, OUT_ARG0(%esp)
15353     movl   %eax, OUT_ARG1(%esp)
15354     call   dvmCheckInst                            # (dPC, self)
15355     movl   rSELF, %ecx
15356     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15357     jmp    *dvmAsmInstructionStart+(229*4)
15358
15359 /* ------------------------------ */
15360 .L_ALT_OP_SPUT_VOLATILE: /* 0xe6 */
15361 /* File: x86/alt_stub.S */
15362 /*
15363  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15364  * any interesting requests and then jump to the real instruction
15365  * handler.  Unlike the Arm handler, we can't do this as a tail call
15366  * because rIBASE is caller save and we need to reload it.
15367  */
15368     movl   rSELF, %eax
15369     movl   rPC, OUT_ARG0(%esp)
15370     movl   %eax, OUT_ARG1(%esp)
15371     call   dvmCheckInst                            # (dPC, self)
15372     movl   rSELF, %ecx
15373     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15374     jmp    *dvmAsmInstructionStart+(230*4)
15375
15376 /* ------------------------------ */
15377 .L_ALT_OP_IGET_OBJECT_VOLATILE: /* 0xe7 */
15378 /* File: x86/alt_stub.S */
15379 /*
15380  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15381  * any interesting requests and then jump to the real instruction
15382  * handler.  Unlike the Arm handler, we can't do this as a tail call
15383  * because rIBASE is caller save and we need to reload it.
15384  */
15385     movl   rSELF, %eax
15386     movl   rPC, OUT_ARG0(%esp)
15387     movl   %eax, OUT_ARG1(%esp)
15388     call   dvmCheckInst                            # (dPC, self)
15389     movl   rSELF, %ecx
15390     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15391     jmp    *dvmAsmInstructionStart+(231*4)
15392
15393 /* ------------------------------ */
15394 .L_ALT_OP_IGET_WIDE_VOLATILE: /* 0xe8 */
15395 /* File: x86/alt_stub.S */
15396 /*
15397  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15398  * any interesting requests and then jump to the real instruction
15399  * handler.  Unlike the Arm handler, we can't do this as a tail call
15400  * because rIBASE is caller save and we need to reload it.
15401  */
15402     movl   rSELF, %eax
15403     movl   rPC, OUT_ARG0(%esp)
15404     movl   %eax, OUT_ARG1(%esp)
15405     call   dvmCheckInst                            # (dPC, self)
15406     movl   rSELF, %ecx
15407     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15408     jmp    *dvmAsmInstructionStart+(232*4)
15409
15410 /* ------------------------------ */
15411 .L_ALT_OP_IPUT_WIDE_VOLATILE: /* 0xe9 */
15412 /* File: x86/alt_stub.S */
15413 /*
15414  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15415  * any interesting requests and then jump to the real instruction
15416  * handler.  Unlike the Arm handler, we can't do this as a tail call
15417  * because rIBASE is caller save and we need to reload it.
15418  */
15419     movl   rSELF, %eax
15420     movl   rPC, OUT_ARG0(%esp)
15421     movl   %eax, OUT_ARG1(%esp)
15422     call   dvmCheckInst                            # (dPC, self)
15423     movl   rSELF, %ecx
15424     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15425     jmp    *dvmAsmInstructionStart+(233*4)
15426
15427 /* ------------------------------ */
15428 .L_ALT_OP_SGET_WIDE_VOLATILE: /* 0xea */
15429 /* File: x86/alt_stub.S */
15430 /*
15431  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15432  * any interesting requests and then jump to the real instruction
15433  * handler.  Unlike the Arm handler, we can't do this as a tail call
15434  * because rIBASE is caller save and we need to reload it.
15435  */
15436     movl   rSELF, %eax
15437     movl   rPC, OUT_ARG0(%esp)
15438     movl   %eax, OUT_ARG1(%esp)
15439     call   dvmCheckInst                            # (dPC, self)
15440     movl   rSELF, %ecx
15441     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15442     jmp    *dvmAsmInstructionStart+(234*4)
15443
15444 /* ------------------------------ */
15445 .L_ALT_OP_SPUT_WIDE_VOLATILE: /* 0xeb */
15446 /* File: x86/alt_stub.S */
15447 /*
15448  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15449  * any interesting requests and then jump to the real instruction
15450  * handler.  Unlike the Arm handler, we can't do this as a tail call
15451  * because rIBASE is caller save and we need to reload it.
15452  */
15453     movl   rSELF, %eax
15454     movl   rPC, OUT_ARG0(%esp)
15455     movl   %eax, OUT_ARG1(%esp)
15456     call   dvmCheckInst                            # (dPC, self)
15457     movl   rSELF, %ecx
15458     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15459     jmp    *dvmAsmInstructionStart+(235*4)
15460
15461 /* ------------------------------ */
15462 .L_ALT_OP_BREAKPOINT: /* 0xec */
15463 /* File: x86/alt_stub.S */
15464 /*
15465  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15466  * any interesting requests and then jump to the real instruction
15467  * handler.  Unlike the Arm handler, we can't do this as a tail call
15468  * because rIBASE is caller save and we need to reload it.
15469  */
15470     movl   rSELF, %eax
15471     movl   rPC, OUT_ARG0(%esp)
15472     movl   %eax, OUT_ARG1(%esp)
15473     call   dvmCheckInst                            # (dPC, self)
15474     movl   rSELF, %ecx
15475     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15476     jmp    *dvmAsmInstructionStart+(236*4)
15477
15478 /* ------------------------------ */
15479 .L_ALT_OP_THROW_VERIFICATION_ERROR: /* 0xed */
15480 /* File: x86/alt_stub.S */
15481 /*
15482  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15483  * any interesting requests and then jump to the real instruction
15484  * handler.  Unlike the Arm handler, we can't do this as a tail call
15485  * because rIBASE is caller save and we need to reload it.
15486  */
15487     movl   rSELF, %eax
15488     movl   rPC, OUT_ARG0(%esp)
15489     movl   %eax, OUT_ARG1(%esp)
15490     call   dvmCheckInst                            # (dPC, self)
15491     movl   rSELF, %ecx
15492     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15493     jmp    *dvmAsmInstructionStart+(237*4)
15494
15495 /* ------------------------------ */
15496 .L_ALT_OP_EXECUTE_INLINE: /* 0xee */
15497 /* File: x86/alt_stub.S */
15498 /*
15499  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15500  * any interesting requests and then jump to the real instruction
15501  * handler.  Unlike the Arm handler, we can't do this as a tail call
15502  * because rIBASE is caller save and we need to reload it.
15503  */
15504     movl   rSELF, %eax
15505     movl   rPC, OUT_ARG0(%esp)
15506     movl   %eax, OUT_ARG1(%esp)
15507     call   dvmCheckInst                            # (dPC, self)
15508     movl   rSELF, %ecx
15509     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15510     jmp    *dvmAsmInstructionStart+(238*4)
15511
15512 /* ------------------------------ */
15513 .L_ALT_OP_EXECUTE_INLINE_RANGE: /* 0xef */
15514 /* File: x86/alt_stub.S */
15515 /*
15516  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15517  * any interesting requests and then jump to the real instruction
15518  * handler.  Unlike the Arm handler, we can't do this as a tail call
15519  * because rIBASE is caller save and we need to reload it.
15520  */
15521     movl   rSELF, %eax
15522     movl   rPC, OUT_ARG0(%esp)
15523     movl   %eax, OUT_ARG1(%esp)
15524     call   dvmCheckInst                            # (dPC, self)
15525     movl   rSELF, %ecx
15526     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15527     jmp    *dvmAsmInstructionStart+(239*4)
15528
15529 /* ------------------------------ */
15530 .L_ALT_OP_INVOKE_OBJECT_INIT_RANGE: /* 0xf0 */
15531 /* File: x86/alt_stub.S */
15532 /*
15533  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15534  * any interesting requests and then jump to the real instruction
15535  * handler.  Unlike the Arm handler, we can't do this as a tail call
15536  * because rIBASE is caller save and we need to reload it.
15537  */
15538     movl   rSELF, %eax
15539     movl   rPC, OUT_ARG0(%esp)
15540     movl   %eax, OUT_ARG1(%esp)
15541     call   dvmCheckInst                            # (dPC, self)
15542     movl   rSELF, %ecx
15543     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15544     jmp    *dvmAsmInstructionStart+(240*4)
15545
15546 /* ------------------------------ */
15547 .L_ALT_OP_RETURN_VOID_BARRIER: /* 0xf1 */
15548 /* File: x86/alt_stub.S */
15549 /*
15550  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15551  * any interesting requests and then jump to the real instruction
15552  * handler.  Unlike the Arm handler, we can't do this as a tail call
15553  * because rIBASE is caller save and we need to reload it.
15554  */
15555     movl   rSELF, %eax
15556     movl   rPC, OUT_ARG0(%esp)
15557     movl   %eax, OUT_ARG1(%esp)
15558     call   dvmCheckInst                            # (dPC, self)
15559     movl   rSELF, %ecx
15560     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15561     jmp    *dvmAsmInstructionStart+(241*4)
15562
15563 /* ------------------------------ */
15564 .L_ALT_OP_IGET_QUICK: /* 0xf2 */
15565 /* File: x86/alt_stub.S */
15566 /*
15567  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15568  * any interesting requests and then jump to the real instruction
15569  * handler.  Unlike the Arm handler, we can't do this as a tail call
15570  * because rIBASE is caller save and we need to reload it.
15571  */
15572     movl   rSELF, %eax
15573     movl   rPC, OUT_ARG0(%esp)
15574     movl   %eax, OUT_ARG1(%esp)
15575     call   dvmCheckInst                            # (dPC, self)
15576     movl   rSELF, %ecx
15577     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15578     jmp    *dvmAsmInstructionStart+(242*4)
15579
15580 /* ------------------------------ */
15581 .L_ALT_OP_IGET_WIDE_QUICK: /* 0xf3 */
15582 /* File: x86/alt_stub.S */
15583 /*
15584  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15585  * any interesting requests and then jump to the real instruction
15586  * handler.  Unlike the Arm handler, we can't do this as a tail call
15587  * because rIBASE is caller save and we need to reload it.
15588  */
15589     movl   rSELF, %eax
15590     movl   rPC, OUT_ARG0(%esp)
15591     movl   %eax, OUT_ARG1(%esp)
15592     call   dvmCheckInst                            # (dPC, self)
15593     movl   rSELF, %ecx
15594     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15595     jmp    *dvmAsmInstructionStart+(243*4)
15596
15597 /* ------------------------------ */
15598 .L_ALT_OP_IGET_OBJECT_QUICK: /* 0xf4 */
15599 /* File: x86/alt_stub.S */
15600 /*
15601  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15602  * any interesting requests and then jump to the real instruction
15603  * handler.  Unlike the Arm handler, we can't do this as a tail call
15604  * because rIBASE is caller save and we need to reload it.
15605  */
15606     movl   rSELF, %eax
15607     movl   rPC, OUT_ARG0(%esp)
15608     movl   %eax, OUT_ARG1(%esp)
15609     call   dvmCheckInst                            # (dPC, self)
15610     movl   rSELF, %ecx
15611     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15612     jmp    *dvmAsmInstructionStart+(244*4)
15613
15614 /* ------------------------------ */
15615 .L_ALT_OP_IPUT_QUICK: /* 0xf5 */
15616 /* File: x86/alt_stub.S */
15617 /*
15618  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15619  * any interesting requests and then jump to the real instruction
15620  * handler.  Unlike the Arm handler, we can't do this as a tail call
15621  * because rIBASE is caller save and we need to reload it.
15622  */
15623     movl   rSELF, %eax
15624     movl   rPC, OUT_ARG0(%esp)
15625     movl   %eax, OUT_ARG1(%esp)
15626     call   dvmCheckInst                            # (dPC, self)
15627     movl   rSELF, %ecx
15628     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15629     jmp    *dvmAsmInstructionStart+(245*4)
15630
15631 /* ------------------------------ */
15632 .L_ALT_OP_IPUT_WIDE_QUICK: /* 0xf6 */
15633 /* File: x86/alt_stub.S */
15634 /*
15635  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15636  * any interesting requests and then jump to the real instruction
15637  * handler.  Unlike the Arm handler, we can't do this as a tail call
15638  * because rIBASE is caller save and we need to reload it.
15639  */
15640     movl   rSELF, %eax
15641     movl   rPC, OUT_ARG0(%esp)
15642     movl   %eax, OUT_ARG1(%esp)
15643     call   dvmCheckInst                            # (dPC, self)
15644     movl   rSELF, %ecx
15645     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15646     jmp    *dvmAsmInstructionStart+(246*4)
15647
15648 /* ------------------------------ */
15649 .L_ALT_OP_IPUT_OBJECT_QUICK: /* 0xf7 */
15650 /* File: x86/alt_stub.S */
15651 /*
15652  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15653  * any interesting requests and then jump to the real instruction
15654  * handler.  Unlike the Arm handler, we can't do this as a tail call
15655  * because rIBASE is caller save and we need to reload it.
15656  */
15657     movl   rSELF, %eax
15658     movl   rPC, OUT_ARG0(%esp)
15659     movl   %eax, OUT_ARG1(%esp)
15660     call   dvmCheckInst                            # (dPC, self)
15661     movl   rSELF, %ecx
15662     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15663     jmp    *dvmAsmInstructionStart+(247*4)
15664
15665 /* ------------------------------ */
15666 .L_ALT_OP_INVOKE_VIRTUAL_QUICK: /* 0xf8 */
15667 /* File: x86/alt_stub.S */
15668 /*
15669  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15670  * any interesting requests and then jump to the real instruction
15671  * handler.  Unlike the Arm handler, we can't do this as a tail call
15672  * because rIBASE is caller save and we need to reload it.
15673  */
15674     movl   rSELF, %eax
15675     movl   rPC, OUT_ARG0(%esp)
15676     movl   %eax, OUT_ARG1(%esp)
15677     call   dvmCheckInst                            # (dPC, self)
15678     movl   rSELF, %ecx
15679     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15680     jmp    *dvmAsmInstructionStart+(248*4)
15681
15682 /* ------------------------------ */
15683 .L_ALT_OP_INVOKE_VIRTUAL_QUICK_RANGE: /* 0xf9 */
15684 /* File: x86/alt_stub.S */
15685 /*
15686  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15687  * any interesting requests and then jump to the real instruction
15688  * handler.  Unlike the Arm handler, we can't do this as a tail call
15689  * because rIBASE is caller save and we need to reload it.
15690  */
15691     movl   rSELF, %eax
15692     movl   rPC, OUT_ARG0(%esp)
15693     movl   %eax, OUT_ARG1(%esp)
15694     call   dvmCheckInst                            # (dPC, self)
15695     movl   rSELF, %ecx
15696     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15697     jmp    *dvmAsmInstructionStart+(249*4)
15698
15699 /* ------------------------------ */
15700 .L_ALT_OP_INVOKE_SUPER_QUICK: /* 0xfa */
15701 /* File: x86/alt_stub.S */
15702 /*
15703  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15704  * any interesting requests and then jump to the real instruction
15705  * handler.  Unlike the Arm handler, we can't do this as a tail call
15706  * because rIBASE is caller save and we need to reload it.
15707  */
15708     movl   rSELF, %eax
15709     movl   rPC, OUT_ARG0(%esp)
15710     movl   %eax, OUT_ARG1(%esp)
15711     call   dvmCheckInst                            # (dPC, self)
15712     movl   rSELF, %ecx
15713     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15714     jmp    *dvmAsmInstructionStart+(250*4)
15715
15716 /* ------------------------------ */
15717 .L_ALT_OP_INVOKE_SUPER_QUICK_RANGE: /* 0xfb */
15718 /* File: x86/alt_stub.S */
15719 /*
15720  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15721  * any interesting requests and then jump to the real instruction
15722  * handler.  Unlike the Arm handler, we can't do this as a tail call
15723  * because rIBASE is caller save and we need to reload it.
15724  */
15725     movl   rSELF, %eax
15726     movl   rPC, OUT_ARG0(%esp)
15727     movl   %eax, OUT_ARG1(%esp)
15728     call   dvmCheckInst                            # (dPC, self)
15729     movl   rSELF, %ecx
15730     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15731     jmp    *dvmAsmInstructionStart+(251*4)
15732
15733 /* ------------------------------ */
15734 .L_ALT_OP_IPUT_OBJECT_VOLATILE: /* 0xfc */
15735 /* File: x86/alt_stub.S */
15736 /*
15737  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15738  * any interesting requests and then jump to the real instruction
15739  * handler.  Unlike the Arm handler, we can't do this as a tail call
15740  * because rIBASE is caller save and we need to reload it.
15741  */
15742     movl   rSELF, %eax
15743     movl   rPC, OUT_ARG0(%esp)
15744     movl   %eax, OUT_ARG1(%esp)
15745     call   dvmCheckInst                            # (dPC, self)
15746     movl   rSELF, %ecx
15747     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15748     jmp    *dvmAsmInstructionStart+(252*4)
15749
15750 /* ------------------------------ */
15751 .L_ALT_OP_SGET_OBJECT_VOLATILE: /* 0xfd */
15752 /* File: x86/alt_stub.S */
15753 /*
15754  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15755  * any interesting requests and then jump to the real instruction
15756  * handler.  Unlike the Arm handler, we can't do this as a tail call
15757  * because rIBASE is caller save and we need to reload it.
15758  */
15759     movl   rSELF, %eax
15760     movl   rPC, OUT_ARG0(%esp)
15761     movl   %eax, OUT_ARG1(%esp)
15762     call   dvmCheckInst                            # (dPC, self)
15763     movl   rSELF, %ecx
15764     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15765     jmp    *dvmAsmInstructionStart+(253*4)
15766
15767 /* ------------------------------ */
15768 .L_ALT_OP_SPUT_OBJECT_VOLATILE: /* 0xfe */
15769 /* File: x86/alt_stub.S */
15770 /*
15771  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15772  * any interesting requests and then jump to the real instruction
15773  * handler.  Unlike the Arm handler, we can't do this as a tail call
15774  * because rIBASE is caller save and we need to reload it.
15775  */
15776     movl   rSELF, %eax
15777     movl   rPC, OUT_ARG0(%esp)
15778     movl   %eax, OUT_ARG1(%esp)
15779     call   dvmCheckInst                            # (dPC, self)
15780     movl   rSELF, %ecx
15781     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15782     jmp    *dvmAsmInstructionStart+(254*4)
15783
15784 /* ------------------------------ */
15785 .L_ALT_OP_DISPATCH_FF: /* 0xff */
15786 /* File: x86/alt_stub.S */
15787 /*
15788  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15789  * any interesting requests and then jump to the real instruction
15790  * handler.  Unlike the Arm handler, we can't do this as a tail call
15791  * because rIBASE is caller save and we need to reload it.
15792  */
15793     movl   rSELF, %eax
15794     movl   rPC, OUT_ARG0(%esp)
15795     movl   %eax, OUT_ARG1(%esp)
15796     call   dvmCheckInst                            # (dPC, self)
15797     movl   rSELF, %ecx
15798     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15799     jmp    *dvmAsmInstructionStart+(255*4)
15800
15801 /* ------------------------------ */
15802 .L_ALT_OP_CONST_CLASS_JUMBO: /* 0x100 */
15803 /* File: x86/alt_stub.S */
15804 /*
15805  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15806  * any interesting requests and then jump to the real instruction
15807  * handler.  Unlike the Arm handler, we can't do this as a tail call
15808  * because rIBASE is caller save and we need to reload it.
15809  */
15810     movl   rSELF, %eax
15811     movl   rPC, OUT_ARG0(%esp)
15812     movl   %eax, OUT_ARG1(%esp)
15813     call   dvmCheckInst                            # (dPC, self)
15814     movl   rSELF, %ecx
15815     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15816     jmp    *dvmAsmInstructionStart+(256*4)
15817
15818 /* ------------------------------ */
15819 .L_ALT_OP_CHECK_CAST_JUMBO: /* 0x101 */
15820 /* File: x86/alt_stub.S */
15821 /*
15822  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15823  * any interesting requests and then jump to the real instruction
15824  * handler.  Unlike the Arm handler, we can't do this as a tail call
15825  * because rIBASE is caller save and we need to reload it.
15826  */
15827     movl   rSELF, %eax
15828     movl   rPC, OUT_ARG0(%esp)
15829     movl   %eax, OUT_ARG1(%esp)
15830     call   dvmCheckInst                            # (dPC, self)
15831     movl   rSELF, %ecx
15832     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15833     jmp    *dvmAsmInstructionStart+(257*4)
15834
15835 /* ------------------------------ */
15836 .L_ALT_OP_INSTANCE_OF_JUMBO: /* 0x102 */
15837 /* File: x86/alt_stub.S */
15838 /*
15839  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15840  * any interesting requests and then jump to the real instruction
15841  * handler.  Unlike the Arm handler, we can't do this as a tail call
15842  * because rIBASE is caller save and we need to reload it.
15843  */
15844     movl   rSELF, %eax
15845     movl   rPC, OUT_ARG0(%esp)
15846     movl   %eax, OUT_ARG1(%esp)
15847     call   dvmCheckInst                            # (dPC, self)
15848     movl   rSELF, %ecx
15849     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15850     jmp    *dvmAsmInstructionStart+(258*4)
15851
15852 /* ------------------------------ */
15853 .L_ALT_OP_NEW_INSTANCE_JUMBO: /* 0x103 */
15854 /* File: x86/alt_stub.S */
15855 /*
15856  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15857  * any interesting requests and then jump to the real instruction
15858  * handler.  Unlike the Arm handler, we can't do this as a tail call
15859  * because rIBASE is caller save and we need to reload it.
15860  */
15861     movl   rSELF, %eax
15862     movl   rPC, OUT_ARG0(%esp)
15863     movl   %eax, OUT_ARG1(%esp)
15864     call   dvmCheckInst                            # (dPC, self)
15865     movl   rSELF, %ecx
15866     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15867     jmp    *dvmAsmInstructionStart+(259*4)
15868
15869 /* ------------------------------ */
15870 .L_ALT_OP_NEW_ARRAY_JUMBO: /* 0x104 */
15871 /* File: x86/alt_stub.S */
15872 /*
15873  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15874  * any interesting requests and then jump to the real instruction
15875  * handler.  Unlike the Arm handler, we can't do this as a tail call
15876  * because rIBASE is caller save and we need to reload it.
15877  */
15878     movl   rSELF, %eax
15879     movl   rPC, OUT_ARG0(%esp)
15880     movl   %eax, OUT_ARG1(%esp)
15881     call   dvmCheckInst                            # (dPC, self)
15882     movl   rSELF, %ecx
15883     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15884     jmp    *dvmAsmInstructionStart+(260*4)
15885
15886 /* ------------------------------ */
15887 .L_ALT_OP_FILLED_NEW_ARRAY_JUMBO: /* 0x105 */
15888 /* File: x86/alt_stub.S */
15889 /*
15890  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15891  * any interesting requests and then jump to the real instruction
15892  * handler.  Unlike the Arm handler, we can't do this as a tail call
15893  * because rIBASE is caller save and we need to reload it.
15894  */
15895     movl   rSELF, %eax
15896     movl   rPC, OUT_ARG0(%esp)
15897     movl   %eax, OUT_ARG1(%esp)
15898     call   dvmCheckInst                            # (dPC, self)
15899     movl   rSELF, %ecx
15900     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15901     jmp    *dvmAsmInstructionStart+(261*4)
15902
15903 /* ------------------------------ */
15904 .L_ALT_OP_IGET_JUMBO: /* 0x106 */
15905 /* File: x86/alt_stub.S */
15906 /*
15907  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15908  * any interesting requests and then jump to the real instruction
15909  * handler.  Unlike the Arm handler, we can't do this as a tail call
15910  * because rIBASE is caller save and we need to reload it.
15911  */
15912     movl   rSELF, %eax
15913     movl   rPC, OUT_ARG0(%esp)
15914     movl   %eax, OUT_ARG1(%esp)
15915     call   dvmCheckInst                            # (dPC, self)
15916     movl   rSELF, %ecx
15917     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15918     jmp    *dvmAsmInstructionStart+(262*4)
15919
15920 /* ------------------------------ */
15921 .L_ALT_OP_IGET_WIDE_JUMBO: /* 0x107 */
15922 /* File: x86/alt_stub.S */
15923 /*
15924  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15925  * any interesting requests and then jump to the real instruction
15926  * handler.  Unlike the Arm handler, we can't do this as a tail call
15927  * because rIBASE is caller save and we need to reload it.
15928  */
15929     movl   rSELF, %eax
15930     movl   rPC, OUT_ARG0(%esp)
15931     movl   %eax, OUT_ARG1(%esp)
15932     call   dvmCheckInst                            # (dPC, self)
15933     movl   rSELF, %ecx
15934     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15935     jmp    *dvmAsmInstructionStart+(263*4)
15936
15937 /* ------------------------------ */
15938 .L_ALT_OP_IGET_OBJECT_JUMBO: /* 0x108 */
15939 /* File: x86/alt_stub.S */
15940 /*
15941  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15942  * any interesting requests and then jump to the real instruction
15943  * handler.  Unlike the Arm handler, we can't do this as a tail call
15944  * because rIBASE is caller save and we need to reload it.
15945  */
15946     movl   rSELF, %eax
15947     movl   rPC, OUT_ARG0(%esp)
15948     movl   %eax, OUT_ARG1(%esp)
15949     call   dvmCheckInst                            # (dPC, self)
15950     movl   rSELF, %ecx
15951     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15952     jmp    *dvmAsmInstructionStart+(264*4)
15953
15954 /* ------------------------------ */
15955 .L_ALT_OP_IGET_BOOLEAN_JUMBO: /* 0x109 */
15956 /* File: x86/alt_stub.S */
15957 /*
15958  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15959  * any interesting requests and then jump to the real instruction
15960  * handler.  Unlike the Arm handler, we can't do this as a tail call
15961  * because rIBASE is caller save and we need to reload it.
15962  */
15963     movl   rSELF, %eax
15964     movl   rPC, OUT_ARG0(%esp)
15965     movl   %eax, OUT_ARG1(%esp)
15966     call   dvmCheckInst                            # (dPC, self)
15967     movl   rSELF, %ecx
15968     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15969     jmp    *dvmAsmInstructionStart+(265*4)
15970
15971 /* ------------------------------ */
15972 .L_ALT_OP_IGET_BYTE_JUMBO: /* 0x10a */
15973 /* File: x86/alt_stub.S */
15974 /*
15975  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15976  * any interesting requests and then jump to the real instruction
15977  * handler.  Unlike the Arm handler, we can't do this as a tail call
15978  * because rIBASE is caller save and we need to reload it.
15979  */
15980     movl   rSELF, %eax
15981     movl   rPC, OUT_ARG0(%esp)
15982     movl   %eax, OUT_ARG1(%esp)
15983     call   dvmCheckInst                            # (dPC, self)
15984     movl   rSELF, %ecx
15985     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
15986     jmp    *dvmAsmInstructionStart+(266*4)
15987
15988 /* ------------------------------ */
15989 .L_ALT_OP_IGET_CHAR_JUMBO: /* 0x10b */
15990 /* File: x86/alt_stub.S */
15991 /*
15992  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
15993  * any interesting requests and then jump to the real instruction
15994  * handler.  Unlike the Arm handler, we can't do this as a tail call
15995  * because rIBASE is caller save and we need to reload it.
15996  */
15997     movl   rSELF, %eax
15998     movl   rPC, OUT_ARG0(%esp)
15999     movl   %eax, OUT_ARG1(%esp)
16000     call   dvmCheckInst                            # (dPC, self)
16001     movl   rSELF, %ecx
16002     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16003     jmp    *dvmAsmInstructionStart+(267*4)
16004
16005 /* ------------------------------ */
16006 .L_ALT_OP_IGET_SHORT_JUMBO: /* 0x10c */
16007 /* File: x86/alt_stub.S */
16008 /*
16009  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16010  * any interesting requests and then jump to the real instruction
16011  * handler.  Unlike the Arm handler, we can't do this as a tail call
16012  * because rIBASE is caller save and we need to reload it.
16013  */
16014     movl   rSELF, %eax
16015     movl   rPC, OUT_ARG0(%esp)
16016     movl   %eax, OUT_ARG1(%esp)
16017     call   dvmCheckInst                            # (dPC, self)
16018     movl   rSELF, %ecx
16019     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16020     jmp    *dvmAsmInstructionStart+(268*4)
16021
16022 /* ------------------------------ */
16023 .L_ALT_OP_IPUT_JUMBO: /* 0x10d */
16024 /* File: x86/alt_stub.S */
16025 /*
16026  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16027  * any interesting requests and then jump to the real instruction
16028  * handler.  Unlike the Arm handler, we can't do this as a tail call
16029  * because rIBASE is caller save and we need to reload it.
16030  */
16031     movl   rSELF, %eax
16032     movl   rPC, OUT_ARG0(%esp)
16033     movl   %eax, OUT_ARG1(%esp)
16034     call   dvmCheckInst                            # (dPC, self)
16035     movl   rSELF, %ecx
16036     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16037     jmp    *dvmAsmInstructionStart+(269*4)
16038
16039 /* ------------------------------ */
16040 .L_ALT_OP_IPUT_WIDE_JUMBO: /* 0x10e */
16041 /* File: x86/alt_stub.S */
16042 /*
16043  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16044  * any interesting requests and then jump to the real instruction
16045  * handler.  Unlike the Arm handler, we can't do this as a tail call
16046  * because rIBASE is caller save and we need to reload it.
16047  */
16048     movl   rSELF, %eax
16049     movl   rPC, OUT_ARG0(%esp)
16050     movl   %eax, OUT_ARG1(%esp)
16051     call   dvmCheckInst                            # (dPC, self)
16052     movl   rSELF, %ecx
16053     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16054     jmp    *dvmAsmInstructionStart+(270*4)
16055
16056 /* ------------------------------ */
16057 .L_ALT_OP_IPUT_OBJECT_JUMBO: /* 0x10f */
16058 /* File: x86/alt_stub.S */
16059 /*
16060  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16061  * any interesting requests and then jump to the real instruction
16062  * handler.  Unlike the Arm handler, we can't do this as a tail call
16063  * because rIBASE is caller save and we need to reload it.
16064  */
16065     movl   rSELF, %eax
16066     movl   rPC, OUT_ARG0(%esp)
16067     movl   %eax, OUT_ARG1(%esp)
16068     call   dvmCheckInst                            # (dPC, self)
16069     movl   rSELF, %ecx
16070     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16071     jmp    *dvmAsmInstructionStart+(271*4)
16072
16073 /* ------------------------------ */
16074 .L_ALT_OP_IPUT_BOOLEAN_JUMBO: /* 0x110 */
16075 /* File: x86/alt_stub.S */
16076 /*
16077  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16078  * any interesting requests and then jump to the real instruction
16079  * handler.  Unlike the Arm handler, we can't do this as a tail call
16080  * because rIBASE is caller save and we need to reload it.
16081  */
16082     movl   rSELF, %eax
16083     movl   rPC, OUT_ARG0(%esp)
16084     movl   %eax, OUT_ARG1(%esp)
16085     call   dvmCheckInst                            # (dPC, self)
16086     movl   rSELF, %ecx
16087     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16088     jmp    *dvmAsmInstructionStart+(272*4)
16089
16090 /* ------------------------------ */
16091 .L_ALT_OP_IPUT_BYTE_JUMBO: /* 0x111 */
16092 /* File: x86/alt_stub.S */
16093 /*
16094  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16095  * any interesting requests and then jump to the real instruction
16096  * handler.  Unlike the Arm handler, we can't do this as a tail call
16097  * because rIBASE is caller save and we need to reload it.
16098  */
16099     movl   rSELF, %eax
16100     movl   rPC, OUT_ARG0(%esp)
16101     movl   %eax, OUT_ARG1(%esp)
16102     call   dvmCheckInst                            # (dPC, self)
16103     movl   rSELF, %ecx
16104     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16105     jmp    *dvmAsmInstructionStart+(273*4)
16106
16107 /* ------------------------------ */
16108 .L_ALT_OP_IPUT_CHAR_JUMBO: /* 0x112 */
16109 /* File: x86/alt_stub.S */
16110 /*
16111  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16112  * any interesting requests and then jump to the real instruction
16113  * handler.  Unlike the Arm handler, we can't do this as a tail call
16114  * because rIBASE is caller save and we need to reload it.
16115  */
16116     movl   rSELF, %eax
16117     movl   rPC, OUT_ARG0(%esp)
16118     movl   %eax, OUT_ARG1(%esp)
16119     call   dvmCheckInst                            # (dPC, self)
16120     movl   rSELF, %ecx
16121     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16122     jmp    *dvmAsmInstructionStart+(274*4)
16123
16124 /* ------------------------------ */
16125 .L_ALT_OP_IPUT_SHORT_JUMBO: /* 0x113 */
16126 /* File: x86/alt_stub.S */
16127 /*
16128  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16129  * any interesting requests and then jump to the real instruction
16130  * handler.  Unlike the Arm handler, we can't do this as a tail call
16131  * because rIBASE is caller save and we need to reload it.
16132  */
16133     movl   rSELF, %eax
16134     movl   rPC, OUT_ARG0(%esp)
16135     movl   %eax, OUT_ARG1(%esp)
16136     call   dvmCheckInst                            # (dPC, self)
16137     movl   rSELF, %ecx
16138     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16139     jmp    *dvmAsmInstructionStart+(275*4)
16140
16141 /* ------------------------------ */
16142 .L_ALT_OP_SGET_JUMBO: /* 0x114 */
16143 /* File: x86/alt_stub.S */
16144 /*
16145  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16146  * any interesting requests and then jump to the real instruction
16147  * handler.  Unlike the Arm handler, we can't do this as a tail call
16148  * because rIBASE is caller save and we need to reload it.
16149  */
16150     movl   rSELF, %eax
16151     movl   rPC, OUT_ARG0(%esp)
16152     movl   %eax, OUT_ARG1(%esp)
16153     call   dvmCheckInst                            # (dPC, self)
16154     movl   rSELF, %ecx
16155     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16156     jmp    *dvmAsmInstructionStart+(276*4)
16157
16158 /* ------------------------------ */
16159 .L_ALT_OP_SGET_WIDE_JUMBO: /* 0x115 */
16160 /* File: x86/alt_stub.S */
16161 /*
16162  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16163  * any interesting requests and then jump to the real instruction
16164  * handler.  Unlike the Arm handler, we can't do this as a tail call
16165  * because rIBASE is caller save and we need to reload it.
16166  */
16167     movl   rSELF, %eax
16168     movl   rPC, OUT_ARG0(%esp)
16169     movl   %eax, OUT_ARG1(%esp)
16170     call   dvmCheckInst                            # (dPC, self)
16171     movl   rSELF, %ecx
16172     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16173     jmp    *dvmAsmInstructionStart+(277*4)
16174
16175 /* ------------------------------ */
16176 .L_ALT_OP_SGET_OBJECT_JUMBO: /* 0x116 */
16177 /* File: x86/alt_stub.S */
16178 /*
16179  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16180  * any interesting requests and then jump to the real instruction
16181  * handler.  Unlike the Arm handler, we can't do this as a tail call
16182  * because rIBASE is caller save and we need to reload it.
16183  */
16184     movl   rSELF, %eax
16185     movl   rPC, OUT_ARG0(%esp)
16186     movl   %eax, OUT_ARG1(%esp)
16187     call   dvmCheckInst                            # (dPC, self)
16188     movl   rSELF, %ecx
16189     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16190     jmp    *dvmAsmInstructionStart+(278*4)
16191
16192 /* ------------------------------ */
16193 .L_ALT_OP_SGET_BOOLEAN_JUMBO: /* 0x117 */
16194 /* File: x86/alt_stub.S */
16195 /*
16196  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16197  * any interesting requests and then jump to the real instruction
16198  * handler.  Unlike the Arm handler, we can't do this as a tail call
16199  * because rIBASE is caller save and we need to reload it.
16200  */
16201     movl   rSELF, %eax
16202     movl   rPC, OUT_ARG0(%esp)
16203     movl   %eax, OUT_ARG1(%esp)
16204     call   dvmCheckInst                            # (dPC, self)
16205     movl   rSELF, %ecx
16206     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16207     jmp    *dvmAsmInstructionStart+(279*4)
16208
16209 /* ------------------------------ */
16210 .L_ALT_OP_SGET_BYTE_JUMBO: /* 0x118 */
16211 /* File: x86/alt_stub.S */
16212 /*
16213  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16214  * any interesting requests and then jump to the real instruction
16215  * handler.  Unlike the Arm handler, we can't do this as a tail call
16216  * because rIBASE is caller save and we need to reload it.
16217  */
16218     movl   rSELF, %eax
16219     movl   rPC, OUT_ARG0(%esp)
16220     movl   %eax, OUT_ARG1(%esp)
16221     call   dvmCheckInst                            # (dPC, self)
16222     movl   rSELF, %ecx
16223     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16224     jmp    *dvmAsmInstructionStart+(280*4)
16225
16226 /* ------------------------------ */
16227 .L_ALT_OP_SGET_CHAR_JUMBO: /* 0x119 */
16228 /* File: x86/alt_stub.S */
16229 /*
16230  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16231  * any interesting requests and then jump to the real instruction
16232  * handler.  Unlike the Arm handler, we can't do this as a tail call
16233  * because rIBASE is caller save and we need to reload it.
16234  */
16235     movl   rSELF, %eax
16236     movl   rPC, OUT_ARG0(%esp)
16237     movl   %eax, OUT_ARG1(%esp)
16238     call   dvmCheckInst                            # (dPC, self)
16239     movl   rSELF, %ecx
16240     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16241     jmp    *dvmAsmInstructionStart+(281*4)
16242
16243 /* ------------------------------ */
16244 .L_ALT_OP_SGET_SHORT_JUMBO: /* 0x11a */
16245 /* File: x86/alt_stub.S */
16246 /*
16247  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16248  * any interesting requests and then jump to the real instruction
16249  * handler.  Unlike the Arm handler, we can't do this as a tail call
16250  * because rIBASE is caller save and we need to reload it.
16251  */
16252     movl   rSELF, %eax
16253     movl   rPC, OUT_ARG0(%esp)
16254     movl   %eax, OUT_ARG1(%esp)
16255     call   dvmCheckInst                            # (dPC, self)
16256     movl   rSELF, %ecx
16257     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16258     jmp    *dvmAsmInstructionStart+(282*4)
16259
16260 /* ------------------------------ */
16261 .L_ALT_OP_SPUT_JUMBO: /* 0x11b */
16262 /* File: x86/alt_stub.S */
16263 /*
16264  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16265  * any interesting requests and then jump to the real instruction
16266  * handler.  Unlike the Arm handler, we can't do this as a tail call
16267  * because rIBASE is caller save and we need to reload it.
16268  */
16269     movl   rSELF, %eax
16270     movl   rPC, OUT_ARG0(%esp)
16271     movl   %eax, OUT_ARG1(%esp)
16272     call   dvmCheckInst                            # (dPC, self)
16273     movl   rSELF, %ecx
16274     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16275     jmp    *dvmAsmInstructionStart+(283*4)
16276
16277 /* ------------------------------ */
16278 .L_ALT_OP_SPUT_WIDE_JUMBO: /* 0x11c */
16279 /* File: x86/alt_stub.S */
16280 /*
16281  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16282  * any interesting requests and then jump to the real instruction
16283  * handler.  Unlike the Arm handler, we can't do this as a tail call
16284  * because rIBASE is caller save and we need to reload it.
16285  */
16286     movl   rSELF, %eax
16287     movl   rPC, OUT_ARG0(%esp)
16288     movl   %eax, OUT_ARG1(%esp)
16289     call   dvmCheckInst                            # (dPC, self)
16290     movl   rSELF, %ecx
16291     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16292     jmp    *dvmAsmInstructionStart+(284*4)
16293
16294 /* ------------------------------ */
16295 .L_ALT_OP_SPUT_OBJECT_JUMBO: /* 0x11d */
16296 /* File: x86/alt_stub.S */
16297 /*
16298  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16299  * any interesting requests and then jump to the real instruction
16300  * handler.  Unlike the Arm handler, we can't do this as a tail call
16301  * because rIBASE is caller save and we need to reload it.
16302  */
16303     movl   rSELF, %eax
16304     movl   rPC, OUT_ARG0(%esp)
16305     movl   %eax, OUT_ARG1(%esp)
16306     call   dvmCheckInst                            # (dPC, self)
16307     movl   rSELF, %ecx
16308     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16309     jmp    *dvmAsmInstructionStart+(285*4)
16310
16311 /* ------------------------------ */
16312 .L_ALT_OP_SPUT_BOOLEAN_JUMBO: /* 0x11e */
16313 /* File: x86/alt_stub.S */
16314 /*
16315  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16316  * any interesting requests and then jump to the real instruction
16317  * handler.  Unlike the Arm handler, we can't do this as a tail call
16318  * because rIBASE is caller save and we need to reload it.
16319  */
16320     movl   rSELF, %eax
16321     movl   rPC, OUT_ARG0(%esp)
16322     movl   %eax, OUT_ARG1(%esp)
16323     call   dvmCheckInst                            # (dPC, self)
16324     movl   rSELF, %ecx
16325     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16326     jmp    *dvmAsmInstructionStart+(286*4)
16327
16328 /* ------------------------------ */
16329 .L_ALT_OP_SPUT_BYTE_JUMBO: /* 0x11f */
16330 /* File: x86/alt_stub.S */
16331 /*
16332  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16333  * any interesting requests and then jump to the real instruction
16334  * handler.  Unlike the Arm handler, we can't do this as a tail call
16335  * because rIBASE is caller save and we need to reload it.
16336  */
16337     movl   rSELF, %eax
16338     movl   rPC, OUT_ARG0(%esp)
16339     movl   %eax, OUT_ARG1(%esp)
16340     call   dvmCheckInst                            # (dPC, self)
16341     movl   rSELF, %ecx
16342     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16343     jmp    *dvmAsmInstructionStart+(287*4)
16344
16345 /* ------------------------------ */
16346 .L_ALT_OP_SPUT_CHAR_JUMBO: /* 0x120 */
16347 /* File: x86/alt_stub.S */
16348 /*
16349  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16350  * any interesting requests and then jump to the real instruction
16351  * handler.  Unlike the Arm handler, we can't do this as a tail call
16352  * because rIBASE is caller save and we need to reload it.
16353  */
16354     movl   rSELF, %eax
16355     movl   rPC, OUT_ARG0(%esp)
16356     movl   %eax, OUT_ARG1(%esp)
16357     call   dvmCheckInst                            # (dPC, self)
16358     movl   rSELF, %ecx
16359     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16360     jmp    *dvmAsmInstructionStart+(288*4)
16361
16362 /* ------------------------------ */
16363 .L_ALT_OP_SPUT_SHORT_JUMBO: /* 0x121 */
16364 /* File: x86/alt_stub.S */
16365 /*
16366  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16367  * any interesting requests and then jump to the real instruction
16368  * handler.  Unlike the Arm handler, we can't do this as a tail call
16369  * because rIBASE is caller save and we need to reload it.
16370  */
16371     movl   rSELF, %eax
16372     movl   rPC, OUT_ARG0(%esp)
16373     movl   %eax, OUT_ARG1(%esp)
16374     call   dvmCheckInst                            # (dPC, self)
16375     movl   rSELF, %ecx
16376     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16377     jmp    *dvmAsmInstructionStart+(289*4)
16378
16379 /* ------------------------------ */
16380 .L_ALT_OP_INVOKE_VIRTUAL_JUMBO: /* 0x122 */
16381 /* File: x86/alt_stub.S */
16382 /*
16383  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16384  * any interesting requests and then jump to the real instruction
16385  * handler.  Unlike the Arm handler, we can't do this as a tail call
16386  * because rIBASE is caller save and we need to reload it.
16387  */
16388     movl   rSELF, %eax
16389     movl   rPC, OUT_ARG0(%esp)
16390     movl   %eax, OUT_ARG1(%esp)
16391     call   dvmCheckInst                            # (dPC, self)
16392     movl   rSELF, %ecx
16393     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16394     jmp    *dvmAsmInstructionStart+(290*4)
16395
16396 /* ------------------------------ */
16397 .L_ALT_OP_INVOKE_SUPER_JUMBO: /* 0x123 */
16398 /* File: x86/alt_stub.S */
16399 /*
16400  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16401  * any interesting requests and then jump to the real instruction
16402  * handler.  Unlike the Arm handler, we can't do this as a tail call
16403  * because rIBASE is caller save and we need to reload it.
16404  */
16405     movl   rSELF, %eax
16406     movl   rPC, OUT_ARG0(%esp)
16407     movl   %eax, OUT_ARG1(%esp)
16408     call   dvmCheckInst                            # (dPC, self)
16409     movl   rSELF, %ecx
16410     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16411     jmp    *dvmAsmInstructionStart+(291*4)
16412
16413 /* ------------------------------ */
16414 .L_ALT_OP_INVOKE_DIRECT_JUMBO: /* 0x124 */
16415 /* File: x86/alt_stub.S */
16416 /*
16417  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16418  * any interesting requests and then jump to the real instruction
16419  * handler.  Unlike the Arm handler, we can't do this as a tail call
16420  * because rIBASE is caller save and we need to reload it.
16421  */
16422     movl   rSELF, %eax
16423     movl   rPC, OUT_ARG0(%esp)
16424     movl   %eax, OUT_ARG1(%esp)
16425     call   dvmCheckInst                            # (dPC, self)
16426     movl   rSELF, %ecx
16427     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16428     jmp    *dvmAsmInstructionStart+(292*4)
16429
16430 /* ------------------------------ */
16431 .L_ALT_OP_INVOKE_STATIC_JUMBO: /* 0x125 */
16432 /* File: x86/alt_stub.S */
16433 /*
16434  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16435  * any interesting requests and then jump to the real instruction
16436  * handler.  Unlike the Arm handler, we can't do this as a tail call
16437  * because rIBASE is caller save and we need to reload it.
16438  */
16439     movl   rSELF, %eax
16440     movl   rPC, OUT_ARG0(%esp)
16441     movl   %eax, OUT_ARG1(%esp)
16442     call   dvmCheckInst                            # (dPC, self)
16443     movl   rSELF, %ecx
16444     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16445     jmp    *dvmAsmInstructionStart+(293*4)
16446
16447 /* ------------------------------ */
16448 .L_ALT_OP_INVOKE_INTERFACE_JUMBO: /* 0x126 */
16449 /* File: x86/alt_stub.S */
16450 /*
16451  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16452  * any interesting requests and then jump to the real instruction
16453  * handler.  Unlike the Arm handler, we can't do this as a tail call
16454  * because rIBASE is caller save and we need to reload it.
16455  */
16456     movl   rSELF, %eax
16457     movl   rPC, OUT_ARG0(%esp)
16458     movl   %eax, OUT_ARG1(%esp)
16459     call   dvmCheckInst                            # (dPC, self)
16460     movl   rSELF, %ecx
16461     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16462     jmp    *dvmAsmInstructionStart+(294*4)
16463
16464 /* ------------------------------ */
16465 .L_ALT_OP_UNUSED_27FF: /* 0x127 */
16466 /* File: x86/alt_stub.S */
16467 /*
16468  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16469  * any interesting requests and then jump to the real instruction
16470  * handler.  Unlike the Arm handler, we can't do this as a tail call
16471  * because rIBASE is caller save and we need to reload it.
16472  */
16473     movl   rSELF, %eax
16474     movl   rPC, OUT_ARG0(%esp)
16475     movl   %eax, OUT_ARG1(%esp)
16476     call   dvmCheckInst                            # (dPC, self)
16477     movl   rSELF, %ecx
16478     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16479     jmp    *dvmAsmInstructionStart+(295*4)
16480
16481 /* ------------------------------ */
16482 .L_ALT_OP_UNUSED_28FF: /* 0x128 */
16483 /* File: x86/alt_stub.S */
16484 /*
16485  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16486  * any interesting requests and then jump to the real instruction
16487  * handler.  Unlike the Arm handler, we can't do this as a tail call
16488  * because rIBASE is caller save and we need to reload it.
16489  */
16490     movl   rSELF, %eax
16491     movl   rPC, OUT_ARG0(%esp)
16492     movl   %eax, OUT_ARG1(%esp)
16493     call   dvmCheckInst                            # (dPC, self)
16494     movl   rSELF, %ecx
16495     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16496     jmp    *dvmAsmInstructionStart+(296*4)
16497
16498 /* ------------------------------ */
16499 .L_ALT_OP_UNUSED_29FF: /* 0x129 */
16500 /* File: x86/alt_stub.S */
16501 /*
16502  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16503  * any interesting requests and then jump to the real instruction
16504  * handler.  Unlike the Arm handler, we can't do this as a tail call
16505  * because rIBASE is caller save and we need to reload it.
16506  */
16507     movl   rSELF, %eax
16508     movl   rPC, OUT_ARG0(%esp)
16509     movl   %eax, OUT_ARG1(%esp)
16510     call   dvmCheckInst                            # (dPC, self)
16511     movl   rSELF, %ecx
16512     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16513     jmp    *dvmAsmInstructionStart+(297*4)
16514
16515 /* ------------------------------ */
16516 .L_ALT_OP_UNUSED_2AFF: /* 0x12a */
16517 /* File: x86/alt_stub.S */
16518 /*
16519  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16520  * any interesting requests and then jump to the real instruction
16521  * handler.  Unlike the Arm handler, we can't do this as a tail call
16522  * because rIBASE is caller save and we need to reload it.
16523  */
16524     movl   rSELF, %eax
16525     movl   rPC, OUT_ARG0(%esp)
16526     movl   %eax, OUT_ARG1(%esp)
16527     call   dvmCheckInst                            # (dPC, self)
16528     movl   rSELF, %ecx
16529     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16530     jmp    *dvmAsmInstructionStart+(298*4)
16531
16532 /* ------------------------------ */
16533 .L_ALT_OP_UNUSED_2BFF: /* 0x12b */
16534 /* File: x86/alt_stub.S */
16535 /*
16536  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16537  * any interesting requests and then jump to the real instruction
16538  * handler.  Unlike the Arm handler, we can't do this as a tail call
16539  * because rIBASE is caller save and we need to reload it.
16540  */
16541     movl   rSELF, %eax
16542     movl   rPC, OUT_ARG0(%esp)
16543     movl   %eax, OUT_ARG1(%esp)
16544     call   dvmCheckInst                            # (dPC, self)
16545     movl   rSELF, %ecx
16546     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16547     jmp    *dvmAsmInstructionStart+(299*4)
16548
16549 /* ------------------------------ */
16550 .L_ALT_OP_UNUSED_2CFF: /* 0x12c */
16551 /* File: x86/alt_stub.S */
16552 /*
16553  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16554  * any interesting requests and then jump to the real instruction
16555  * handler.  Unlike the Arm handler, we can't do this as a tail call
16556  * because rIBASE is caller save and we need to reload it.
16557  */
16558     movl   rSELF, %eax
16559     movl   rPC, OUT_ARG0(%esp)
16560     movl   %eax, OUT_ARG1(%esp)
16561     call   dvmCheckInst                            # (dPC, self)
16562     movl   rSELF, %ecx
16563     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16564     jmp    *dvmAsmInstructionStart+(300*4)
16565
16566 /* ------------------------------ */
16567 .L_ALT_OP_UNUSED_2DFF: /* 0x12d */
16568 /* File: x86/alt_stub.S */
16569 /*
16570  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16571  * any interesting requests and then jump to the real instruction
16572  * handler.  Unlike the Arm handler, we can't do this as a tail call
16573  * because rIBASE is caller save and we need to reload it.
16574  */
16575     movl   rSELF, %eax
16576     movl   rPC, OUT_ARG0(%esp)
16577     movl   %eax, OUT_ARG1(%esp)
16578     call   dvmCheckInst                            # (dPC, self)
16579     movl   rSELF, %ecx
16580     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16581     jmp    *dvmAsmInstructionStart+(301*4)
16582
16583 /* ------------------------------ */
16584 .L_ALT_OP_UNUSED_2EFF: /* 0x12e */
16585 /* File: x86/alt_stub.S */
16586 /*
16587  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16588  * any interesting requests and then jump to the real instruction
16589  * handler.  Unlike the Arm handler, we can't do this as a tail call
16590  * because rIBASE is caller save and we need to reload it.
16591  */
16592     movl   rSELF, %eax
16593     movl   rPC, OUT_ARG0(%esp)
16594     movl   %eax, OUT_ARG1(%esp)
16595     call   dvmCheckInst                            # (dPC, self)
16596     movl   rSELF, %ecx
16597     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16598     jmp    *dvmAsmInstructionStart+(302*4)
16599
16600 /* ------------------------------ */
16601 .L_ALT_OP_UNUSED_2FFF: /* 0x12f */
16602 /* File: x86/alt_stub.S */
16603 /*
16604  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16605  * any interesting requests and then jump to the real instruction
16606  * handler.  Unlike the Arm handler, we can't do this as a tail call
16607  * because rIBASE is caller save and we need to reload it.
16608  */
16609     movl   rSELF, %eax
16610     movl   rPC, OUT_ARG0(%esp)
16611     movl   %eax, OUT_ARG1(%esp)
16612     call   dvmCheckInst                            # (dPC, self)
16613     movl   rSELF, %ecx
16614     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16615     jmp    *dvmAsmInstructionStart+(303*4)
16616
16617 /* ------------------------------ */
16618 .L_ALT_OP_UNUSED_30FF: /* 0x130 */
16619 /* File: x86/alt_stub.S */
16620 /*
16621  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16622  * any interesting requests and then jump to the real instruction
16623  * handler.  Unlike the Arm handler, we can't do this as a tail call
16624  * because rIBASE is caller save and we need to reload it.
16625  */
16626     movl   rSELF, %eax
16627     movl   rPC, OUT_ARG0(%esp)
16628     movl   %eax, OUT_ARG1(%esp)
16629     call   dvmCheckInst                            # (dPC, self)
16630     movl   rSELF, %ecx
16631     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16632     jmp    *dvmAsmInstructionStart+(304*4)
16633
16634 /* ------------------------------ */
16635 .L_ALT_OP_UNUSED_31FF: /* 0x131 */
16636 /* File: x86/alt_stub.S */
16637 /*
16638  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16639  * any interesting requests and then jump to the real instruction
16640  * handler.  Unlike the Arm handler, we can't do this as a tail call
16641  * because rIBASE is caller save and we need to reload it.
16642  */
16643     movl   rSELF, %eax
16644     movl   rPC, OUT_ARG0(%esp)
16645     movl   %eax, OUT_ARG1(%esp)
16646     call   dvmCheckInst                            # (dPC, self)
16647     movl   rSELF, %ecx
16648     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16649     jmp    *dvmAsmInstructionStart+(305*4)
16650
16651 /* ------------------------------ */
16652 .L_ALT_OP_UNUSED_32FF: /* 0x132 */
16653 /* File: x86/alt_stub.S */
16654 /*
16655  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16656  * any interesting requests and then jump to the real instruction
16657  * handler.  Unlike the Arm handler, we can't do this as a tail call
16658  * because rIBASE is caller save and we need to reload it.
16659  */
16660     movl   rSELF, %eax
16661     movl   rPC, OUT_ARG0(%esp)
16662     movl   %eax, OUT_ARG1(%esp)
16663     call   dvmCheckInst                            # (dPC, self)
16664     movl   rSELF, %ecx
16665     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16666     jmp    *dvmAsmInstructionStart+(306*4)
16667
16668 /* ------------------------------ */
16669 .L_ALT_OP_UNUSED_33FF: /* 0x133 */
16670 /* File: x86/alt_stub.S */
16671 /*
16672  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16673  * any interesting requests and then jump to the real instruction
16674  * handler.  Unlike the Arm handler, we can't do this as a tail call
16675  * because rIBASE is caller save and we need to reload it.
16676  */
16677     movl   rSELF, %eax
16678     movl   rPC, OUT_ARG0(%esp)
16679     movl   %eax, OUT_ARG1(%esp)
16680     call   dvmCheckInst                            # (dPC, self)
16681     movl   rSELF, %ecx
16682     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16683     jmp    *dvmAsmInstructionStart+(307*4)
16684
16685 /* ------------------------------ */
16686 .L_ALT_OP_UNUSED_34FF: /* 0x134 */
16687 /* File: x86/alt_stub.S */
16688 /*
16689  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16690  * any interesting requests and then jump to the real instruction
16691  * handler.  Unlike the Arm handler, we can't do this as a tail call
16692  * because rIBASE is caller save and we need to reload it.
16693  */
16694     movl   rSELF, %eax
16695     movl   rPC, OUT_ARG0(%esp)
16696     movl   %eax, OUT_ARG1(%esp)
16697     call   dvmCheckInst                            # (dPC, self)
16698     movl   rSELF, %ecx
16699     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16700     jmp    *dvmAsmInstructionStart+(308*4)
16701
16702 /* ------------------------------ */
16703 .L_ALT_OP_UNUSED_35FF: /* 0x135 */
16704 /* File: x86/alt_stub.S */
16705 /*
16706  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16707  * any interesting requests and then jump to the real instruction
16708  * handler.  Unlike the Arm handler, we can't do this as a tail call
16709  * because rIBASE is caller save and we need to reload it.
16710  */
16711     movl   rSELF, %eax
16712     movl   rPC, OUT_ARG0(%esp)
16713     movl   %eax, OUT_ARG1(%esp)
16714     call   dvmCheckInst                            # (dPC, self)
16715     movl   rSELF, %ecx
16716     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16717     jmp    *dvmAsmInstructionStart+(309*4)
16718
16719 /* ------------------------------ */
16720 .L_ALT_OP_UNUSED_36FF: /* 0x136 */
16721 /* File: x86/alt_stub.S */
16722 /*
16723  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16724  * any interesting requests and then jump to the real instruction
16725  * handler.  Unlike the Arm handler, we can't do this as a tail call
16726  * because rIBASE is caller save and we need to reload it.
16727  */
16728     movl   rSELF, %eax
16729     movl   rPC, OUT_ARG0(%esp)
16730     movl   %eax, OUT_ARG1(%esp)
16731     call   dvmCheckInst                            # (dPC, self)
16732     movl   rSELF, %ecx
16733     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16734     jmp    *dvmAsmInstructionStart+(310*4)
16735
16736 /* ------------------------------ */
16737 .L_ALT_OP_UNUSED_37FF: /* 0x137 */
16738 /* File: x86/alt_stub.S */
16739 /*
16740  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16741  * any interesting requests and then jump to the real instruction
16742  * handler.  Unlike the Arm handler, we can't do this as a tail call
16743  * because rIBASE is caller save and we need to reload it.
16744  */
16745     movl   rSELF, %eax
16746     movl   rPC, OUT_ARG0(%esp)
16747     movl   %eax, OUT_ARG1(%esp)
16748     call   dvmCheckInst                            # (dPC, self)
16749     movl   rSELF, %ecx
16750     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16751     jmp    *dvmAsmInstructionStart+(311*4)
16752
16753 /* ------------------------------ */
16754 .L_ALT_OP_UNUSED_38FF: /* 0x138 */
16755 /* File: x86/alt_stub.S */
16756 /*
16757  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16758  * any interesting requests and then jump to the real instruction
16759  * handler.  Unlike the Arm handler, we can't do this as a tail call
16760  * because rIBASE is caller save and we need to reload it.
16761  */
16762     movl   rSELF, %eax
16763     movl   rPC, OUT_ARG0(%esp)
16764     movl   %eax, OUT_ARG1(%esp)
16765     call   dvmCheckInst                            # (dPC, self)
16766     movl   rSELF, %ecx
16767     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16768     jmp    *dvmAsmInstructionStart+(312*4)
16769
16770 /* ------------------------------ */
16771 .L_ALT_OP_UNUSED_39FF: /* 0x139 */
16772 /* File: x86/alt_stub.S */
16773 /*
16774  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16775  * any interesting requests and then jump to the real instruction
16776  * handler.  Unlike the Arm handler, we can't do this as a tail call
16777  * because rIBASE is caller save and we need to reload it.
16778  */
16779     movl   rSELF, %eax
16780     movl   rPC, OUT_ARG0(%esp)
16781     movl   %eax, OUT_ARG1(%esp)
16782     call   dvmCheckInst                            # (dPC, self)
16783     movl   rSELF, %ecx
16784     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16785     jmp    *dvmAsmInstructionStart+(313*4)
16786
16787 /* ------------------------------ */
16788 .L_ALT_OP_UNUSED_3AFF: /* 0x13a */
16789 /* File: x86/alt_stub.S */
16790 /*
16791  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16792  * any interesting requests and then jump to the real instruction
16793  * handler.  Unlike the Arm handler, we can't do this as a tail call
16794  * because rIBASE is caller save and we need to reload it.
16795  */
16796     movl   rSELF, %eax
16797     movl   rPC, OUT_ARG0(%esp)
16798     movl   %eax, OUT_ARG1(%esp)
16799     call   dvmCheckInst                            # (dPC, self)
16800     movl   rSELF, %ecx
16801     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16802     jmp    *dvmAsmInstructionStart+(314*4)
16803
16804 /* ------------------------------ */
16805 .L_ALT_OP_UNUSED_3BFF: /* 0x13b */
16806 /* File: x86/alt_stub.S */
16807 /*
16808  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16809  * any interesting requests and then jump to the real instruction
16810  * handler.  Unlike the Arm handler, we can't do this as a tail call
16811  * because rIBASE is caller save and we need to reload it.
16812  */
16813     movl   rSELF, %eax
16814     movl   rPC, OUT_ARG0(%esp)
16815     movl   %eax, OUT_ARG1(%esp)
16816     call   dvmCheckInst                            # (dPC, self)
16817     movl   rSELF, %ecx
16818     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16819     jmp    *dvmAsmInstructionStart+(315*4)
16820
16821 /* ------------------------------ */
16822 .L_ALT_OP_UNUSED_3CFF: /* 0x13c */
16823 /* File: x86/alt_stub.S */
16824 /*
16825  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16826  * any interesting requests and then jump to the real instruction
16827  * handler.  Unlike the Arm handler, we can't do this as a tail call
16828  * because rIBASE is caller save and we need to reload it.
16829  */
16830     movl   rSELF, %eax
16831     movl   rPC, OUT_ARG0(%esp)
16832     movl   %eax, OUT_ARG1(%esp)
16833     call   dvmCheckInst                            # (dPC, self)
16834     movl   rSELF, %ecx
16835     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16836     jmp    *dvmAsmInstructionStart+(316*4)
16837
16838 /* ------------------------------ */
16839 .L_ALT_OP_UNUSED_3DFF: /* 0x13d */
16840 /* File: x86/alt_stub.S */
16841 /*
16842  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16843  * any interesting requests and then jump to the real instruction
16844  * handler.  Unlike the Arm handler, we can't do this as a tail call
16845  * because rIBASE is caller save and we need to reload it.
16846  */
16847     movl   rSELF, %eax
16848     movl   rPC, OUT_ARG0(%esp)
16849     movl   %eax, OUT_ARG1(%esp)
16850     call   dvmCheckInst                            # (dPC, self)
16851     movl   rSELF, %ecx
16852     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16853     jmp    *dvmAsmInstructionStart+(317*4)
16854
16855 /* ------------------------------ */
16856 .L_ALT_OP_UNUSED_3EFF: /* 0x13e */
16857 /* File: x86/alt_stub.S */
16858 /*
16859  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16860  * any interesting requests and then jump to the real instruction
16861  * handler.  Unlike the Arm handler, we can't do this as a tail call
16862  * because rIBASE is caller save and we need to reload it.
16863  */
16864     movl   rSELF, %eax
16865     movl   rPC, OUT_ARG0(%esp)
16866     movl   %eax, OUT_ARG1(%esp)
16867     call   dvmCheckInst                            # (dPC, self)
16868     movl   rSELF, %ecx
16869     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16870     jmp    *dvmAsmInstructionStart+(318*4)
16871
16872 /* ------------------------------ */
16873 .L_ALT_OP_UNUSED_3FFF: /* 0x13f */
16874 /* File: x86/alt_stub.S */
16875 /*
16876  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16877  * any interesting requests and then jump to the real instruction
16878  * handler.  Unlike the Arm handler, we can't do this as a tail call
16879  * because rIBASE is caller save and we need to reload it.
16880  */
16881     movl   rSELF, %eax
16882     movl   rPC, OUT_ARG0(%esp)
16883     movl   %eax, OUT_ARG1(%esp)
16884     call   dvmCheckInst                            # (dPC, self)
16885     movl   rSELF, %ecx
16886     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16887     jmp    *dvmAsmInstructionStart+(319*4)
16888
16889 /* ------------------------------ */
16890 .L_ALT_OP_UNUSED_40FF: /* 0x140 */
16891 /* File: x86/alt_stub.S */
16892 /*
16893  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16894  * any interesting requests and then jump to the real instruction
16895  * handler.  Unlike the Arm handler, we can't do this as a tail call
16896  * because rIBASE is caller save and we need to reload it.
16897  */
16898     movl   rSELF, %eax
16899     movl   rPC, OUT_ARG0(%esp)
16900     movl   %eax, OUT_ARG1(%esp)
16901     call   dvmCheckInst                            # (dPC, self)
16902     movl   rSELF, %ecx
16903     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16904     jmp    *dvmAsmInstructionStart+(320*4)
16905
16906 /* ------------------------------ */
16907 .L_ALT_OP_UNUSED_41FF: /* 0x141 */
16908 /* File: x86/alt_stub.S */
16909 /*
16910  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16911  * any interesting requests and then jump to the real instruction
16912  * handler.  Unlike the Arm handler, we can't do this as a tail call
16913  * because rIBASE is caller save and we need to reload it.
16914  */
16915     movl   rSELF, %eax
16916     movl   rPC, OUT_ARG0(%esp)
16917     movl   %eax, OUT_ARG1(%esp)
16918     call   dvmCheckInst                            # (dPC, self)
16919     movl   rSELF, %ecx
16920     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16921     jmp    *dvmAsmInstructionStart+(321*4)
16922
16923 /* ------------------------------ */
16924 .L_ALT_OP_UNUSED_42FF: /* 0x142 */
16925 /* File: x86/alt_stub.S */
16926 /*
16927  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16928  * any interesting requests and then jump to the real instruction
16929  * handler.  Unlike the Arm handler, we can't do this as a tail call
16930  * because rIBASE is caller save and we need to reload it.
16931  */
16932     movl   rSELF, %eax
16933     movl   rPC, OUT_ARG0(%esp)
16934     movl   %eax, OUT_ARG1(%esp)
16935     call   dvmCheckInst                            # (dPC, self)
16936     movl   rSELF, %ecx
16937     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16938     jmp    *dvmAsmInstructionStart+(322*4)
16939
16940 /* ------------------------------ */
16941 .L_ALT_OP_UNUSED_43FF: /* 0x143 */
16942 /* File: x86/alt_stub.S */
16943 /*
16944  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16945  * any interesting requests and then jump to the real instruction
16946  * handler.  Unlike the Arm handler, we can't do this as a tail call
16947  * because rIBASE is caller save and we need to reload it.
16948  */
16949     movl   rSELF, %eax
16950     movl   rPC, OUT_ARG0(%esp)
16951     movl   %eax, OUT_ARG1(%esp)
16952     call   dvmCheckInst                            # (dPC, self)
16953     movl   rSELF, %ecx
16954     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16955     jmp    *dvmAsmInstructionStart+(323*4)
16956
16957 /* ------------------------------ */
16958 .L_ALT_OP_UNUSED_44FF: /* 0x144 */
16959 /* File: x86/alt_stub.S */
16960 /*
16961  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16962  * any interesting requests and then jump to the real instruction
16963  * handler.  Unlike the Arm handler, we can't do this as a tail call
16964  * because rIBASE is caller save and we need to reload it.
16965  */
16966     movl   rSELF, %eax
16967     movl   rPC, OUT_ARG0(%esp)
16968     movl   %eax, OUT_ARG1(%esp)
16969     call   dvmCheckInst                            # (dPC, self)
16970     movl   rSELF, %ecx
16971     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16972     jmp    *dvmAsmInstructionStart+(324*4)
16973
16974 /* ------------------------------ */
16975 .L_ALT_OP_UNUSED_45FF: /* 0x145 */
16976 /* File: x86/alt_stub.S */
16977 /*
16978  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16979  * any interesting requests and then jump to the real instruction
16980  * handler.  Unlike the Arm handler, we can't do this as a tail call
16981  * because rIBASE is caller save and we need to reload it.
16982  */
16983     movl   rSELF, %eax
16984     movl   rPC, OUT_ARG0(%esp)
16985     movl   %eax, OUT_ARG1(%esp)
16986     call   dvmCheckInst                            # (dPC, self)
16987     movl   rSELF, %ecx
16988     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
16989     jmp    *dvmAsmInstructionStart+(325*4)
16990
16991 /* ------------------------------ */
16992 .L_ALT_OP_UNUSED_46FF: /* 0x146 */
16993 /* File: x86/alt_stub.S */
16994 /*
16995  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
16996  * any interesting requests and then jump to the real instruction
16997  * handler.  Unlike the Arm handler, we can't do this as a tail call
16998  * because rIBASE is caller save and we need to reload it.
16999  */
17000     movl   rSELF, %eax
17001     movl   rPC, OUT_ARG0(%esp)
17002     movl   %eax, OUT_ARG1(%esp)
17003     call   dvmCheckInst                            # (dPC, self)
17004     movl   rSELF, %ecx
17005     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17006     jmp    *dvmAsmInstructionStart+(326*4)
17007
17008 /* ------------------------------ */
17009 .L_ALT_OP_UNUSED_47FF: /* 0x147 */
17010 /* File: x86/alt_stub.S */
17011 /*
17012  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17013  * any interesting requests and then jump to the real instruction
17014  * handler.  Unlike the Arm handler, we can't do this as a tail call
17015  * because rIBASE is caller save and we need to reload it.
17016  */
17017     movl   rSELF, %eax
17018     movl   rPC, OUT_ARG0(%esp)
17019     movl   %eax, OUT_ARG1(%esp)
17020     call   dvmCheckInst                            # (dPC, self)
17021     movl   rSELF, %ecx
17022     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17023     jmp    *dvmAsmInstructionStart+(327*4)
17024
17025 /* ------------------------------ */
17026 .L_ALT_OP_UNUSED_48FF: /* 0x148 */
17027 /* File: x86/alt_stub.S */
17028 /*
17029  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17030  * any interesting requests and then jump to the real instruction
17031  * handler.  Unlike the Arm handler, we can't do this as a tail call
17032  * because rIBASE is caller save and we need to reload it.
17033  */
17034     movl   rSELF, %eax
17035     movl   rPC, OUT_ARG0(%esp)
17036     movl   %eax, OUT_ARG1(%esp)
17037     call   dvmCheckInst                            # (dPC, self)
17038     movl   rSELF, %ecx
17039     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17040     jmp    *dvmAsmInstructionStart+(328*4)
17041
17042 /* ------------------------------ */
17043 .L_ALT_OP_UNUSED_49FF: /* 0x149 */
17044 /* File: x86/alt_stub.S */
17045 /*
17046  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17047  * any interesting requests and then jump to the real instruction
17048  * handler.  Unlike the Arm handler, we can't do this as a tail call
17049  * because rIBASE is caller save and we need to reload it.
17050  */
17051     movl   rSELF, %eax
17052     movl   rPC, OUT_ARG0(%esp)
17053     movl   %eax, OUT_ARG1(%esp)
17054     call   dvmCheckInst                            # (dPC, self)
17055     movl   rSELF, %ecx
17056     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17057     jmp    *dvmAsmInstructionStart+(329*4)
17058
17059 /* ------------------------------ */
17060 .L_ALT_OP_UNUSED_4AFF: /* 0x14a */
17061 /* File: x86/alt_stub.S */
17062 /*
17063  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17064  * any interesting requests and then jump to the real instruction
17065  * handler.  Unlike the Arm handler, we can't do this as a tail call
17066  * because rIBASE is caller save and we need to reload it.
17067  */
17068     movl   rSELF, %eax
17069     movl   rPC, OUT_ARG0(%esp)
17070     movl   %eax, OUT_ARG1(%esp)
17071     call   dvmCheckInst                            # (dPC, self)
17072     movl   rSELF, %ecx
17073     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17074     jmp    *dvmAsmInstructionStart+(330*4)
17075
17076 /* ------------------------------ */
17077 .L_ALT_OP_UNUSED_4BFF: /* 0x14b */
17078 /* File: x86/alt_stub.S */
17079 /*
17080  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17081  * any interesting requests and then jump to the real instruction
17082  * handler.  Unlike the Arm handler, we can't do this as a tail call
17083  * because rIBASE is caller save and we need to reload it.
17084  */
17085     movl   rSELF, %eax
17086     movl   rPC, OUT_ARG0(%esp)
17087     movl   %eax, OUT_ARG1(%esp)
17088     call   dvmCheckInst                            # (dPC, self)
17089     movl   rSELF, %ecx
17090     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17091     jmp    *dvmAsmInstructionStart+(331*4)
17092
17093 /* ------------------------------ */
17094 .L_ALT_OP_UNUSED_4CFF: /* 0x14c */
17095 /* File: x86/alt_stub.S */
17096 /*
17097  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17098  * any interesting requests and then jump to the real instruction
17099  * handler.  Unlike the Arm handler, we can't do this as a tail call
17100  * because rIBASE is caller save and we need to reload it.
17101  */
17102     movl   rSELF, %eax
17103     movl   rPC, OUT_ARG0(%esp)
17104     movl   %eax, OUT_ARG1(%esp)
17105     call   dvmCheckInst                            # (dPC, self)
17106     movl   rSELF, %ecx
17107     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17108     jmp    *dvmAsmInstructionStart+(332*4)
17109
17110 /* ------------------------------ */
17111 .L_ALT_OP_UNUSED_4DFF: /* 0x14d */
17112 /* File: x86/alt_stub.S */
17113 /*
17114  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17115  * any interesting requests and then jump to the real instruction
17116  * handler.  Unlike the Arm handler, we can't do this as a tail call
17117  * because rIBASE is caller save and we need to reload it.
17118  */
17119     movl   rSELF, %eax
17120     movl   rPC, OUT_ARG0(%esp)
17121     movl   %eax, OUT_ARG1(%esp)
17122     call   dvmCheckInst                            # (dPC, self)
17123     movl   rSELF, %ecx
17124     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17125     jmp    *dvmAsmInstructionStart+(333*4)
17126
17127 /* ------------------------------ */
17128 .L_ALT_OP_UNUSED_4EFF: /* 0x14e */
17129 /* File: x86/alt_stub.S */
17130 /*
17131  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17132  * any interesting requests and then jump to the real instruction
17133  * handler.  Unlike the Arm handler, we can't do this as a tail call
17134  * because rIBASE is caller save and we need to reload it.
17135  */
17136     movl   rSELF, %eax
17137     movl   rPC, OUT_ARG0(%esp)
17138     movl   %eax, OUT_ARG1(%esp)
17139     call   dvmCheckInst                            # (dPC, self)
17140     movl   rSELF, %ecx
17141     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17142     jmp    *dvmAsmInstructionStart+(334*4)
17143
17144 /* ------------------------------ */
17145 .L_ALT_OP_UNUSED_4FFF: /* 0x14f */
17146 /* File: x86/alt_stub.S */
17147 /*
17148  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17149  * any interesting requests and then jump to the real instruction
17150  * handler.  Unlike the Arm handler, we can't do this as a tail call
17151  * because rIBASE is caller save and we need to reload it.
17152  */
17153     movl   rSELF, %eax
17154     movl   rPC, OUT_ARG0(%esp)
17155     movl   %eax, OUT_ARG1(%esp)
17156     call   dvmCheckInst                            # (dPC, self)
17157     movl   rSELF, %ecx
17158     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17159     jmp    *dvmAsmInstructionStart+(335*4)
17160
17161 /* ------------------------------ */
17162 .L_ALT_OP_UNUSED_50FF: /* 0x150 */
17163 /* File: x86/alt_stub.S */
17164 /*
17165  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17166  * any interesting requests and then jump to the real instruction
17167  * handler.  Unlike the Arm handler, we can't do this as a tail call
17168  * because rIBASE is caller save and we need to reload it.
17169  */
17170     movl   rSELF, %eax
17171     movl   rPC, OUT_ARG0(%esp)
17172     movl   %eax, OUT_ARG1(%esp)
17173     call   dvmCheckInst                            # (dPC, self)
17174     movl   rSELF, %ecx
17175     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17176     jmp    *dvmAsmInstructionStart+(336*4)
17177
17178 /* ------------------------------ */
17179 .L_ALT_OP_UNUSED_51FF: /* 0x151 */
17180 /* File: x86/alt_stub.S */
17181 /*
17182  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17183  * any interesting requests and then jump to the real instruction
17184  * handler.  Unlike the Arm handler, we can't do this as a tail call
17185  * because rIBASE is caller save and we need to reload it.
17186  */
17187     movl   rSELF, %eax
17188     movl   rPC, OUT_ARG0(%esp)
17189     movl   %eax, OUT_ARG1(%esp)
17190     call   dvmCheckInst                            # (dPC, self)
17191     movl   rSELF, %ecx
17192     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17193     jmp    *dvmAsmInstructionStart+(337*4)
17194
17195 /* ------------------------------ */
17196 .L_ALT_OP_UNUSED_52FF: /* 0x152 */
17197 /* File: x86/alt_stub.S */
17198 /*
17199  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17200  * any interesting requests and then jump to the real instruction
17201  * handler.  Unlike the Arm handler, we can't do this as a tail call
17202  * because rIBASE is caller save and we need to reload it.
17203  */
17204     movl   rSELF, %eax
17205     movl   rPC, OUT_ARG0(%esp)
17206     movl   %eax, OUT_ARG1(%esp)
17207     call   dvmCheckInst                            # (dPC, self)
17208     movl   rSELF, %ecx
17209     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17210     jmp    *dvmAsmInstructionStart+(338*4)
17211
17212 /* ------------------------------ */
17213 .L_ALT_OP_UNUSED_53FF: /* 0x153 */
17214 /* File: x86/alt_stub.S */
17215 /*
17216  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17217  * any interesting requests and then jump to the real instruction
17218  * handler.  Unlike the Arm handler, we can't do this as a tail call
17219  * because rIBASE is caller save and we need to reload it.
17220  */
17221     movl   rSELF, %eax
17222     movl   rPC, OUT_ARG0(%esp)
17223     movl   %eax, OUT_ARG1(%esp)
17224     call   dvmCheckInst                            # (dPC, self)
17225     movl   rSELF, %ecx
17226     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17227     jmp    *dvmAsmInstructionStart+(339*4)
17228
17229 /* ------------------------------ */
17230 .L_ALT_OP_UNUSED_54FF: /* 0x154 */
17231 /* File: x86/alt_stub.S */
17232 /*
17233  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17234  * any interesting requests and then jump to the real instruction
17235  * handler.  Unlike the Arm handler, we can't do this as a tail call
17236  * because rIBASE is caller save and we need to reload it.
17237  */
17238     movl   rSELF, %eax
17239     movl   rPC, OUT_ARG0(%esp)
17240     movl   %eax, OUT_ARG1(%esp)
17241     call   dvmCheckInst                            # (dPC, self)
17242     movl   rSELF, %ecx
17243     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17244     jmp    *dvmAsmInstructionStart+(340*4)
17245
17246 /* ------------------------------ */
17247 .L_ALT_OP_UNUSED_55FF: /* 0x155 */
17248 /* File: x86/alt_stub.S */
17249 /*
17250  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17251  * any interesting requests and then jump to the real instruction
17252  * handler.  Unlike the Arm handler, we can't do this as a tail call
17253  * because rIBASE is caller save and we need to reload it.
17254  */
17255     movl   rSELF, %eax
17256     movl   rPC, OUT_ARG0(%esp)
17257     movl   %eax, OUT_ARG1(%esp)
17258     call   dvmCheckInst                            # (dPC, self)
17259     movl   rSELF, %ecx
17260     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17261     jmp    *dvmAsmInstructionStart+(341*4)
17262
17263 /* ------------------------------ */
17264 .L_ALT_OP_UNUSED_56FF: /* 0x156 */
17265 /* File: x86/alt_stub.S */
17266 /*
17267  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17268  * any interesting requests and then jump to the real instruction
17269  * handler.  Unlike the Arm handler, we can't do this as a tail call
17270  * because rIBASE is caller save and we need to reload it.
17271  */
17272     movl   rSELF, %eax
17273     movl   rPC, OUT_ARG0(%esp)
17274     movl   %eax, OUT_ARG1(%esp)
17275     call   dvmCheckInst                            # (dPC, self)
17276     movl   rSELF, %ecx
17277     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17278     jmp    *dvmAsmInstructionStart+(342*4)
17279
17280 /* ------------------------------ */
17281 .L_ALT_OP_UNUSED_57FF: /* 0x157 */
17282 /* File: x86/alt_stub.S */
17283 /*
17284  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17285  * any interesting requests and then jump to the real instruction
17286  * handler.  Unlike the Arm handler, we can't do this as a tail call
17287  * because rIBASE is caller save and we need to reload it.
17288  */
17289     movl   rSELF, %eax
17290     movl   rPC, OUT_ARG0(%esp)
17291     movl   %eax, OUT_ARG1(%esp)
17292     call   dvmCheckInst                            # (dPC, self)
17293     movl   rSELF, %ecx
17294     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17295     jmp    *dvmAsmInstructionStart+(343*4)
17296
17297 /* ------------------------------ */
17298 .L_ALT_OP_UNUSED_58FF: /* 0x158 */
17299 /* File: x86/alt_stub.S */
17300 /*
17301  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17302  * any interesting requests and then jump to the real instruction
17303  * handler.  Unlike the Arm handler, we can't do this as a tail call
17304  * because rIBASE is caller save and we need to reload it.
17305  */
17306     movl   rSELF, %eax
17307     movl   rPC, OUT_ARG0(%esp)
17308     movl   %eax, OUT_ARG1(%esp)
17309     call   dvmCheckInst                            # (dPC, self)
17310     movl   rSELF, %ecx
17311     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17312     jmp    *dvmAsmInstructionStart+(344*4)
17313
17314 /* ------------------------------ */
17315 .L_ALT_OP_UNUSED_59FF: /* 0x159 */
17316 /* File: x86/alt_stub.S */
17317 /*
17318  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17319  * any interesting requests and then jump to the real instruction
17320  * handler.  Unlike the Arm handler, we can't do this as a tail call
17321  * because rIBASE is caller save and we need to reload it.
17322  */
17323     movl   rSELF, %eax
17324     movl   rPC, OUT_ARG0(%esp)
17325     movl   %eax, OUT_ARG1(%esp)
17326     call   dvmCheckInst                            # (dPC, self)
17327     movl   rSELF, %ecx
17328     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17329     jmp    *dvmAsmInstructionStart+(345*4)
17330
17331 /* ------------------------------ */
17332 .L_ALT_OP_UNUSED_5AFF: /* 0x15a */
17333 /* File: x86/alt_stub.S */
17334 /*
17335  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17336  * any interesting requests and then jump to the real instruction
17337  * handler.  Unlike the Arm handler, we can't do this as a tail call
17338  * because rIBASE is caller save and we need to reload it.
17339  */
17340     movl   rSELF, %eax
17341     movl   rPC, OUT_ARG0(%esp)
17342     movl   %eax, OUT_ARG1(%esp)
17343     call   dvmCheckInst                            # (dPC, self)
17344     movl   rSELF, %ecx
17345     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17346     jmp    *dvmAsmInstructionStart+(346*4)
17347
17348 /* ------------------------------ */
17349 .L_ALT_OP_UNUSED_5BFF: /* 0x15b */
17350 /* File: x86/alt_stub.S */
17351 /*
17352  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17353  * any interesting requests and then jump to the real instruction
17354  * handler.  Unlike the Arm handler, we can't do this as a tail call
17355  * because rIBASE is caller save and we need to reload it.
17356  */
17357     movl   rSELF, %eax
17358     movl   rPC, OUT_ARG0(%esp)
17359     movl   %eax, OUT_ARG1(%esp)
17360     call   dvmCheckInst                            # (dPC, self)
17361     movl   rSELF, %ecx
17362     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17363     jmp    *dvmAsmInstructionStart+(347*4)
17364
17365 /* ------------------------------ */
17366 .L_ALT_OP_UNUSED_5CFF: /* 0x15c */
17367 /* File: x86/alt_stub.S */
17368 /*
17369  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17370  * any interesting requests and then jump to the real instruction
17371  * handler.  Unlike the Arm handler, we can't do this as a tail call
17372  * because rIBASE is caller save and we need to reload it.
17373  */
17374     movl   rSELF, %eax
17375     movl   rPC, OUT_ARG0(%esp)
17376     movl   %eax, OUT_ARG1(%esp)
17377     call   dvmCheckInst                            # (dPC, self)
17378     movl   rSELF, %ecx
17379     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17380     jmp    *dvmAsmInstructionStart+(348*4)
17381
17382 /* ------------------------------ */
17383 .L_ALT_OP_UNUSED_5DFF: /* 0x15d */
17384 /* File: x86/alt_stub.S */
17385 /*
17386  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17387  * any interesting requests and then jump to the real instruction
17388  * handler.  Unlike the Arm handler, we can't do this as a tail call
17389  * because rIBASE is caller save and we need to reload it.
17390  */
17391     movl   rSELF, %eax
17392     movl   rPC, OUT_ARG0(%esp)
17393     movl   %eax, OUT_ARG1(%esp)
17394     call   dvmCheckInst                            # (dPC, self)
17395     movl   rSELF, %ecx
17396     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17397     jmp    *dvmAsmInstructionStart+(349*4)
17398
17399 /* ------------------------------ */
17400 .L_ALT_OP_UNUSED_5EFF: /* 0x15e */
17401 /* File: x86/alt_stub.S */
17402 /*
17403  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17404  * any interesting requests and then jump to the real instruction
17405  * handler.  Unlike the Arm handler, we can't do this as a tail call
17406  * because rIBASE is caller save and we need to reload it.
17407  */
17408     movl   rSELF, %eax
17409     movl   rPC, OUT_ARG0(%esp)
17410     movl   %eax, OUT_ARG1(%esp)
17411     call   dvmCheckInst                            # (dPC, self)
17412     movl   rSELF, %ecx
17413     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17414     jmp    *dvmAsmInstructionStart+(350*4)
17415
17416 /* ------------------------------ */
17417 .L_ALT_OP_UNUSED_5FFF: /* 0x15f */
17418 /* File: x86/alt_stub.S */
17419 /*
17420  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17421  * any interesting requests and then jump to the real instruction
17422  * handler.  Unlike the Arm handler, we can't do this as a tail call
17423  * because rIBASE is caller save and we need to reload it.
17424  */
17425     movl   rSELF, %eax
17426     movl   rPC, OUT_ARG0(%esp)
17427     movl   %eax, OUT_ARG1(%esp)
17428     call   dvmCheckInst                            # (dPC, self)
17429     movl   rSELF, %ecx
17430     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17431     jmp    *dvmAsmInstructionStart+(351*4)
17432
17433 /* ------------------------------ */
17434 .L_ALT_OP_UNUSED_60FF: /* 0x160 */
17435 /* File: x86/alt_stub.S */
17436 /*
17437  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17438  * any interesting requests and then jump to the real instruction
17439  * handler.  Unlike the Arm handler, we can't do this as a tail call
17440  * because rIBASE is caller save and we need to reload it.
17441  */
17442     movl   rSELF, %eax
17443     movl   rPC, OUT_ARG0(%esp)
17444     movl   %eax, OUT_ARG1(%esp)
17445     call   dvmCheckInst                            # (dPC, self)
17446     movl   rSELF, %ecx
17447     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17448     jmp    *dvmAsmInstructionStart+(352*4)
17449
17450 /* ------------------------------ */
17451 .L_ALT_OP_UNUSED_61FF: /* 0x161 */
17452 /* File: x86/alt_stub.S */
17453 /*
17454  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17455  * any interesting requests and then jump to the real instruction
17456  * handler.  Unlike the Arm handler, we can't do this as a tail call
17457  * because rIBASE is caller save and we need to reload it.
17458  */
17459     movl   rSELF, %eax
17460     movl   rPC, OUT_ARG0(%esp)
17461     movl   %eax, OUT_ARG1(%esp)
17462     call   dvmCheckInst                            # (dPC, self)
17463     movl   rSELF, %ecx
17464     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17465     jmp    *dvmAsmInstructionStart+(353*4)
17466
17467 /* ------------------------------ */
17468 .L_ALT_OP_UNUSED_62FF: /* 0x162 */
17469 /* File: x86/alt_stub.S */
17470 /*
17471  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17472  * any interesting requests and then jump to the real instruction
17473  * handler.  Unlike the Arm handler, we can't do this as a tail call
17474  * because rIBASE is caller save and we need to reload it.
17475  */
17476     movl   rSELF, %eax
17477     movl   rPC, OUT_ARG0(%esp)
17478     movl   %eax, OUT_ARG1(%esp)
17479     call   dvmCheckInst                            # (dPC, self)
17480     movl   rSELF, %ecx
17481     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17482     jmp    *dvmAsmInstructionStart+(354*4)
17483
17484 /* ------------------------------ */
17485 .L_ALT_OP_UNUSED_63FF: /* 0x163 */
17486 /* File: x86/alt_stub.S */
17487 /*
17488  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17489  * any interesting requests and then jump to the real instruction
17490  * handler.  Unlike the Arm handler, we can't do this as a tail call
17491  * because rIBASE is caller save and we need to reload it.
17492  */
17493     movl   rSELF, %eax
17494     movl   rPC, OUT_ARG0(%esp)
17495     movl   %eax, OUT_ARG1(%esp)
17496     call   dvmCheckInst                            # (dPC, self)
17497     movl   rSELF, %ecx
17498     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17499     jmp    *dvmAsmInstructionStart+(355*4)
17500
17501 /* ------------------------------ */
17502 .L_ALT_OP_UNUSED_64FF: /* 0x164 */
17503 /* File: x86/alt_stub.S */
17504 /*
17505  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17506  * any interesting requests and then jump to the real instruction
17507  * handler.  Unlike the Arm handler, we can't do this as a tail call
17508  * because rIBASE is caller save and we need to reload it.
17509  */
17510     movl   rSELF, %eax
17511     movl   rPC, OUT_ARG0(%esp)
17512     movl   %eax, OUT_ARG1(%esp)
17513     call   dvmCheckInst                            # (dPC, self)
17514     movl   rSELF, %ecx
17515     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17516     jmp    *dvmAsmInstructionStart+(356*4)
17517
17518 /* ------------------------------ */
17519 .L_ALT_OP_UNUSED_65FF: /* 0x165 */
17520 /* File: x86/alt_stub.S */
17521 /*
17522  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17523  * any interesting requests and then jump to the real instruction
17524  * handler.  Unlike the Arm handler, we can't do this as a tail call
17525  * because rIBASE is caller save and we need to reload it.
17526  */
17527     movl   rSELF, %eax
17528     movl   rPC, OUT_ARG0(%esp)
17529     movl   %eax, OUT_ARG1(%esp)
17530     call   dvmCheckInst                            # (dPC, self)
17531     movl   rSELF, %ecx
17532     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17533     jmp    *dvmAsmInstructionStart+(357*4)
17534
17535 /* ------------------------------ */
17536 .L_ALT_OP_UNUSED_66FF: /* 0x166 */
17537 /* File: x86/alt_stub.S */
17538 /*
17539  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17540  * any interesting requests and then jump to the real instruction
17541  * handler.  Unlike the Arm handler, we can't do this as a tail call
17542  * because rIBASE is caller save and we need to reload it.
17543  */
17544     movl   rSELF, %eax
17545     movl   rPC, OUT_ARG0(%esp)
17546     movl   %eax, OUT_ARG1(%esp)
17547     call   dvmCheckInst                            # (dPC, self)
17548     movl   rSELF, %ecx
17549     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17550     jmp    *dvmAsmInstructionStart+(358*4)
17551
17552 /* ------------------------------ */
17553 .L_ALT_OP_UNUSED_67FF: /* 0x167 */
17554 /* File: x86/alt_stub.S */
17555 /*
17556  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17557  * any interesting requests and then jump to the real instruction
17558  * handler.  Unlike the Arm handler, we can't do this as a tail call
17559  * because rIBASE is caller save and we need to reload it.
17560  */
17561     movl   rSELF, %eax
17562     movl   rPC, OUT_ARG0(%esp)
17563     movl   %eax, OUT_ARG1(%esp)
17564     call   dvmCheckInst                            # (dPC, self)
17565     movl   rSELF, %ecx
17566     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17567     jmp    *dvmAsmInstructionStart+(359*4)
17568
17569 /* ------------------------------ */
17570 .L_ALT_OP_UNUSED_68FF: /* 0x168 */
17571 /* File: x86/alt_stub.S */
17572 /*
17573  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17574  * any interesting requests and then jump to the real instruction
17575  * handler.  Unlike the Arm handler, we can't do this as a tail call
17576  * because rIBASE is caller save and we need to reload it.
17577  */
17578     movl   rSELF, %eax
17579     movl   rPC, OUT_ARG0(%esp)
17580     movl   %eax, OUT_ARG1(%esp)
17581     call   dvmCheckInst                            # (dPC, self)
17582     movl   rSELF, %ecx
17583     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17584     jmp    *dvmAsmInstructionStart+(360*4)
17585
17586 /* ------------------------------ */
17587 .L_ALT_OP_UNUSED_69FF: /* 0x169 */
17588 /* File: x86/alt_stub.S */
17589 /*
17590  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17591  * any interesting requests and then jump to the real instruction
17592  * handler.  Unlike the Arm handler, we can't do this as a tail call
17593  * because rIBASE is caller save and we need to reload it.
17594  */
17595     movl   rSELF, %eax
17596     movl   rPC, OUT_ARG0(%esp)
17597     movl   %eax, OUT_ARG1(%esp)
17598     call   dvmCheckInst                            # (dPC, self)
17599     movl   rSELF, %ecx
17600     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17601     jmp    *dvmAsmInstructionStart+(361*4)
17602
17603 /* ------------------------------ */
17604 .L_ALT_OP_UNUSED_6AFF: /* 0x16a */
17605 /* File: x86/alt_stub.S */
17606 /*
17607  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17608  * any interesting requests and then jump to the real instruction
17609  * handler.  Unlike the Arm handler, we can't do this as a tail call
17610  * because rIBASE is caller save and we need to reload it.
17611  */
17612     movl   rSELF, %eax
17613     movl   rPC, OUT_ARG0(%esp)
17614     movl   %eax, OUT_ARG1(%esp)
17615     call   dvmCheckInst                            # (dPC, self)
17616     movl   rSELF, %ecx
17617     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17618     jmp    *dvmAsmInstructionStart+(362*4)
17619
17620 /* ------------------------------ */
17621 .L_ALT_OP_UNUSED_6BFF: /* 0x16b */
17622 /* File: x86/alt_stub.S */
17623 /*
17624  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17625  * any interesting requests and then jump to the real instruction
17626  * handler.  Unlike the Arm handler, we can't do this as a tail call
17627  * because rIBASE is caller save and we need to reload it.
17628  */
17629     movl   rSELF, %eax
17630     movl   rPC, OUT_ARG0(%esp)
17631     movl   %eax, OUT_ARG1(%esp)
17632     call   dvmCheckInst                            # (dPC, self)
17633     movl   rSELF, %ecx
17634     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17635     jmp    *dvmAsmInstructionStart+(363*4)
17636
17637 /* ------------------------------ */
17638 .L_ALT_OP_UNUSED_6CFF: /* 0x16c */
17639 /* File: x86/alt_stub.S */
17640 /*
17641  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17642  * any interesting requests and then jump to the real instruction
17643  * handler.  Unlike the Arm handler, we can't do this as a tail call
17644  * because rIBASE is caller save and we need to reload it.
17645  */
17646     movl   rSELF, %eax
17647     movl   rPC, OUT_ARG0(%esp)
17648     movl   %eax, OUT_ARG1(%esp)
17649     call   dvmCheckInst                            # (dPC, self)
17650     movl   rSELF, %ecx
17651     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17652     jmp    *dvmAsmInstructionStart+(364*4)
17653
17654 /* ------------------------------ */
17655 .L_ALT_OP_UNUSED_6DFF: /* 0x16d */
17656 /* File: x86/alt_stub.S */
17657 /*
17658  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17659  * any interesting requests and then jump to the real instruction
17660  * handler.  Unlike the Arm handler, we can't do this as a tail call
17661  * because rIBASE is caller save and we need to reload it.
17662  */
17663     movl   rSELF, %eax
17664     movl   rPC, OUT_ARG0(%esp)
17665     movl   %eax, OUT_ARG1(%esp)
17666     call   dvmCheckInst                            # (dPC, self)
17667     movl   rSELF, %ecx
17668     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17669     jmp    *dvmAsmInstructionStart+(365*4)
17670
17671 /* ------------------------------ */
17672 .L_ALT_OP_UNUSED_6EFF: /* 0x16e */
17673 /* File: x86/alt_stub.S */
17674 /*
17675  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17676  * any interesting requests and then jump to the real instruction
17677  * handler.  Unlike the Arm handler, we can't do this as a tail call
17678  * because rIBASE is caller save and we need to reload it.
17679  */
17680     movl   rSELF, %eax
17681     movl   rPC, OUT_ARG0(%esp)
17682     movl   %eax, OUT_ARG1(%esp)
17683     call   dvmCheckInst                            # (dPC, self)
17684     movl   rSELF, %ecx
17685     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17686     jmp    *dvmAsmInstructionStart+(366*4)
17687
17688 /* ------------------------------ */
17689 .L_ALT_OP_UNUSED_6FFF: /* 0x16f */
17690 /* File: x86/alt_stub.S */
17691 /*
17692  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17693  * any interesting requests and then jump to the real instruction
17694  * handler.  Unlike the Arm handler, we can't do this as a tail call
17695  * because rIBASE is caller save and we need to reload it.
17696  */
17697     movl   rSELF, %eax
17698     movl   rPC, OUT_ARG0(%esp)
17699     movl   %eax, OUT_ARG1(%esp)
17700     call   dvmCheckInst                            # (dPC, self)
17701     movl   rSELF, %ecx
17702     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17703     jmp    *dvmAsmInstructionStart+(367*4)
17704
17705 /* ------------------------------ */
17706 .L_ALT_OP_UNUSED_70FF: /* 0x170 */
17707 /* File: x86/alt_stub.S */
17708 /*
17709  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17710  * any interesting requests and then jump to the real instruction
17711  * handler.  Unlike the Arm handler, we can't do this as a tail call
17712  * because rIBASE is caller save and we need to reload it.
17713  */
17714     movl   rSELF, %eax
17715     movl   rPC, OUT_ARG0(%esp)
17716     movl   %eax, OUT_ARG1(%esp)
17717     call   dvmCheckInst                            # (dPC, self)
17718     movl   rSELF, %ecx
17719     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17720     jmp    *dvmAsmInstructionStart+(368*4)
17721
17722 /* ------------------------------ */
17723 .L_ALT_OP_UNUSED_71FF: /* 0x171 */
17724 /* File: x86/alt_stub.S */
17725 /*
17726  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17727  * any interesting requests and then jump to the real instruction
17728  * handler.  Unlike the Arm handler, we can't do this as a tail call
17729  * because rIBASE is caller save and we need to reload it.
17730  */
17731     movl   rSELF, %eax
17732     movl   rPC, OUT_ARG0(%esp)
17733     movl   %eax, OUT_ARG1(%esp)
17734     call   dvmCheckInst                            # (dPC, self)
17735     movl   rSELF, %ecx
17736     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17737     jmp    *dvmAsmInstructionStart+(369*4)
17738
17739 /* ------------------------------ */
17740 .L_ALT_OP_UNUSED_72FF: /* 0x172 */
17741 /* File: x86/alt_stub.S */
17742 /*
17743  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17744  * any interesting requests and then jump to the real instruction
17745  * handler.  Unlike the Arm handler, we can't do this as a tail call
17746  * because rIBASE is caller save and we need to reload it.
17747  */
17748     movl   rSELF, %eax
17749     movl   rPC, OUT_ARG0(%esp)
17750     movl   %eax, OUT_ARG1(%esp)
17751     call   dvmCheckInst                            # (dPC, self)
17752     movl   rSELF, %ecx
17753     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17754     jmp    *dvmAsmInstructionStart+(370*4)
17755
17756 /* ------------------------------ */
17757 .L_ALT_OP_UNUSED_73FF: /* 0x173 */
17758 /* File: x86/alt_stub.S */
17759 /*
17760  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17761  * any interesting requests and then jump to the real instruction
17762  * handler.  Unlike the Arm handler, we can't do this as a tail call
17763  * because rIBASE is caller save and we need to reload it.
17764  */
17765     movl   rSELF, %eax
17766     movl   rPC, OUT_ARG0(%esp)
17767     movl   %eax, OUT_ARG1(%esp)
17768     call   dvmCheckInst                            # (dPC, self)
17769     movl   rSELF, %ecx
17770     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17771     jmp    *dvmAsmInstructionStart+(371*4)
17772
17773 /* ------------------------------ */
17774 .L_ALT_OP_UNUSED_74FF: /* 0x174 */
17775 /* File: x86/alt_stub.S */
17776 /*
17777  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17778  * any interesting requests and then jump to the real instruction
17779  * handler.  Unlike the Arm handler, we can't do this as a tail call
17780  * because rIBASE is caller save and we need to reload it.
17781  */
17782     movl   rSELF, %eax
17783     movl   rPC, OUT_ARG0(%esp)
17784     movl   %eax, OUT_ARG1(%esp)
17785     call   dvmCheckInst                            # (dPC, self)
17786     movl   rSELF, %ecx
17787     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17788     jmp    *dvmAsmInstructionStart+(372*4)
17789
17790 /* ------------------------------ */
17791 .L_ALT_OP_UNUSED_75FF: /* 0x175 */
17792 /* File: x86/alt_stub.S */
17793 /*
17794  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17795  * any interesting requests and then jump to the real instruction
17796  * handler.  Unlike the Arm handler, we can't do this as a tail call
17797  * because rIBASE is caller save and we need to reload it.
17798  */
17799     movl   rSELF, %eax
17800     movl   rPC, OUT_ARG0(%esp)
17801     movl   %eax, OUT_ARG1(%esp)
17802     call   dvmCheckInst                            # (dPC, self)
17803     movl   rSELF, %ecx
17804     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17805     jmp    *dvmAsmInstructionStart+(373*4)
17806
17807 /* ------------------------------ */
17808 .L_ALT_OP_UNUSED_76FF: /* 0x176 */
17809 /* File: x86/alt_stub.S */
17810 /*
17811  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17812  * any interesting requests and then jump to the real instruction
17813  * handler.  Unlike the Arm handler, we can't do this as a tail call
17814  * because rIBASE is caller save and we need to reload it.
17815  */
17816     movl   rSELF, %eax
17817     movl   rPC, OUT_ARG0(%esp)
17818     movl   %eax, OUT_ARG1(%esp)
17819     call   dvmCheckInst                            # (dPC, self)
17820     movl   rSELF, %ecx
17821     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17822     jmp    *dvmAsmInstructionStart+(374*4)
17823
17824 /* ------------------------------ */
17825 .L_ALT_OP_UNUSED_77FF: /* 0x177 */
17826 /* File: x86/alt_stub.S */
17827 /*
17828  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17829  * any interesting requests and then jump to the real instruction
17830  * handler.  Unlike the Arm handler, we can't do this as a tail call
17831  * because rIBASE is caller save and we need to reload it.
17832  */
17833     movl   rSELF, %eax
17834     movl   rPC, OUT_ARG0(%esp)
17835     movl   %eax, OUT_ARG1(%esp)
17836     call   dvmCheckInst                            # (dPC, self)
17837     movl   rSELF, %ecx
17838     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17839     jmp    *dvmAsmInstructionStart+(375*4)
17840
17841 /* ------------------------------ */
17842 .L_ALT_OP_UNUSED_78FF: /* 0x178 */
17843 /* File: x86/alt_stub.S */
17844 /*
17845  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17846  * any interesting requests and then jump to the real instruction
17847  * handler.  Unlike the Arm handler, we can't do this as a tail call
17848  * because rIBASE is caller save and we need to reload it.
17849  */
17850     movl   rSELF, %eax
17851     movl   rPC, OUT_ARG0(%esp)
17852     movl   %eax, OUT_ARG1(%esp)
17853     call   dvmCheckInst                            # (dPC, self)
17854     movl   rSELF, %ecx
17855     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17856     jmp    *dvmAsmInstructionStart+(376*4)
17857
17858 /* ------------------------------ */
17859 .L_ALT_OP_UNUSED_79FF: /* 0x179 */
17860 /* File: x86/alt_stub.S */
17861 /*
17862  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17863  * any interesting requests and then jump to the real instruction
17864  * handler.  Unlike the Arm handler, we can't do this as a tail call
17865  * because rIBASE is caller save and we need to reload it.
17866  */
17867     movl   rSELF, %eax
17868     movl   rPC, OUT_ARG0(%esp)
17869     movl   %eax, OUT_ARG1(%esp)
17870     call   dvmCheckInst                            # (dPC, self)
17871     movl   rSELF, %ecx
17872     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17873     jmp    *dvmAsmInstructionStart+(377*4)
17874
17875 /* ------------------------------ */
17876 .L_ALT_OP_UNUSED_7AFF: /* 0x17a */
17877 /* File: x86/alt_stub.S */
17878 /*
17879  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17880  * any interesting requests and then jump to the real instruction
17881  * handler.  Unlike the Arm handler, we can't do this as a tail call
17882  * because rIBASE is caller save and we need to reload it.
17883  */
17884     movl   rSELF, %eax
17885     movl   rPC, OUT_ARG0(%esp)
17886     movl   %eax, OUT_ARG1(%esp)
17887     call   dvmCheckInst                            # (dPC, self)
17888     movl   rSELF, %ecx
17889     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17890     jmp    *dvmAsmInstructionStart+(378*4)
17891
17892 /* ------------------------------ */
17893 .L_ALT_OP_UNUSED_7BFF: /* 0x17b */
17894 /* File: x86/alt_stub.S */
17895 /*
17896  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17897  * any interesting requests and then jump to the real instruction
17898  * handler.  Unlike the Arm handler, we can't do this as a tail call
17899  * because rIBASE is caller save and we need to reload it.
17900  */
17901     movl   rSELF, %eax
17902     movl   rPC, OUT_ARG0(%esp)
17903     movl   %eax, OUT_ARG1(%esp)
17904     call   dvmCheckInst                            # (dPC, self)
17905     movl   rSELF, %ecx
17906     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17907     jmp    *dvmAsmInstructionStart+(379*4)
17908
17909 /* ------------------------------ */
17910 .L_ALT_OP_UNUSED_7CFF: /* 0x17c */
17911 /* File: x86/alt_stub.S */
17912 /*
17913  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17914  * any interesting requests and then jump to the real instruction
17915  * handler.  Unlike the Arm handler, we can't do this as a tail call
17916  * because rIBASE is caller save and we need to reload it.
17917  */
17918     movl   rSELF, %eax
17919     movl   rPC, OUT_ARG0(%esp)
17920     movl   %eax, OUT_ARG1(%esp)
17921     call   dvmCheckInst                            # (dPC, self)
17922     movl   rSELF, %ecx
17923     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17924     jmp    *dvmAsmInstructionStart+(380*4)
17925
17926 /* ------------------------------ */
17927 .L_ALT_OP_UNUSED_7DFF: /* 0x17d */
17928 /* File: x86/alt_stub.S */
17929 /*
17930  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17931  * any interesting requests and then jump to the real instruction
17932  * handler.  Unlike the Arm handler, we can't do this as a tail call
17933  * because rIBASE is caller save and we need to reload it.
17934  */
17935     movl   rSELF, %eax
17936     movl   rPC, OUT_ARG0(%esp)
17937     movl   %eax, OUT_ARG1(%esp)
17938     call   dvmCheckInst                            # (dPC, self)
17939     movl   rSELF, %ecx
17940     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17941     jmp    *dvmAsmInstructionStart+(381*4)
17942
17943 /* ------------------------------ */
17944 .L_ALT_OP_UNUSED_7EFF: /* 0x17e */
17945 /* File: x86/alt_stub.S */
17946 /*
17947  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17948  * any interesting requests and then jump to the real instruction
17949  * handler.  Unlike the Arm handler, we can't do this as a tail call
17950  * because rIBASE is caller save and we need to reload it.
17951  */
17952     movl   rSELF, %eax
17953     movl   rPC, OUT_ARG0(%esp)
17954     movl   %eax, OUT_ARG1(%esp)
17955     call   dvmCheckInst                            # (dPC, self)
17956     movl   rSELF, %ecx
17957     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17958     jmp    *dvmAsmInstructionStart+(382*4)
17959
17960 /* ------------------------------ */
17961 .L_ALT_OP_UNUSED_7FFF: /* 0x17f */
17962 /* File: x86/alt_stub.S */
17963 /*
17964  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17965  * any interesting requests and then jump to the real instruction
17966  * handler.  Unlike the Arm handler, we can't do this as a tail call
17967  * because rIBASE is caller save and we need to reload it.
17968  */
17969     movl   rSELF, %eax
17970     movl   rPC, OUT_ARG0(%esp)
17971     movl   %eax, OUT_ARG1(%esp)
17972     call   dvmCheckInst                            # (dPC, self)
17973     movl   rSELF, %ecx
17974     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17975     jmp    *dvmAsmInstructionStart+(383*4)
17976
17977 /* ------------------------------ */
17978 .L_ALT_OP_UNUSED_80FF: /* 0x180 */
17979 /* File: x86/alt_stub.S */
17980 /*
17981  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17982  * any interesting requests and then jump to the real instruction
17983  * handler.  Unlike the Arm handler, we can't do this as a tail call
17984  * because rIBASE is caller save and we need to reload it.
17985  */
17986     movl   rSELF, %eax
17987     movl   rPC, OUT_ARG0(%esp)
17988     movl   %eax, OUT_ARG1(%esp)
17989     call   dvmCheckInst                            # (dPC, self)
17990     movl   rSELF, %ecx
17991     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
17992     jmp    *dvmAsmInstructionStart+(384*4)
17993
17994 /* ------------------------------ */
17995 .L_ALT_OP_UNUSED_81FF: /* 0x181 */
17996 /* File: x86/alt_stub.S */
17997 /*
17998  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
17999  * any interesting requests and then jump to the real instruction
18000  * handler.  Unlike the Arm handler, we can't do this as a tail call
18001  * because rIBASE is caller save and we need to reload it.
18002  */
18003     movl   rSELF, %eax
18004     movl   rPC, OUT_ARG0(%esp)
18005     movl   %eax, OUT_ARG1(%esp)
18006     call   dvmCheckInst                            # (dPC, self)
18007     movl   rSELF, %ecx
18008     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18009     jmp    *dvmAsmInstructionStart+(385*4)
18010
18011 /* ------------------------------ */
18012 .L_ALT_OP_UNUSED_82FF: /* 0x182 */
18013 /* File: x86/alt_stub.S */
18014 /*
18015  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18016  * any interesting requests and then jump to the real instruction
18017  * handler.  Unlike the Arm handler, we can't do this as a tail call
18018  * because rIBASE is caller save and we need to reload it.
18019  */
18020     movl   rSELF, %eax
18021     movl   rPC, OUT_ARG0(%esp)
18022     movl   %eax, OUT_ARG1(%esp)
18023     call   dvmCheckInst                            # (dPC, self)
18024     movl   rSELF, %ecx
18025     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18026     jmp    *dvmAsmInstructionStart+(386*4)
18027
18028 /* ------------------------------ */
18029 .L_ALT_OP_UNUSED_83FF: /* 0x183 */
18030 /* File: x86/alt_stub.S */
18031 /*
18032  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18033  * any interesting requests and then jump to the real instruction
18034  * handler.  Unlike the Arm handler, we can't do this as a tail call
18035  * because rIBASE is caller save and we need to reload it.
18036  */
18037     movl   rSELF, %eax
18038     movl   rPC, OUT_ARG0(%esp)
18039     movl   %eax, OUT_ARG1(%esp)
18040     call   dvmCheckInst                            # (dPC, self)
18041     movl   rSELF, %ecx
18042     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18043     jmp    *dvmAsmInstructionStart+(387*4)
18044
18045 /* ------------------------------ */
18046 .L_ALT_OP_UNUSED_84FF: /* 0x184 */
18047 /* File: x86/alt_stub.S */
18048 /*
18049  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18050  * any interesting requests and then jump to the real instruction
18051  * handler.  Unlike the Arm handler, we can't do this as a tail call
18052  * because rIBASE is caller save and we need to reload it.
18053  */
18054     movl   rSELF, %eax
18055     movl   rPC, OUT_ARG0(%esp)
18056     movl   %eax, OUT_ARG1(%esp)
18057     call   dvmCheckInst                            # (dPC, self)
18058     movl   rSELF, %ecx
18059     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18060     jmp    *dvmAsmInstructionStart+(388*4)
18061
18062 /* ------------------------------ */
18063 .L_ALT_OP_UNUSED_85FF: /* 0x185 */
18064 /* File: x86/alt_stub.S */
18065 /*
18066  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18067  * any interesting requests and then jump to the real instruction
18068  * handler.  Unlike the Arm handler, we can't do this as a tail call
18069  * because rIBASE is caller save and we need to reload it.
18070  */
18071     movl   rSELF, %eax
18072     movl   rPC, OUT_ARG0(%esp)
18073     movl   %eax, OUT_ARG1(%esp)
18074     call   dvmCheckInst                            # (dPC, self)
18075     movl   rSELF, %ecx
18076     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18077     jmp    *dvmAsmInstructionStart+(389*4)
18078
18079 /* ------------------------------ */
18080 .L_ALT_OP_UNUSED_86FF: /* 0x186 */
18081 /* File: x86/alt_stub.S */
18082 /*
18083  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18084  * any interesting requests and then jump to the real instruction
18085  * handler.  Unlike the Arm handler, we can't do this as a tail call
18086  * because rIBASE is caller save and we need to reload it.
18087  */
18088     movl   rSELF, %eax
18089     movl   rPC, OUT_ARG0(%esp)
18090     movl   %eax, OUT_ARG1(%esp)
18091     call   dvmCheckInst                            # (dPC, self)
18092     movl   rSELF, %ecx
18093     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18094     jmp    *dvmAsmInstructionStart+(390*4)
18095
18096 /* ------------------------------ */
18097 .L_ALT_OP_UNUSED_87FF: /* 0x187 */
18098 /* File: x86/alt_stub.S */
18099 /*
18100  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18101  * any interesting requests and then jump to the real instruction
18102  * handler.  Unlike the Arm handler, we can't do this as a tail call
18103  * because rIBASE is caller save and we need to reload it.
18104  */
18105     movl   rSELF, %eax
18106     movl   rPC, OUT_ARG0(%esp)
18107     movl   %eax, OUT_ARG1(%esp)
18108     call   dvmCheckInst                            # (dPC, self)
18109     movl   rSELF, %ecx
18110     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18111     jmp    *dvmAsmInstructionStart+(391*4)
18112
18113 /* ------------------------------ */
18114 .L_ALT_OP_UNUSED_88FF: /* 0x188 */
18115 /* File: x86/alt_stub.S */
18116 /*
18117  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18118  * any interesting requests and then jump to the real instruction
18119  * handler.  Unlike the Arm handler, we can't do this as a tail call
18120  * because rIBASE is caller save and we need to reload it.
18121  */
18122     movl   rSELF, %eax
18123     movl   rPC, OUT_ARG0(%esp)
18124     movl   %eax, OUT_ARG1(%esp)
18125     call   dvmCheckInst                            # (dPC, self)
18126     movl   rSELF, %ecx
18127     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18128     jmp    *dvmAsmInstructionStart+(392*4)
18129
18130 /* ------------------------------ */
18131 .L_ALT_OP_UNUSED_89FF: /* 0x189 */
18132 /* File: x86/alt_stub.S */
18133 /*
18134  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18135  * any interesting requests and then jump to the real instruction
18136  * handler.  Unlike the Arm handler, we can't do this as a tail call
18137  * because rIBASE is caller save and we need to reload it.
18138  */
18139     movl   rSELF, %eax
18140     movl   rPC, OUT_ARG0(%esp)
18141     movl   %eax, OUT_ARG1(%esp)
18142     call   dvmCheckInst                            # (dPC, self)
18143     movl   rSELF, %ecx
18144     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18145     jmp    *dvmAsmInstructionStart+(393*4)
18146
18147 /* ------------------------------ */
18148 .L_ALT_OP_UNUSED_8AFF: /* 0x18a */
18149 /* File: x86/alt_stub.S */
18150 /*
18151  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18152  * any interesting requests and then jump to the real instruction
18153  * handler.  Unlike the Arm handler, we can't do this as a tail call
18154  * because rIBASE is caller save and we need to reload it.
18155  */
18156     movl   rSELF, %eax
18157     movl   rPC, OUT_ARG0(%esp)
18158     movl   %eax, OUT_ARG1(%esp)
18159     call   dvmCheckInst                            # (dPC, self)
18160     movl   rSELF, %ecx
18161     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18162     jmp    *dvmAsmInstructionStart+(394*4)
18163
18164 /* ------------------------------ */
18165 .L_ALT_OP_UNUSED_8BFF: /* 0x18b */
18166 /* File: x86/alt_stub.S */
18167 /*
18168  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18169  * any interesting requests and then jump to the real instruction
18170  * handler.  Unlike the Arm handler, we can't do this as a tail call
18171  * because rIBASE is caller save and we need to reload it.
18172  */
18173     movl   rSELF, %eax
18174     movl   rPC, OUT_ARG0(%esp)
18175     movl   %eax, OUT_ARG1(%esp)
18176     call   dvmCheckInst                            # (dPC, self)
18177     movl   rSELF, %ecx
18178     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18179     jmp    *dvmAsmInstructionStart+(395*4)
18180
18181 /* ------------------------------ */
18182 .L_ALT_OP_UNUSED_8CFF: /* 0x18c */
18183 /* File: x86/alt_stub.S */
18184 /*
18185  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18186  * any interesting requests and then jump to the real instruction
18187  * handler.  Unlike the Arm handler, we can't do this as a tail call
18188  * because rIBASE is caller save and we need to reload it.
18189  */
18190     movl   rSELF, %eax
18191     movl   rPC, OUT_ARG0(%esp)
18192     movl   %eax, OUT_ARG1(%esp)
18193     call   dvmCheckInst                            # (dPC, self)
18194     movl   rSELF, %ecx
18195     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18196     jmp    *dvmAsmInstructionStart+(396*4)
18197
18198 /* ------------------------------ */
18199 .L_ALT_OP_UNUSED_8DFF: /* 0x18d */
18200 /* File: x86/alt_stub.S */
18201 /*
18202  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18203  * any interesting requests and then jump to the real instruction
18204  * handler.  Unlike the Arm handler, we can't do this as a tail call
18205  * because rIBASE is caller save and we need to reload it.
18206  */
18207     movl   rSELF, %eax
18208     movl   rPC, OUT_ARG0(%esp)
18209     movl   %eax, OUT_ARG1(%esp)
18210     call   dvmCheckInst                            # (dPC, self)
18211     movl   rSELF, %ecx
18212     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18213     jmp    *dvmAsmInstructionStart+(397*4)
18214
18215 /* ------------------------------ */
18216 .L_ALT_OP_UNUSED_8EFF: /* 0x18e */
18217 /* File: x86/alt_stub.S */
18218 /*
18219  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18220  * any interesting requests and then jump to the real instruction
18221  * handler.  Unlike the Arm handler, we can't do this as a tail call
18222  * because rIBASE is caller save and we need to reload it.
18223  */
18224     movl   rSELF, %eax
18225     movl   rPC, OUT_ARG0(%esp)
18226     movl   %eax, OUT_ARG1(%esp)
18227     call   dvmCheckInst                            # (dPC, self)
18228     movl   rSELF, %ecx
18229     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18230     jmp    *dvmAsmInstructionStart+(398*4)
18231
18232 /* ------------------------------ */
18233 .L_ALT_OP_UNUSED_8FFF: /* 0x18f */
18234 /* File: x86/alt_stub.S */
18235 /*
18236  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18237  * any interesting requests and then jump to the real instruction
18238  * handler.  Unlike the Arm handler, we can't do this as a tail call
18239  * because rIBASE is caller save and we need to reload it.
18240  */
18241     movl   rSELF, %eax
18242     movl   rPC, OUT_ARG0(%esp)
18243     movl   %eax, OUT_ARG1(%esp)
18244     call   dvmCheckInst                            # (dPC, self)
18245     movl   rSELF, %ecx
18246     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18247     jmp    *dvmAsmInstructionStart+(399*4)
18248
18249 /* ------------------------------ */
18250 .L_ALT_OP_UNUSED_90FF: /* 0x190 */
18251 /* File: x86/alt_stub.S */
18252 /*
18253  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18254  * any interesting requests and then jump to the real instruction
18255  * handler.  Unlike the Arm handler, we can't do this as a tail call
18256  * because rIBASE is caller save and we need to reload it.
18257  */
18258     movl   rSELF, %eax
18259     movl   rPC, OUT_ARG0(%esp)
18260     movl   %eax, OUT_ARG1(%esp)
18261     call   dvmCheckInst                            # (dPC, self)
18262     movl   rSELF, %ecx
18263     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18264     jmp    *dvmAsmInstructionStart+(400*4)
18265
18266 /* ------------------------------ */
18267 .L_ALT_OP_UNUSED_91FF: /* 0x191 */
18268 /* File: x86/alt_stub.S */
18269 /*
18270  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18271  * any interesting requests and then jump to the real instruction
18272  * handler.  Unlike the Arm handler, we can't do this as a tail call
18273  * because rIBASE is caller save and we need to reload it.
18274  */
18275     movl   rSELF, %eax
18276     movl   rPC, OUT_ARG0(%esp)
18277     movl   %eax, OUT_ARG1(%esp)
18278     call   dvmCheckInst                            # (dPC, self)
18279     movl   rSELF, %ecx
18280     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18281     jmp    *dvmAsmInstructionStart+(401*4)
18282
18283 /* ------------------------------ */
18284 .L_ALT_OP_UNUSED_92FF: /* 0x192 */
18285 /* File: x86/alt_stub.S */
18286 /*
18287  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18288  * any interesting requests and then jump to the real instruction
18289  * handler.  Unlike the Arm handler, we can't do this as a tail call
18290  * because rIBASE is caller save and we need to reload it.
18291  */
18292     movl   rSELF, %eax
18293     movl   rPC, OUT_ARG0(%esp)
18294     movl   %eax, OUT_ARG1(%esp)
18295     call   dvmCheckInst                            # (dPC, self)
18296     movl   rSELF, %ecx
18297     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18298     jmp    *dvmAsmInstructionStart+(402*4)
18299
18300 /* ------------------------------ */
18301 .L_ALT_OP_UNUSED_93FF: /* 0x193 */
18302 /* File: x86/alt_stub.S */
18303 /*
18304  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18305  * any interesting requests and then jump to the real instruction
18306  * handler.  Unlike the Arm handler, we can't do this as a tail call
18307  * because rIBASE is caller save and we need to reload it.
18308  */
18309     movl   rSELF, %eax
18310     movl   rPC, OUT_ARG0(%esp)
18311     movl   %eax, OUT_ARG1(%esp)
18312     call   dvmCheckInst                            # (dPC, self)
18313     movl   rSELF, %ecx
18314     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18315     jmp    *dvmAsmInstructionStart+(403*4)
18316
18317 /* ------------------------------ */
18318 .L_ALT_OP_UNUSED_94FF: /* 0x194 */
18319 /* File: x86/alt_stub.S */
18320 /*
18321  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18322  * any interesting requests and then jump to the real instruction
18323  * handler.  Unlike the Arm handler, we can't do this as a tail call
18324  * because rIBASE is caller save and we need to reload it.
18325  */
18326     movl   rSELF, %eax
18327     movl   rPC, OUT_ARG0(%esp)
18328     movl   %eax, OUT_ARG1(%esp)
18329     call   dvmCheckInst                            # (dPC, self)
18330     movl   rSELF, %ecx
18331     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18332     jmp    *dvmAsmInstructionStart+(404*4)
18333
18334 /* ------------------------------ */
18335 .L_ALT_OP_UNUSED_95FF: /* 0x195 */
18336 /* File: x86/alt_stub.S */
18337 /*
18338  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18339  * any interesting requests and then jump to the real instruction
18340  * handler.  Unlike the Arm handler, we can't do this as a tail call
18341  * because rIBASE is caller save and we need to reload it.
18342  */
18343     movl   rSELF, %eax
18344     movl   rPC, OUT_ARG0(%esp)
18345     movl   %eax, OUT_ARG1(%esp)
18346     call   dvmCheckInst                            # (dPC, self)
18347     movl   rSELF, %ecx
18348     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18349     jmp    *dvmAsmInstructionStart+(405*4)
18350
18351 /* ------------------------------ */
18352 .L_ALT_OP_UNUSED_96FF: /* 0x196 */
18353 /* File: x86/alt_stub.S */
18354 /*
18355  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18356  * any interesting requests and then jump to the real instruction
18357  * handler.  Unlike the Arm handler, we can't do this as a tail call
18358  * because rIBASE is caller save and we need to reload it.
18359  */
18360     movl   rSELF, %eax
18361     movl   rPC, OUT_ARG0(%esp)
18362     movl   %eax, OUT_ARG1(%esp)
18363     call   dvmCheckInst                            # (dPC, self)
18364     movl   rSELF, %ecx
18365     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18366     jmp    *dvmAsmInstructionStart+(406*4)
18367
18368 /* ------------------------------ */
18369 .L_ALT_OP_UNUSED_97FF: /* 0x197 */
18370 /* File: x86/alt_stub.S */
18371 /*
18372  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18373  * any interesting requests and then jump to the real instruction
18374  * handler.  Unlike the Arm handler, we can't do this as a tail call
18375  * because rIBASE is caller save and we need to reload it.
18376  */
18377     movl   rSELF, %eax
18378     movl   rPC, OUT_ARG0(%esp)
18379     movl   %eax, OUT_ARG1(%esp)
18380     call   dvmCheckInst                            # (dPC, self)
18381     movl   rSELF, %ecx
18382     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18383     jmp    *dvmAsmInstructionStart+(407*4)
18384
18385 /* ------------------------------ */
18386 .L_ALT_OP_UNUSED_98FF: /* 0x198 */
18387 /* File: x86/alt_stub.S */
18388 /*
18389  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18390  * any interesting requests and then jump to the real instruction
18391  * handler.  Unlike the Arm handler, we can't do this as a tail call
18392  * because rIBASE is caller save and we need to reload it.
18393  */
18394     movl   rSELF, %eax
18395     movl   rPC, OUT_ARG0(%esp)
18396     movl   %eax, OUT_ARG1(%esp)
18397     call   dvmCheckInst                            # (dPC, self)
18398     movl   rSELF, %ecx
18399     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18400     jmp    *dvmAsmInstructionStart+(408*4)
18401
18402 /* ------------------------------ */
18403 .L_ALT_OP_UNUSED_99FF: /* 0x199 */
18404 /* File: x86/alt_stub.S */
18405 /*
18406  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18407  * any interesting requests and then jump to the real instruction
18408  * handler.  Unlike the Arm handler, we can't do this as a tail call
18409  * because rIBASE is caller save and we need to reload it.
18410  */
18411     movl   rSELF, %eax
18412     movl   rPC, OUT_ARG0(%esp)
18413     movl   %eax, OUT_ARG1(%esp)
18414     call   dvmCheckInst                            # (dPC, self)
18415     movl   rSELF, %ecx
18416     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18417     jmp    *dvmAsmInstructionStart+(409*4)
18418
18419 /* ------------------------------ */
18420 .L_ALT_OP_UNUSED_9AFF: /* 0x19a */
18421 /* File: x86/alt_stub.S */
18422 /*
18423  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18424  * any interesting requests and then jump to the real instruction
18425  * handler.  Unlike the Arm handler, we can't do this as a tail call
18426  * because rIBASE is caller save and we need to reload it.
18427  */
18428     movl   rSELF, %eax
18429     movl   rPC, OUT_ARG0(%esp)
18430     movl   %eax, OUT_ARG1(%esp)
18431     call   dvmCheckInst                            # (dPC, self)
18432     movl   rSELF, %ecx
18433     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18434     jmp    *dvmAsmInstructionStart+(410*4)
18435
18436 /* ------------------------------ */
18437 .L_ALT_OP_UNUSED_9BFF: /* 0x19b */
18438 /* File: x86/alt_stub.S */
18439 /*
18440  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18441  * any interesting requests and then jump to the real instruction
18442  * handler.  Unlike the Arm handler, we can't do this as a tail call
18443  * because rIBASE is caller save and we need to reload it.
18444  */
18445     movl   rSELF, %eax
18446     movl   rPC, OUT_ARG0(%esp)
18447     movl   %eax, OUT_ARG1(%esp)
18448     call   dvmCheckInst                            # (dPC, self)
18449     movl   rSELF, %ecx
18450     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18451     jmp    *dvmAsmInstructionStart+(411*4)
18452
18453 /* ------------------------------ */
18454 .L_ALT_OP_UNUSED_9CFF: /* 0x19c */
18455 /* File: x86/alt_stub.S */
18456 /*
18457  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18458  * any interesting requests and then jump to the real instruction
18459  * handler.  Unlike the Arm handler, we can't do this as a tail call
18460  * because rIBASE is caller save and we need to reload it.
18461  */
18462     movl   rSELF, %eax
18463     movl   rPC, OUT_ARG0(%esp)
18464     movl   %eax, OUT_ARG1(%esp)
18465     call   dvmCheckInst                            # (dPC, self)
18466     movl   rSELF, %ecx
18467     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18468     jmp    *dvmAsmInstructionStart+(412*4)
18469
18470 /* ------------------------------ */
18471 .L_ALT_OP_UNUSED_9DFF: /* 0x19d */
18472 /* File: x86/alt_stub.S */
18473 /*
18474  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18475  * any interesting requests and then jump to the real instruction
18476  * handler.  Unlike the Arm handler, we can't do this as a tail call
18477  * because rIBASE is caller save and we need to reload it.
18478  */
18479     movl   rSELF, %eax
18480     movl   rPC, OUT_ARG0(%esp)
18481     movl   %eax, OUT_ARG1(%esp)
18482     call   dvmCheckInst                            # (dPC, self)
18483     movl   rSELF, %ecx
18484     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18485     jmp    *dvmAsmInstructionStart+(413*4)
18486
18487 /* ------------------------------ */
18488 .L_ALT_OP_UNUSED_9EFF: /* 0x19e */
18489 /* File: x86/alt_stub.S */
18490 /*
18491  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18492  * any interesting requests and then jump to the real instruction
18493  * handler.  Unlike the Arm handler, we can't do this as a tail call
18494  * because rIBASE is caller save and we need to reload it.
18495  */
18496     movl   rSELF, %eax
18497     movl   rPC, OUT_ARG0(%esp)
18498     movl   %eax, OUT_ARG1(%esp)
18499     call   dvmCheckInst                            # (dPC, self)
18500     movl   rSELF, %ecx
18501     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18502     jmp    *dvmAsmInstructionStart+(414*4)
18503
18504 /* ------------------------------ */
18505 .L_ALT_OP_UNUSED_9FFF: /* 0x19f */
18506 /* File: x86/alt_stub.S */
18507 /*
18508  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18509  * any interesting requests and then jump to the real instruction
18510  * handler.  Unlike the Arm handler, we can't do this as a tail call
18511  * because rIBASE is caller save and we need to reload it.
18512  */
18513     movl   rSELF, %eax
18514     movl   rPC, OUT_ARG0(%esp)
18515     movl   %eax, OUT_ARG1(%esp)
18516     call   dvmCheckInst                            # (dPC, self)
18517     movl   rSELF, %ecx
18518     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18519     jmp    *dvmAsmInstructionStart+(415*4)
18520
18521 /* ------------------------------ */
18522 .L_ALT_OP_UNUSED_A0FF: /* 0x1a0 */
18523 /* File: x86/alt_stub.S */
18524 /*
18525  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18526  * any interesting requests and then jump to the real instruction
18527  * handler.  Unlike the Arm handler, we can't do this as a tail call
18528  * because rIBASE is caller save and we need to reload it.
18529  */
18530     movl   rSELF, %eax
18531     movl   rPC, OUT_ARG0(%esp)
18532     movl   %eax, OUT_ARG1(%esp)
18533     call   dvmCheckInst                            # (dPC, self)
18534     movl   rSELF, %ecx
18535     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18536     jmp    *dvmAsmInstructionStart+(416*4)
18537
18538 /* ------------------------------ */
18539 .L_ALT_OP_UNUSED_A1FF: /* 0x1a1 */
18540 /* File: x86/alt_stub.S */
18541 /*
18542  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18543  * any interesting requests and then jump to the real instruction
18544  * handler.  Unlike the Arm handler, we can't do this as a tail call
18545  * because rIBASE is caller save and we need to reload it.
18546  */
18547     movl   rSELF, %eax
18548     movl   rPC, OUT_ARG0(%esp)
18549     movl   %eax, OUT_ARG1(%esp)
18550     call   dvmCheckInst                            # (dPC, self)
18551     movl   rSELF, %ecx
18552     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18553     jmp    *dvmAsmInstructionStart+(417*4)
18554
18555 /* ------------------------------ */
18556 .L_ALT_OP_UNUSED_A2FF: /* 0x1a2 */
18557 /* File: x86/alt_stub.S */
18558 /*
18559  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18560  * any interesting requests and then jump to the real instruction
18561  * handler.  Unlike the Arm handler, we can't do this as a tail call
18562  * because rIBASE is caller save and we need to reload it.
18563  */
18564     movl   rSELF, %eax
18565     movl   rPC, OUT_ARG0(%esp)
18566     movl   %eax, OUT_ARG1(%esp)
18567     call   dvmCheckInst                            # (dPC, self)
18568     movl   rSELF, %ecx
18569     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18570     jmp    *dvmAsmInstructionStart+(418*4)
18571
18572 /* ------------------------------ */
18573 .L_ALT_OP_UNUSED_A3FF: /* 0x1a3 */
18574 /* File: x86/alt_stub.S */
18575 /*
18576  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18577  * any interesting requests and then jump to the real instruction
18578  * handler.  Unlike the Arm handler, we can't do this as a tail call
18579  * because rIBASE is caller save and we need to reload it.
18580  */
18581     movl   rSELF, %eax
18582     movl   rPC, OUT_ARG0(%esp)
18583     movl   %eax, OUT_ARG1(%esp)
18584     call   dvmCheckInst                            # (dPC, self)
18585     movl   rSELF, %ecx
18586     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18587     jmp    *dvmAsmInstructionStart+(419*4)
18588
18589 /* ------------------------------ */
18590 .L_ALT_OP_UNUSED_A4FF: /* 0x1a4 */
18591 /* File: x86/alt_stub.S */
18592 /*
18593  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18594  * any interesting requests and then jump to the real instruction
18595  * handler.  Unlike the Arm handler, we can't do this as a tail call
18596  * because rIBASE is caller save and we need to reload it.
18597  */
18598     movl   rSELF, %eax
18599     movl   rPC, OUT_ARG0(%esp)
18600     movl   %eax, OUT_ARG1(%esp)
18601     call   dvmCheckInst                            # (dPC, self)
18602     movl   rSELF, %ecx
18603     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18604     jmp    *dvmAsmInstructionStart+(420*4)
18605
18606 /* ------------------------------ */
18607 .L_ALT_OP_UNUSED_A5FF: /* 0x1a5 */
18608 /* File: x86/alt_stub.S */
18609 /*
18610  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18611  * any interesting requests and then jump to the real instruction
18612  * handler.  Unlike the Arm handler, we can't do this as a tail call
18613  * because rIBASE is caller save and we need to reload it.
18614  */
18615     movl   rSELF, %eax
18616     movl   rPC, OUT_ARG0(%esp)
18617     movl   %eax, OUT_ARG1(%esp)
18618     call   dvmCheckInst                            # (dPC, self)
18619     movl   rSELF, %ecx
18620     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18621     jmp    *dvmAsmInstructionStart+(421*4)
18622
18623 /* ------------------------------ */
18624 .L_ALT_OP_UNUSED_A6FF: /* 0x1a6 */
18625 /* File: x86/alt_stub.S */
18626 /*
18627  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18628  * any interesting requests and then jump to the real instruction
18629  * handler.  Unlike the Arm handler, we can't do this as a tail call
18630  * because rIBASE is caller save and we need to reload it.
18631  */
18632     movl   rSELF, %eax
18633     movl   rPC, OUT_ARG0(%esp)
18634     movl   %eax, OUT_ARG1(%esp)
18635     call   dvmCheckInst                            # (dPC, self)
18636     movl   rSELF, %ecx
18637     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18638     jmp    *dvmAsmInstructionStart+(422*4)
18639
18640 /* ------------------------------ */
18641 .L_ALT_OP_UNUSED_A7FF: /* 0x1a7 */
18642 /* File: x86/alt_stub.S */
18643 /*
18644  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18645  * any interesting requests and then jump to the real instruction
18646  * handler.  Unlike the Arm handler, we can't do this as a tail call
18647  * because rIBASE is caller save and we need to reload it.
18648  */
18649     movl   rSELF, %eax
18650     movl   rPC, OUT_ARG0(%esp)
18651     movl   %eax, OUT_ARG1(%esp)
18652     call   dvmCheckInst                            # (dPC, self)
18653     movl   rSELF, %ecx
18654     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18655     jmp    *dvmAsmInstructionStart+(423*4)
18656
18657 /* ------------------------------ */
18658 .L_ALT_OP_UNUSED_A8FF: /* 0x1a8 */
18659 /* File: x86/alt_stub.S */
18660 /*
18661  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18662  * any interesting requests and then jump to the real instruction
18663  * handler.  Unlike the Arm handler, we can't do this as a tail call
18664  * because rIBASE is caller save and we need to reload it.
18665  */
18666     movl   rSELF, %eax
18667     movl   rPC, OUT_ARG0(%esp)
18668     movl   %eax, OUT_ARG1(%esp)
18669     call   dvmCheckInst                            # (dPC, self)
18670     movl   rSELF, %ecx
18671     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18672     jmp    *dvmAsmInstructionStart+(424*4)
18673
18674 /* ------------------------------ */
18675 .L_ALT_OP_UNUSED_A9FF: /* 0x1a9 */
18676 /* File: x86/alt_stub.S */
18677 /*
18678  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18679  * any interesting requests and then jump to the real instruction
18680  * handler.  Unlike the Arm handler, we can't do this as a tail call
18681  * because rIBASE is caller save and we need to reload it.
18682  */
18683     movl   rSELF, %eax
18684     movl   rPC, OUT_ARG0(%esp)
18685     movl   %eax, OUT_ARG1(%esp)
18686     call   dvmCheckInst                            # (dPC, self)
18687     movl   rSELF, %ecx
18688     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18689     jmp    *dvmAsmInstructionStart+(425*4)
18690
18691 /* ------------------------------ */
18692 .L_ALT_OP_UNUSED_AAFF: /* 0x1aa */
18693 /* File: x86/alt_stub.S */
18694 /*
18695  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18696  * any interesting requests and then jump to the real instruction
18697  * handler.  Unlike the Arm handler, we can't do this as a tail call
18698  * because rIBASE is caller save and we need to reload it.
18699  */
18700     movl   rSELF, %eax
18701     movl   rPC, OUT_ARG0(%esp)
18702     movl   %eax, OUT_ARG1(%esp)
18703     call   dvmCheckInst                            # (dPC, self)
18704     movl   rSELF, %ecx
18705     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18706     jmp    *dvmAsmInstructionStart+(426*4)
18707
18708 /* ------------------------------ */
18709 .L_ALT_OP_UNUSED_ABFF: /* 0x1ab */
18710 /* File: x86/alt_stub.S */
18711 /*
18712  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18713  * any interesting requests and then jump to the real instruction
18714  * handler.  Unlike the Arm handler, we can't do this as a tail call
18715  * because rIBASE is caller save and we need to reload it.
18716  */
18717     movl   rSELF, %eax
18718     movl   rPC, OUT_ARG0(%esp)
18719     movl   %eax, OUT_ARG1(%esp)
18720     call   dvmCheckInst                            # (dPC, self)
18721     movl   rSELF, %ecx
18722     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18723     jmp    *dvmAsmInstructionStart+(427*4)
18724
18725 /* ------------------------------ */
18726 .L_ALT_OP_UNUSED_ACFF: /* 0x1ac */
18727 /* File: x86/alt_stub.S */
18728 /*
18729  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18730  * any interesting requests and then jump to the real instruction
18731  * handler.  Unlike the Arm handler, we can't do this as a tail call
18732  * because rIBASE is caller save and we need to reload it.
18733  */
18734     movl   rSELF, %eax
18735     movl   rPC, OUT_ARG0(%esp)
18736     movl   %eax, OUT_ARG1(%esp)
18737     call   dvmCheckInst                            # (dPC, self)
18738     movl   rSELF, %ecx
18739     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18740     jmp    *dvmAsmInstructionStart+(428*4)
18741
18742 /* ------------------------------ */
18743 .L_ALT_OP_UNUSED_ADFF: /* 0x1ad */
18744 /* File: x86/alt_stub.S */
18745 /*
18746  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18747  * any interesting requests and then jump to the real instruction
18748  * handler.  Unlike the Arm handler, we can't do this as a tail call
18749  * because rIBASE is caller save and we need to reload it.
18750  */
18751     movl   rSELF, %eax
18752     movl   rPC, OUT_ARG0(%esp)
18753     movl   %eax, OUT_ARG1(%esp)
18754     call   dvmCheckInst                            # (dPC, self)
18755     movl   rSELF, %ecx
18756     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18757     jmp    *dvmAsmInstructionStart+(429*4)
18758
18759 /* ------------------------------ */
18760 .L_ALT_OP_UNUSED_AEFF: /* 0x1ae */
18761 /* File: x86/alt_stub.S */
18762 /*
18763  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18764  * any interesting requests and then jump to the real instruction
18765  * handler.  Unlike the Arm handler, we can't do this as a tail call
18766  * because rIBASE is caller save and we need to reload it.
18767  */
18768     movl   rSELF, %eax
18769     movl   rPC, OUT_ARG0(%esp)
18770     movl   %eax, OUT_ARG1(%esp)
18771     call   dvmCheckInst                            # (dPC, self)
18772     movl   rSELF, %ecx
18773     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18774     jmp    *dvmAsmInstructionStart+(430*4)
18775
18776 /* ------------------------------ */
18777 .L_ALT_OP_UNUSED_AFFF: /* 0x1af */
18778 /* File: x86/alt_stub.S */
18779 /*
18780  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18781  * any interesting requests and then jump to the real instruction
18782  * handler.  Unlike the Arm handler, we can't do this as a tail call
18783  * because rIBASE is caller save and we need to reload it.
18784  */
18785     movl   rSELF, %eax
18786     movl   rPC, OUT_ARG0(%esp)
18787     movl   %eax, OUT_ARG1(%esp)
18788     call   dvmCheckInst                            # (dPC, self)
18789     movl   rSELF, %ecx
18790     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18791     jmp    *dvmAsmInstructionStart+(431*4)
18792
18793 /* ------------------------------ */
18794 .L_ALT_OP_UNUSED_B0FF: /* 0x1b0 */
18795 /* File: x86/alt_stub.S */
18796 /*
18797  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18798  * any interesting requests and then jump to the real instruction
18799  * handler.  Unlike the Arm handler, we can't do this as a tail call
18800  * because rIBASE is caller save and we need to reload it.
18801  */
18802     movl   rSELF, %eax
18803     movl   rPC, OUT_ARG0(%esp)
18804     movl   %eax, OUT_ARG1(%esp)
18805     call   dvmCheckInst                            # (dPC, self)
18806     movl   rSELF, %ecx
18807     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18808     jmp    *dvmAsmInstructionStart+(432*4)
18809
18810 /* ------------------------------ */
18811 .L_ALT_OP_UNUSED_B1FF: /* 0x1b1 */
18812 /* File: x86/alt_stub.S */
18813 /*
18814  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18815  * any interesting requests and then jump to the real instruction
18816  * handler.  Unlike the Arm handler, we can't do this as a tail call
18817  * because rIBASE is caller save and we need to reload it.
18818  */
18819     movl   rSELF, %eax
18820     movl   rPC, OUT_ARG0(%esp)
18821     movl   %eax, OUT_ARG1(%esp)
18822     call   dvmCheckInst                            # (dPC, self)
18823     movl   rSELF, %ecx
18824     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18825     jmp    *dvmAsmInstructionStart+(433*4)
18826
18827 /* ------------------------------ */
18828 .L_ALT_OP_UNUSED_B2FF: /* 0x1b2 */
18829 /* File: x86/alt_stub.S */
18830 /*
18831  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18832  * any interesting requests and then jump to the real instruction
18833  * handler.  Unlike the Arm handler, we can't do this as a tail call
18834  * because rIBASE is caller save and we need to reload it.
18835  */
18836     movl   rSELF, %eax
18837     movl   rPC, OUT_ARG0(%esp)
18838     movl   %eax, OUT_ARG1(%esp)
18839     call   dvmCheckInst                            # (dPC, self)
18840     movl   rSELF, %ecx
18841     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18842     jmp    *dvmAsmInstructionStart+(434*4)
18843
18844 /* ------------------------------ */
18845 .L_ALT_OP_UNUSED_B3FF: /* 0x1b3 */
18846 /* File: x86/alt_stub.S */
18847 /*
18848  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18849  * any interesting requests and then jump to the real instruction
18850  * handler.  Unlike the Arm handler, we can't do this as a tail call
18851  * because rIBASE is caller save and we need to reload it.
18852  */
18853     movl   rSELF, %eax
18854     movl   rPC, OUT_ARG0(%esp)
18855     movl   %eax, OUT_ARG1(%esp)
18856     call   dvmCheckInst                            # (dPC, self)
18857     movl   rSELF, %ecx
18858     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18859     jmp    *dvmAsmInstructionStart+(435*4)
18860
18861 /* ------------------------------ */
18862 .L_ALT_OP_UNUSED_B4FF: /* 0x1b4 */
18863 /* File: x86/alt_stub.S */
18864 /*
18865  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18866  * any interesting requests and then jump to the real instruction
18867  * handler.  Unlike the Arm handler, we can't do this as a tail call
18868  * because rIBASE is caller save and we need to reload it.
18869  */
18870     movl   rSELF, %eax
18871     movl   rPC, OUT_ARG0(%esp)
18872     movl   %eax, OUT_ARG1(%esp)
18873     call   dvmCheckInst                            # (dPC, self)
18874     movl   rSELF, %ecx
18875     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18876     jmp    *dvmAsmInstructionStart+(436*4)
18877
18878 /* ------------------------------ */
18879 .L_ALT_OP_UNUSED_B5FF: /* 0x1b5 */
18880 /* File: x86/alt_stub.S */
18881 /*
18882  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18883  * any interesting requests and then jump to the real instruction
18884  * handler.  Unlike the Arm handler, we can't do this as a tail call
18885  * because rIBASE is caller save and we need to reload it.
18886  */
18887     movl   rSELF, %eax
18888     movl   rPC, OUT_ARG0(%esp)
18889     movl   %eax, OUT_ARG1(%esp)
18890     call   dvmCheckInst                            # (dPC, self)
18891     movl   rSELF, %ecx
18892     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18893     jmp    *dvmAsmInstructionStart+(437*4)
18894
18895 /* ------------------------------ */
18896 .L_ALT_OP_UNUSED_B6FF: /* 0x1b6 */
18897 /* File: x86/alt_stub.S */
18898 /*
18899  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18900  * any interesting requests and then jump to the real instruction
18901  * handler.  Unlike the Arm handler, we can't do this as a tail call
18902  * because rIBASE is caller save and we need to reload it.
18903  */
18904     movl   rSELF, %eax
18905     movl   rPC, OUT_ARG0(%esp)
18906     movl   %eax, OUT_ARG1(%esp)
18907     call   dvmCheckInst                            # (dPC, self)
18908     movl   rSELF, %ecx
18909     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18910     jmp    *dvmAsmInstructionStart+(438*4)
18911
18912 /* ------------------------------ */
18913 .L_ALT_OP_UNUSED_B7FF: /* 0x1b7 */
18914 /* File: x86/alt_stub.S */
18915 /*
18916  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18917  * any interesting requests and then jump to the real instruction
18918  * handler.  Unlike the Arm handler, we can't do this as a tail call
18919  * because rIBASE is caller save and we need to reload it.
18920  */
18921     movl   rSELF, %eax
18922     movl   rPC, OUT_ARG0(%esp)
18923     movl   %eax, OUT_ARG1(%esp)
18924     call   dvmCheckInst                            # (dPC, self)
18925     movl   rSELF, %ecx
18926     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18927     jmp    *dvmAsmInstructionStart+(439*4)
18928
18929 /* ------------------------------ */
18930 .L_ALT_OP_UNUSED_B8FF: /* 0x1b8 */
18931 /* File: x86/alt_stub.S */
18932 /*
18933  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18934  * any interesting requests and then jump to the real instruction
18935  * handler.  Unlike the Arm handler, we can't do this as a tail call
18936  * because rIBASE is caller save and we need to reload it.
18937  */
18938     movl   rSELF, %eax
18939     movl   rPC, OUT_ARG0(%esp)
18940     movl   %eax, OUT_ARG1(%esp)
18941     call   dvmCheckInst                            # (dPC, self)
18942     movl   rSELF, %ecx
18943     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18944     jmp    *dvmAsmInstructionStart+(440*4)
18945
18946 /* ------------------------------ */
18947 .L_ALT_OP_UNUSED_B9FF: /* 0x1b9 */
18948 /* File: x86/alt_stub.S */
18949 /*
18950  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18951  * any interesting requests and then jump to the real instruction
18952  * handler.  Unlike the Arm handler, we can't do this as a tail call
18953  * because rIBASE is caller save and we need to reload it.
18954  */
18955     movl   rSELF, %eax
18956     movl   rPC, OUT_ARG0(%esp)
18957     movl   %eax, OUT_ARG1(%esp)
18958     call   dvmCheckInst                            # (dPC, self)
18959     movl   rSELF, %ecx
18960     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18961     jmp    *dvmAsmInstructionStart+(441*4)
18962
18963 /* ------------------------------ */
18964 .L_ALT_OP_UNUSED_BAFF: /* 0x1ba */
18965 /* File: x86/alt_stub.S */
18966 /*
18967  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18968  * any interesting requests and then jump to the real instruction
18969  * handler.  Unlike the Arm handler, we can't do this as a tail call
18970  * because rIBASE is caller save and we need to reload it.
18971  */
18972     movl   rSELF, %eax
18973     movl   rPC, OUT_ARG0(%esp)
18974     movl   %eax, OUT_ARG1(%esp)
18975     call   dvmCheckInst                            # (dPC, self)
18976     movl   rSELF, %ecx
18977     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18978     jmp    *dvmAsmInstructionStart+(442*4)
18979
18980 /* ------------------------------ */
18981 .L_ALT_OP_UNUSED_BBFF: /* 0x1bb */
18982 /* File: x86/alt_stub.S */
18983 /*
18984  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
18985  * any interesting requests and then jump to the real instruction
18986  * handler.  Unlike the Arm handler, we can't do this as a tail call
18987  * because rIBASE is caller save and we need to reload it.
18988  */
18989     movl   rSELF, %eax
18990     movl   rPC, OUT_ARG0(%esp)
18991     movl   %eax, OUT_ARG1(%esp)
18992     call   dvmCheckInst                            # (dPC, self)
18993     movl   rSELF, %ecx
18994     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
18995     jmp    *dvmAsmInstructionStart+(443*4)
18996
18997 /* ------------------------------ */
18998 .L_ALT_OP_UNUSED_BCFF: /* 0x1bc */
18999 /* File: x86/alt_stub.S */
19000 /*
19001  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19002  * any interesting requests and then jump to the real instruction
19003  * handler.  Unlike the Arm handler, we can't do this as a tail call
19004  * because rIBASE is caller save and we need to reload it.
19005  */
19006     movl   rSELF, %eax
19007     movl   rPC, OUT_ARG0(%esp)
19008     movl   %eax, OUT_ARG1(%esp)
19009     call   dvmCheckInst                            # (dPC, self)
19010     movl   rSELF, %ecx
19011     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19012     jmp    *dvmAsmInstructionStart+(444*4)
19013
19014 /* ------------------------------ */
19015 .L_ALT_OP_UNUSED_BDFF: /* 0x1bd */
19016 /* File: x86/alt_stub.S */
19017 /*
19018  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19019  * any interesting requests and then jump to the real instruction
19020  * handler.  Unlike the Arm handler, we can't do this as a tail call
19021  * because rIBASE is caller save and we need to reload it.
19022  */
19023     movl   rSELF, %eax
19024     movl   rPC, OUT_ARG0(%esp)
19025     movl   %eax, OUT_ARG1(%esp)
19026     call   dvmCheckInst                            # (dPC, self)
19027     movl   rSELF, %ecx
19028     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19029     jmp    *dvmAsmInstructionStart+(445*4)
19030
19031 /* ------------------------------ */
19032 .L_ALT_OP_UNUSED_BEFF: /* 0x1be */
19033 /* File: x86/alt_stub.S */
19034 /*
19035  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19036  * any interesting requests and then jump to the real instruction
19037  * handler.  Unlike the Arm handler, we can't do this as a tail call
19038  * because rIBASE is caller save and we need to reload it.
19039  */
19040     movl   rSELF, %eax
19041     movl   rPC, OUT_ARG0(%esp)
19042     movl   %eax, OUT_ARG1(%esp)
19043     call   dvmCheckInst                            # (dPC, self)
19044     movl   rSELF, %ecx
19045     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19046     jmp    *dvmAsmInstructionStart+(446*4)
19047
19048 /* ------------------------------ */
19049 .L_ALT_OP_UNUSED_BFFF: /* 0x1bf */
19050 /* File: x86/alt_stub.S */
19051 /*
19052  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19053  * any interesting requests and then jump to the real instruction
19054  * handler.  Unlike the Arm handler, we can't do this as a tail call
19055  * because rIBASE is caller save and we need to reload it.
19056  */
19057     movl   rSELF, %eax
19058     movl   rPC, OUT_ARG0(%esp)
19059     movl   %eax, OUT_ARG1(%esp)
19060     call   dvmCheckInst                            # (dPC, self)
19061     movl   rSELF, %ecx
19062     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19063     jmp    *dvmAsmInstructionStart+(447*4)
19064
19065 /* ------------------------------ */
19066 .L_ALT_OP_UNUSED_C0FF: /* 0x1c0 */
19067 /* File: x86/alt_stub.S */
19068 /*
19069  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19070  * any interesting requests and then jump to the real instruction
19071  * handler.  Unlike the Arm handler, we can't do this as a tail call
19072  * because rIBASE is caller save and we need to reload it.
19073  */
19074     movl   rSELF, %eax
19075     movl   rPC, OUT_ARG0(%esp)
19076     movl   %eax, OUT_ARG1(%esp)
19077     call   dvmCheckInst                            # (dPC, self)
19078     movl   rSELF, %ecx
19079     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19080     jmp    *dvmAsmInstructionStart+(448*4)
19081
19082 /* ------------------------------ */
19083 .L_ALT_OP_UNUSED_C1FF: /* 0x1c1 */
19084 /* File: x86/alt_stub.S */
19085 /*
19086  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19087  * any interesting requests and then jump to the real instruction
19088  * handler.  Unlike the Arm handler, we can't do this as a tail call
19089  * because rIBASE is caller save and we need to reload it.
19090  */
19091     movl   rSELF, %eax
19092     movl   rPC, OUT_ARG0(%esp)
19093     movl   %eax, OUT_ARG1(%esp)
19094     call   dvmCheckInst                            # (dPC, self)
19095     movl   rSELF, %ecx
19096     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19097     jmp    *dvmAsmInstructionStart+(449*4)
19098
19099 /* ------------------------------ */
19100 .L_ALT_OP_UNUSED_C2FF: /* 0x1c2 */
19101 /* File: x86/alt_stub.S */
19102 /*
19103  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19104  * any interesting requests and then jump to the real instruction
19105  * handler.  Unlike the Arm handler, we can't do this as a tail call
19106  * because rIBASE is caller save and we need to reload it.
19107  */
19108     movl   rSELF, %eax
19109     movl   rPC, OUT_ARG0(%esp)
19110     movl   %eax, OUT_ARG1(%esp)
19111     call   dvmCheckInst                            # (dPC, self)
19112     movl   rSELF, %ecx
19113     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19114     jmp    *dvmAsmInstructionStart+(450*4)
19115
19116 /* ------------------------------ */
19117 .L_ALT_OP_UNUSED_C3FF: /* 0x1c3 */
19118 /* File: x86/alt_stub.S */
19119 /*
19120  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19121  * any interesting requests and then jump to the real instruction
19122  * handler.  Unlike the Arm handler, we can't do this as a tail call
19123  * because rIBASE is caller save and we need to reload it.
19124  */
19125     movl   rSELF, %eax
19126     movl   rPC, OUT_ARG0(%esp)
19127     movl   %eax, OUT_ARG1(%esp)
19128     call   dvmCheckInst                            # (dPC, self)
19129     movl   rSELF, %ecx
19130     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19131     jmp    *dvmAsmInstructionStart+(451*4)
19132
19133 /* ------------------------------ */
19134 .L_ALT_OP_UNUSED_C4FF: /* 0x1c4 */
19135 /* File: x86/alt_stub.S */
19136 /*
19137  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19138  * any interesting requests and then jump to the real instruction
19139  * handler.  Unlike the Arm handler, we can't do this as a tail call
19140  * because rIBASE is caller save and we need to reload it.
19141  */
19142     movl   rSELF, %eax
19143     movl   rPC, OUT_ARG0(%esp)
19144     movl   %eax, OUT_ARG1(%esp)
19145     call   dvmCheckInst                            # (dPC, self)
19146     movl   rSELF, %ecx
19147     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19148     jmp    *dvmAsmInstructionStart+(452*4)
19149
19150 /* ------------------------------ */
19151 .L_ALT_OP_UNUSED_C5FF: /* 0x1c5 */
19152 /* File: x86/alt_stub.S */
19153 /*
19154  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19155  * any interesting requests and then jump to the real instruction
19156  * handler.  Unlike the Arm handler, we can't do this as a tail call
19157  * because rIBASE is caller save and we need to reload it.
19158  */
19159     movl   rSELF, %eax
19160     movl   rPC, OUT_ARG0(%esp)
19161     movl   %eax, OUT_ARG1(%esp)
19162     call   dvmCheckInst                            # (dPC, self)
19163     movl   rSELF, %ecx
19164     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19165     jmp    *dvmAsmInstructionStart+(453*4)
19166
19167 /* ------------------------------ */
19168 .L_ALT_OP_UNUSED_C6FF: /* 0x1c6 */
19169 /* File: x86/alt_stub.S */
19170 /*
19171  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19172  * any interesting requests and then jump to the real instruction
19173  * handler.  Unlike the Arm handler, we can't do this as a tail call
19174  * because rIBASE is caller save and we need to reload it.
19175  */
19176     movl   rSELF, %eax
19177     movl   rPC, OUT_ARG0(%esp)
19178     movl   %eax, OUT_ARG1(%esp)
19179     call   dvmCheckInst                            # (dPC, self)
19180     movl   rSELF, %ecx
19181     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19182     jmp    *dvmAsmInstructionStart+(454*4)
19183
19184 /* ------------------------------ */
19185 .L_ALT_OP_UNUSED_C7FF: /* 0x1c7 */
19186 /* File: x86/alt_stub.S */
19187 /*
19188  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19189  * any interesting requests and then jump to the real instruction
19190  * handler.  Unlike the Arm handler, we can't do this as a tail call
19191  * because rIBASE is caller save and we need to reload it.
19192  */
19193     movl   rSELF, %eax
19194     movl   rPC, OUT_ARG0(%esp)
19195     movl   %eax, OUT_ARG1(%esp)
19196     call   dvmCheckInst                            # (dPC, self)
19197     movl   rSELF, %ecx
19198     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19199     jmp    *dvmAsmInstructionStart+(455*4)
19200
19201 /* ------------------------------ */
19202 .L_ALT_OP_UNUSED_C8FF: /* 0x1c8 */
19203 /* File: x86/alt_stub.S */
19204 /*
19205  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19206  * any interesting requests and then jump to the real instruction
19207  * handler.  Unlike the Arm handler, we can't do this as a tail call
19208  * because rIBASE is caller save and we need to reload it.
19209  */
19210     movl   rSELF, %eax
19211     movl   rPC, OUT_ARG0(%esp)
19212     movl   %eax, OUT_ARG1(%esp)
19213     call   dvmCheckInst                            # (dPC, self)
19214     movl   rSELF, %ecx
19215     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19216     jmp    *dvmAsmInstructionStart+(456*4)
19217
19218 /* ------------------------------ */
19219 .L_ALT_OP_UNUSED_C9FF: /* 0x1c9 */
19220 /* File: x86/alt_stub.S */
19221 /*
19222  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19223  * any interesting requests and then jump to the real instruction
19224  * handler.  Unlike the Arm handler, we can't do this as a tail call
19225  * because rIBASE is caller save and we need to reload it.
19226  */
19227     movl   rSELF, %eax
19228     movl   rPC, OUT_ARG0(%esp)
19229     movl   %eax, OUT_ARG1(%esp)
19230     call   dvmCheckInst                            # (dPC, self)
19231     movl   rSELF, %ecx
19232     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19233     jmp    *dvmAsmInstructionStart+(457*4)
19234
19235 /* ------------------------------ */
19236 .L_ALT_OP_UNUSED_CAFF: /* 0x1ca */
19237 /* File: x86/alt_stub.S */
19238 /*
19239  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19240  * any interesting requests and then jump to the real instruction
19241  * handler.  Unlike the Arm handler, we can't do this as a tail call
19242  * because rIBASE is caller save and we need to reload it.
19243  */
19244     movl   rSELF, %eax
19245     movl   rPC, OUT_ARG0(%esp)
19246     movl   %eax, OUT_ARG1(%esp)
19247     call   dvmCheckInst                            # (dPC, self)
19248     movl   rSELF, %ecx
19249     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19250     jmp    *dvmAsmInstructionStart+(458*4)
19251
19252 /* ------------------------------ */
19253 .L_ALT_OP_UNUSED_CBFF: /* 0x1cb */
19254 /* File: x86/alt_stub.S */
19255 /*
19256  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19257  * any interesting requests and then jump to the real instruction
19258  * handler.  Unlike the Arm handler, we can't do this as a tail call
19259  * because rIBASE is caller save and we need to reload it.
19260  */
19261     movl   rSELF, %eax
19262     movl   rPC, OUT_ARG0(%esp)
19263     movl   %eax, OUT_ARG1(%esp)
19264     call   dvmCheckInst                            # (dPC, self)
19265     movl   rSELF, %ecx
19266     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19267     jmp    *dvmAsmInstructionStart+(459*4)
19268
19269 /* ------------------------------ */
19270 .L_ALT_OP_UNUSED_CCFF: /* 0x1cc */
19271 /* File: x86/alt_stub.S */
19272 /*
19273  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19274  * any interesting requests and then jump to the real instruction
19275  * handler.  Unlike the Arm handler, we can't do this as a tail call
19276  * because rIBASE is caller save and we need to reload it.
19277  */
19278     movl   rSELF, %eax
19279     movl   rPC, OUT_ARG0(%esp)
19280     movl   %eax, OUT_ARG1(%esp)
19281     call   dvmCheckInst                            # (dPC, self)
19282     movl   rSELF, %ecx
19283     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19284     jmp    *dvmAsmInstructionStart+(460*4)
19285
19286 /* ------------------------------ */
19287 .L_ALT_OP_UNUSED_CDFF: /* 0x1cd */
19288 /* File: x86/alt_stub.S */
19289 /*
19290  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19291  * any interesting requests and then jump to the real instruction
19292  * handler.  Unlike the Arm handler, we can't do this as a tail call
19293  * because rIBASE is caller save and we need to reload it.
19294  */
19295     movl   rSELF, %eax
19296     movl   rPC, OUT_ARG0(%esp)
19297     movl   %eax, OUT_ARG1(%esp)
19298     call   dvmCheckInst                            # (dPC, self)
19299     movl   rSELF, %ecx
19300     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19301     jmp    *dvmAsmInstructionStart+(461*4)
19302
19303 /* ------------------------------ */
19304 .L_ALT_OP_UNUSED_CEFF: /* 0x1ce */
19305 /* File: x86/alt_stub.S */
19306 /*
19307  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19308  * any interesting requests and then jump to the real instruction
19309  * handler.  Unlike the Arm handler, we can't do this as a tail call
19310  * because rIBASE is caller save and we need to reload it.
19311  */
19312     movl   rSELF, %eax
19313     movl   rPC, OUT_ARG0(%esp)
19314     movl   %eax, OUT_ARG1(%esp)
19315     call   dvmCheckInst                            # (dPC, self)
19316     movl   rSELF, %ecx
19317     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19318     jmp    *dvmAsmInstructionStart+(462*4)
19319
19320 /* ------------------------------ */
19321 .L_ALT_OP_UNUSED_CFFF: /* 0x1cf */
19322 /* File: x86/alt_stub.S */
19323 /*
19324  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19325  * any interesting requests and then jump to the real instruction
19326  * handler.  Unlike the Arm handler, we can't do this as a tail call
19327  * because rIBASE is caller save and we need to reload it.
19328  */
19329     movl   rSELF, %eax
19330     movl   rPC, OUT_ARG0(%esp)
19331     movl   %eax, OUT_ARG1(%esp)
19332     call   dvmCheckInst                            # (dPC, self)
19333     movl   rSELF, %ecx
19334     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19335     jmp    *dvmAsmInstructionStart+(463*4)
19336
19337 /* ------------------------------ */
19338 .L_ALT_OP_UNUSED_D0FF: /* 0x1d0 */
19339 /* File: x86/alt_stub.S */
19340 /*
19341  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19342  * any interesting requests and then jump to the real instruction
19343  * handler.  Unlike the Arm handler, we can't do this as a tail call
19344  * because rIBASE is caller save and we need to reload it.
19345  */
19346     movl   rSELF, %eax
19347     movl   rPC, OUT_ARG0(%esp)
19348     movl   %eax, OUT_ARG1(%esp)
19349     call   dvmCheckInst                            # (dPC, self)
19350     movl   rSELF, %ecx
19351     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19352     jmp    *dvmAsmInstructionStart+(464*4)
19353
19354 /* ------------------------------ */
19355 .L_ALT_OP_UNUSED_D1FF: /* 0x1d1 */
19356 /* File: x86/alt_stub.S */
19357 /*
19358  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19359  * any interesting requests and then jump to the real instruction
19360  * handler.  Unlike the Arm handler, we can't do this as a tail call
19361  * because rIBASE is caller save and we need to reload it.
19362  */
19363     movl   rSELF, %eax
19364     movl   rPC, OUT_ARG0(%esp)
19365     movl   %eax, OUT_ARG1(%esp)
19366     call   dvmCheckInst                            # (dPC, self)
19367     movl   rSELF, %ecx
19368     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19369     jmp    *dvmAsmInstructionStart+(465*4)
19370
19371 /* ------------------------------ */
19372 .L_ALT_OP_UNUSED_D2FF: /* 0x1d2 */
19373 /* File: x86/alt_stub.S */
19374 /*
19375  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19376  * any interesting requests and then jump to the real instruction
19377  * handler.  Unlike the Arm handler, we can't do this as a tail call
19378  * because rIBASE is caller save and we need to reload it.
19379  */
19380     movl   rSELF, %eax
19381     movl   rPC, OUT_ARG0(%esp)
19382     movl   %eax, OUT_ARG1(%esp)
19383     call   dvmCheckInst                            # (dPC, self)
19384     movl   rSELF, %ecx
19385     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19386     jmp    *dvmAsmInstructionStart+(466*4)
19387
19388 /* ------------------------------ */
19389 .L_ALT_OP_UNUSED_D3FF: /* 0x1d3 */
19390 /* File: x86/alt_stub.S */
19391 /*
19392  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19393  * any interesting requests and then jump to the real instruction
19394  * handler.  Unlike the Arm handler, we can't do this as a tail call
19395  * because rIBASE is caller save and we need to reload it.
19396  */
19397     movl   rSELF, %eax
19398     movl   rPC, OUT_ARG0(%esp)
19399     movl   %eax, OUT_ARG1(%esp)
19400     call   dvmCheckInst                            # (dPC, self)
19401     movl   rSELF, %ecx
19402     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19403     jmp    *dvmAsmInstructionStart+(467*4)
19404
19405 /* ------------------------------ */
19406 .L_ALT_OP_UNUSED_D4FF: /* 0x1d4 */
19407 /* File: x86/alt_stub.S */
19408 /*
19409  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19410  * any interesting requests and then jump to the real instruction
19411  * handler.  Unlike the Arm handler, we can't do this as a tail call
19412  * because rIBASE is caller save and we need to reload it.
19413  */
19414     movl   rSELF, %eax
19415     movl   rPC, OUT_ARG0(%esp)
19416     movl   %eax, OUT_ARG1(%esp)
19417     call   dvmCheckInst                            # (dPC, self)
19418     movl   rSELF, %ecx
19419     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19420     jmp    *dvmAsmInstructionStart+(468*4)
19421
19422 /* ------------------------------ */
19423 .L_ALT_OP_UNUSED_D5FF: /* 0x1d5 */
19424 /* File: x86/alt_stub.S */
19425 /*
19426  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19427  * any interesting requests and then jump to the real instruction
19428  * handler.  Unlike the Arm handler, we can't do this as a tail call
19429  * because rIBASE is caller save and we need to reload it.
19430  */
19431     movl   rSELF, %eax
19432     movl   rPC, OUT_ARG0(%esp)
19433     movl   %eax, OUT_ARG1(%esp)
19434     call   dvmCheckInst                            # (dPC, self)
19435     movl   rSELF, %ecx
19436     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19437     jmp    *dvmAsmInstructionStart+(469*4)
19438
19439 /* ------------------------------ */
19440 .L_ALT_OP_UNUSED_D6FF: /* 0x1d6 */
19441 /* File: x86/alt_stub.S */
19442 /*
19443  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19444  * any interesting requests and then jump to the real instruction
19445  * handler.  Unlike the Arm handler, we can't do this as a tail call
19446  * because rIBASE is caller save and we need to reload it.
19447  */
19448     movl   rSELF, %eax
19449     movl   rPC, OUT_ARG0(%esp)
19450     movl   %eax, OUT_ARG1(%esp)
19451     call   dvmCheckInst                            # (dPC, self)
19452     movl   rSELF, %ecx
19453     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19454     jmp    *dvmAsmInstructionStart+(470*4)
19455
19456 /* ------------------------------ */
19457 .L_ALT_OP_UNUSED_D7FF: /* 0x1d7 */
19458 /* File: x86/alt_stub.S */
19459 /*
19460  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19461  * any interesting requests and then jump to the real instruction
19462  * handler.  Unlike the Arm handler, we can't do this as a tail call
19463  * because rIBASE is caller save and we need to reload it.
19464  */
19465     movl   rSELF, %eax
19466     movl   rPC, OUT_ARG0(%esp)
19467     movl   %eax, OUT_ARG1(%esp)
19468     call   dvmCheckInst                            # (dPC, self)
19469     movl   rSELF, %ecx
19470     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19471     jmp    *dvmAsmInstructionStart+(471*4)
19472
19473 /* ------------------------------ */
19474 .L_ALT_OP_UNUSED_D8FF: /* 0x1d8 */
19475 /* File: x86/alt_stub.S */
19476 /*
19477  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19478  * any interesting requests and then jump to the real instruction
19479  * handler.  Unlike the Arm handler, we can't do this as a tail call
19480  * because rIBASE is caller save and we need to reload it.
19481  */
19482     movl   rSELF, %eax
19483     movl   rPC, OUT_ARG0(%esp)
19484     movl   %eax, OUT_ARG1(%esp)
19485     call   dvmCheckInst                            # (dPC, self)
19486     movl   rSELF, %ecx
19487     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19488     jmp    *dvmAsmInstructionStart+(472*4)
19489
19490 /* ------------------------------ */
19491 .L_ALT_OP_UNUSED_D9FF: /* 0x1d9 */
19492 /* File: x86/alt_stub.S */
19493 /*
19494  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19495  * any interesting requests and then jump to the real instruction
19496  * handler.  Unlike the Arm handler, we can't do this as a tail call
19497  * because rIBASE is caller save and we need to reload it.
19498  */
19499     movl   rSELF, %eax
19500     movl   rPC, OUT_ARG0(%esp)
19501     movl   %eax, OUT_ARG1(%esp)
19502     call   dvmCheckInst                            # (dPC, self)
19503     movl   rSELF, %ecx
19504     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19505     jmp    *dvmAsmInstructionStart+(473*4)
19506
19507 /* ------------------------------ */
19508 .L_ALT_OP_UNUSED_DAFF: /* 0x1da */
19509 /* File: x86/alt_stub.S */
19510 /*
19511  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19512  * any interesting requests and then jump to the real instruction
19513  * handler.  Unlike the Arm handler, we can't do this as a tail call
19514  * because rIBASE is caller save and we need to reload it.
19515  */
19516     movl   rSELF, %eax
19517     movl   rPC, OUT_ARG0(%esp)
19518     movl   %eax, OUT_ARG1(%esp)
19519     call   dvmCheckInst                            # (dPC, self)
19520     movl   rSELF, %ecx
19521     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19522     jmp    *dvmAsmInstructionStart+(474*4)
19523
19524 /* ------------------------------ */
19525 .L_ALT_OP_UNUSED_DBFF: /* 0x1db */
19526 /* File: x86/alt_stub.S */
19527 /*
19528  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19529  * any interesting requests and then jump to the real instruction
19530  * handler.  Unlike the Arm handler, we can't do this as a tail call
19531  * because rIBASE is caller save and we need to reload it.
19532  */
19533     movl   rSELF, %eax
19534     movl   rPC, OUT_ARG0(%esp)
19535     movl   %eax, OUT_ARG1(%esp)
19536     call   dvmCheckInst                            # (dPC, self)
19537     movl   rSELF, %ecx
19538     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19539     jmp    *dvmAsmInstructionStart+(475*4)
19540
19541 /* ------------------------------ */
19542 .L_ALT_OP_UNUSED_DCFF: /* 0x1dc */
19543 /* File: x86/alt_stub.S */
19544 /*
19545  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19546  * any interesting requests and then jump to the real instruction
19547  * handler.  Unlike the Arm handler, we can't do this as a tail call
19548  * because rIBASE is caller save and we need to reload it.
19549  */
19550     movl   rSELF, %eax
19551     movl   rPC, OUT_ARG0(%esp)
19552     movl   %eax, OUT_ARG1(%esp)
19553     call   dvmCheckInst                            # (dPC, self)
19554     movl   rSELF, %ecx
19555     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19556     jmp    *dvmAsmInstructionStart+(476*4)
19557
19558 /* ------------------------------ */
19559 .L_ALT_OP_UNUSED_DDFF: /* 0x1dd */
19560 /* File: x86/alt_stub.S */
19561 /*
19562  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19563  * any interesting requests and then jump to the real instruction
19564  * handler.  Unlike the Arm handler, we can't do this as a tail call
19565  * because rIBASE is caller save and we need to reload it.
19566  */
19567     movl   rSELF, %eax
19568     movl   rPC, OUT_ARG0(%esp)
19569     movl   %eax, OUT_ARG1(%esp)
19570     call   dvmCheckInst                            # (dPC, self)
19571     movl   rSELF, %ecx
19572     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19573     jmp    *dvmAsmInstructionStart+(477*4)
19574
19575 /* ------------------------------ */
19576 .L_ALT_OP_UNUSED_DEFF: /* 0x1de */
19577 /* File: x86/alt_stub.S */
19578 /*
19579  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19580  * any interesting requests and then jump to the real instruction
19581  * handler.  Unlike the Arm handler, we can't do this as a tail call
19582  * because rIBASE is caller save and we need to reload it.
19583  */
19584     movl   rSELF, %eax
19585     movl   rPC, OUT_ARG0(%esp)
19586     movl   %eax, OUT_ARG1(%esp)
19587     call   dvmCheckInst                            # (dPC, self)
19588     movl   rSELF, %ecx
19589     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19590     jmp    *dvmAsmInstructionStart+(478*4)
19591
19592 /* ------------------------------ */
19593 .L_ALT_OP_UNUSED_DFFF: /* 0x1df */
19594 /* File: x86/alt_stub.S */
19595 /*
19596  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19597  * any interesting requests and then jump to the real instruction
19598  * handler.  Unlike the Arm handler, we can't do this as a tail call
19599  * because rIBASE is caller save and we need to reload it.
19600  */
19601     movl   rSELF, %eax
19602     movl   rPC, OUT_ARG0(%esp)
19603     movl   %eax, OUT_ARG1(%esp)
19604     call   dvmCheckInst                            # (dPC, self)
19605     movl   rSELF, %ecx
19606     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19607     jmp    *dvmAsmInstructionStart+(479*4)
19608
19609 /* ------------------------------ */
19610 .L_ALT_OP_UNUSED_E0FF: /* 0x1e0 */
19611 /* File: x86/alt_stub.S */
19612 /*
19613  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19614  * any interesting requests and then jump to the real instruction
19615  * handler.  Unlike the Arm handler, we can't do this as a tail call
19616  * because rIBASE is caller save and we need to reload it.
19617  */
19618     movl   rSELF, %eax
19619     movl   rPC, OUT_ARG0(%esp)
19620     movl   %eax, OUT_ARG1(%esp)
19621     call   dvmCheckInst                            # (dPC, self)
19622     movl   rSELF, %ecx
19623     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19624     jmp    *dvmAsmInstructionStart+(480*4)
19625
19626 /* ------------------------------ */
19627 .L_ALT_OP_UNUSED_E1FF: /* 0x1e1 */
19628 /* File: x86/alt_stub.S */
19629 /*
19630  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19631  * any interesting requests and then jump to the real instruction
19632  * handler.  Unlike the Arm handler, we can't do this as a tail call
19633  * because rIBASE is caller save and we need to reload it.
19634  */
19635     movl   rSELF, %eax
19636     movl   rPC, OUT_ARG0(%esp)
19637     movl   %eax, OUT_ARG1(%esp)
19638     call   dvmCheckInst                            # (dPC, self)
19639     movl   rSELF, %ecx
19640     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19641     jmp    *dvmAsmInstructionStart+(481*4)
19642
19643 /* ------------------------------ */
19644 .L_ALT_OP_UNUSED_E2FF: /* 0x1e2 */
19645 /* File: x86/alt_stub.S */
19646 /*
19647  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19648  * any interesting requests and then jump to the real instruction
19649  * handler.  Unlike the Arm handler, we can't do this as a tail call
19650  * because rIBASE is caller save and we need to reload it.
19651  */
19652     movl   rSELF, %eax
19653     movl   rPC, OUT_ARG0(%esp)
19654     movl   %eax, OUT_ARG1(%esp)
19655     call   dvmCheckInst                            # (dPC, self)
19656     movl   rSELF, %ecx
19657     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19658     jmp    *dvmAsmInstructionStart+(482*4)
19659
19660 /* ------------------------------ */
19661 .L_ALT_OP_UNUSED_E3FF: /* 0x1e3 */
19662 /* File: x86/alt_stub.S */
19663 /*
19664  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19665  * any interesting requests and then jump to the real instruction
19666  * handler.  Unlike the Arm handler, we can't do this as a tail call
19667  * because rIBASE is caller save and we need to reload it.
19668  */
19669     movl   rSELF, %eax
19670     movl   rPC, OUT_ARG0(%esp)
19671     movl   %eax, OUT_ARG1(%esp)
19672     call   dvmCheckInst                            # (dPC, self)
19673     movl   rSELF, %ecx
19674     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19675     jmp    *dvmAsmInstructionStart+(483*4)
19676
19677 /* ------------------------------ */
19678 .L_ALT_OP_UNUSED_E4FF: /* 0x1e4 */
19679 /* File: x86/alt_stub.S */
19680 /*
19681  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19682  * any interesting requests and then jump to the real instruction
19683  * handler.  Unlike the Arm handler, we can't do this as a tail call
19684  * because rIBASE is caller save and we need to reload it.
19685  */
19686     movl   rSELF, %eax
19687     movl   rPC, OUT_ARG0(%esp)
19688     movl   %eax, OUT_ARG1(%esp)
19689     call   dvmCheckInst                            # (dPC, self)
19690     movl   rSELF, %ecx
19691     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19692     jmp    *dvmAsmInstructionStart+(484*4)
19693
19694 /* ------------------------------ */
19695 .L_ALT_OP_UNUSED_E5FF: /* 0x1e5 */
19696 /* File: x86/alt_stub.S */
19697 /*
19698  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19699  * any interesting requests and then jump to the real instruction
19700  * handler.  Unlike the Arm handler, we can't do this as a tail call
19701  * because rIBASE is caller save and we need to reload it.
19702  */
19703     movl   rSELF, %eax
19704     movl   rPC, OUT_ARG0(%esp)
19705     movl   %eax, OUT_ARG1(%esp)
19706     call   dvmCheckInst                            # (dPC, self)
19707     movl   rSELF, %ecx
19708     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19709     jmp    *dvmAsmInstructionStart+(485*4)
19710
19711 /* ------------------------------ */
19712 .L_ALT_OP_UNUSED_E6FF: /* 0x1e6 */
19713 /* File: x86/alt_stub.S */
19714 /*
19715  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19716  * any interesting requests and then jump to the real instruction
19717  * handler.  Unlike the Arm handler, we can't do this as a tail call
19718  * because rIBASE is caller save and we need to reload it.
19719  */
19720     movl   rSELF, %eax
19721     movl   rPC, OUT_ARG0(%esp)
19722     movl   %eax, OUT_ARG1(%esp)
19723     call   dvmCheckInst                            # (dPC, self)
19724     movl   rSELF, %ecx
19725     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19726     jmp    *dvmAsmInstructionStart+(486*4)
19727
19728 /* ------------------------------ */
19729 .L_ALT_OP_UNUSED_E7FF: /* 0x1e7 */
19730 /* File: x86/alt_stub.S */
19731 /*
19732  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19733  * any interesting requests and then jump to the real instruction
19734  * handler.  Unlike the Arm handler, we can't do this as a tail call
19735  * because rIBASE is caller save and we need to reload it.
19736  */
19737     movl   rSELF, %eax
19738     movl   rPC, OUT_ARG0(%esp)
19739     movl   %eax, OUT_ARG1(%esp)
19740     call   dvmCheckInst                            # (dPC, self)
19741     movl   rSELF, %ecx
19742     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19743     jmp    *dvmAsmInstructionStart+(487*4)
19744
19745 /* ------------------------------ */
19746 .L_ALT_OP_UNUSED_E8FF: /* 0x1e8 */
19747 /* File: x86/alt_stub.S */
19748 /*
19749  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19750  * any interesting requests and then jump to the real instruction
19751  * handler.  Unlike the Arm handler, we can't do this as a tail call
19752  * because rIBASE is caller save and we need to reload it.
19753  */
19754     movl   rSELF, %eax
19755     movl   rPC, OUT_ARG0(%esp)
19756     movl   %eax, OUT_ARG1(%esp)
19757     call   dvmCheckInst                            # (dPC, self)
19758     movl   rSELF, %ecx
19759     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19760     jmp    *dvmAsmInstructionStart+(488*4)
19761
19762 /* ------------------------------ */
19763 .L_ALT_OP_UNUSED_E9FF: /* 0x1e9 */
19764 /* File: x86/alt_stub.S */
19765 /*
19766  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19767  * any interesting requests and then jump to the real instruction
19768  * handler.  Unlike the Arm handler, we can't do this as a tail call
19769  * because rIBASE is caller save and we need to reload it.
19770  */
19771     movl   rSELF, %eax
19772     movl   rPC, OUT_ARG0(%esp)
19773     movl   %eax, OUT_ARG1(%esp)
19774     call   dvmCheckInst                            # (dPC, self)
19775     movl   rSELF, %ecx
19776     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19777     jmp    *dvmAsmInstructionStart+(489*4)
19778
19779 /* ------------------------------ */
19780 .L_ALT_OP_UNUSED_EAFF: /* 0x1ea */
19781 /* File: x86/alt_stub.S */
19782 /*
19783  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19784  * any interesting requests and then jump to the real instruction
19785  * handler.  Unlike the Arm handler, we can't do this as a tail call
19786  * because rIBASE is caller save and we need to reload it.
19787  */
19788     movl   rSELF, %eax
19789     movl   rPC, OUT_ARG0(%esp)
19790     movl   %eax, OUT_ARG1(%esp)
19791     call   dvmCheckInst                            # (dPC, self)
19792     movl   rSELF, %ecx
19793     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19794     jmp    *dvmAsmInstructionStart+(490*4)
19795
19796 /* ------------------------------ */
19797 .L_ALT_OP_UNUSED_EBFF: /* 0x1eb */
19798 /* File: x86/alt_stub.S */
19799 /*
19800  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19801  * any interesting requests and then jump to the real instruction
19802  * handler.  Unlike the Arm handler, we can't do this as a tail call
19803  * because rIBASE is caller save and we need to reload it.
19804  */
19805     movl   rSELF, %eax
19806     movl   rPC, OUT_ARG0(%esp)
19807     movl   %eax, OUT_ARG1(%esp)
19808     call   dvmCheckInst                            # (dPC, self)
19809     movl   rSELF, %ecx
19810     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19811     jmp    *dvmAsmInstructionStart+(491*4)
19812
19813 /* ------------------------------ */
19814 .L_ALT_OP_UNUSED_ECFF: /* 0x1ec */
19815 /* File: x86/alt_stub.S */
19816 /*
19817  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19818  * any interesting requests and then jump to the real instruction
19819  * handler.  Unlike the Arm handler, we can't do this as a tail call
19820  * because rIBASE is caller save and we need to reload it.
19821  */
19822     movl   rSELF, %eax
19823     movl   rPC, OUT_ARG0(%esp)
19824     movl   %eax, OUT_ARG1(%esp)
19825     call   dvmCheckInst                            # (dPC, self)
19826     movl   rSELF, %ecx
19827     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19828     jmp    *dvmAsmInstructionStart+(492*4)
19829
19830 /* ------------------------------ */
19831 .L_ALT_OP_UNUSED_EDFF: /* 0x1ed */
19832 /* File: x86/alt_stub.S */
19833 /*
19834  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19835  * any interesting requests and then jump to the real instruction
19836  * handler.  Unlike the Arm handler, we can't do this as a tail call
19837  * because rIBASE is caller save and we need to reload it.
19838  */
19839     movl   rSELF, %eax
19840     movl   rPC, OUT_ARG0(%esp)
19841     movl   %eax, OUT_ARG1(%esp)
19842     call   dvmCheckInst                            # (dPC, self)
19843     movl   rSELF, %ecx
19844     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19845     jmp    *dvmAsmInstructionStart+(493*4)
19846
19847 /* ------------------------------ */
19848 .L_ALT_OP_UNUSED_EEFF: /* 0x1ee */
19849 /* File: x86/alt_stub.S */
19850 /*
19851  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19852  * any interesting requests and then jump to the real instruction
19853  * handler.  Unlike the Arm handler, we can't do this as a tail call
19854  * because rIBASE is caller save and we need to reload it.
19855  */
19856     movl   rSELF, %eax
19857     movl   rPC, OUT_ARG0(%esp)
19858     movl   %eax, OUT_ARG1(%esp)
19859     call   dvmCheckInst                            # (dPC, self)
19860     movl   rSELF, %ecx
19861     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19862     jmp    *dvmAsmInstructionStart+(494*4)
19863
19864 /* ------------------------------ */
19865 .L_ALT_OP_UNUSED_EFFF: /* 0x1ef */
19866 /* File: x86/alt_stub.S */
19867 /*
19868  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19869  * any interesting requests and then jump to the real instruction
19870  * handler.  Unlike the Arm handler, we can't do this as a tail call
19871  * because rIBASE is caller save and we need to reload it.
19872  */
19873     movl   rSELF, %eax
19874     movl   rPC, OUT_ARG0(%esp)
19875     movl   %eax, OUT_ARG1(%esp)
19876     call   dvmCheckInst                            # (dPC, self)
19877     movl   rSELF, %ecx
19878     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19879     jmp    *dvmAsmInstructionStart+(495*4)
19880
19881 /* ------------------------------ */
19882 .L_ALT_OP_UNUSED_F0FF: /* 0x1f0 */
19883 /* File: x86/alt_stub.S */
19884 /*
19885  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19886  * any interesting requests and then jump to the real instruction
19887  * handler.  Unlike the Arm handler, we can't do this as a tail call
19888  * because rIBASE is caller save and we need to reload it.
19889  */
19890     movl   rSELF, %eax
19891     movl   rPC, OUT_ARG0(%esp)
19892     movl   %eax, OUT_ARG1(%esp)
19893     call   dvmCheckInst                            # (dPC, self)
19894     movl   rSELF, %ecx
19895     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19896     jmp    *dvmAsmInstructionStart+(496*4)
19897
19898 /* ------------------------------ */
19899 .L_ALT_OP_UNUSED_F1FF: /* 0x1f1 */
19900 /* File: x86/alt_stub.S */
19901 /*
19902  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19903  * any interesting requests and then jump to the real instruction
19904  * handler.  Unlike the Arm handler, we can't do this as a tail call
19905  * because rIBASE is caller save and we need to reload it.
19906  */
19907     movl   rSELF, %eax
19908     movl   rPC, OUT_ARG0(%esp)
19909     movl   %eax, OUT_ARG1(%esp)
19910     call   dvmCheckInst                            # (dPC, self)
19911     movl   rSELF, %ecx
19912     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19913     jmp    *dvmAsmInstructionStart+(497*4)
19914
19915 /* ------------------------------ */
19916 .L_ALT_OP_UNUSED_F2FF: /* 0x1f2 */
19917 /* File: x86/alt_stub.S */
19918 /*
19919  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19920  * any interesting requests and then jump to the real instruction
19921  * handler.  Unlike the Arm handler, we can't do this as a tail call
19922  * because rIBASE is caller save and we need to reload it.
19923  */
19924     movl   rSELF, %eax
19925     movl   rPC, OUT_ARG0(%esp)
19926     movl   %eax, OUT_ARG1(%esp)
19927     call   dvmCheckInst                            # (dPC, self)
19928     movl   rSELF, %ecx
19929     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19930     jmp    *dvmAsmInstructionStart+(498*4)
19931
19932 /* ------------------------------ */
19933 .L_ALT_OP_UNUSED_F3FF: /* 0x1f3 */
19934 /* File: x86/alt_stub.S */
19935 /*
19936  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19937  * any interesting requests and then jump to the real instruction
19938  * handler.  Unlike the Arm handler, we can't do this as a tail call
19939  * because rIBASE is caller save and we need to reload it.
19940  */
19941     movl   rSELF, %eax
19942     movl   rPC, OUT_ARG0(%esp)
19943     movl   %eax, OUT_ARG1(%esp)
19944     call   dvmCheckInst                            # (dPC, self)
19945     movl   rSELF, %ecx
19946     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19947     jmp    *dvmAsmInstructionStart+(499*4)
19948
19949 /* ------------------------------ */
19950 .L_ALT_OP_UNUSED_F4FF: /* 0x1f4 */
19951 /* File: x86/alt_stub.S */
19952 /*
19953  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19954  * any interesting requests and then jump to the real instruction
19955  * handler.  Unlike the Arm handler, we can't do this as a tail call
19956  * because rIBASE is caller save and we need to reload it.
19957  */
19958     movl   rSELF, %eax
19959     movl   rPC, OUT_ARG0(%esp)
19960     movl   %eax, OUT_ARG1(%esp)
19961     call   dvmCheckInst                            # (dPC, self)
19962     movl   rSELF, %ecx
19963     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19964     jmp    *dvmAsmInstructionStart+(500*4)
19965
19966 /* ------------------------------ */
19967 .L_ALT_OP_UNUSED_F5FF: /* 0x1f5 */
19968 /* File: x86/alt_stub.S */
19969 /*
19970  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19971  * any interesting requests and then jump to the real instruction
19972  * handler.  Unlike the Arm handler, we can't do this as a tail call
19973  * because rIBASE is caller save and we need to reload it.
19974  */
19975     movl   rSELF, %eax
19976     movl   rPC, OUT_ARG0(%esp)
19977     movl   %eax, OUT_ARG1(%esp)
19978     call   dvmCheckInst                            # (dPC, self)
19979     movl   rSELF, %ecx
19980     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19981     jmp    *dvmAsmInstructionStart+(501*4)
19982
19983 /* ------------------------------ */
19984 .L_ALT_OP_UNUSED_F6FF: /* 0x1f6 */
19985 /* File: x86/alt_stub.S */
19986 /*
19987  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
19988  * any interesting requests and then jump to the real instruction
19989  * handler.  Unlike the Arm handler, we can't do this as a tail call
19990  * because rIBASE is caller save and we need to reload it.
19991  */
19992     movl   rSELF, %eax
19993     movl   rPC, OUT_ARG0(%esp)
19994     movl   %eax, OUT_ARG1(%esp)
19995     call   dvmCheckInst                            # (dPC, self)
19996     movl   rSELF, %ecx
19997     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
19998     jmp    *dvmAsmInstructionStart+(502*4)
19999
20000 /* ------------------------------ */
20001 .L_ALT_OP_UNUSED_F7FF: /* 0x1f7 */
20002 /* File: x86/alt_stub.S */
20003 /*
20004  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
20005  * any interesting requests and then jump to the real instruction
20006  * handler.  Unlike the Arm handler, we can't do this as a tail call
20007  * because rIBASE is caller save and we need to reload it.
20008  */
20009     movl   rSELF, %eax
20010     movl   rPC, OUT_ARG0(%esp)
20011     movl   %eax, OUT_ARG1(%esp)
20012     call   dvmCheckInst                            # (dPC, self)
20013     movl   rSELF, %ecx
20014     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
20015     jmp    *dvmAsmInstructionStart+(503*4)
20016
20017 /* ------------------------------ */
20018 .L_ALT_OP_UNUSED_F8FF: /* 0x1f8 */
20019 /* File: x86/alt_stub.S */
20020 /*
20021  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
20022  * any interesting requests and then jump to the real instruction
20023  * handler.  Unlike the Arm handler, we can't do this as a tail call
20024  * because rIBASE is caller save and we need to reload it.
20025  */
20026     movl   rSELF, %eax
20027     movl   rPC, OUT_ARG0(%esp)
20028     movl   %eax, OUT_ARG1(%esp)
20029     call   dvmCheckInst                            # (dPC, self)
20030     movl   rSELF, %ecx
20031     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
20032     jmp    *dvmAsmInstructionStart+(504*4)
20033
20034 /* ------------------------------ */
20035 .L_ALT_OP_UNUSED_F9FF: /* 0x1f9 */
20036 /* File: x86/alt_stub.S */
20037 /*
20038  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
20039  * any interesting requests and then jump to the real instruction
20040  * handler.  Unlike the Arm handler, we can't do this as a tail call
20041  * because rIBASE is caller save and we need to reload it.
20042  */
20043     movl   rSELF, %eax
20044     movl   rPC, OUT_ARG0(%esp)
20045     movl   %eax, OUT_ARG1(%esp)
20046     call   dvmCheckInst                            # (dPC, self)
20047     movl   rSELF, %ecx
20048     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
20049     jmp    *dvmAsmInstructionStart+(505*4)
20050
20051 /* ------------------------------ */
20052 .L_ALT_OP_UNUSED_FAFF: /* 0x1fa */
20053 /* File: x86/alt_stub.S */
20054 /*
20055  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
20056  * any interesting requests and then jump to the real instruction
20057  * handler.  Unlike the Arm handler, we can't do this as a tail call
20058  * because rIBASE is caller save and we need to reload it.
20059  */
20060     movl   rSELF, %eax
20061     movl   rPC, OUT_ARG0(%esp)
20062     movl   %eax, OUT_ARG1(%esp)
20063     call   dvmCheckInst                            # (dPC, self)
20064     movl   rSELF, %ecx
20065     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
20066     jmp    *dvmAsmInstructionStart+(506*4)
20067
20068 /* ------------------------------ */
20069 .L_ALT_OP_UNUSED_FBFF: /* 0x1fb */
20070 /* File: x86/alt_stub.S */
20071 /*
20072  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
20073  * any interesting requests and then jump to the real instruction
20074  * handler.  Unlike the Arm handler, we can't do this as a tail call
20075  * because rIBASE is caller save and we need to reload it.
20076  */
20077     movl   rSELF, %eax
20078     movl   rPC, OUT_ARG0(%esp)
20079     movl   %eax, OUT_ARG1(%esp)
20080     call   dvmCheckInst                            # (dPC, self)
20081     movl   rSELF, %ecx
20082     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
20083     jmp    *dvmAsmInstructionStart+(507*4)
20084
20085 /* ------------------------------ */
20086 .L_ALT_OP_UNUSED_FCFF: /* 0x1fc */
20087 /* File: x86/alt_stub.S */
20088 /*
20089  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
20090  * any interesting requests and then jump to the real instruction
20091  * handler.  Unlike the Arm handler, we can't do this as a tail call
20092  * because rIBASE is caller save and we need to reload it.
20093  */
20094     movl   rSELF, %eax
20095     movl   rPC, OUT_ARG0(%esp)
20096     movl   %eax, OUT_ARG1(%esp)
20097     call   dvmCheckInst                            # (dPC, self)
20098     movl   rSELF, %ecx
20099     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
20100     jmp    *dvmAsmInstructionStart+(508*4)
20101
20102 /* ------------------------------ */
20103 .L_ALT_OP_UNUSED_FDFF: /* 0x1fd */
20104 /* File: x86/alt_stub.S */
20105 /*
20106  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
20107  * any interesting requests and then jump to the real instruction
20108  * handler.  Unlike the Arm handler, we can't do this as a tail call
20109  * because rIBASE is caller save and we need to reload it.
20110  */
20111     movl   rSELF, %eax
20112     movl   rPC, OUT_ARG0(%esp)
20113     movl   %eax, OUT_ARG1(%esp)
20114     call   dvmCheckInst                            # (dPC, self)
20115     movl   rSELF, %ecx
20116     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
20117     jmp    *dvmAsmInstructionStart+(509*4)
20118
20119 /* ------------------------------ */
20120 .L_ALT_OP_UNUSED_FEFF: /* 0x1fe */
20121 /* File: x86/alt_stub.S */
20122 /*
20123  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
20124  * any interesting requests and then jump to the real instruction
20125  * handler.  Unlike the Arm handler, we can't do this as a tail call
20126  * because rIBASE is caller save and we need to reload it.
20127  */
20128     movl   rSELF, %eax
20129     movl   rPC, OUT_ARG0(%esp)
20130     movl   %eax, OUT_ARG1(%esp)
20131     call   dvmCheckInst                            # (dPC, self)
20132     movl   rSELF, %ecx
20133     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
20134     jmp    *dvmAsmInstructionStart+(510*4)
20135
20136 /* ------------------------------ */
20137 .L_ALT_OP_THROW_VERIFICATION_ERROR_JUMBO: /* 0x1ff */
20138 /* File: x86/alt_stub.S */
20139 /*
20140  * Inter-instruction transfer stub.  Call out to dvmCheckInst to handle
20141  * any interesting requests and then jump to the real instruction
20142  * handler.  Unlike the Arm handler, we can't do this as a tail call
20143  * because rIBASE is caller save and we need to reload it.
20144  */
20145     movl   rSELF, %eax
20146     movl   rPC, OUT_ARG0(%esp)
20147     movl   %eax, OUT_ARG1(%esp)
20148     call   dvmCheckInst                            # (dPC, self)
20149     movl   rSELF, %ecx
20150     movl   offThread_curHandlerTable(%ecx), rIBASE # reload rIBASE
20151     jmp    *dvmAsmInstructionStart+(511*4)
20152
20153     .size   dvmAsmAltInstructionStartCode, .-dvmAsmAltInstructionStartCode
20154     .global dvmAsmAltInstructionEndCode
20155 dvmAsmAltInstructionEndCode:
20156
20157     .global dvmAsmInstructionStart
20158     .text
20159 dvmAsmInstructionStart:
20160     .long .L_OP_NOP /* 0x00 */
20161     .long .L_OP_MOVE /* 0x01 */
20162     .long .L_OP_MOVE_FROM16 /* 0x02 */
20163     .long .L_OP_MOVE_16 /* 0x03 */
20164     .long .L_OP_MOVE_WIDE /* 0x04 */
20165     .long .L_OP_MOVE_WIDE_FROM16 /* 0x05 */
20166     .long .L_OP_MOVE_WIDE_16 /* 0x06 */
20167     .long .L_OP_MOVE_OBJECT /* 0x07 */
20168     .long .L_OP_MOVE_OBJECT_FROM16 /* 0x08 */
20169     .long .L_OP_MOVE_OBJECT_16 /* 0x09 */
20170     .long .L_OP_MOVE_RESULT /* 0x0a */
20171     .long .L_OP_MOVE_RESULT_WIDE /* 0x0b */
20172     .long .L_OP_MOVE_RESULT_OBJECT /* 0x0c */
20173     .long .L_OP_MOVE_EXCEPTION /* 0x0d */
20174     .long .L_OP_RETURN_VOID /* 0x0e */
20175     .long .L_OP_RETURN /* 0x0f */
20176     .long .L_OP_RETURN_WIDE /* 0x10 */
20177     .long .L_OP_RETURN_OBJECT /* 0x11 */
20178     .long .L_OP_CONST_4 /* 0x12 */
20179     .long .L_OP_CONST_16 /* 0x13 */
20180     .long .L_OP_CONST /* 0x14 */
20181     .long .L_OP_CONST_HIGH16 /* 0x15 */
20182     .long .L_OP_CONST_WIDE_16 /* 0x16 */
20183     .long .L_OP_CONST_WIDE_32 /* 0x17 */
20184     .long .L_OP_CONST_WIDE /* 0x18 */
20185     .long .L_OP_CONST_WIDE_HIGH16 /* 0x19 */
20186     .long .L_OP_CONST_STRING /* 0x1a */
20187     .long .L_OP_CONST_STRING_JUMBO /* 0x1b */
20188     .long .L_OP_CONST_CLASS /* 0x1c */
20189     .long .L_OP_MONITOR_ENTER /* 0x1d */
20190     .long .L_OP_MONITOR_EXIT /* 0x1e */
20191     .long .L_OP_CHECK_CAST /* 0x1f */
20192     .long .L_OP_INSTANCE_OF /* 0x20 */
20193     .long .L_OP_ARRAY_LENGTH /* 0x21 */
20194     .long .L_OP_NEW_INSTANCE /* 0x22 */
20195     .long .L_OP_NEW_ARRAY /* 0x23 */
20196     .long .L_OP_FILLED_NEW_ARRAY /* 0x24 */
20197     .long .L_OP_FILLED_NEW_ARRAY_RANGE /* 0x25 */
20198     .long .L_OP_FILL_ARRAY_DATA /* 0x26 */
20199     .long .L_OP_THROW /* 0x27 */
20200     .long .L_OP_GOTO /* 0x28 */
20201     .long .L_OP_GOTO_16 /* 0x29 */
20202     .long .L_OP_GOTO_32 /* 0x2a */
20203     .long .L_OP_PACKED_SWITCH /* 0x2b */
20204     .long .L_OP_SPARSE_SWITCH /* 0x2c */
20205     .long .L_OP_CMPL_FLOAT /* 0x2d */
20206     .long .L_OP_CMPG_FLOAT /* 0x2e */
20207     .long .L_OP_CMPL_DOUBLE /* 0x2f */
20208     .long .L_OP_CMPG_DOUBLE /* 0x30 */
20209     .long .L_OP_CMP_LONG /* 0x31 */
20210     .long .L_OP_IF_EQ /* 0x32 */
20211     .long .L_OP_IF_NE /* 0x33 */
20212     .long .L_OP_IF_LT /* 0x34 */
20213     .long .L_OP_IF_GE /* 0x35 */
20214     .long .L_OP_IF_GT /* 0x36 */
20215     .long .L_OP_IF_LE /* 0x37 */
20216     .long .L_OP_IF_EQZ /* 0x38 */
20217     .long .L_OP_IF_NEZ /* 0x39 */
20218     .long .L_OP_IF_LTZ /* 0x3a */
20219     .long .L_OP_IF_GEZ /* 0x3b */
20220     .long .L_OP_IF_GTZ /* 0x3c */
20221     .long .L_OP_IF_LEZ /* 0x3d */
20222     .long .L_OP_UNUSED_3E /* 0x3e */
20223     .long .L_OP_UNUSED_3F /* 0x3f */
20224     .long .L_OP_UNUSED_40 /* 0x40 */
20225     .long .L_OP_UNUSED_41 /* 0x41 */
20226     .long .L_OP_UNUSED_42 /* 0x42 */
20227     .long .L_OP_UNUSED_43 /* 0x43 */
20228     .long .L_OP_AGET /* 0x44 */
20229     .long .L_OP_AGET_WIDE /* 0x45 */
20230     .long .L_OP_AGET_OBJECT /* 0x46 */
20231     .long .L_OP_AGET_BOOLEAN /* 0x47 */
20232     .long .L_OP_AGET_BYTE /* 0x48 */
20233     .long .L_OP_AGET_CHAR /* 0x49 */
20234     .long .L_OP_AGET_SHORT /* 0x4a */
20235     .long .L_OP_APUT /* 0x4b */
20236     .long .L_OP_APUT_WIDE /* 0x4c */
20237     .long .L_OP_APUT_OBJECT /* 0x4d */
20238     .long .L_OP_APUT_BOOLEAN /* 0x4e */
20239     .long .L_OP_APUT_BYTE /* 0x4f */
20240     .long .L_OP_APUT_CHAR /* 0x50 */
20241     .long .L_OP_APUT_SHORT /* 0x51 */
20242     .long .L_OP_IGET /* 0x52 */
20243     .long .L_OP_IGET_WIDE /* 0x53 */
20244     .long .L_OP_IGET_OBJECT /* 0x54 */
20245     .long .L_OP_IGET_BOOLEAN /* 0x55 */
20246     .long .L_OP_IGET_BYTE /* 0x56 */
20247     .long .L_OP_IGET_CHAR /* 0x57 */
20248     .long .L_OP_IGET_SHORT /* 0x58 */
20249     .long .L_OP_IPUT /* 0x59 */
20250     .long .L_OP_IPUT_WIDE /* 0x5a */
20251     .long .L_OP_IPUT_OBJECT /* 0x5b */
20252     .long .L_OP_IPUT_BOOLEAN /* 0x5c */
20253     .long .L_OP_IPUT_BYTE /* 0x5d */
20254     .long .L_OP_IPUT_CHAR /* 0x5e */
20255     .long .L_OP_IPUT_SHORT /* 0x5f */
20256     .long .L_OP_SGET /* 0x60 */
20257     .long .L_OP_SGET_WIDE /* 0x61 */
20258     .long .L_OP_SGET_OBJECT /* 0x62 */
20259     .long .L_OP_SGET_BOOLEAN /* 0x63 */
20260     .long .L_OP_SGET_BYTE /* 0x64 */
20261     .long .L_OP_SGET_CHAR /* 0x65 */
20262     .long .L_OP_SGET_SHORT /* 0x66 */
20263     .long .L_OP_SPUT /* 0x67 */
20264     .long .L_OP_SPUT_WIDE /* 0x68 */
20265     .long .L_OP_SPUT_OBJECT /* 0x69 */
20266     .long .L_OP_SPUT_BOOLEAN /* 0x6a */
20267     .long .L_OP_SPUT_BYTE /* 0x6b */
20268     .long .L_OP_SPUT_CHAR /* 0x6c */
20269     .long .L_OP_SPUT_SHORT /* 0x6d */
20270     .long .L_OP_INVOKE_VIRTUAL /* 0x6e */
20271     .long .L_OP_INVOKE_SUPER /* 0x6f */
20272     .long .L_OP_INVOKE_DIRECT /* 0x70 */
20273     .long .L_OP_INVOKE_STATIC /* 0x71 */
20274     .long .L_OP_INVOKE_INTERFACE /* 0x72 */
20275     .long .L_OP_UNUSED_73 /* 0x73 */
20276     .long .L_OP_INVOKE_VIRTUAL_RANGE /* 0x74 */
20277     .long .L_OP_INVOKE_SUPER_RANGE /* 0x75 */
20278     .long .L_OP_INVOKE_DIRECT_RANGE /* 0x76 */
20279     .long .L_OP_INVOKE_STATIC_RANGE /* 0x77 */
20280     .long .L_OP_INVOKE_INTERFACE_RANGE /* 0x78 */
20281     .long .L_OP_UNUSED_79 /* 0x79 */
20282     .long .L_OP_UNUSED_7A /* 0x7a */
20283     .long .L_OP_NEG_INT /* 0x7b */
20284     .long .L_OP_NOT_INT /* 0x7c */
20285     .long .L_OP_NEG_LONG /* 0x7d */
20286     .long .L_OP_NOT_LONG /* 0x7e */
20287     .long .L_OP_NEG_FLOAT /* 0x7f */
20288     .long .L_OP_NEG_DOUBLE /* 0x80 */
20289     .long .L_OP_INT_TO_LONG /* 0x81 */
20290     .long .L_OP_INT_TO_FLOAT /* 0x82 */
20291     .long .L_OP_INT_TO_DOUBLE /* 0x83 */
20292     .long .L_OP_LONG_TO_INT /* 0x84 */
20293     .long .L_OP_LONG_TO_FLOAT /* 0x85 */
20294     .long .L_OP_LONG_TO_DOUBLE /* 0x86 */
20295     .long .L_OP_FLOAT_TO_INT /* 0x87 */
20296     .long .L_OP_FLOAT_TO_LONG /* 0x88 */
20297     .long .L_OP_FLOAT_TO_DOUBLE /* 0x89 */
20298     .long .L_OP_DOUBLE_TO_INT /* 0x8a */
20299     .long .L_OP_DOUBLE_TO_LONG /* 0x8b */
20300     .long .L_OP_DOUBLE_TO_FLOAT /* 0x8c */
20301     .long .L_OP_INT_TO_BYTE /* 0x8d */
20302     .long .L_OP_INT_TO_CHAR /* 0x8e */
20303     .long .L_OP_INT_TO_SHORT /* 0x8f */
20304     .long .L_OP_ADD_INT /* 0x90 */
20305     .long .L_OP_SUB_INT /* 0x91 */
20306     .long .L_OP_MUL_INT /* 0x92 */
20307     .long .L_OP_DIV_INT /* 0x93 */
20308     .long .L_OP_REM_INT /* 0x94 */
20309     .long .L_OP_AND_INT /* 0x95 */
20310     .long .L_OP_OR_INT /* 0x96 */
20311     .long .L_OP_XOR_INT /* 0x97 */
20312     .long .L_OP_SHL_INT /* 0x98 */
20313     .long .L_OP_SHR_INT /* 0x99 */
20314     .long .L_OP_USHR_INT /* 0x9a */
20315     .long .L_OP_ADD_LONG /* 0x9b */
20316     .long .L_OP_SUB_LONG /* 0x9c */
20317     .long .L_OP_MUL_LONG /* 0x9d */
20318     .long .L_OP_DIV_LONG /* 0x9e */
20319     .long .L_OP_REM_LONG /* 0x9f */
20320     .long .L_OP_AND_LONG /* 0xa0 */
20321     .long .L_OP_OR_LONG /* 0xa1 */
20322     .long .L_OP_XOR_LONG /* 0xa2 */
20323     .long .L_OP_SHL_LONG /* 0xa3 */
20324     .long .L_OP_SHR_LONG /* 0xa4 */
20325     .long .L_OP_USHR_LONG /* 0xa5 */
20326     .long .L_OP_ADD_FLOAT /* 0xa6 */
20327     .long .L_OP_SUB_FLOAT /* 0xa7 */
20328     .long .L_OP_MUL_FLOAT /* 0xa8 */
20329     .long .L_OP_DIV_FLOAT /* 0xa9 */
20330     .long .L_OP_REM_FLOAT /* 0xaa */
20331     .long .L_OP_ADD_DOUBLE /* 0xab */
20332     .long .L_OP_SUB_DOUBLE /* 0xac */
20333     .long .L_OP_MUL_DOUBLE /* 0xad */
20334     .long .L_OP_DIV_DOUBLE /* 0xae */
20335     .long .L_OP_REM_DOUBLE /* 0xaf */
20336     .long .L_OP_ADD_INT_2ADDR /* 0xb0 */
20337     .long .L_OP_SUB_INT_2ADDR /* 0xb1 */
20338     .long .L_OP_MUL_INT_2ADDR /* 0xb2 */
20339     .long .L_OP_DIV_INT_2ADDR /* 0xb3 */
20340     .long .L_OP_REM_INT_2ADDR /* 0xb4 */
20341     .long .L_OP_AND_INT_2ADDR /* 0xb5 */
20342     .long .L_OP_OR_INT_2ADDR /* 0xb6 */
20343     .long .L_OP_XOR_INT_2ADDR /* 0xb7 */
20344     .long .L_OP_SHL_INT_2ADDR /* 0xb8 */
20345     .long .L_OP_SHR_INT_2ADDR /* 0xb9 */
20346     .long .L_OP_USHR_INT_2ADDR /* 0xba */
20347     .long .L_OP_ADD_LONG_2ADDR /* 0xbb */
20348     .long .L_OP_SUB_LONG_2ADDR /* 0xbc */
20349     .long .L_OP_MUL_LONG_2ADDR /* 0xbd */
20350     .long .L_OP_DIV_LONG_2ADDR /* 0xbe */
20351     .long .L_OP_REM_LONG_2ADDR /* 0xbf */
20352     .long .L_OP_AND_LONG_2ADDR /* 0xc0 */
20353     .long .L_OP_OR_LONG_2ADDR /* 0xc1 */
20354     .long .L_OP_XOR_LONG_2ADDR /* 0xc2 */
20355     .long .L_OP_SHL_LONG_2ADDR /* 0xc3 */
20356     .long .L_OP_SHR_LONG_2ADDR /* 0xc4 */
20357     .long .L_OP_USHR_LONG_2ADDR /* 0xc5 */
20358     .long .L_OP_ADD_FLOAT_2ADDR /* 0xc6 */
20359     .long .L_OP_SUB_FLOAT_2ADDR /* 0xc7 */
20360     .long .L_OP_MUL_FLOAT_2ADDR /* 0xc8 */
20361     .long .L_OP_DIV_FLOAT_2ADDR /* 0xc9 */
20362     .long .L_OP_REM_FLOAT_2ADDR /* 0xca */
20363     .long .L_OP_ADD_DOUBLE_2ADDR /* 0xcb */
20364     .long .L_OP_SUB_DOUBLE_2ADDR /* 0xcc */
20365     .long .L_OP_MUL_DOUBLE_2ADDR /* 0xcd */
20366     .long .L_OP_DIV_DOUBLE_2ADDR /* 0xce */
20367     .long .L_OP_REM_DOUBLE_2ADDR /* 0xcf */
20368     .long .L_OP_ADD_INT_LIT16 /* 0xd0 */
20369     .long .L_OP_RSUB_INT /* 0xd1 */
20370     .long .L_OP_MUL_INT_LIT16 /* 0xd2 */
20371     .long .L_OP_DIV_INT_LIT16 /* 0xd3 */
20372     .long .L_OP_REM_INT_LIT16 /* 0xd4 */
20373     .long .L_OP_AND_INT_LIT16 /* 0xd5 */
20374     .long .L_OP_OR_INT_LIT16 /* 0xd6 */
20375     .long .L_OP_XOR_INT_LIT16 /* 0xd7 */
20376     .long .L_OP_ADD_INT_LIT8 /* 0xd8 */
20377     .long .L_OP_RSUB_INT_LIT8 /* 0xd9 */
20378     .long .L_OP_MUL_INT_LIT8 /* 0xda */
20379     .long .L_OP_DIV_INT_LIT8 /* 0xdb */
20380     .long .L_OP_REM_INT_LIT8 /* 0xdc */
20381     .long .L_OP_AND_INT_LIT8 /* 0xdd */
20382     .long .L_OP_OR_INT_LIT8 /* 0xde */
20383     .long .L_OP_XOR_INT_LIT8 /* 0xdf */
20384     .long .L_OP_SHL_INT_LIT8 /* 0xe0 */
20385     .long .L_OP_SHR_INT_LIT8 /* 0xe1 */
20386     .long .L_OP_USHR_INT_LIT8 /* 0xe2 */
20387     .long .L_OP_IGET_VOLATILE /* 0xe3 */
20388     .long .L_OP_IPUT_VOLATILE /* 0xe4 */
20389     .long .L_OP_SGET_VOLATILE /* 0xe5 */
20390     .long .L_OP_SPUT_VOLATILE /* 0xe6 */
20391     .long .L_OP_IGET_OBJECT_VOLATILE /* 0xe7 */
20392     .long .L_OP_IGET_WIDE_VOLATILE /* 0xe8 */
20393     .long .L_OP_IPUT_WIDE_VOLATILE /* 0xe9 */
20394     .long .L_OP_SGET_WIDE_VOLATILE /* 0xea */
20395     .long .L_OP_SPUT_WIDE_VOLATILE /* 0xeb */
20396     .long .L_OP_BREAKPOINT /* 0xec */
20397     .long .L_OP_THROW_VERIFICATION_ERROR /* 0xed */
20398     .long .L_OP_EXECUTE_INLINE /* 0xee */
20399     .long .L_OP_EXECUTE_INLINE_RANGE /* 0xef */
20400     .long .L_OP_INVOKE_OBJECT_INIT_RANGE /* 0xf0 */
20401     .long .L_OP_RETURN_VOID_BARRIER /* 0xf1 */
20402     .long .L_OP_IGET_QUICK /* 0xf2 */
20403     .long .L_OP_IGET_WIDE_QUICK /* 0xf3 */
20404     .long .L_OP_IGET_OBJECT_QUICK /* 0xf4 */
20405     .long .L_OP_IPUT_QUICK /* 0xf5 */
20406     .long .L_OP_IPUT_WIDE_QUICK /* 0xf6 */
20407     .long .L_OP_IPUT_OBJECT_QUICK /* 0xf7 */
20408     .long .L_OP_INVOKE_VIRTUAL_QUICK /* 0xf8 */
20409     .long .L_OP_INVOKE_VIRTUAL_QUICK_RANGE /* 0xf9 */
20410     .long .L_OP_INVOKE_SUPER_QUICK /* 0xfa */
20411     .long .L_OP_INVOKE_SUPER_QUICK_RANGE /* 0xfb */
20412     .long .L_OP_IPUT_OBJECT_VOLATILE /* 0xfc */
20413     .long .L_OP_SGET_OBJECT_VOLATILE /* 0xfd */
20414     .long .L_OP_SPUT_OBJECT_VOLATILE /* 0xfe */
20415     .long .L_OP_DISPATCH_FF /* 0xff */
20416     .long .L_OP_CONST_CLASS_JUMBO /* 0x100 */
20417     .long .L_OP_CHECK_CAST_JUMBO /* 0x101 */
20418     .long .L_OP_INSTANCE_OF_JUMBO /* 0x102 */
20419     .long .L_OP_NEW_INSTANCE_JUMBO /* 0x103 */
20420     .long .L_OP_NEW_ARRAY_JUMBO /* 0x104 */
20421     .long .L_OP_FILLED_NEW_ARRAY_JUMBO /* 0x105 */
20422     .long .L_OP_IGET_JUMBO /* 0x106 */
20423     .long .L_OP_IGET_WIDE_JUMBO /* 0x107 */
20424     .long .L_OP_IGET_OBJECT_JUMBO /* 0x108 */
20425     .long .L_OP_IGET_BOOLEAN_JUMBO /* 0x109 */
20426     .long .L_OP_IGET_BYTE_JUMBO /* 0x10a */
20427     .long .L_OP_IGET_CHAR_JUMBO /* 0x10b */
20428     .long .L_OP_IGET_SHORT_JUMBO /* 0x10c */
20429     .long .L_OP_IPUT_JUMBO /* 0x10d */
20430     .long .L_OP_IPUT_WIDE_JUMBO /* 0x10e */
20431     .long .L_OP_IPUT_OBJECT_JUMBO /* 0x10f */
20432     .long .L_OP_IPUT_BOOLEAN_JUMBO /* 0x110 */
20433     .long .L_OP_IPUT_BYTE_JUMBO /* 0x111 */
20434     .long .L_OP_IPUT_CHAR_JUMBO /* 0x112 */
20435     .long .L_OP_IPUT_SHORT_JUMBO /* 0x113 */
20436     .long .L_OP_SGET_JUMBO /* 0x114 */
20437     .long .L_OP_SGET_WIDE_JUMBO /* 0x115 */
20438     .long .L_OP_SGET_OBJECT_JUMBO /* 0x116 */
20439     .long .L_OP_SGET_BOOLEAN_JUMBO /* 0x117 */
20440     .long .L_OP_SGET_BYTE_JUMBO /* 0x118 */
20441     .long .L_OP_SGET_CHAR_JUMBO /* 0x119 */
20442     .long .L_OP_SGET_SHORT_JUMBO /* 0x11a */
20443     .long .L_OP_SPUT_JUMBO /* 0x11b */
20444     .long .L_OP_SPUT_WIDE_JUMBO /* 0x11c */
20445     .long .L_OP_SPUT_OBJECT_JUMBO /* 0x11d */
20446     .long .L_OP_SPUT_BOOLEAN_JUMBO /* 0x11e */
20447     .long .L_OP_SPUT_BYTE_JUMBO /* 0x11f */
20448     .long .L_OP_SPUT_CHAR_JUMBO /* 0x120 */
20449     .long .L_OP_SPUT_SHORT_JUMBO /* 0x121 */
20450     .long .L_OP_INVOKE_VIRTUAL_JUMBO /* 0x122 */
20451     .long .L_OP_INVOKE_SUPER_JUMBO /* 0x123 */
20452     .long .L_OP_INVOKE_DIRECT_JUMBO /* 0x124 */
20453     .long .L_OP_INVOKE_STATIC_JUMBO /* 0x125 */
20454     .long .L_OP_INVOKE_INTERFACE_JUMBO /* 0x126 */
20455     .long .L_OP_UNUSED_27FF /* 0x127 */
20456     .long .L_OP_UNUSED_28FF /* 0x128 */
20457     .long .L_OP_UNUSED_29FF /* 0x129 */
20458     .long .L_OP_UNUSED_2AFF /* 0x12a */
20459     .long .L_OP_UNUSED_2BFF /* 0x12b */
20460     .long .L_OP_UNUSED_2CFF /* 0x12c */
20461     .long .L_OP_UNUSED_2DFF /* 0x12d */
20462     .long .L_OP_UNUSED_2EFF /* 0x12e */
20463     .long .L_OP_UNUSED_2FFF /* 0x12f */
20464     .long .L_OP_UNUSED_30FF /* 0x130 */
20465     .long .L_OP_UNUSED_31FF /* 0x131 */
20466     .long .L_OP_UNUSED_32FF /* 0x132 */
20467     .long .L_OP_UNUSED_33FF /* 0x133 */
20468     .long .L_OP_UNUSED_34FF /* 0x134 */
20469     .long .L_OP_UNUSED_35FF /* 0x135 */
20470     .long .L_OP_UNUSED_36FF /* 0x136 */
20471     .long .L_OP_UNUSED_37FF /* 0x137 */
20472     .long .L_OP_UNUSED_38FF /* 0x138 */
20473     .long .L_OP_UNUSED_39FF /* 0x139 */
20474     .long .L_OP_UNUSED_3AFF /* 0x13a */
20475     .long .L_OP_UNUSED_3BFF /* 0x13b */
20476     .long .L_OP_UNUSED_3CFF /* 0x13c */
20477     .long .L_OP_UNUSED_3DFF /* 0x13d */
20478     .long .L_OP_UNUSED_3EFF /* 0x13e */
20479     .long .L_OP_UNUSED_3FFF /* 0x13f */
20480     .long .L_OP_UNUSED_40FF /* 0x140 */
20481     .long .L_OP_UNUSED_41FF /* 0x141 */
20482     .long .L_OP_UNUSED_42FF /* 0x142 */
20483     .long .L_OP_UNUSED_43FF /* 0x143 */
20484     .long .L_OP_UNUSED_44FF /* 0x144 */
20485     .long .L_OP_UNUSED_45FF /* 0x145 */
20486     .long .L_OP_UNUSED_46FF /* 0x146 */
20487     .long .L_OP_UNUSED_47FF /* 0x147 */
20488     .long .L_OP_UNUSED_48FF /* 0x148 */
20489     .long .L_OP_UNUSED_49FF /* 0x149 */
20490     .long .L_OP_UNUSED_4AFF /* 0x14a */
20491     .long .L_OP_UNUSED_4BFF /* 0x14b */
20492     .long .L_OP_UNUSED_4CFF /* 0x14c */
20493     .long .L_OP_UNUSED_4DFF /* 0x14d */
20494     .long .L_OP_UNUSED_4EFF /* 0x14e */
20495     .long .L_OP_UNUSED_4FFF /* 0x14f */
20496     .long .L_OP_UNUSED_50FF /* 0x150 */
20497     .long .L_OP_UNUSED_51FF /* 0x151 */
20498     .long .L_OP_UNUSED_52FF /* 0x152 */
20499     .long .L_OP_UNUSED_53FF /* 0x153 */
20500     .long .L_OP_UNUSED_54FF /* 0x154 */
20501     .long .L_OP_UNUSED_55FF /* 0x155 */
20502     .long .L_OP_UNUSED_56FF /* 0x156 */
20503     .long .L_OP_UNUSED_57FF /* 0x157 */
20504     .long .L_OP_UNUSED_58FF /* 0x158 */
20505     .long .L_OP_UNUSED_59FF /* 0x159 */
20506     .long .L_OP_UNUSED_5AFF /* 0x15a */
20507     .long .L_OP_UNUSED_5BFF /* 0x15b */
20508     .long .L_OP_UNUSED_5CFF /* 0x15c */
20509     .long .L_OP_UNUSED_5DFF /* 0x15d */
20510     .long .L_OP_UNUSED_5EFF /* 0x15e */
20511     .long .L_OP_UNUSED_5FFF /* 0x15f */
20512     .long .L_OP_UNUSED_60FF /* 0x160 */
20513     .long .L_OP_UNUSED_61FF /* 0x161 */
20514     .long .L_OP_UNUSED_62FF /* 0x162 */
20515     .long .L_OP_UNUSED_63FF /* 0x163 */
20516     .long .L_OP_UNUSED_64FF /* 0x164 */
20517     .long .L_OP_UNUSED_65FF /* 0x165 */
20518     .long .L_OP_UNUSED_66FF /* 0x166 */
20519     .long .L_OP_UNUSED_67FF /* 0x167 */
20520     .long .L_OP_UNUSED_68FF /* 0x168 */
20521     .long .L_OP_UNUSED_69FF /* 0x169 */
20522     .long .L_OP_UNUSED_6AFF /* 0x16a */
20523     .long .L_OP_UNUSED_6BFF /* 0x16b */
20524     .long .L_OP_UNUSED_6CFF /* 0x16c */
20525     .long .L_OP_UNUSED_6DFF /* 0x16d */
20526     .long .L_OP_UNUSED_6EFF /* 0x16e */
20527     .long .L_OP_UNUSED_6FFF /* 0x16f */
20528     .long .L_OP_UNUSED_70FF /* 0x170 */
20529     .long .L_OP_UNUSED_71FF /* 0x171 */
20530     .long .L_OP_UNUSED_72FF /* 0x172 */
20531     .long .L_OP_UNUSED_73FF /* 0x173 */
20532     .long .L_OP_UNUSED_74FF /* 0x174 */
20533     .long .L_OP_UNUSED_75FF /* 0x175 */
20534     .long .L_OP_UNUSED_76FF /* 0x176 */
20535     .long .L_OP_UNUSED_77FF /* 0x177 */
20536     .long .L_OP_UNUSED_78FF /* 0x178 */
20537     .long .L_OP_UNUSED_79FF /* 0x179 */
20538     .long .L_OP_UNUSED_7AFF /* 0x17a */
20539     .long .L_OP_UNUSED_7BFF /* 0x17b */
20540     .long .L_OP_UNUSED_7CFF /* 0x17c */
20541     .long .L_OP_UNUSED_7DFF /* 0x17d */
20542     .long .L_OP_UNUSED_7EFF /* 0x17e */
20543     .long .L_OP_UNUSED_7FFF /* 0x17f */
20544     .long .L_OP_UNUSED_80FF /* 0x180 */
20545     .long .L_OP_UNUSED_81FF /* 0x181 */
20546     .long .L_OP_UNUSED_82FF /* 0x182 */
20547     .long .L_OP_UNUSED_83FF /* 0x183 */
20548     .long .L_OP_UNUSED_84FF /* 0x184 */
20549     .long .L_OP_UNUSED_85FF /* 0x185 */
20550     .long .L_OP_UNUSED_86FF /* 0x186 */
20551     .long .L_OP_UNUSED_87FF /* 0x187 */
20552     .long .L_OP_UNUSED_88FF /* 0x188 */
20553     .long .L_OP_UNUSED_89FF /* 0x189 */
20554     .long .L_OP_UNUSED_8AFF /* 0x18a */
20555     .long .L_OP_UNUSED_8BFF /* 0x18b */
20556     .long .L_OP_UNUSED_8CFF /* 0x18c */
20557     .long .L_OP_UNUSED_8DFF /* 0x18d */
20558     .long .L_OP_UNUSED_8EFF /* 0x18e */
20559     .long .L_OP_UNUSED_8FFF /* 0x18f */
20560     .long .L_OP_UNUSED_90FF /* 0x190 */
20561     .long .L_OP_UNUSED_91FF /* 0x191 */
20562     .long .L_OP_UNUSED_92FF /* 0x192 */
20563     .long .L_OP_UNUSED_93FF /* 0x193 */
20564     .long .L_OP_UNUSED_94FF /* 0x194 */
20565     .long .L_OP_UNUSED_95FF /* 0x195 */
20566     .long .L_OP_UNUSED_96FF /* 0x196 */
20567     .long .L_OP_UNUSED_97FF /* 0x197 */
20568     .long .L_OP_UNUSED_98FF /* 0x198 */
20569     .long .L_OP_UNUSED_99FF /* 0x199 */
20570     .long .L_OP_UNUSED_9AFF /* 0x19a */
20571     .long .L_OP_UNUSED_9BFF /* 0x19b */
20572     .long .L_OP_UNUSED_9CFF /* 0x19c */
20573     .long .L_OP_UNUSED_9DFF /* 0x19d */
20574     .long .L_OP_UNUSED_9EFF /* 0x19e */
20575     .long .L_OP_UNUSED_9FFF /* 0x19f */
20576     .long .L_OP_UNUSED_A0FF /* 0x1a0 */
20577     .long .L_OP_UNUSED_A1FF /* 0x1a1 */
20578     .long .L_OP_UNUSED_A2FF /* 0x1a2 */
20579     .long .L_OP_UNUSED_A3FF /* 0x1a3 */
20580     .long .L_OP_UNUSED_A4FF /* 0x1a4 */
20581     .long .L_OP_UNUSED_A5FF /* 0x1a5 */
20582     .long .L_OP_UNUSED_A6FF /* 0x1a6 */
20583     .long .L_OP_UNUSED_A7FF /* 0x1a7 */
20584     .long .L_OP_UNUSED_A8FF /* 0x1a8 */
20585     .long .L_OP_UNUSED_A9FF /* 0x1a9 */
20586     .long .L_OP_UNUSED_AAFF /* 0x1aa */
20587     .long .L_OP_UNUSED_ABFF /* 0x1ab */
20588     .long .L_OP_UNUSED_ACFF /* 0x1ac */
20589     .long .L_OP_UNUSED_ADFF /* 0x1ad */
20590     .long .L_OP_UNUSED_AEFF /* 0x1ae */
20591     .long .L_OP_UNUSED_AFFF /* 0x1af */
20592     .long .L_OP_UNUSED_B0FF /* 0x1b0 */
20593     .long .L_OP_UNUSED_B1FF /* 0x1b1 */
20594     .long .L_OP_UNUSED_B2FF /* 0x1b2 */
20595     .long .L_OP_UNUSED_B3FF /* 0x1b3 */
20596     .long .L_OP_UNUSED_B4FF /* 0x1b4 */
20597     .long .L_OP_UNUSED_B5FF /* 0x1b5 */
20598     .long .L_OP_UNUSED_B6FF /* 0x1b6 */
20599     .long .L_OP_UNUSED_B7FF /* 0x1b7 */
20600     .long .L_OP_UNUSED_B8FF /* 0x1b8 */
20601     .long .L_OP_UNUSED_B9FF /* 0x1b9 */
20602     .long .L_OP_UNUSED_BAFF /* 0x1ba */
20603     .long .L_OP_UNUSED_BBFF /* 0x1bb */
20604     .long .L_OP_UNUSED_BCFF /* 0x1bc */
20605     .long .L_OP_UNUSED_BDFF /* 0x1bd */
20606     .long .L_OP_UNUSED_BEFF /* 0x1be */
20607     .long .L_OP_UNUSED_BFFF /* 0x1bf */
20608     .long .L_OP_UNUSED_C0FF /* 0x1c0 */
20609     .long .L_OP_UNUSED_C1FF /* 0x1c1 */
20610     .long .L_OP_UNUSED_C2FF /* 0x1c2 */
20611     .long .L_OP_UNUSED_C3FF /* 0x1c3 */
20612     .long .L_OP_UNUSED_C4FF /* 0x1c4 */
20613     .long .L_OP_UNUSED_C5FF /* 0x1c5 */
20614     .long .L_OP_UNUSED_C6FF /* 0x1c6 */
20615     .long .L_OP_UNUSED_C7FF /* 0x1c7 */
20616     .long .L_OP_UNUSED_C8FF /* 0x1c8 */
20617     .long .L_OP_UNUSED_C9FF /* 0x1c9 */
20618     .long .L_OP_UNUSED_CAFF /* 0x1ca */
20619     .long .L_OP_UNUSED_CBFF /* 0x1cb */
20620     .long .L_OP_UNUSED_CCFF /* 0x1cc */
20621     .long .L_OP_UNUSED_CDFF /* 0x1cd */
20622     .long .L_OP_UNUSED_CEFF /* 0x1ce */
20623     .long .L_OP_UNUSED_CFFF /* 0x1cf */
20624     .long .L_OP_UNUSED_D0FF /* 0x1d0 */
20625     .long .L_OP_UNUSED_D1FF /* 0x1d1 */
20626     .long .L_OP_UNUSED_D2FF /* 0x1d2 */
20627     .long .L_OP_UNUSED_D3FF /* 0x1d3 */
20628     .long .L_OP_UNUSED_D4FF /* 0x1d4 */
20629     .long .L_OP_UNUSED_D5FF /* 0x1d5 */
20630     .long .L_OP_UNUSED_D6FF /* 0x1d6 */
20631     .long .L_OP_UNUSED_D7FF /* 0x1d7 */
20632     .long .L_OP_UNUSED_D8FF /* 0x1d8 */
20633     .long .L_OP_UNUSED_D9FF /* 0x1d9 */
20634     .long .L_OP_UNUSED_DAFF /* 0x1da */
20635     .long .L_OP_UNUSED_DBFF /* 0x1db */
20636     .long .L_OP_UNUSED_DCFF /* 0x1dc */
20637     .long .L_OP_UNUSED_DDFF /* 0x1dd */
20638     .long .L_OP_UNUSED_DEFF /* 0x1de */
20639     .long .L_OP_UNUSED_DFFF /* 0x1df */
20640     .long .L_OP_UNUSED_E0FF /* 0x1e0 */
20641     .long .L_OP_UNUSED_E1FF /* 0x1e1 */
20642     .long .L_OP_UNUSED_E2FF /* 0x1e2 */
20643     .long .L_OP_UNUSED_E3FF /* 0x1e3 */
20644     .long .L_OP_UNUSED_E4FF /* 0x1e4 */
20645     .long .L_OP_UNUSED_E5FF /* 0x1e5 */
20646     .long .L_OP_UNUSED_E6FF /* 0x1e6 */
20647     .long .L_OP_UNUSED_E7FF /* 0x1e7 */
20648     .long .L_OP_UNUSED_E8FF /* 0x1e8 */
20649     .long .L_OP_UNUSED_E9FF /* 0x1e9 */
20650     .long .L_OP_UNUSED_EAFF /* 0x1ea */
20651     .long .L_OP_UNUSED_EBFF /* 0x1eb */
20652     .long .L_OP_UNUSED_ECFF /* 0x1ec */
20653     .long .L_OP_UNUSED_EDFF /* 0x1ed */
20654     .long .L_OP_UNUSED_EEFF /* 0x1ee */
20655     .long .L_OP_UNUSED_EFFF /* 0x1ef */
20656     .long .L_OP_UNUSED_F0FF /* 0x1f0 */
20657     .long .L_OP_UNUSED_F1FF /* 0x1f1 */
20658     .long .L_OP_UNUSED_F2FF /* 0x1f2 */
20659     .long .L_OP_UNUSED_F3FF /* 0x1f3 */
20660     .long .L_OP_UNUSED_F4FF /* 0x1f4 */
20661     .long .L_OP_UNUSED_F5FF /* 0x1f5 */
20662     .long .L_OP_UNUSED_F6FF /* 0x1f6 */
20663     .long .L_OP_UNUSED_F7FF /* 0x1f7 */
20664     .long .L_OP_UNUSED_F8FF /* 0x1f8 */
20665     .long .L_OP_UNUSED_F9FF /* 0x1f9 */
20666     .long .L_OP_UNUSED_FAFF /* 0x1fa */
20667     .long .L_OP_UNUSED_FBFF /* 0x1fb */
20668     .long .L_OP_UNUSED_FCFF /* 0x1fc */
20669     .long .L_OP_UNUSED_FDFF /* 0x1fd */
20670     .long .L_OP_UNUSED_FEFF /* 0x1fe */
20671     .long .L_OP_THROW_VERIFICATION_ERROR_JUMBO /* 0x1ff */
20672
20673     .global dvmAsmAltInstructionStart
20674     .text
20675 dvmAsmAltInstructionStart:
20676     .long .L_ALT_OP_NOP /* 0x00 */
20677     .long .L_ALT_OP_MOVE /* 0x01 */
20678     .long .L_ALT_OP_MOVE_FROM16 /* 0x02 */
20679     .long .L_ALT_OP_MOVE_16 /* 0x03 */
20680     .long .L_ALT_OP_MOVE_WIDE /* 0x04 */
20681     .long .L_ALT_OP_MOVE_WIDE_FROM16 /* 0x05 */
20682     .long .L_ALT_OP_MOVE_WIDE_16 /* 0x06 */
20683     .long .L_ALT_OP_MOVE_OBJECT /* 0x07 */
20684     .long .L_ALT_OP_MOVE_OBJECT_FROM16 /* 0x08 */
20685     .long .L_ALT_OP_MOVE_OBJECT_16 /* 0x09 */
20686     .long .L_ALT_OP_MOVE_RESULT /* 0x0a */
20687     .long .L_ALT_OP_MOVE_RESULT_WIDE /* 0x0b */
20688     .long .L_ALT_OP_MOVE_RESULT_OBJECT /* 0x0c */
20689     .long .L_ALT_OP_MOVE_EXCEPTION /* 0x0d */
20690     .long .L_ALT_OP_RETURN_VOID /* 0x0e */
20691     .long .L_ALT_OP_RETURN /* 0x0f */
20692     .long .L_ALT_OP_RETURN_WIDE /* 0x10 */
20693     .long .L_ALT_OP_RETURN_OBJECT /* 0x11 */
20694     .long .L_ALT_OP_CONST_4 /* 0x12 */
20695     .long .L_ALT_OP_CONST_16 /* 0x13 */
20696     .long .L_ALT_OP_CONST /* 0x14 */
20697     .long .L_ALT_OP_CONST_HIGH16 /* 0x15 */
20698     .long .L_ALT_OP_CONST_WIDE_16 /* 0x16 */
20699     .long .L_ALT_OP_CONST_WIDE_32 /* 0x17 */
20700     .long .L_ALT_OP_CONST_WIDE /* 0x18 */
20701     .long .L_ALT_OP_CONST_WIDE_HIGH16 /* 0x19 */
20702     .long .L_ALT_OP_CONST_STRING /* 0x1a */
20703     .long .L_ALT_OP_CONST_STRING_JUMBO /* 0x1b */
20704     .long .L_ALT_OP_CONST_CLASS /* 0x1c */
20705     .long .L_ALT_OP_MONITOR_ENTER /* 0x1d */
20706     .long .L_ALT_OP_MONITOR_EXIT /* 0x1e */
20707     .long .L_ALT_OP_CHECK_CAST /* 0x1f */
20708     .long .L_ALT_OP_INSTANCE_OF /* 0x20 */
20709     .long .L_ALT_OP_ARRAY_LENGTH /* 0x21 */
20710     .long .L_ALT_OP_NEW_INSTANCE /* 0x22 */
20711     .long .L_ALT_OP_NEW_ARRAY /* 0x23 */
20712     .long .L_ALT_OP_FILLED_NEW_ARRAY /* 0x24 */
20713     .long .L_ALT_OP_FILLED_NEW_ARRAY_RANGE /* 0x25 */
20714     .long .L_ALT_OP_FILL_ARRAY_DATA /* 0x26 */
20715     .long .L_ALT_OP_THROW /* 0x27 */
20716     .long .L_ALT_OP_GOTO /* 0x28 */
20717     .long .L_ALT_OP_GOTO_16 /* 0x29 */
20718     .long .L_ALT_OP_GOTO_32 /* 0x2a */
20719     .long .L_ALT_OP_PACKED_SWITCH /* 0x2b */
20720     .long .L_ALT_OP_SPARSE_SWITCH /* 0x2c */
20721     .long .L_ALT_OP_CMPL_FLOAT /* 0x2d */
20722     .long .L_ALT_OP_CMPG_FLOAT /* 0x2e */
20723     .long .L_ALT_OP_CMPL_DOUBLE /* 0x2f */
20724     .long .L_ALT_OP_CMPG_DOUBLE /* 0x30 */
20725     .long .L_ALT_OP_CMP_LONG /* 0x31 */
20726     .long .L_ALT_OP_IF_EQ /* 0x32 */
20727     .long .L_ALT_OP_IF_NE /* 0x33 */
20728     .long .L_ALT_OP_IF_LT /* 0x34 */
20729     .long .L_ALT_OP_IF_GE /* 0x35 */
20730     .long .L_ALT_OP_IF_GT /* 0x36 */
20731     .long .L_ALT_OP_IF_LE /* 0x37 */
20732     .long .L_ALT_OP_IF_EQZ /* 0x38 */
20733     .long .L_ALT_OP_IF_NEZ /* 0x39 */
20734     .long .L_ALT_OP_IF_LTZ /* 0x3a */
20735     .long .L_ALT_OP_IF_GEZ /* 0x3b */
20736     .long .L_ALT_OP_IF_GTZ /* 0x3c */
20737     .long .L_ALT_OP_IF_LEZ /* 0x3d */
20738     .long .L_ALT_OP_UNUSED_3E /* 0x3e */
20739     .long .L_ALT_OP_UNUSED_3F /* 0x3f */
20740     .long .L_ALT_OP_UNUSED_40 /* 0x40 */
20741     .long .L_ALT_OP_UNUSED_41 /* 0x41 */
20742     .long .L_ALT_OP_UNUSED_42 /* 0x42 */
20743     .long .L_ALT_OP_UNUSED_43 /* 0x43 */
20744     .long .L_ALT_OP_AGET /* 0x44 */
20745     .long .L_ALT_OP_AGET_WIDE /* 0x45 */
20746     .long .L_ALT_OP_AGET_OBJECT /* 0x46 */
20747     .long .L_ALT_OP_AGET_BOOLEAN /* 0x47 */
20748     .long .L_ALT_OP_AGET_BYTE /* 0x48 */
20749     .long .L_ALT_OP_AGET_CHAR /* 0x49 */
20750     .long .L_ALT_OP_AGET_SHORT /* 0x4a */
20751     .long .L_ALT_OP_APUT /* 0x4b */
20752     .long .L_ALT_OP_APUT_WIDE /* 0x4c */
20753     .long .L_ALT_OP_APUT_OBJECT /* 0x4d */
20754     .long .L_ALT_OP_APUT_BOOLEAN /* 0x4e */
20755     .long .L_ALT_OP_APUT_BYTE /* 0x4f */
20756     .long .L_ALT_OP_APUT_CHAR /* 0x50 */
20757     .long .L_ALT_OP_APUT_SHORT /* 0x51 */
20758     .long .L_ALT_OP_IGET /* 0x52 */
20759     .long .L_ALT_OP_IGET_WIDE /* 0x53 */
20760     .long .L_ALT_OP_IGET_OBJECT /* 0x54 */
20761     .long .L_ALT_OP_IGET_BOOLEAN /* 0x55 */
20762     .long .L_ALT_OP_IGET_BYTE /* 0x56 */
20763     .long .L_ALT_OP_IGET_CHAR /* 0x57 */
20764     .long .L_ALT_OP_IGET_SHORT /* 0x58 */
20765     .long .L_ALT_OP_IPUT /* 0x59 */
20766     .long .L_ALT_OP_IPUT_WIDE /* 0x5a */
20767     .long .L_ALT_OP_IPUT_OBJECT /* 0x5b */
20768     .long .L_ALT_OP_IPUT_BOOLEAN /* 0x5c */
20769     .long .L_ALT_OP_IPUT_BYTE /* 0x5d */
20770     .long .L_ALT_OP_IPUT_CHAR /* 0x5e */
20771     .long .L_ALT_OP_IPUT_SHORT /* 0x5f */
20772     .long .L_ALT_OP_SGET /* 0x60 */
20773     .long .L_ALT_OP_SGET_WIDE /* 0x61 */
20774     .long .L_ALT_OP_SGET_OBJECT /* 0x62 */
20775     .long .L_ALT_OP_SGET_BOOLEAN /* 0x63 */
20776     .long .L_ALT_OP_SGET_BYTE /* 0x64 */
20777     .long .L_ALT_OP_SGET_CHAR /* 0x65 */
20778     .long .L_ALT_OP_SGET_SHORT /* 0x66 */
20779     .long .L_ALT_OP_SPUT /* 0x67 */
20780     .long .L_ALT_OP_SPUT_WIDE /* 0x68 */
20781     .long .L_ALT_OP_SPUT_OBJECT /* 0x69 */
20782     .long .L_ALT_OP_SPUT_BOOLEAN /* 0x6a */
20783     .long .L_ALT_OP_SPUT_BYTE /* 0x6b */
20784     .long .L_ALT_OP_SPUT_CHAR /* 0x6c */
20785     .long .L_ALT_OP_SPUT_SHORT /* 0x6d */
20786     .long .L_ALT_OP_INVOKE_VIRTUAL /* 0x6e */
20787     .long .L_ALT_OP_INVOKE_SUPER /* 0x6f */
20788     .long .L_ALT_OP_INVOKE_DIRECT /* 0x70 */
20789     .long .L_ALT_OP_INVOKE_STATIC /* 0x71 */
20790     .long .L_ALT_OP_INVOKE_INTERFACE /* 0x72 */
20791     .long .L_ALT_OP_UNUSED_73 /* 0x73 */
20792     .long .L_ALT_OP_INVOKE_VIRTUAL_RANGE /* 0x74 */
20793     .long .L_ALT_OP_INVOKE_SUPER_RANGE /* 0x75 */
20794     .long .L_ALT_OP_INVOKE_DIRECT_RANGE /* 0x76 */
20795     .long .L_ALT_OP_INVOKE_STATIC_RANGE /* 0x77 */
20796     .long .L_ALT_OP_INVOKE_INTERFACE_RANGE /* 0x78 */
20797     .long .L_ALT_OP_UNUSED_79 /* 0x79 */
20798     .long .L_ALT_OP_UNUSED_7A /* 0x7a */
20799     .long .L_ALT_OP_NEG_INT /* 0x7b */
20800     .long .L_ALT_OP_NOT_INT /* 0x7c */
20801     .long .L_ALT_OP_NEG_LONG /* 0x7d */
20802     .long .L_ALT_OP_NOT_LONG /* 0x7e */
20803     .long .L_ALT_OP_NEG_FLOAT /* 0x7f */
20804     .long .L_ALT_OP_NEG_DOUBLE /* 0x80 */
20805     .long .L_ALT_OP_INT_TO_LONG /* 0x81 */
20806     .long .L_ALT_OP_INT_TO_FLOAT /* 0x82 */
20807     .long .L_ALT_OP_INT_TO_DOUBLE /* 0x83 */
20808     .long .L_ALT_OP_LONG_TO_INT /* 0x84 */
20809     .long .L_ALT_OP_LONG_TO_FLOAT /* 0x85 */
20810     .long .L_ALT_OP_LONG_TO_DOUBLE /* 0x86 */
20811     .long .L_ALT_OP_FLOAT_TO_INT /* 0x87 */
20812     .long .L_ALT_OP_FLOAT_TO_LONG /* 0x88 */
20813     .long .L_ALT_OP_FLOAT_TO_DOUBLE /* 0x89 */
20814     .long .L_ALT_OP_DOUBLE_TO_INT /* 0x8a */
20815     .long .L_ALT_OP_DOUBLE_TO_LONG /* 0x8b */
20816     .long .L_ALT_OP_DOUBLE_TO_FLOAT /* 0x8c */
20817     .long .L_ALT_OP_INT_TO_BYTE /* 0x8d */
20818     .long .L_ALT_OP_INT_TO_CHAR /* 0x8e */
20819     .long .L_ALT_OP_INT_TO_SHORT /* 0x8f */
20820     .long .L_ALT_OP_ADD_INT /* 0x90 */
20821     .long .L_ALT_OP_SUB_INT /* 0x91 */
20822     .long .L_ALT_OP_MUL_INT /* 0x92 */
20823     .long .L_ALT_OP_DIV_INT /* 0x93 */
20824     .long .L_ALT_OP_REM_INT /* 0x94 */
20825     .long .L_ALT_OP_AND_INT /* 0x95 */
20826     .long .L_ALT_OP_OR_INT /* 0x96 */
20827     .long .L_ALT_OP_XOR_INT /* 0x97 */
20828     .long .L_ALT_OP_SHL_INT /* 0x98 */
20829     .long .L_ALT_OP_SHR_INT /* 0x99 */
20830     .long .L_ALT_OP_USHR_INT /* 0x9a */
20831     .long .L_ALT_OP_ADD_LONG /* 0x9b */
20832     .long .L_ALT_OP_SUB_LONG /* 0x9c */
20833     .long .L_ALT_OP_MUL_LONG /* 0x9d */
20834     .long .L_ALT_OP_DIV_LONG /* 0x9e */
20835     .long .L_ALT_OP_REM_LONG /* 0x9f */
20836     .long .L_ALT_OP_AND_LONG /* 0xa0 */
20837     .long .L_ALT_OP_OR_LONG /* 0xa1 */
20838     .long .L_ALT_OP_XOR_LONG /* 0xa2 */
20839     .long .L_ALT_OP_SHL_LONG /* 0xa3 */
20840     .long .L_ALT_OP_SHR_LONG /* 0xa4 */
20841     .long .L_ALT_OP_USHR_LONG /* 0xa5 */
20842     .long .L_ALT_OP_ADD_FLOAT /* 0xa6 */
20843     .long .L_ALT_OP_SUB_FLOAT /* 0xa7 */
20844     .long .L_ALT_OP_MUL_FLOAT /* 0xa8 */
20845     .long .L_ALT_OP_DIV_FLOAT /* 0xa9 */
20846     .long .L_ALT_OP_REM_FLOAT /* 0xaa */
20847     .long .L_ALT_OP_ADD_DOUBLE /* 0xab */
20848     .long .L_ALT_OP_SUB_DOUBLE /* 0xac */
20849     .long .L_ALT_OP_MUL_DOUBLE /* 0xad */
20850     .long .L_ALT_OP_DIV_DOUBLE /* 0xae */
20851     .long .L_ALT_OP_REM_DOUBLE /* 0xaf */
20852     .long .L_ALT_OP_ADD_INT_2ADDR /* 0xb0 */
20853     .long .L_ALT_OP_SUB_INT_2ADDR /* 0xb1 */
20854     .long .L_ALT_OP_MUL_INT_2ADDR /* 0xb2 */
20855     .long .L_ALT_OP_DIV_INT_2ADDR /* 0xb3 */
20856     .long .L_ALT_OP_REM_INT_2ADDR /* 0xb4 */
20857     .long .L_ALT_OP_AND_INT_2ADDR /* 0xb5 */
20858     .long .L_ALT_OP_OR_INT_2ADDR /* 0xb6 */
20859     .long .L_ALT_OP_XOR_INT_2ADDR /* 0xb7 */
20860     .long .L_ALT_OP_SHL_INT_2ADDR /* 0xb8 */
20861     .long .L_ALT_OP_SHR_INT_2ADDR /* 0xb9 */
20862     .long .L_ALT_OP_USHR_INT_2ADDR /* 0xba */
20863     .long .L_ALT_OP_ADD_LONG_2ADDR /* 0xbb */
20864     .long .L_ALT_OP_SUB_LONG_2ADDR /* 0xbc */
20865     .long .L_ALT_OP_MUL_LONG_2ADDR /* 0xbd */
20866     .long .L_ALT_OP_DIV_LONG_2ADDR /* 0xbe */
20867     .long .L_ALT_OP_REM_LONG_2ADDR /* 0xbf */
20868     .long .L_ALT_OP_AND_LONG_2ADDR /* 0xc0 */
20869     .long .L_ALT_OP_OR_LONG_2ADDR /* 0xc1 */
20870     .long .L_ALT_OP_XOR_LONG_2ADDR /* 0xc2 */
20871     .long .L_ALT_OP_SHL_LONG_2ADDR /* 0xc3 */
20872     .long .L_ALT_OP_SHR_LONG_2ADDR /* 0xc4 */
20873     .long .L_ALT_OP_USHR_LONG_2ADDR /* 0xc5 */
20874     .long .L_ALT_OP_ADD_FLOAT_2ADDR /* 0xc6 */
20875     .long .L_ALT_OP_SUB_FLOAT_2ADDR /* 0xc7 */
20876     .long .L_ALT_OP_MUL_FLOAT_2ADDR /* 0xc8 */
20877     .long .L_ALT_OP_DIV_FLOAT_2ADDR /* 0xc9 */
20878     .long .L_ALT_OP_REM_FLOAT_2ADDR /* 0xca */
20879     .long .L_ALT_OP_ADD_DOUBLE_2ADDR /* 0xcb */
20880     .long .L_ALT_OP_SUB_DOUBLE_2ADDR /* 0xcc */
20881     .long .L_ALT_OP_MUL_DOUBLE_2ADDR /* 0xcd */
20882     .long .L_ALT_OP_DIV_DOUBLE_2ADDR /* 0xce */
20883     .long .L_ALT_OP_REM_DOUBLE_2ADDR /* 0xcf */
20884     .long .L_ALT_OP_ADD_INT_LIT16 /* 0xd0 */
20885     .long .L_ALT_OP_RSUB_INT /* 0xd1 */
20886     .long .L_ALT_OP_MUL_INT_LIT16 /* 0xd2 */
20887     .long .L_ALT_OP_DIV_INT_LIT16 /* 0xd3 */
20888     .long .L_ALT_OP_REM_INT_LIT16 /* 0xd4 */
20889     .long .L_ALT_OP_AND_INT_LIT16 /* 0xd5 */
20890     .long .L_ALT_OP_OR_INT_LIT16 /* 0xd6 */
20891     .long .L_ALT_OP_XOR_INT_LIT16 /* 0xd7 */
20892     .long .L_ALT_OP_ADD_INT_LIT8 /* 0xd8 */
20893     .long .L_ALT_OP_RSUB_INT_LIT8 /* 0xd9 */
20894     .long .L_ALT_OP_MUL_INT_LIT8 /* 0xda */
20895     .long .L_ALT_OP_DIV_INT_LIT8 /* 0xdb */
20896     .long .L_ALT_OP_REM_INT_LIT8 /* 0xdc */
20897     .long .L_ALT_OP_AND_INT_LIT8 /* 0xdd */
20898     .long .L_ALT_OP_OR_INT_LIT8 /* 0xde */
20899     .long .L_ALT_OP_XOR_INT_LIT8 /* 0xdf */
20900     .long .L_ALT_OP_SHL_INT_LIT8 /* 0xe0 */
20901     .long .L_ALT_OP_SHR_INT_LIT8 /* 0xe1 */
20902     .long .L_ALT_OP_USHR_INT_LIT8 /* 0xe2 */
20903     .long .L_ALT_OP_IGET_VOLATILE /* 0xe3 */
20904     .long .L_ALT_OP_IPUT_VOLATILE /* 0xe4 */
20905     .long .L_ALT_OP_SGET_VOLATILE /* 0xe5 */
20906     .long .L_ALT_OP_SPUT_VOLATILE /* 0xe6 */
20907     .long .L_ALT_OP_IGET_OBJECT_VOLATILE /* 0xe7 */
20908     .long .L_ALT_OP_IGET_WIDE_VOLATILE /* 0xe8 */
20909     .long .L_ALT_OP_IPUT_WIDE_VOLATILE /* 0xe9 */
20910     .long .L_ALT_OP_SGET_WIDE_VOLATILE /* 0xea */
20911     .long .L_ALT_OP_SPUT_WIDE_VOLATILE /* 0xeb */
20912     .long .L_ALT_OP_BREAKPOINT /* 0xec */
20913     .long .L_ALT_OP_THROW_VERIFICATION_ERROR /* 0xed */
20914     .long .L_ALT_OP_EXECUTE_INLINE /* 0xee */
20915     .long .L_ALT_OP_EXECUTE_INLINE_RANGE /* 0xef */
20916     .long .L_ALT_OP_INVOKE_OBJECT_INIT_RANGE /* 0xf0 */
20917     .long .L_ALT_OP_RETURN_VOID_BARRIER /* 0xf1 */
20918     .long .L_ALT_OP_IGET_QUICK /* 0xf2 */
20919     .long .L_ALT_OP_IGET_WIDE_QUICK /* 0xf3 */
20920     .long .L_ALT_OP_IGET_OBJECT_QUICK /* 0xf4 */
20921     .long .L_ALT_OP_IPUT_QUICK /* 0xf5 */
20922     .long .L_ALT_OP_IPUT_WIDE_QUICK /* 0xf6 */
20923     .long .L_ALT_OP_IPUT_OBJECT_QUICK /* 0xf7 */
20924     .long .L_ALT_OP_INVOKE_VIRTUAL_QUICK /* 0xf8 */
20925     .long .L_ALT_OP_INVOKE_VIRTUAL_QUICK_RANGE /* 0xf9 */
20926     .long .L_ALT_OP_INVOKE_SUPER_QUICK /* 0xfa */
20927     .long .L_ALT_OP_INVOKE_SUPER_QUICK_RANGE /* 0xfb */
20928     .long .L_ALT_OP_IPUT_OBJECT_VOLATILE /* 0xfc */
20929     .long .L_ALT_OP_SGET_OBJECT_VOLATILE /* 0xfd */
20930     .long .L_ALT_OP_SPUT_OBJECT_VOLATILE /* 0xfe */
20931     .long .L_ALT_OP_DISPATCH_FF /* 0xff */
20932     .long .L_ALT_OP_CONST_CLASS_JUMBO /* 0x100 */
20933     .long .L_ALT_OP_CHECK_CAST_JUMBO /* 0x101 */
20934     .long .L_ALT_OP_INSTANCE_OF_JUMBO /* 0x102 */
20935     .long .L_ALT_OP_NEW_INSTANCE_JUMBO /* 0x103 */
20936     .long .L_ALT_OP_NEW_ARRAY_JUMBO /* 0x104 */
20937     .long .L_ALT_OP_FILLED_NEW_ARRAY_JUMBO /* 0x105 */
20938     .long .L_ALT_OP_IGET_JUMBO /* 0x106 */
20939     .long .L_ALT_OP_IGET_WIDE_JUMBO /* 0x107 */
20940     .long .L_ALT_OP_IGET_OBJECT_JUMBO /* 0x108 */
20941     .long .L_ALT_OP_IGET_BOOLEAN_JUMBO /* 0x109 */
20942     .long .L_ALT_OP_IGET_BYTE_JUMBO /* 0x10a */
20943     .long .L_ALT_OP_IGET_CHAR_JUMBO /* 0x10b */
20944     .long .L_ALT_OP_IGET_SHORT_JUMBO /* 0x10c */
20945     .long .L_ALT_OP_IPUT_JUMBO /* 0x10d */
20946     .long .L_ALT_OP_IPUT_WIDE_JUMBO /* 0x10e */
20947     .long .L_ALT_OP_IPUT_OBJECT_JUMBO /* 0x10f */
20948     .long .L_ALT_OP_IPUT_BOOLEAN_JUMBO /* 0x110 */
20949     .long .L_ALT_OP_IPUT_BYTE_JUMBO /* 0x111 */
20950     .long .L_ALT_OP_IPUT_CHAR_JUMBO /* 0x112 */
20951     .long .L_ALT_OP_IPUT_SHORT_JUMBO /* 0x113 */
20952     .long .L_ALT_OP_SGET_JUMBO /* 0x114 */
20953     .long .L_ALT_OP_SGET_WIDE_JUMBO /* 0x115 */
20954     .long .L_ALT_OP_SGET_OBJECT_JUMBO /* 0x116 */
20955     .long .L_ALT_OP_SGET_BOOLEAN_JUMBO /* 0x117 */
20956     .long .L_ALT_OP_SGET_BYTE_JUMBO /* 0x118 */
20957     .long .L_ALT_OP_SGET_CHAR_JUMBO /* 0x119 */
20958     .long .L_ALT_OP_SGET_SHORT_JUMBO /* 0x11a */
20959     .long .L_ALT_OP_SPUT_JUMBO /* 0x11b */
20960     .long .L_ALT_OP_SPUT_WIDE_JUMBO /* 0x11c */
20961     .long .L_ALT_OP_SPUT_OBJECT_JUMBO /* 0x11d */
20962     .long .L_ALT_OP_SPUT_BOOLEAN_JUMBO /* 0x11e */
20963     .long .L_ALT_OP_SPUT_BYTE_JUMBO /* 0x11f */
20964     .long .L_ALT_OP_SPUT_CHAR_JUMBO /* 0x120 */
20965     .long .L_ALT_OP_SPUT_SHORT_JUMBO /* 0x121 */
20966     .long .L_ALT_OP_INVOKE_VIRTUAL_JUMBO /* 0x122 */
20967     .long .L_ALT_OP_INVOKE_SUPER_JUMBO /* 0x123 */
20968     .long .L_ALT_OP_INVOKE_DIRECT_JUMBO /* 0x124 */
20969     .long .L_ALT_OP_INVOKE_STATIC_JUMBO /* 0x125 */
20970     .long .L_ALT_OP_INVOKE_INTERFACE_JUMBO /* 0x126 */
20971     .long .L_ALT_OP_UNUSED_27FF /* 0x127 */
20972     .long .L_ALT_OP_UNUSED_28FF /* 0x128 */
20973     .long .L_ALT_OP_UNUSED_29FF /* 0x129 */
20974     .long .L_ALT_OP_UNUSED_2AFF /* 0x12a */
20975     .long .L_ALT_OP_UNUSED_2BFF /* 0x12b */
20976     .long .L_ALT_OP_UNUSED_2CFF /* 0x12c */
20977     .long .L_ALT_OP_UNUSED_2DFF /* 0x12d */
20978     .long .L_ALT_OP_UNUSED_2EFF /* 0x12e */
20979     .long .L_ALT_OP_UNUSED_2FFF /* 0x12f */
20980     .long .L_ALT_OP_UNUSED_30FF /* 0x130 */
20981     .long .L_ALT_OP_UNUSED_31FF /* 0x131 */
20982     .long .L_ALT_OP_UNUSED_32FF /* 0x132 */
20983     .long .L_ALT_OP_UNUSED_33FF /* 0x133 */
20984     .long .L_ALT_OP_UNUSED_34FF /* 0x134 */
20985     .long .L_ALT_OP_UNUSED_35FF /* 0x135 */
20986     .long .L_ALT_OP_UNUSED_36FF /* 0x136 */
20987     .long .L_ALT_OP_UNUSED_37FF /* 0x137 */
20988     .long .L_ALT_OP_UNUSED_38FF /* 0x138 */
20989     .long .L_ALT_OP_UNUSED_39FF /* 0x139 */
20990     .long .L_ALT_OP_UNUSED_3AFF /* 0x13a */
20991     .long .L_ALT_OP_UNUSED_3BFF /* 0x13b */
20992     .long .L_ALT_OP_UNUSED_3CFF /* 0x13c */
20993     .long .L_ALT_OP_UNUSED_3DFF /* 0x13d */
20994     .long .L_ALT_OP_UNUSED_3EFF /* 0x13e */
20995     .long .L_ALT_OP_UNUSED_3FFF /* 0x13f */
20996     .long .L_ALT_OP_UNUSED_40FF /* 0x140 */
20997     .long .L_ALT_OP_UNUSED_41FF /* 0x141 */
20998     .long .L_ALT_OP_UNUSED_42FF /* 0x142 */
20999     .long .L_ALT_OP_UNUSED_43FF /* 0x143 */
21000     .long .L_ALT_OP_UNUSED_44FF /* 0x144 */
21001     .long .L_ALT_OP_UNUSED_45FF /* 0x145 */
21002     .long .L_ALT_OP_UNUSED_46FF /* 0x146 */
21003     .long .L_ALT_OP_UNUSED_47FF /* 0x147 */
21004     .long .L_ALT_OP_UNUSED_48FF /* 0x148 */
21005     .long .L_ALT_OP_UNUSED_49FF /* 0x149 */
21006     .long .L_ALT_OP_UNUSED_4AFF /* 0x14a */
21007     .long .L_ALT_OP_UNUSED_4BFF /* 0x14b */
21008     .long .L_ALT_OP_UNUSED_4CFF /* 0x14c */
21009     .long .L_ALT_OP_UNUSED_4DFF /* 0x14d */
21010     .long .L_ALT_OP_UNUSED_4EFF /* 0x14e */
21011     .long .L_ALT_OP_UNUSED_4FFF /* 0x14f */
21012     .long .L_ALT_OP_UNUSED_50FF /* 0x150 */
21013     .long .L_ALT_OP_UNUSED_51FF /* 0x151 */
21014     .long .L_ALT_OP_UNUSED_52FF /* 0x152 */
21015     .long .L_ALT_OP_UNUSED_53FF /* 0x153 */
21016     .long .L_ALT_OP_UNUSED_54FF /* 0x154 */
21017     .long .L_ALT_OP_UNUSED_55FF /* 0x155 */
21018     .long .L_ALT_OP_UNUSED_56FF /* 0x156 */
21019     .long .L_ALT_OP_UNUSED_57FF /* 0x157 */
21020     .long .L_ALT_OP_UNUSED_58FF /* 0x158 */
21021     .long .L_ALT_OP_UNUSED_59FF /* 0x159 */
21022     .long .L_ALT_OP_UNUSED_5AFF /* 0x15a */
21023     .long .L_ALT_OP_UNUSED_5BFF /* 0x15b */
21024     .long .L_ALT_OP_UNUSED_5CFF /* 0x15c */
21025     .long .L_ALT_OP_UNUSED_5DFF /* 0x15d */
21026     .long .L_ALT_OP_UNUSED_5EFF /* 0x15e */
21027     .long .L_ALT_OP_UNUSED_5FFF /* 0x15f */
21028     .long .L_ALT_OP_UNUSED_60FF /* 0x160 */
21029     .long .L_ALT_OP_UNUSED_61FF /* 0x161 */
21030     .long .L_ALT_OP_UNUSED_62FF /* 0x162 */
21031     .long .L_ALT_OP_UNUSED_63FF /* 0x163 */
21032     .long .L_ALT_OP_UNUSED_64FF /* 0x164 */
21033     .long .L_ALT_OP_UNUSED_65FF /* 0x165 */
21034     .long .L_ALT_OP_UNUSED_66FF /* 0x166 */
21035     .long .L_ALT_OP_UNUSED_67FF /* 0x167 */
21036     .long .L_ALT_OP_UNUSED_68FF /* 0x168 */
21037     .long .L_ALT_OP_UNUSED_69FF /* 0x169 */
21038     .long .L_ALT_OP_UNUSED_6AFF /* 0x16a */
21039     .long .L_ALT_OP_UNUSED_6BFF /* 0x16b */
21040     .long .L_ALT_OP_UNUSED_6CFF /* 0x16c */
21041     .long .L_ALT_OP_UNUSED_6DFF /* 0x16d */
21042     .long .L_ALT_OP_UNUSED_6EFF /* 0x16e */
21043     .long .L_ALT_OP_UNUSED_6FFF /* 0x16f */
21044     .long .L_ALT_OP_UNUSED_70FF /* 0x170 */
21045     .long .L_ALT_OP_UNUSED_71FF /* 0x171 */
21046     .long .L_ALT_OP_UNUSED_72FF /* 0x172 */
21047     .long .L_ALT_OP_UNUSED_73FF /* 0x173 */
21048     .long .L_ALT_OP_UNUSED_74FF /* 0x174 */
21049     .long .L_ALT_OP_UNUSED_75FF /* 0x175 */
21050     .long .L_ALT_OP_UNUSED_76FF /* 0x176 */
21051     .long .L_ALT_OP_UNUSED_77FF /* 0x177 */
21052     .long .L_ALT_OP_UNUSED_78FF /* 0x178 */
21053     .long .L_ALT_OP_UNUSED_79FF /* 0x179 */
21054     .long .L_ALT_OP_UNUSED_7AFF /* 0x17a */
21055     .long .L_ALT_OP_UNUSED_7BFF /* 0x17b */
21056     .long .L_ALT_OP_UNUSED_7CFF /* 0x17c */
21057     .long .L_ALT_OP_UNUSED_7DFF /* 0x17d */
21058     .long .L_ALT_OP_UNUSED_7EFF /* 0x17e */
21059     .long .L_ALT_OP_UNUSED_7FFF /* 0x17f */
21060     .long .L_ALT_OP_UNUSED_80FF /* 0x180 */
21061     .long .L_ALT_OP_UNUSED_81FF /* 0x181 */
21062     .long .L_ALT_OP_UNUSED_82FF /* 0x182 */
21063     .long .L_ALT_OP_UNUSED_83FF /* 0x183 */
21064     .long .L_ALT_OP_UNUSED_84FF /* 0x184 */
21065     .long .L_ALT_OP_UNUSED_85FF /* 0x185 */
21066     .long .L_ALT_OP_UNUSED_86FF /* 0x186 */
21067     .long .L_ALT_OP_UNUSED_87FF /* 0x187 */
21068     .long .L_ALT_OP_UNUSED_88FF /* 0x188 */
21069     .long .L_ALT_OP_UNUSED_89FF /* 0x189 */
21070     .long .L_ALT_OP_UNUSED_8AFF /* 0x18a */
21071     .long .L_ALT_OP_UNUSED_8BFF /* 0x18b */
21072     .long .L_ALT_OP_UNUSED_8CFF /* 0x18c */
21073     .long .L_ALT_OP_UNUSED_8DFF /* 0x18d */
21074     .long .L_ALT_OP_UNUSED_8EFF /* 0x18e */
21075     .long .L_ALT_OP_UNUSED_8FFF /* 0x18f */
21076     .long .L_ALT_OP_UNUSED_90FF /* 0x190 */
21077     .long .L_ALT_OP_UNUSED_91FF /* 0x191 */
21078     .long .L_ALT_OP_UNUSED_92FF /* 0x192 */
21079     .long .L_ALT_OP_UNUSED_93FF /* 0x193 */
21080     .long .L_ALT_OP_UNUSED_94FF /* 0x194 */
21081     .long .L_ALT_OP_UNUSED_95FF /* 0x195 */
21082     .long .L_ALT_OP_UNUSED_96FF /* 0x196 */
21083     .long .L_ALT_OP_UNUSED_97FF /* 0x197 */
21084     .long .L_ALT_OP_UNUSED_98FF /* 0x198 */
21085     .long .L_ALT_OP_UNUSED_99FF /* 0x199 */
21086     .long .L_ALT_OP_UNUSED_9AFF /* 0x19a */
21087     .long .L_ALT_OP_UNUSED_9BFF /* 0x19b */
21088     .long .L_ALT_OP_UNUSED_9CFF /* 0x19c */
21089     .long .L_ALT_OP_UNUSED_9DFF /* 0x19d */
21090     .long .L_ALT_OP_UNUSED_9EFF /* 0x19e */
21091     .long .L_ALT_OP_UNUSED_9FFF /* 0x19f */
21092     .long .L_ALT_OP_UNUSED_A0FF /* 0x1a0 */
21093     .long .L_ALT_OP_UNUSED_A1FF /* 0x1a1 */
21094     .long .L_ALT_OP_UNUSED_A2FF /* 0x1a2 */
21095     .long .L_ALT_OP_UNUSED_A3FF /* 0x1a3 */
21096     .long .L_ALT_OP_UNUSED_A4FF /* 0x1a4 */
21097     .long .L_ALT_OP_UNUSED_A5FF /* 0x1a5 */
21098     .long .L_ALT_OP_UNUSED_A6FF /* 0x1a6 */
21099     .long .L_ALT_OP_UNUSED_A7FF /* 0x1a7 */
21100     .long .L_ALT_OP_UNUSED_A8FF /* 0x1a8 */
21101     .long .L_ALT_OP_UNUSED_A9FF /* 0x1a9 */
21102     .long .L_ALT_OP_UNUSED_AAFF /* 0x1aa */
21103     .long .L_ALT_OP_UNUSED_ABFF /* 0x1ab */
21104     .long .L_ALT_OP_UNUSED_ACFF /* 0x1ac */
21105     .long .L_ALT_OP_UNUSED_ADFF /* 0x1ad */
21106     .long .L_ALT_OP_UNUSED_AEFF /* 0x1ae */
21107     .long .L_ALT_OP_UNUSED_AFFF /* 0x1af */
21108     .long .L_ALT_OP_UNUSED_B0FF /* 0x1b0 */
21109     .long .L_ALT_OP_UNUSED_B1FF /* 0x1b1 */
21110     .long .L_ALT_OP_UNUSED_B2FF /* 0x1b2 */
21111     .long .L_ALT_OP_UNUSED_B3FF /* 0x1b3 */
21112     .long .L_ALT_OP_UNUSED_B4FF /* 0x1b4 */
21113     .long .L_ALT_OP_UNUSED_B5FF /* 0x1b5 */
21114     .long .L_ALT_OP_UNUSED_B6FF /* 0x1b6 */
21115     .long .L_ALT_OP_UNUSED_B7FF /* 0x1b7 */
21116     .long .L_ALT_OP_UNUSED_B8FF /* 0x1b8 */
21117     .long .L_ALT_OP_UNUSED_B9FF /* 0x1b9 */
21118     .long .L_ALT_OP_UNUSED_BAFF /* 0x1ba */
21119     .long .L_ALT_OP_UNUSED_BBFF /* 0x1bb */
21120     .long .L_ALT_OP_UNUSED_BCFF /* 0x1bc */
21121     .long .L_ALT_OP_UNUSED_BDFF /* 0x1bd */
21122     .long .L_ALT_OP_UNUSED_BEFF /* 0x1be */
21123     .long .L_ALT_OP_UNUSED_BFFF /* 0x1bf */
21124     .long .L_ALT_OP_UNUSED_C0FF /* 0x1c0 */
21125     .long .L_ALT_OP_UNUSED_C1FF /* 0x1c1 */
21126     .long .L_ALT_OP_UNUSED_C2FF /* 0x1c2 */
21127     .long .L_ALT_OP_UNUSED_C3FF /* 0x1c3 */
21128     .long .L_ALT_OP_UNUSED_C4FF /* 0x1c4 */
21129     .long .L_ALT_OP_UNUSED_C5FF /* 0x1c5 */
21130     .long .L_ALT_OP_UNUSED_C6FF /* 0x1c6 */
21131     .long .L_ALT_OP_UNUSED_C7FF /* 0x1c7 */
21132     .long .L_ALT_OP_UNUSED_C8FF /* 0x1c8 */
21133     .long .L_ALT_OP_UNUSED_C9FF /* 0x1c9 */
21134     .long .L_ALT_OP_UNUSED_CAFF /* 0x1ca */
21135     .long .L_ALT_OP_UNUSED_CBFF /* 0x1cb */
21136     .long .L_ALT_OP_UNUSED_CCFF /* 0x1cc */
21137     .long .L_ALT_OP_UNUSED_CDFF /* 0x1cd */
21138     .long .L_ALT_OP_UNUSED_CEFF /* 0x1ce */
21139     .long .L_ALT_OP_UNUSED_CFFF /* 0x1cf */
21140     .long .L_ALT_OP_UNUSED_D0FF /* 0x1d0 */
21141     .long .L_ALT_OP_UNUSED_D1FF /* 0x1d1 */
21142     .long .L_ALT_OP_UNUSED_D2FF /* 0x1d2 */
21143     .long .L_ALT_OP_UNUSED_D3FF /* 0x1d3 */
21144     .long .L_ALT_OP_UNUSED_D4FF /* 0x1d4 */
21145     .long .L_ALT_OP_UNUSED_D5FF /* 0x1d5 */
21146     .long .L_ALT_OP_UNUSED_D6FF /* 0x1d6 */
21147     .long .L_ALT_OP_UNUSED_D7FF /* 0x1d7 */
21148     .long .L_ALT_OP_UNUSED_D8FF /* 0x1d8 */
21149     .long .L_ALT_OP_UNUSED_D9FF /* 0x1d9 */
21150     .long .L_ALT_OP_UNUSED_DAFF /* 0x1da */
21151     .long .L_ALT_OP_UNUSED_DBFF /* 0x1db */
21152     .long .L_ALT_OP_UNUSED_DCFF /* 0x1dc */
21153     .long .L_ALT_OP_UNUSED_DDFF /* 0x1dd */
21154     .long .L_ALT_OP_UNUSED_DEFF /* 0x1de */
21155     .long .L_ALT_OP_UNUSED_DFFF /* 0x1df */
21156     .long .L_ALT_OP_UNUSED_E0FF /* 0x1e0 */
21157     .long .L_ALT_OP_UNUSED_E1FF /* 0x1e1 */
21158     .long .L_ALT_OP_UNUSED_E2FF /* 0x1e2 */
21159     .long .L_ALT_OP_UNUSED_E3FF /* 0x1e3 */
21160     .long .L_ALT_OP_UNUSED_E4FF /* 0x1e4 */
21161     .long .L_ALT_OP_UNUSED_E5FF /* 0x1e5 */
21162     .long .L_ALT_OP_UNUSED_E6FF /* 0x1e6 */
21163     .long .L_ALT_OP_UNUSED_E7FF /* 0x1e7 */
21164     .long .L_ALT_OP_UNUSED_E8FF /* 0x1e8 */
21165     .long .L_ALT_OP_UNUSED_E9FF /* 0x1e9 */
21166     .long .L_ALT_OP_UNUSED_EAFF /* 0x1ea */
21167     .long .L_ALT_OP_UNUSED_EBFF /* 0x1eb */
21168     .long .L_ALT_OP_UNUSED_ECFF /* 0x1ec */
21169     .long .L_ALT_OP_UNUSED_EDFF /* 0x1ed */
21170     .long .L_ALT_OP_UNUSED_EEFF /* 0x1ee */
21171     .long .L_ALT_OP_UNUSED_EFFF /* 0x1ef */
21172     .long .L_ALT_OP_UNUSED_F0FF /* 0x1f0 */
21173     .long .L_ALT_OP_UNUSED_F1FF /* 0x1f1 */
21174     .long .L_ALT_OP_UNUSED_F2FF /* 0x1f2 */
21175     .long .L_ALT_OP_UNUSED_F3FF /* 0x1f3 */
21176     .long .L_ALT_OP_UNUSED_F4FF /* 0x1f4 */
21177     .long .L_ALT_OP_UNUSED_F5FF /* 0x1f5 */
21178     .long .L_ALT_OP_UNUSED_F6FF /* 0x1f6 */
21179     .long .L_ALT_OP_UNUSED_F7FF /* 0x1f7 */
21180     .long .L_ALT_OP_UNUSED_F8FF /* 0x1f8 */
21181     .long .L_ALT_OP_UNUSED_F9FF /* 0x1f9 */
21182     .long .L_ALT_OP_UNUSED_FAFF /* 0x1fa */
21183     .long .L_ALT_OP_UNUSED_FBFF /* 0x1fb */
21184     .long .L_ALT_OP_UNUSED_FCFF /* 0x1fc */
21185     .long .L_ALT_OP_UNUSED_FDFF /* 0x1fd */
21186     .long .L_ALT_OP_UNUSED_FEFF /* 0x1fe */
21187     .long .L_ALT_OP_THROW_VERIFICATION_ERROR_JUMBO /* 0x1ff */
21188 /* File: x86/entry.S */
21189 /*
21190  * Copyright (C) 2008 The Android Open Source Project
21191  *
21192  * Licensed under the Apache License, Version 2.0 (the "License");
21193  * you may not use this file except in compliance with the License.
21194  * You may obtain a copy of the License at
21195  *
21196  *      http://www.apache.org/licenses/LICENSE-2.0
21197  *
21198  * Unless required by applicable law or agreed to in writing, software
21199  * distributed under the License is distributed on an "AS IS" BASIS,
21200  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21201  * See the License for the specific language governing permissions and
21202  * limitations under the License.
21203  */
21204
21205
21206     .text
21207     .global dvmMterpStdRun
21208     .type   dvmMterpStdRun, %function
21209 /*
21210  * bool dvmMterpStdRun(Thread* self)
21211  *
21212  * Interpreter entry point.  Returns changeInterp.
21213  *
21214  */
21215 dvmMterpStdRun:
21216     movl    4(%esp), %ecx        # get incoming rSELF
21217     push    %ebp                 # save caller base pointer
21218     push    %ecx                 # save rSELF at (%ebp)
21219     movl    %esp, %ebp           # set our %ebp
21220 /*
21221  * At this point we've allocated two slots on the stack
21222  * via push and stack is 8-byte aligned.  Allocate space
21223  * for 8 spill slots, 3 local slots, 5 arg slots + 2 slots for
21224  * padding to bring us to 16-byte alignment
21225  */
21226     subl    $(FRAME_SIZE-8), %esp
21227
21228 /* Spill callee save regs */
21229     movl    %edi,EDI_SPILL(%ebp)
21230     movl    %esi,ESI_SPILL(%ebp)
21231     movl    %ebx,EBX_SPILL(%ebp)
21232
21233 /* Set up "named" registers */
21234     movl    offThread_pc(%ecx),rPC
21235     movl    offThread_fp(%ecx),rFP
21236     movl    offThread_curHandlerTable(%ecx),rIBASE
21237
21238 /* Remember %esp for future "longjmp" */
21239     movl    %esp,offThread_bailPtr(%ecx)
21240
21241 /* How to start? */
21242     movb    offThread_entryPoint(%ecx),%al
21243
21244 /* Normal start? */
21245     cmpb    $kInterpEntryInstr,%al
21246     jne     .Lnot_instr
21247
21248    /* Normal case: start executing the instruction at rPC */
21249     FETCH_INST
21250     GOTO_NEXT
21251
21252 .Lnot_instr:
21253     /* Reset to normal case */
21254     movb   $kInterpEntryInstr,offThread_entryPoint(%ecx)
21255     cmpb   $kInterpEntryReturn,%al
21256     je     common_returnFromMethod
21257     cmpb   $kInterpEntryThrow,%al
21258     je     common_exceptionThrown
21259     movzx  %al,%eax
21260     movl   %eax,OUT_ARG1(%esp)
21261     movl   $.LstrBadEntryPoint,OUT_ARG0(%esp)
21262     call   printf
21263     call   dvmAbort
21264     /* Not reached */
21265
21266
21267     .global dvmMterpStdBail
21268     .type   dvmMterpStdBail, %function
21269 /*
21270  * void dvmMterpStdBail(Thread* self, bool changeInterp)
21271  *
21272  * Restore the stack pointer and PC from the save point established on entry.
21273  * This is essentially the same as a longjmp, but should be cheaper.  The
21274  * last instruction causes us to return to whoever called dvmMterpStdRun.
21275  *
21276  * We're not going to build a standard frame here, so the arg accesses will
21277  * look a little strange.
21278  *
21279  * On entry:
21280  *  esp+4 (arg0)  Thread* self
21281  *  esp+8 (arg1)  bool changeInterp
21282  */
21283 dvmMterpStdBail:
21284     movl    4(%esp),%ecx                 # grab self
21285     movl    8(%esp),%eax                 # changeInterp to return reg
21286     movl    offThread_bailPtr(%ecx),%esp   # Restore "setjmp" esp
21287     movl    %esp,%ebp
21288     addl    $(FRAME_SIZE-8), %ebp       # Restore %ebp at point of setjmp
21289     movl    EDI_SPILL(%ebp),%edi
21290     movl    ESI_SPILL(%ebp),%esi
21291     movl    EBX_SPILL(%ebp),%ebx
21292     movl    PREV_FP(%ebp),%ebp           # restore caller's ebp
21293     addl    $FRAME_SIZE,%esp                    # strip frame
21294     ret                                  # return to dvmMterpStdRun's caller
21295
21296
21297 /*
21298  * Strings
21299  */
21300     .section    .rodata
21301 .LstrBadEntryPoint:
21302     .asciz  "Bad entry point %d\n"
21303
21304
21305 /* File: x86/footer.S */
21306 /*
21307  * Copyright (C) 2008 The Android Open Source Project
21308  *
21309  * Licensed under the Apache License, Version 2.0 (the "License");
21310  * you may not use this file except in compliance with the License.
21311  * You may obtain a copy of the License at
21312  *
21313  *      http://www.apache.org/licenses/LICENSE-2.0
21314  *
21315  * Unless required by applicable law or agreed to in writing, software
21316  * distributed under the License is distributed on an "AS IS" BASIS,
21317  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21318  * See the License for the specific language governing permissions and
21319  * limitations under the License.
21320  */
21321 /*
21322  * Common subroutines and data.
21323  */
21324
21325 #if defined(WITH_JIT)
21326 /*
21327  * JIT-related re-entries into the interpreter.  In general, if the
21328  * exit from a translation can at some point be chained, the entry
21329  * here requires that control arrived via a call, and that the "rp"
21330  * on TOS is actually a pointer to a 32-bit cell containing the Dalvik PC
21331  * of the next insn to handle.  If no chaining will happen, the entry
21332  * should be reached via a direct jump and rPC set beforehand.
21333  */
21334
21335     .global dvmJitToInterpPunt
21336 /*
21337  * The compiler will generate a jump to this entry point when it is
21338  * having difficulty translating a Dalvik instruction.  We must skip
21339  * the code cache lookup & prevent chaining to avoid bouncing between
21340  * the interpreter and code cache. rPC must be set on entry.
21341  */
21342 dvmJitToInterpPunt:
21343 #if defined(WITH_JIT_TUNING)
21344     movl   rPC, OUT_ARG0(%esp)
21345     call   dvmBumpPunt
21346 #endif
21347     movl   rSELF, %ecx
21348     movl   offThread_curHandlerTable(%ecx),rIBASE
21349     FETCH_INST_R %ecx
21350     GOTO_NEXT_R %ecx
21351
21352     .global dvmJitToInterpSingleStep
21353 /*
21354  * Return to the interpreter to handle a single instruction.
21355  * Should be reached via a call.
21356  * On entry:
21357  *   0(%esp)          <= native return address within trace
21358  *   rPC              <= Dalvik PC of this instruction
21359  *   OUT_ARG0+4(%esp) <= Dalvik PC of next instruction
21360  */
21361 dvmJitToInterpSingleStep:
21362     pop    %eax
21363     movl   rSELF, %ecx
21364     movl   OUT_ARG0(%esp), %edx
21365     movl   %eax,offThread_jitResumeNPC(%ecx)
21366     movl   %edx,offThread_jitResumeDPC(%ecx)
21367     movl   $kInterpEntryInstr,offThread_entryPoint(%ecx)
21368     movl   $1,rINST     # changeInterp <= true
21369     jmp    common_gotoBail
21370
21371     .global dvmJitToInterpNoChainNoProfile
21372 /*
21373  * Return from the translation cache to the interpreter to do method
21374  * invocation.  Check if the translation exists for the callee, but don't
21375  * chain to it. rPC must be set on entry.
21376  */
21377 dvmJitToInterpNoChainNoProfile:
21378 #if defined(WITH_JIT_TUNING)
21379     call   dvmBumpNoChain
21380 #endif
21381     movl   rPC,OUT_ARG0(%esp)
21382     call   dvmJitGetTraceAddr        # is there a translation?
21383     movl   rSELF,%ecx                # ecx <- self
21384     movl   %eax,offThread_inJitCodeCache(%ecx)  # set inJitCodeCache flag
21385     cmpl   $0, %eax
21386     jz     1f
21387     call   *%eax                     # exec translation if we've got one
21388     # won't return
21389 1:
21390     movl   rSELF, %ecx
21391     movl   offThread_curHandlerTable(%ecx),rIBASE
21392     FETCH_INST_R %ecx
21393     GOTO_NEXT_R %ecx
21394
21395 /*
21396  * Return from the translation cache and immediately request a
21397  * translation fro the exit target, but don't attempt to chain.
21398  * rPC set on entry.
21399  */
21400     .global dvmJitToInterpTraceSelectNoChain
21401 dvmJitToInterpTraceSelectNoChain:
21402 #if defined(WITH_JIT_TUNING)
21403     call   dvmBumpNoChain
21404 #endif
21405     movl   rPC,OUT_ARG0(%esp)
21406     call   dvmJitGetTraceAddr # is there a translation?
21407     movl   rSELF,%ecx
21408     cmpl   $0,%eax
21409     movl   %eax,offThread_inJitCodeCache(%ecx)  # set inJitCodeCache flag
21410     jz     1f
21411     call   *%eax              # jump to tranlation
21412     # won't return
21413
21414 /* No Translation - request one */
21415 1:
21416     GET_JIT_PROF_TABLE %ecx %eax
21417     cmpl   $0, %eax          # JIT enabled?
21418     jnz    2f                 # Request one if so
21419     movl   rSELF, %ecx
21420     movl   offThread_curHandlerTable(%ecx),rIBASE
21421     FETCH_INST_R %ecx         # Continue interpreting if not
21422     GOTO_NEXT_R %ecx
21423 2:
21424     movl   $kJitTSelectRequestHot,rINST  # ask for trace select
21425     jmp    common_selectTrace
21426
21427 /*
21428  * Return from the translation cache and immediately request a
21429  * translation for the exit target.  Reached via a call, and
21430  * (TOS)->rPC.
21431  */
21432     .global dvmJitToInterpTraceSelect
21433 dvmJitToInterpTraceSelect:
21434     pop    rINST           # save chain cell address in callee save reg
21435     movl   (rINST),rPC
21436     movl   rPC,OUT_ARG0(%esp)
21437     call   dvmJitGetTraceAddr # is there a translation?
21438     cmpl   $0,%eax
21439     jz     1b                 # no - ask for one
21440     movl   %eax,OUT_ARG0(%esp)
21441 # FIXME - need to adjust rINST to beginning of sequence
21442     movl   rINST,OUT_ARG1(%esp)
21443     call   dvmJitChain        # Attempt dvmJitChain(codeAddr,chainAddr)
21444     cmpl   $0,%eax           # Success?
21445     jz     toInterpreter      # didn't chain - interpret
21446     call   *%eax
21447     # won't return
21448
21449 /*
21450  * Placeholder entries for x86 JIT
21451  */
21452     .global dvmJitToInterpBackwardBranch
21453 dvmJitToInterpBackwardBranch:
21454     .global dvmJitToInterpNormal
21455 dvmJitToInterpNormal:
21456     .global dvmJitToInterpNoChain
21457 dvmJitToInterpNoChain:
21458 toInterpreter:
21459     jmp  common_abort
21460 #endif
21461
21462 /*
21463  * Common code when a backwards branch is taken
21464  *
21465  * On entry:
21466  *   ebx (a.k.a. rINST) -> PC adjustment in 16-bit words
21467  */
21468 common_backwardBranch:
21469     movl    rSELF,%ecx
21470     call   common_periodicChecks  # rPC and ecx/rSELF preserved
21471 #if defined(WITH_JIT)
21472     GET_JIT_PROF_TABLE %ecx rIBASE
21473     ADVANCE_PC_INDEXED rINST
21474     cmpl   $0,rIBASE
21475     movl   offThread_curHandlerTable(%ecx),rIBASE
21476     FETCH_INST
21477     jz    1f                    # Profiling off - continue
21478     .global updateProfile
21479 updateProfile:
21480 common_updateProfile:
21481     # quick & dirty hash
21482     movl   rPC, %eax
21483     shrl   $12, %eax
21484     xorl   rPC, %eax
21485     andl   $((1<<JIT_PROF_SIZE_LOG_2)-1),%eax
21486     decb   (%edx,%eax)
21487     jz     2f
21488 1:
21489     GOTO_NEXT
21490 2:
21491 /*
21492  * Here, we switch to the debug interpreter to request
21493  * trace selection.  First, though, check to see if there
21494  * is already a native translation in place (and, if so,
21495  * jump to it now.
21496  */
21497     GET_JIT_THRESHOLD %ecx rINST  # leaves rSELF in %ecx
21498     EXPORT_PC
21499     movb   rINSTbl,(%edx,%eax)   # reset counter
21500     movl   %ecx,rINST            # preserve rSELF
21501     movl   rPC,OUT_ARG0(%esp)
21502     call   dvmJitGetTraceAddr  # already have one?
21503     movl   %eax,offThread_inJitCodeCache(rINST)   # set the inJitCodeCache flag
21504     cmpl   $0,%eax
21505     jz     1f
21506     call   *%eax        # FIXME: decide call vs/ jmp!.  No return either way
21507 1:
21508     movl   $kJitTSelectRequest,%eax
21509     # On entry, eax<- jitState, rPC valid
21510 common_selectTrace:
21511
21512     movl   rSELF,%ecx
21513     movl   %eax,offThread_jitState(%ecx)
21514     movl   $kInterpEntryInstr,offThread_entryPoint(%ecx)
21515     movl   $1,rINST
21516     jmp    common_gotoBail
21517 #else
21518     movl   offThread_curHandlerTable(%ecx),rIBASE
21519     ADVANCE_PC_INDEXED rINST
21520     FETCH_INST
21521     GOTO_NEXT
21522 #endif
21523
21524
21525
21526 /*
21527  * Common code for jumbo method invocation.
21528  *
21529  * On entry:
21530  *   eax = Method* methodToCall
21531  *   rINSTw trashed, must reload
21532  *   rIBASE trashed, must reload before resuming interpreter
21533  */
21534
21535 common_invokeMethodJumbo:
21536 .LinvokeNewJumbo:
21537
21538    /*
21539     * prepare to copy args to "outs" area of current frame
21540     */
21541     movzwl      6(rPC),rINST            # rINST<- BBBB
21542     movzwl      8(rPC), %ecx            # %ecx<- CCCC
21543     ADVANCE_PC 2                        # adjust pc to make return similar
21544     SAVEAREA_FROM_FP %edx               # %edx<- &StackSaveArea
21545     test        rINST, rINST
21546     movl        rINST, LOCAL0_OFFSET(%ebp) # LOCAL0_OFFSET(%ebp)<- BBBB
21547     jz          .LinvokeArgsDone        # no args; jump to args done
21548     jmp         .LinvokeRangeArgs       # handle args like invoke range
21549
21550 /*
21551  * Common code for method invocation with range.
21552  *
21553  * On entry:
21554  *   eax = Method* methodToCall
21555  *   rINSTw trashed, must reload
21556  *   rIBASE trashed, must reload before resuming interpreter
21557  */
21558
21559 common_invokeMethodRange:
21560 .LinvokeNewRange:
21561
21562    /*
21563     * prepare to copy args to "outs" area of current frame
21564     */
21565
21566     movzbl      1(rPC),rINST       # rINST<- AA
21567     movzwl      4(rPC), %ecx            # %ecx<- CCCC
21568     SAVEAREA_FROM_FP %edx               # %edx<- &StackSaveArea
21569     test        rINST, rINST
21570     movl        rINST, LOCAL0_OFFSET(%ebp) # LOCAL0_OFFSET(%ebp)<- AA
21571     jz          .LinvokeArgsDone        # no args; jump to args done
21572
21573
21574    /*
21575     * %eax=methodToCall, %ecx=CCCC, LOCAL0_OFFSET(%ebp)=count, %edx=&outs (&stackSaveArea)
21576     * (very few methods have > 10 args; could unroll for common cases)
21577     */
21578
21579 .LinvokeRangeArgs:
21580     movl        %ebx, LOCAL1_OFFSET(%ebp)       # LOCAL1_OFFSET(%ebp)<- save %ebx
21581     lea         (rFP, %ecx, 4), %ecx    # %ecx<- &vCCCC
21582     shll        $2, LOCAL0_OFFSET(%ebp)        # LOCAL0_OFFSET(%ebp)<- offset
21583     subl        LOCAL0_OFFSET(%ebp), %edx       # %edx<- update &outs
21584     shrl        $2, LOCAL0_OFFSET(%ebp)        # LOCAL0_OFFSET(%ebp)<- offset
21585 1:
21586     movl        (%ecx), %ebx            # %ebx<- vCCCC
21587     lea         4(%ecx), %ecx           # %ecx<- &vCCCC++
21588     subl        $1, LOCAL0_OFFSET(%ebp)        # LOCAL0_OFFSET<- LOCAL0_OFFSET--
21589     movl        %ebx, (%edx)            # *outs<- vCCCC
21590     lea         4(%edx), %edx           # outs++
21591     jne         1b                      # loop if count (LOCAL0_OFFSET(%ebp)) not zero
21592     movl        LOCAL1_OFFSET(%ebp), %ebx       # %ebx<- restore %ebx
21593     jmp         .LinvokeArgsDone        # continue
21594
21595    /*
21596     * %eax is "Method* methodToCall", the method we're trying to call
21597     * prepare to copy args to "outs" area of current frame
21598     * rIBASE trashed, must reload before resuming interpreter
21599     */
21600
21601 common_invokeMethodNoRange:
21602 .LinvokeNewNoRange:
21603     movzbl      1(rPC),rINST       # rINST<- BA
21604     movl        rINST, LOCAL0_OFFSET(%ebp) # LOCAL0_OFFSET(%ebp)<- BA
21605     shrl        $4, LOCAL0_OFFSET(%ebp)        # LOCAL0_OFFSET(%ebp)<- B
21606     je          .LinvokeArgsDone        # no args; jump to args done
21607     movzwl      4(rPC), %ecx            # %ecx<- GFED
21608     SAVEAREA_FROM_FP %edx               # %edx<- &StackSaveArea
21609
21610    /*
21611     * %eax=methodToCall, %ecx=GFED, LOCAL0_OFFSET(%ebp)=count, %edx=outs
21612     */
21613
21614 .LinvokeNonRange:
21615     cmp         $2, LOCAL0_OFFSET(%ebp)        # compare LOCAL0_OFFSET(%ebp) to 2
21616     movl        %ecx, LOCAL1_OFFSET(%ebp)       # LOCAL1_OFFSET(%ebp)<- GFED
21617     jl          1f                      # handle 1 arg
21618     je          2f                      # handle 2 args
21619     cmp         $4, LOCAL0_OFFSET(%ebp)        # compare LOCAL0_OFFSET(%ebp) to 4
21620     jl          3f                      # handle 3 args
21621     je          4f                      # handle 4 args
21622 5:
21623     andl        $15, rINST             # rINSTw<- A
21624     lea         -4(%edx), %edx          # %edx<- update &outs; &outs--
21625     movl        (rFP, rINST, 4), %ecx   # %ecx<- vA
21626     movl        %ecx, (%edx)            # *outs<- vA
21627     movl        LOCAL1_OFFSET(%ebp), %ecx       # %ecx<- GFED
21628 4:
21629     shr         $12, %ecx              # %ecx<- G
21630     lea         -4(%edx), %edx          # %edx<- update &outs; &outs--
21631     movl        (rFP, %ecx, 4), %ecx    # %ecx<- vG
21632     movl        %ecx, (%edx)            # *outs<- vG
21633     movl        LOCAL1_OFFSET(%ebp), %ecx       # %ecx<- GFED
21634 3:
21635     and         $0x0f00, %ecx          # %ecx<- 0F00
21636     shr         $8, %ecx               # %ecx<- F
21637     lea         -4(%edx), %edx          # %edx<- update &outs; &outs--
21638     movl        (rFP, %ecx, 4), %ecx    # %ecx<- vF
21639     movl        %ecx, (%edx)            # *outs<- vF
21640     movl        LOCAL1_OFFSET(%ebp), %ecx       # %ecx<- GFED
21641 2:
21642     and         $0x00f0, %ecx          # %ecx<- 00E0
21643     shr         $4, %ecx               # %ecx<- E
21644     lea         -4(%edx), %edx          # %edx<- update &outs; &outs--
21645     movl        (rFP, %ecx, 4), %ecx    # %ecx<- vE
21646     movl        %ecx, (%edx)            # *outs<- vE
21647     movl        LOCAL1_OFFSET(%ebp), %ecx       # %ecx<- GFED
21648 1:
21649     and         $0x000f, %ecx          # %ecx<- 000D
21650     movl        (rFP, %ecx, 4), %ecx    # %ecx<- vD
21651     movl        %ecx, -4(%edx)          # *--outs<- vD
21652 0:
21653
21654    /*
21655     * %eax is "Method* methodToCall", the method we're trying to call
21656     * find space for the new stack frame, check for overflow
21657     */
21658
21659 .LinvokeArgsDone:
21660     movzwl      offMethod_registersSize(%eax), %edx # %edx<- methodToCall->regsSize
21661     movzwl      offMethod_outsSize(%eax), %ecx # %ecx<- methodToCall->outsSize
21662     movl        %eax, LOCAL0_OFFSET(%ebp)       # LOCAL0_OFFSET<- methodToCall
21663     shl         $2, %edx               # %edx<- update offset
21664     SAVEAREA_FROM_FP %eax               # %eax<- &StackSaveArea
21665     subl        %edx, %eax              # %eax<- newFP; (old savearea - regsSize)
21666     movl        rSELF,%edx              # %edx<- pthread
21667     movl        %eax, LOCAL1_OFFSET(%ebp)       # LOCAL1_OFFSET(%ebp)<- &outs
21668     subl        $sizeofStackSaveArea, %eax # %eax<- newSaveArea (stack save area using newFP)
21669     movl        offThread_interpStackEnd(%edx), %edx # %edx<- self->interpStackEnd
21670     movl        %edx, LOCAL2_OFFSET(%ebp)       # LOCAL2_OFFSET<- self->interpStackEnd
21671     shl         $2, %ecx               # %ecx<- update offset for outsSize
21672     movl        %eax, %edx              # %edx<- newSaveArea
21673     sub         %ecx, %eax              # %eax<- bottom; (newSaveArea - outsSize)
21674     cmp         LOCAL2_OFFSET(%ebp), %eax       # compare interpStackEnd and bottom
21675     movl        LOCAL0_OFFSET(%ebp), %eax       # %eax<- restore methodToCall
21676     jl          .LstackOverflow         # handle frame overflow
21677
21678    /*
21679     * set up newSaveArea
21680     */
21681
21682 #ifdef EASY_GDB
21683     SAVEAREA_FROM_FP %ecx               # %ecx<- &StackSaveArea
21684     movl        %ecx, offStackSaveArea_prevSave(%edx) # newSaveArea->prevSave<- &outs
21685 #endif
21686     movl        rFP, offStackSaveArea_prevFrame(%edx) # newSaveArea->prevFrame<- rFP
21687     movl        rPC, offStackSaveArea_savedPc(%edx) # newSaveArea->savedPc<- rPC
21688     testl       $ACC_NATIVE, offMethod_accessFlags(%eax) # check for native call
21689     movl        %eax, offStackSaveArea_method(%edx) # newSaveArea->method<- method to call
21690     jne         .LinvokeNative          # handle native call
21691
21692    /*
21693     * Update "self" values for the new method
21694     * %eax=methodToCall, LOCAL1_OFFSET(%ebp)=newFp
21695     */
21696
21697     movl        offMethod_clazz(%eax), %edx # %edx<- method->clazz
21698     movl        rSELF,%ecx                  # %ecx<- pthread
21699     movl        offClassObject_pDvmDex(%edx), %edx # %edx<- method->clazz->pDvmDex
21700     movl        %eax, offThread_method(%ecx) # self->method<- methodToCall
21701     movl        %edx, offThread_methodClassDex(%ecx) # self->methodClassDex<- method->clazz->pDvmDex
21702     movl        offMethod_insns(%eax), rPC # rPC<- methodToCall->insns
21703     movl        LOCAL1_OFFSET(%ebp), rFP # rFP<- newFP
21704     movl        rFP, offThread_curFrame(%ecx) # self->curFrame<- newFP
21705     movl        offThread_curHandlerTable(%ecx),rIBASE
21706     FETCH_INST
21707     GOTO_NEXT                           # jump to methodToCall->insns
21708
21709    /*
21710     * Prep for the native call
21711     * %eax=methodToCall, LOCAL1_OFFSET(%ebp)=newFP, %edx=newSaveArea
21712     */
21713
21714 .LinvokeNative:
21715     movl        rSELF,%ecx              # %ecx<- pthread
21716     movl        %eax, OUT_ARG1(%esp)    # push parameter methodToCall
21717     movl        offThread_jniLocal_topCookie(%ecx), %eax # %eax<- self->localRef->...
21718     movl        %eax, offStackSaveArea_localRefCookie(%edx) # newSaveArea->localRefCookie<- top
21719     movl        %edx, OUT_ARG4(%esp)    # save newSaveArea
21720     movl        LOCAL1_OFFSET(%ebp), %edx # %edx<- newFP
21721     movl        %edx, offThread_curFrame(%ecx)  # self->curFrame<- newFP
21722     movl        %ecx, OUT_ARG3(%esp)    # save self
21723     movl        %ecx, OUT_ARG2(%esp)    # push parameter self
21724     movl        rSELF,%ecx              # %ecx<- pthread
21725     movl        OUT_ARG1(%esp), %eax    # %eax<- methodToCall
21726     lea         offThread_retval(%ecx), %ecx # %ecx<- &retval
21727     movl        %ecx, OUT_ARG0(%esp)    # push parameter pthread
21728     push        %edx                    # push parameter newFP
21729
21730     call        *offMethod_nativeFunc(%eax) # call methodToCall->nativeFunc
21731     lea         4(%esp), %esp
21732     movl        OUT_ARG4(%esp), %ecx    # %ecx<- newSaveArea
21733     movl        OUT_ARG3(%esp), %eax    # %eax<- self
21734     movl        offStackSaveArea_localRefCookie(%ecx), %edx # %edx<- old top
21735     cmp         $0, offThread_exception(%eax) # check for exception
21736     movl        rFP, offThread_curFrame(%eax) # self->curFrame<- rFP
21737     movl        %edx, offThread_jniLocal_topCookie(%eax) # new top <- old top
21738     jne         common_exceptionThrown  # handle exception
21739     movl        offThread_curHandlerTable(%eax),rIBASE
21740     FETCH_INST_OPCODE 3 %ecx
21741     ADVANCE_PC 3
21742     GOTO_NEXT_R %ecx                    # jump to next instruction
21743
21744 .LstackOverflow:    # eax=methodToCall
21745     movl        %eax, OUT_ARG1(%esp)    # push parameter methodToCall
21746     movl        rSELF,%eax              # %eax<- self
21747     movl        %eax, OUT_ARG0(%esp)    # push parameter self
21748     call        dvmHandleStackOverflow  # call: (Thread* self, Method* meth)
21749     jmp         common_exceptionThrown  # handle exception
21750
21751
21752 /*
21753  * Do we need the thread to be suspended or have debugger/profiling activity?
21754  *
21755  * On entry:
21756  *   ebx  -> PC adjustment in 16-bit words (must be preserved)
21757  *   ecx  -> SELF pointer
21758  *   reentry type, e.g. kInterpEntryInstr stored in rSELF->entryPoint
21759  *
21760  * Note: A call will normally kill %eax and %ecx.  To
21761  *       streamline the normal case, this routine will preserve
21762  *       %ecx in addition to the normal caller save regs.  The save/restore
21763  *       is a bit ugly, but will happen in the relatively uncommon path.
21764  * TODO: Basic-block style Jit will need a hook here as well.  Fold it into
21765  *       the suspendCount check so we can get both in 1 shot.
21766  * TUNING: Improve scheduling here & do initial single test for all.
21767  */
21768 common_periodicChecks:
21769     cmpl    $0,offThread_suspendCount(%ecx)     # non-zero suspendCount?
21770     jne     1f
21771
21772 6:
21773     movl   offThread_pInterpBreak(%ecx),%eax    # eax <- &interpBreak
21774     cmpl   $0,(%eax)              # something interesting happening?
21775     jne    3f                      # yes - switch interpreters
21776     ret
21777
21778     /* Check for suspend */
21779 1:
21780     /*  At this point, the return pointer to the caller of
21781      *  common_periodicChecks is on the top of stack.  We need to preserve
21782      *  SELF(ecx).
21783      *  The outgoing profile is:
21784      *      bool dvmCheckSuspendPending(Thread* self)
21785      *  Because we reached here via a call, go ahead and build a new frame.
21786      */
21787     EXPORT_PC                         # need for precise GC
21788     movl    %ecx,%eax                 # eax<- self
21789     push    %ebp
21790     movl    %esp,%ebp
21791     subl    $24,%esp
21792     movl    %eax,OUT_ARG0(%esp)
21793     call    dvmCheckSuspendPending
21794     addl    $24,%esp
21795     pop     %ebp
21796     movl    rSELF,%ecx
21797
21798     /*
21799      * Need to check to see if debugger or profiler flags got set
21800      * while we were suspended.
21801      */
21802     jmp    6b
21803
21804     /* Switch interpreters */
21805     /* Note: %ebx contains the 16-bit word offset to be applied to rPC to
21806      * "complete" the interpretation of backwards branches.  In effect, we
21807      * are completing the interpretation of the branch instruction here,
21808      * and the new interpreter will resume interpretation at the branch
21809      * target. However, a switch request recognized during the handling
21810      * of a return from method instruction results in an immediate abort,
21811      * and the new interpreter will resume by re-interpreting the return
21812      * instruction.
21813      */
21814 3:
21815     leal    (rPC,%ebx,2),rPC       # adjust pc to show target
21816     movl    rSELF,%ecx             # bail expect SELF already loaded
21817     movl    $1,rINST              # set changeInterp to true
21818     jmp     common_gotoBail
21819
21820
21821 /*
21822  * Common code for handling a return instruction
21823  */
21824 common_returnFromMethod:
21825     movl    rSELF,%ecx
21826     /* Set entry mode in case we bail */
21827     movb    $kInterpEntryReturn,offThread_entryPoint(%ecx)
21828     xorl    rINST,rINST   # zero offset in case we switch interps
21829     call    common_periodicChecks   # Note: expects %ecx to be preserved
21830
21831     SAVEAREA_FROM_FP %eax                         # eax<- saveArea (old)
21832     movl    offStackSaveArea_prevFrame(%eax),rFP  # rFP<- prevFrame
21833     movl    (offStackSaveArea_method-sizeofStackSaveArea)(rFP),rINST
21834     cmpl    $0,rINST                             # break?
21835     je      common_gotoBail    # break frame, bail out completely
21836
21837     movl    offStackSaveArea_savedPc(%eax),rPC    # pc<- saveArea->savedPC
21838     movl    rINST,offThread_method(%ecx)          # self->method = newSave->meethod
21839     movl    rFP,offThread_curFrame(%ecx)          # self->curFrame = fp
21840     movl    offMethod_clazz(rINST),%eax           # eax<- method->clazz
21841     movl    offThread_curHandlerTable(%ecx),rIBASE
21842     movl    offClassObject_pDvmDex(%eax),rINST    # rINST<- method->clazz->pDvmDex
21843     FETCH_INST_OPCODE 3 %eax
21844     movl    rINST,offThread_methodClassDex(%ecx)
21845     ADVANCE_PC 3
21846     /* not bailing - restore entry mode to default */
21847     movb    $kInterpEntryInstr,offThread_entryPoint(%ecx)
21848     GOTO_NEXT_R %eax
21849
21850 /*
21851  * Prepare to strip the current frame and "longjump" back to caller of
21852  * dvmMterpStdRun.
21853  *
21854  * on entry:
21855  *    rINST holds changeInterp
21856  *    ecx holds self pointer
21857  *
21858  * expected profile: dvmMterpStdBail(Thread *self, bool changeInterp)
21859  */
21860 common_gotoBail:
21861     movl   rPC,offThread_pc(%ecx)     # export state to self
21862     movl   rFP,offThread_fp(%ecx)
21863     movl   %ecx,OUT_ARG0(%esp)      # self in arg0
21864     movl   rINST,OUT_ARG1(%esp)     # changeInterp in arg1
21865     call   dvmMterpStdBail          # bail out....
21866
21867
21868 /*
21869  * After returning from a "selfd" function, pull out the updated values
21870  * and start executing at the next instruction.
21871  */
21872  common_resumeAfterGlueCall:
21873      movl  rSELF, %eax
21874      movl  offThread_pc(%eax),rPC
21875      movl  offThread_fp(%eax),rFP
21876      movl  offThread_curHandlerTable(%eax),rIBASE
21877      FETCH_INST
21878      GOTO_NEXT
21879
21880 /*
21881  * Integer divide or mod by zero
21882  */
21883 common_errDivideByZero:
21884     EXPORT_PC
21885     movl    $.LstrDivideByZero,%eax
21886     movl    %eax,OUT_ARG0(%esp)
21887     call    dvmThrowArithmeticException
21888     jmp     common_exceptionThrown
21889
21890 /*
21891  * Attempt to allocate an array with a negative size.
21892  * On entry, len in eax
21893  */
21894 common_errNegativeArraySize:
21895     EXPORT_PC
21896     movl    %eax,OUT_ARG0(%esp)                  # arg0<- len
21897     call    dvmThrowNegativeArraySizeException   # (len)
21898     jmp     common_exceptionThrown
21899
21900 /*
21901  * Attempt to allocate an array with a negative size.
21902  * On entry, method name in eax
21903  */
21904 common_errNoSuchMethod:
21905
21906     EXPORT_PC
21907     movl    %eax,OUT_ARG0(%esp)
21908     call    dvmThrowNoSuchMethodError
21909     jmp     common_exceptionThrown
21910
21911 /*
21912  * Hit a null object when we weren't expecting one.  Export the PC, throw a
21913  * NullPointerException and goto the exception processing code.
21914  */
21915 common_errNullObject:
21916     EXPORT_PC
21917     xorl    %eax,%eax
21918     movl    %eax,OUT_ARG0(%esp)
21919     call    dvmThrowNullPointerException
21920     jmp     common_exceptionThrown
21921
21922 /*
21923  * Array index exceeds max.
21924  * On entry:
21925  *    eax <- array object
21926  *    ecx <- index
21927  */
21928 common_errArrayIndex:
21929     EXPORT_PC
21930     movl    offArrayObject_length(%eax), %eax
21931     movl    %ecx,OUT_ARG0(%esp)
21932     movl    %eax,OUT_ARG1(%esp)
21933     call    dvmThrowArrayIndexOutOfBoundsException   # args (index, length)
21934     jmp     common_exceptionThrown
21935
21936 /*
21937  * Somebody has thrown an exception.  Handle it.
21938  *
21939  * If the exception processing code returns to us (instead of falling
21940  * out of the interpreter), continue with whatever the next instruction
21941  * now happens to be.
21942  *
21943  * This does not return.
21944  */
21945 common_exceptionThrown:
21946     movl    rSELF,%ecx
21947     movl    rPC,offThread_pc(%ecx)
21948     movl    rFP,offThread_fp(%ecx)
21949     movl    %ecx,OUT_ARG0(%esp)
21950     call    dvmMterp_exceptionThrown
21951     jmp     common_resumeAfterGlueCall
21952
21953 common_abort:
21954     movl    $0xdeadf00d,%eax
21955     call     *%eax
21956
21957
21958 /*
21959  * Strings
21960  */
21961
21962     .section     .rodata
21963 .LstrDivideByZero:
21964     .asciz  "divide by zero"
21965 .LstrFilledNewArrayNotImplA:
21966     .asciz  "filled-new-array only implemented for 'int'"
21967